恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
肉鸡健康检测数据集:VOC/YOLO双格式与YOLO训练实战指南
首页
资讯中心
/
肉鸡健康检测数据集:VOC/YOLO双格式与YOLO训练实战指南
肉鸡健康检测数据集:VOC/YOLO双格式与YOLO训练实战指南
发布时间:2026/10/14 11:43:42
简介面向智慧养殖场景的肉鸡健康状态检测数据集适用于目标检测模型训练、科研实验及农业AI应用开发。资源包含4657张图片并同时提供Pascal VOC格式XML与YOLO格式TXT两类标注文件省去自行转换数据格式的额外工作。标注类别分为AbNormal异常与Normal正常合计标注框21610个其中AbNormal框数8447、Normal框数13163各类别标注样本均较充足可直接用于监督训练所有标注由labelImg工具完成规则为矩形框标注准确且合理能够顺利接入YOLO系列、Faster R-CNN等主流检测器便于快速开展模型训练、性能对比与迁移调优。压缩包体积约396.56MB文件类型以图片、XML和TXT为主整体结构简单清晰便于检索与提取数据集仅包含准确标注的原始数据不附带任何训练权重或精度保证适合作为公平的算法评测基准。目前已有396人学习浏览适合需要标准化数据的算法工程师、科研人员及竞赛选手。1. 智慧养殖场肉鸡健康检测4657张双格式数据集能解决什么养过鸡的人都知道靠人工巡栏找病鸡是件体力活。几千只鸡在一个棚里管理员一天走两三圈靠肉眼找精神萎靡、缩脖耷翅的个体效率低不说漏检是常态。摄像头方案解决了“看得全”的问题却把压力转移到了“看得懂”上——监控流每天产生大量画面靠人盯屏幕不现实靠AI就需要一份贴近真实养殖环境的训练数据。这个标题里的数据集就是干这个用的4657张肉鸡图像2个类别健康与异常同时提供VOC和YOLO两种标注格式解压以后可以直接喂给主流检测框架省掉自己花几周去拍摄、清洗、标注的重复劳动。适合正在做养殖智能化、想快速把检测模型跑起来的技术团队和学生。2. 数据集结构拆解VOC与YOLO格式的目录布局和标签映射拿到的压缩包解压后第一件事不是急着训练而是先搞清楚里面的目录结构和标注格式。肉鸡健康检测这种场景图片里目标多、排列密集、个体之间有遮挡标注格式选错或者目录摆错后面全白干。2.1 VOC和YOLO标注的核心差异xml与txt的坐标定义VOC格式的标注是xml文件里面用bndbox节点存四个值xmin、ymin、xmax、ymax单位是图像的绝对像素坐标左上角为原点向右向下为正。YOLO格式的标注是txt文件每行对应一个目标格式是class_id x_center y_center width height前三个值后面这四个数全部相对于图像宽高做了归一化取值范围在0到1之间坐标是目标框的中心点。这两套坐标体系在转换时容易踩坑尤其是归一化坐标回算像素框时如果图像尺寸读错了框的位置就会整体偏移。我一般拿到数据集后会先写一个校验脚本把两种格式各自解析出来画到原图上对比一遍确认不是一套标注套了两层皮。转换关系本身不复杂核心代码可以这样写import xml.etree.ElementTree as ET import os # 类别顺序要和训练配置里的names严格一致 # 这里假设0健康(healthy)1异常(abnormal)按实际数据集的classes.txt调整 class_names [healthy, abnormal] def voc_to_yolo(xml_path, out_dir): tree ET.parse(xml_path) root tree.getroot() # 图像尺寸在VOC里通常存在size节点下 img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) file_name os.path.splitext(os.path.basename(xml_path))[0] lines [] for obj in root.iter(object): cls obj.find(name).text if cls not in class_names: continue cls_id class_names.index(cls) box obj.find(bndbox) # bndbox是绝对像素坐标 xmin int(box.find(xmin).text) ymin int(box.find(ymin).text) xmax int(box.find(xmax).text) ymax int(box.find(ymax).text) # 转中心点宽高全部归一化 x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 逆序输出的txt每行是一个目标 lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(os.path.join(out_dir, file_name .txt), w) as f: f.write(\n.join(lines))这段代码的逻辑是先读xml里的图像尺寸和每个目标的bounding box再把绝对坐标换算成归一化中心点坐标最后写成YOLO格式的txt。几个关键点class_names的列表顺序直接决定类别id顺序写错整个训练都会错位img_w和img_h必须取原图尺寸如果图像经过resize预处理这里的宽高要和实际输入保持一致否则框就会漂移。转换完成后建议随机抽20张图把框画回去肉眼检查一遍这一步不能省。2.2 数据集目录怎么摆才能被检测框架直接认出来主流检测框架对数据集的目录结构有固定预期常见做法是images和labels两个根目录下面各按train、val、test划分图片和标签的文件名一一对应只是扩展名不同。整合这个数据集时我通常整理成这样的结构dataset_root/ ├── images/ │ ├── train/ # 如 000001.jpg │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ # 如 000001.txt │ ├── val/ │ └── test/ └── data.yamldata.yaml是训练时的配置文件指向上面这些目录同时声明类别数和类别名。一个典型内容是这样的# data.yaml train: dataset_root/images/train val: dataset_root/images/val test: dataset_root/images/test nc: 2 names: [healthy, abnormal]注意train和val字段指向的是图片目录不是标签目录——框架会根据图片文件名去同名的labels目录下找对应的txt。如果你把图片和标签混放在一个文件夹里训练时会报label not found。另外names的顺序必须和转换脚本里的class_names、txt里的类别id三者完全一致这是我每次都要反复检查的点。2.3 类别设计与标注对象2个类别对应什么检测任务这个数据集的2个类别一般对应“健康”和“异常”两种状态。健康的鸡只姿态正常、行动活跃异常的鸡只往往表现为精神萎靡、羽毛蓬乱、缩脖站立或伏地不动。检测任务的目标是给定一张养殖场俯拍或平视图像模型输出图像中每只鸡的边界框并给出健康或异常的标签。由于只有2个类别模型的分类压力不大难点集中在检测上——养殖场内鸡只密集相互遮挡严重而且很多鸡长得非常像边界框稍有偏差类别判断就可能落在相邻个体上。因此在这个数据集上边界框回归的精度比分类精度更影响最终效果。另外一个容易被忽略的点这个2类别的设计是“单框单标签”不是“单框多标签”一只鸡身上不会同时标健康和异常这符合实际场景语义。如果后续想扩展到“异常的具体类型”比如呼吸道疾病、消化道疾病才需要重新设计类别体系。3. 用YOLO系列框架跑通训练从解压到出模型的最小流程目录结构摆好之后下一步是让训练真正跑起来。这一步的关键不是把命令敲对而是理解每个参数在这个具体场景里该怎么设。养殖场肉鸡图像光线复杂、目标密集和公开数据集上的通用目标检测有区别参数不能照搬默认值。3.1 解压、校验与划分训练集/验证集/测试集的比例怎么定解压后先确认图片数量和标签数量对得上4657张图如果VOC和YOLO各有一套标签那么两种格式下都应该是4657个标注文件多一个少一个都说明文件有损坏或遗漏。然后检查图片分辨率分布用一段脚本统计一下宽高范围import os from PIL import Image img_dir dataset_root/images/train sizes {} for name in os.listdir(img_dir): img Image.open(os.path.join(img_dir, name)) sizes.setdefault(img.size, 0) sizes[img.size] 1 for size, count in sorted(sizes.items(), keylambda x: -x[1])[:10]: print(size, count)这个统计会告诉你图片主要是统一分辨率还是长短不一。如果混着1920x1080和640x480两种尺寸训练时--img参数就要谨慎分辨率差异太大时统一缩放到640会有明显信息损失。我建议优先使用原始分辨率训练或者把图片先统一到接近的尺寸再做缩放。划分比例上4657张不算大常见做法是8:1:1也就是3725张训练、466张验证、466张测试。如果单类样本特别少还可以考虑按类别分层划分避免某个类别只在训练集或验证集出现。分层划分的通用实现是先按类别id统计每张图的标签分布再用StratifiedShuffleSplit按标签向量做划分保证两个集合的类别比例接近。3.2 训练命令与必调参数imgsz、batch、epochs、workers数据划分完成后训练命令本身不长但几个参数直接决定训练成败python train.py \ --data dataset_root/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 32 \ --epochs 100 \ --device 0 \ --workers 8 \ --cache每个参数在这个场景里的含义--img 640训练时输入网络的图像分辨率。肉鸡检测里小目标不少比如远端的鸡在画面里可能只有20x20像素640分辨率下这些目标只有约3x3个特征点容易漏检。如果显存允许建议上到960或1280代价是训练时间成倍增加。--batch 32单卡8G显存下640分辨率配合YOLOv5s大约能跑到32左右如果跑不动就减半到16不要硬撑。batch大小影响BN层的统计量太小的batch小于8会让BN抖动剧烈loss曲线不稳。--epochs 100这个数据量下100轮是一个合理的起点。前30轮loss下降明显30到60轮缓慢收敛60轮以后主要是在修正边界框精度。如果100轮结束后mAP还在上升趋势就继续加训练轮数。--cache把图片预加载到内存减小磁盘IO压力。数据集不大这个选项能省不少等待时间特别是硬盘速度一般的情况下非常明显。还有一个常被忽略的--workers它控制数据加载的进程数。Windows上设8偶尔会报错改成4更稳Linux上设8没问题。如果训练中出现“死循环”或“卡在加载数据”的现象先排查workers是否开得过高。有预训练权重就用预训练权重不要随机初始化训练。哪怕数据是鸡舍场景COCO预训练模型学到的通用纹理和边缘特征也能让训练初期loss下降快得多。如果模型完全不收敛先检查是不是类别id映射错了——用训练集里任意一张图片的标签文件打开看看类别id对不对得上data.yaml里的names。3.3 训练产物解读weights、results.csv、混淆矩阵怎么看训练结束后框架会在runs/train/exp目录下输出权重文件和评估曲线。重点看三个东西第一个是best.pt和last.ptbest.pt是验证集上mAP最高的权重部署时用这个last.pt是最后一轮的权重一般用于断点续训。第二个是results.csv里面逐行记录了每一轮的train_loss、val_loss、precision、recall、mAP等指标。画曲线比看数字直观import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/train/exp/results.csv) df.columns [c.strip() for c in df.columns] plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) df[train/box_loss].plot(labelbox_loss) df[val/box_loss].plot(labelval_box_loss) plt.legend() plt.subplot(1, 2, 2) df[metrics/precision].plot(labelprecision) df[metrics/recall].plot(labelrecall) df[metrics/mAP_0.5].plot(labelmAP0.5) plt.legend() plt.tight_layout() plt.savefig(training_curve.png)注意列名的格式可能因框架版本略有差异运行前先print(df.columns.tolist())确认。如果val_loss在训练后期不降反升而train_loss继续下降说明过拟合了回退到val_loss最低点那个epoch的权重。第三个是混淆矩阵图。肉鸡健康检测里混淆矩阵最需要注意的是“健康被误判成异常”还是“异常被误判成健康”。前者会产生大量不必要的干预增加人工复核负担后者会漏掉病鸡直接导致治疗延误。在2类别场景下如果recall低优先看异常类是不是被吃掉了。4. 训练肉鸡检测模型容易翻车的5个坑与排查路径这个数据集的场景很特殊和通用目标检测不同密集、遮挡、类别不平衡这些因素会集中引爆。以下几条是我实际跑这个方向时踩过的坑每条按现象、原因、解决的顺序来写。4.1 现象loss在降但mAP一直不动训练了50轮train_loss从0.08降到了0.03看起来一切正常但验证集mAP0.5始终在0.3附近徘徊。这种情况最迷惑人因为loss和mAP方向不一致。原因大概率是类别不平衡健康类样本远多于异常类模型学会了把所有目标都预测成健康类box回归虽然也在学但分类分支几乎退化。Loss曲线显示的是所有loss的平均值分类loss被大量健康样本主导掩盖了异常类分类不准的问题。解决方法是先看混淆矩阵确认这个猜测。如果确认不平衡两个手段一是调整类别权重在loss计算里给少数类更高的权重具体做法是修改损失函数里cls_loss的alpha参数二是做类别级别的数据增强——对异常类样本做更强的复制粘贴copy-paste增强而不是整体数据随机增强。4.2 现象验证集全判成背景大量漏检训练完成测试时发现模型对每张图都输出空白或者只输出极少数低置信度框。检查测试图片格式、尺寸都正常权重文件也没加载错。这种“全判背景”的情况最直接的原因是训练数据里背景占比过高或者模型欠拟合。放大了看如果训练时--epochs只跑了30轮而数据集的类别特征并没有那么明显模型可能根本还没学到“什么是鸡”只是学会了“图像整体像背景所以置信度压低”。解决办法是先用预训练权重和默认超参完整跑100轮确认基础能收敛再进行参数调整。如果100轮后还是全判背景去看labels目录里的txt文件是否大量为空——如果某张图对应的txt是0字节文件这张图会被当作纯背景训练空标签文件过多会严重拉偏模型。4.3 现象训练集mAP接近1验证集一塌糊涂训练集上模型表现完美换到验证集立刻掉到0.5以下这是典型的过拟合。4657张的数据量并不大模型容量足够的情况下完全记住训练集并不难。过拟合的根源在于模型参数太多、数据多样性不够。这个场景里肉鸡的姿势、光照、棚舍环境比公开数据集更单一加剧了过拟合风险。解决办法按优先级来第一增强数据增强强度把mosaic打开、hsv增强调高让模型看不到重复的“原图”第二加大weight_decay从默认的0.0005调到0.001限制参数复杂度第三使用更小的模型比如从yolov5s降到yolov5n。实在不行再考虑收集更多数据增强手段优先因为数据标注成本高。4.4 现象小目标远距离鸡只完全检测不到模型对近处大目标检测没问题但画面远端、或者俯拍视角下远处的鸡只完全检测不到。肉鸡棚通常很长摄像头装在侧壁时远端鸡只像素尺寸非常小。原因输入分辨率不够小目标在降采样后特征消失了。YOLO系列的检测头在多尺度上预测但最小的检测层也只能有效处理8x8以上的目标特征更小的目标在深层特征图里只剩一两个像素语义信息不够。解决方案有两个方向。一是把--img提到1280小目标像素倍数增加检测率提升明显但显存占用几乎翻倍batch要相应降低二是用多尺度训练--multi-scale配合--img 640 --img 1280让模型适应不同目标尺寸。如果显存实在不够可以尝试在模型输出层加一个针对小目标的检测头工程量大一些但思路是增加一个stride更小的预测层。4.5 现象训练一启动就报错显存溢出CUDA out of memory这是最常见也最好解决的报错。通常发生在batch设太高或者--img分辨率太大导致特征图占满显存。直接解决办法是把batch减半如果还报就是输入分辨率过高把--img降到544或480。如果batch已经低到8还溢出的检查是不是同时开了多个进程在占用显存nvidia-smi看一下。还有一种隐蔽情况--cache把数据提前加载到显存里部分框架的cache实现了GPU缓存和模型参数抢显存这种情况下关掉--cache、改用内存缓存即可。5. 验证与部署数据集的真实价值要在产线上确认训练出一版模型只是第一步。肉鸡健康状态检测的最终目标是部署到养殖场环境里代替人工盯监控这中间还有评估方式和部署细节两层问题。5.1 用测试集算mAP0.5和mAP0.5:0.95别只看loss训练时的验证集指标有参考意义但最终要用单独划分的测试集评估。因为验证集用于选模型和调参模型已经在验证集上暴露过多次不能代表真实效果。测试集评估时重点看两个指标mAP0.5和mAP0.5:0.95。mAP0.5判断的是“框大概准就行了”在养殖场这种密集场景下框的定位偏差直接关联到“这到底是哪只鸡”所以mAP0.5:0.95更有参考价值它对框的精度要求更严格。评估流程上我一般会单独跑一遍验证命令输出每一类的AP# 用best.pt在测试集上评估 python val.py \ --data dataset_root/data.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --task test \ --conf-thres 0.25 \ --iou-thres 0.45--conf-thres是置信度阈值低于这个值的预测框会被过滤--iou-thres是NMS的IoU阈值。测试时这两个值的设定会影响最终mAP数值调模型阶段用默认的0.25和0.45保持一致才能横向对比不同权重的好坏。如果只是看单类AP在输出结果里找到每个类别的precision和recall即可。5.2 部署场景的三个变量光照、遮挡、机位角度训练数据是死的养殖场是活的。模型从数据集上训练出来部署后面对的第一个问题就是数据分布漂移光照变化、鸡只生长阶段、机位安装角度都会让场景与训练数据产生偏差。光照养殖场内光源相对固定但白天到夜晚的色温变化、日光灯频闪都会影响图片质量。模型如果对光照敏感同一条产线早晚两个时段的表现会不同。这个数据集的图像如果多数是同一时段拍的部署时要额外补拍傍晚和夜间的图像做测试。遮挡鸡只群体活动时互相遮挡严重尤其是异常鸡只往往趴着不动容易被其他鸡挡住。遮挡导致的漏检在产线上是主要误差来源。我的习惯是部署前单独准备一批“遮挡严重”的图片统计模型在遮挡程度不同的样本上的recall差异如果遮挡严重时recall低于0.5就要考虑多机位交叉覆盖。机位角度数据集里的图像如果是俯拍部署时摄像头安装在侧壁则视角不同检测效果可能直线下降。安装时尽量还原数据集拍摄角度或者使用多个不同角度的摄像头分别检测综合结果。5.3 模型轻量化从s到n量化对密集场景的影响养殖场边缘设备算力通常有限。如果模型要在IPC、NVR这类设备上实时运行YOLOv5s或更大的模型可能跑不到实时帧率需要轻量化处理。常见路径是换用小模型比如从yolov5s换成yolov5n参数量大约减少一半mAP一般掉1-3个点。如果算力仍然紧张再做FP16半精度推理或INT8量化。量化对密集小目标场景的影响比通用场景更大因为小目标的特征信息本来就少INT8量化的精度损失可能直接导致漏检。我的做法是量化后用第5.1节的测试集重新评估确认mAP下降在可接受范围内再部署。如果INT8掉点超过5个点就不使用量化改为降低输入分辨率或减少检测帧率。肉鸡健康检测不需要每帧都跑每3秒检测一次已经足够因为鸡的异常状态是持续性的不会在几秒内恢复。6. 进阶技巧迁移学习与数据增强让4657张发挥出4万张的效果数据量只有4657张但训练效果可以通过两个方向显著提升迁移学习的策略选择和数据增强参数调优。迁移学习的关键不是“用不用预训练权重”而是“冻结多少层”。拿到预训练权重后前20轮冻结backbone只训练检测头让新数据先教会head适应鸡舍场景20轮之后解冻全部层用较小的学习率微调整个网络。具体做法是前20轮--lr 0.001之后降到0.0001继续跑。这套操作可以让最终mAP比全程不冻结高3到5个点而且收敛更快。数据增强方面YOLO系框架默认的增强策略对这个数据集基本可用但需要调两个参数。第一个是hsv_h色调偏移默认0.015在肉鸡场景下可能略高——鸡舍灯光偏暖颜色是重要的健康判断线索色调偏移太大会让模型对“发白发蔫”的异常特征不敏感我一般降到0.008。第二个是degrees旋转角度默认0.0不要加大——鸡舍里的鸡不会倒着站大幅旋转产生的样本不符合真实分布反而干扰模型。最后一个个人习惯训练完成后备份best.pt和data.yaml命名里带上训练日期、分辨率、epoch数比如best_640ep100_20250101.pt记录全在文件名里。原因是这个方向后续迭代很快每次可能训练出十几个模型如果不做标记两天后就分不清哪个版本的参数是什么只能重训血泪教训。这个方案做完回头看核心其实不是训练命令而是数据质量的管理。从解压、校验格式、划分数据集、调参训练到最后的评估和部署每一步都在和数据分布打交道。希望帮到你。本文还有配套的精品资源点击获取