简介:本资源面向计算机视觉学习者与养殖智能化研究者,提供YOLOv5养殖场肉鸡健康状态检测的权重文件与配套数据集,可用于识别肉鸡异常与正常两类状态,适用于目标检测训练、模型微调及课程实践等场景。压缩包共983个文件,约58.62MB,包含441张jpg图像、435个txt标签、29个yaml配置、24个py脚本及3个pt权重,另有少量pyc、yml、sh、png、md等辅助文件,覆盖数据、代码与配置全流程。数据集已按train、val、test划分完毕,并附data.yaml,标注nc为2、类别为Abnormal与Normal,yolov5、yolov7、yolov8、yolov9等算法可直接读取训练。目前已有146人学习,读者可借此快速复现检测流程、验证模型效果,并参考作者博文中的检测结果与目录结构,减少环境配置与数据整理成本。
1. 养殖场里那点事:为什么肉鸡健康检测值得用 YOLOv5 认真做一遍
肉鸡养殖最怕的不是行情波动,而是鸡群生病没被及时发现。一个万只规模的鸡舍,饲养员每天巡棚两三次,靠肉眼判断哪只鸡精神萎靡、羽毛蓬乱、缩脖呆立,漏检率其实很高。等到大面积出现症状,投药成本、死淘率、料肉比全都跟着恶化。我接触过几个做智慧养殖的团队,他们共同的诉求很朴素:能不能用摄像头加一套目标检测模型,自动把“看起来不对劲”的鸡挑出来,哪怕只是给饲养员一个提示,也比重头翻一遍强。
YOLOv5 养殖场肉鸡健康状态检测权重加数据集,这个标题拆开看就是三件事:一个开箱可用的检测权重、一份标注好的肉鸡健康状态数据集、以及把它们跑起来做推理或再训练的完整路径。它解决的是“从零标注太贵、从零训练太慢”的问题,适合两类人:一类是想快速验证养殖场景 AI 可行性的开发者,另一类是有自己鸡舍数据、想拿现成权重做微调的工程人员。下面我按自己落地的顺序,把选型、数据、训练、推理和踩坑讲清楚。
2. 权重和数据集到底给了什么:先看清再动手
2.1 健康状态检测的类别定义与标注口径
肉鸡健康状态检测不是简单的“鸡”和“非鸡”二分类。实际落地时,类别定义直接决定模型能不能用。常见的做法是把状态分成三类到五类,比如健康、精神萎靡、跛行、羽毛异常、拥挤堆叠。类别太少,模型学不到区分度;类别太多,标注一致性会崩。我一般建议先做三分类:健康、疑似异常、明显异常。这样标注员容易统一口径,模型也容易收敛。
标注格式上,YOLOv5 用的是 YOLO 格式的 txt 文件,每行是class_id x_center y_center width height,坐标全部归一化到 0 到 1。数据集目录通常长这样:
dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml里写清楚train、val路径、nc类别数和names类别名。这里有个容易翻车的点:图片和标签文件名必须一一对应,扩展名不同但主名相同。我见过有人把img001.jpg对应的标签写成img001.txt放在另一个文件夹,结果训练时找不到标签,loss 直接不降。
2.2 权重文件的来源与适用边界
标题里的“权重”通常指在肉鸡健康状态数据集上训练好的.pt文件。它可能是官方 YOLOv5s/m/l 在自定义数据上微调后的结果,也可能是从某个基线模型继续训练的。拿到权重后,第一件事不是直接上生产,而是用验证集跑一遍,看 mAP、precision、recall 和混淆矩阵。如果 recall 偏低,说明漏检多,养殖场景里漏检比误检更致命,因为漏掉一只病鸡可能传染一片。
权重的适用边界要心里有数:训练数据来自哪个日龄段、什么光照条件、什么拍摄角度,权重就偏向那个分布。拿 30 日龄、白炽灯、俯拍的数据训出来的权重,直接用到 10 日龄、自然光、侧拍场景,效果会打折扣。这不是模型不行,是域偏移。常见做法是先用权重做推理,把置信度低的样本挑出来人工复核,再把这些样本加入训练集做增量微调。
2.3 用 conda 把 YOLOv5 环境跑起来的最小命令
环境这块,我习惯用 conda 建独立环境,避免和系统 Python 打架。YOLOv5 对 PyTorch 和 CUDA 版本比较敏感,版本对不上会报各种玄学错误。下面是一套我验证过能跑通的命令,具体版本按你显卡驱动调整。
# 创建环境,Python 用 3.8 或 3.9 比较稳 conda create -n poultry_yolo python=3.9 -y conda activate poultry_yolo # 安装 PyTorch,CUDA 11.3 对应 cu113,没有 GPU 就用 cpu 版本 pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html # 克隆 YOLOv5 仓库并安装依赖 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt逻辑说明:先隔离环境,再装和 CUDA 匹配的 PyTorch,最后装 YOLOv5 依赖。参数上,torch==1.12.1+cu113里的cu113表示 CUDA 11.3 编译版,如果你驱动是 11.6 以上,可以换 cu116。没有 GPU 就把+cu113去掉装 CPU 版,但训练会慢到怀疑人生。装完用python -c "import torch; print(torch.cuda.is_available())"验证,返回 True 才算 GPU 可用。
3. 从数据到权重:训练和验证的完整链路
3.1 数据集划分与 data.yaml 配置
拿到数据集后,别急着训练。先检查类别分布,如果某一类样本特别少,比如“跛行”只有几十张,模型会偏向多数类。我一般会做两件事:一是统计每类实例数,二是把长尾类别做简单过采样或增强。划分比例上,train:val 用 8:2 或 7:3,验证集要覆盖不同光照和日龄,不能全是一个棚的。
data.yaml的写法如下:
# 数据集路径,建议写绝对路径避免找不到 train: /data/poultry/images/train val: /data/poultry/images/val # 类别数 nc: 3 # 类别名,顺序要和标注时的 class_id 一致 names: ['healthy', 'suspicious', 'abnormal']逻辑说明:train和val指向图片目录,YOLOv5 会自动去找同级的labels目录。nc必须和 names 长度一致,否则训练时报维度错误。names 的顺序一旦定了就不能改,改完必须重新标注或映射,否则模型学到的类别会错位。
3.2 用预训练权重做微调的训练命令与参数
训练时我一般从 YOLOv5s 或 YOLOv5m 的官方预训练权重起步,这样收敛快。命令如下:
# 从 yolov5s.pt 微调,输入尺寸 640,batch 16,训练 100 轮 python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data /data/poultry/data.yaml \ --weights yolov5s.pt \ --project runs/train \ --name poultry_exp1 \ --cache逻辑说明:--img 640是输入分辨率,鸡舍远景图里鸡只占像素少,可以提到 1280,但显存要够。--batch 16看显存调,8G 显存跑 640 一般能到 16,跑 1280 可能只能到 4。--weights yolov5s.pt表示用官方预训练权重初始化,不写就是从零训练,效果通常差很多。--cache把图片缓存到内存,加快读取,但数据集大时吃内存。训练完权重在runs/train/poultry_exp1/weights/best.pt。
3.3 验证集评估:看哪些指标才不白跑
训练完别只看 loss 曲线,要用验证集跑val.py:
python val.py \ --data /data/poultry/data.yaml \ --weights runs/train/poultry_exp1/weights/best.pt \ --img 640 \ --conf 0.25 \ --iou 0.45逻辑说明:--conf 0.25是置信度阈值,低于这个值的框不算。--iou 0.45是 NMS 的 IoU 阈值,控制重叠框合并。输出里重点看mAP@0.5和mAP@0.5:0.95,前者宽松后者严格。养殖场景我更关注每一类的 recall,如果“abnormal”类 recall 低于 0.7,说明漏检严重,得回去补样本或调低 conf。混淆矩阵能看出类别之间有没有混,比如“suspicious”被大量判成“healthy”,那就是特征不够区分。
4. 推理部署:把权重变成鸡舍里能用的检测
4.1 单张图片和视频流的推理命令
推理用detect.py,单张图:
python detect.py \ --weights runs/train/poultry_exp1/weights/best.pt \ --source /data/test/chicken_001.jpg \ --img 640 \ --conf 0.3 \ --save-txt视频流或摄像头:
python detect.py \ --weights runs/train/poultry_exp1/weights/best.pt \ --source /data/videos/shed.mp4 \ --img 640 \ --conf 0.3 \ --view-img逻辑说明:--source可以是图片、视频、目录或摄像头编号。--save-txt把检测框坐标存成 txt,方便后续统计。--view-img实时显示,调试时用,生产环境去掉。--conf 0.3比验证时略高,减少误报,因为鸡舍里误报多了饲养员会烦。
4.2 用 Python 脚本批量统计异常鸡只数量
实际部署时,饲养员要的不是一张张画框图,而是“这个棚今天有多少只异常”。下面这段脚本读检测结果,按类别计数:
import os from collections import Counter # 检测结果 txt 目录,每行 class_id x y w h conf result_dir = "runs/detect/exp/labels" class_names = ['healthy', 'suspicious', 'abnormal'] counter = Counter() for txt_file in os.listdir(result_dir): if not txt_file.endswith(".txt"): continue with open(os.path.join(result_dir, txt_file), "r") as f: for line in f: parts = line.strip().split() if len(parts) < 5: continue cls_id = int(parts[0]) counter[class_names[cls_id]] += 1 print("本批次检测统计:") for name, count in counter.items(): print(f"{name}: {count} 只")逻辑说明:遍历 labels 目录下每个 txt,按行解析 class_id,累加计数。参数上,class_names顺序必须和 data.yaml 一致。这个脚本可以改成按棚、按时间段统计,接上数据库就能做趋势报警。注意检测框有重叠时会计重复,生产环境要加 NMS 后处理或按跟踪 ID 去重。
4.3 导出 ONNX 或 TensorRT 做边缘部署
鸡舍现场往往没有服务器,用 Jetson 或工控机跑推理更现实。YOLOv5 支持导出 ONNX 和 TensorRT:
# 导出 ONNX python export.py \ --weights runs/train/poultry_exp1/weights/best.pt \ --include onnx \ --img 640 \ --batch 1 # 导出 TensorRT,需要 GPU 和 tensorrt 环境 python export.py \ --weights runs/train/poultry_exp1/weights/best.pt \ --include engine \ --img 640 \ --batch 1 \ --device 0逻辑说明:--include onnx生成.onnx文件,跨平台好使。--include engine生成 TensorRT 引擎,在 NVIDIA 设备上速度最快,但和硬件绑定,换设备要重新导出。--batch 1是推理 batch,边缘设备一般单张跑。导出后可以用trtexec或 Python 的onnxruntime加载测试,确认输出节点和 YOLOv5 后处理对得上。
5. 避坑与排查:那些让我返工三次的细节
5.1 训练 loss 不降,先查标签和路径
现象:训练几个 epoch 后 box_loss 和 cls_loss 几乎不动,mAP 接近零。原因通常是标签路径不对或标签格式错。YOLOv5 找不到标签时不会报错,而是当负样本处理。解决:用python utils/general.py里的检查逻辑,或者手动写脚本确认每张图都有对应 txt,且每行是 5 个值、坐标在 0 到 1 之间。我习惯先跑 10 个 epoch 看 loss 有没有下降趋势,不降就停,别浪费卡。
5.2 验证集 mAP 高但现场漏检多
现象:验证集 mAP@0.5 到 0.9,拉到鸡舍里跑,病鸡漏检严重。原因是验证集和现场分布不一致,比如验证集都是清晰近景,现场是远距离俯拍。解决:从现场视频里抽帧,人工标一批难样本,加入训练集做微调。另外把推理--img提到 1280,小目标更容易检出。如果还不行,考虑切图推理,把大图切成小块分别检测再合并。
5.3 显存溢出导致训练中断
现象:训练到一半报 CUDA out of memory。原因是 batch 或 img 太大,或者--cache把内存吃满。解决:先把--batch减半,再把--img从 1280 降到 640。如果用了--cache,去掉它。还可以开--amp混合精度,省显存且速度更快。我一般先用小 batch 跑通,再逐步往上加,找到显存上限。
5.4 类别不平衡导致异常类 recall 低
现象:健康类检测很准,异常类 recall 只有 0.5 左右。原因是异常样本少,模型偏向多数类。解决:在 data.yaml 里加class_weights或者在训练时用--balance类平衡采样。更直接的办法是对异常类做数据增强,比如随机裁剪、亮度调整、加噪声,把样本量补到健康类的三分之一以上。还可以调低异常类的置信度阈值,用召回换精确。
5.5 导出 ONNX 后输出对不上
现象:PyTorch 推理正常,导出 ONNX 后框全乱或数量不对。原因是导出时的输入尺寸、anchor 配置和后处理没对齐。解决:导出时--img和训练时一致,--batch 1。加载 ONNX 后先看输出 shape,YOLOv5 的输出通常是[1, 25200, 85]这种,85 是 4 个坐标加 1 个 obj 加 80 类,你的类别数不同,最后一维是5 + nc。后处理里的 anchor 和 stride 要从训练配置里读,不能硬编码。
6. 把检测做成闭环:几个让方案真正落地的小技巧
权重和数据集只是起点,真正让养殖场愿意用的是闭环。我一般会加三个东西:第一是置信度分级,把检测结果分成高置信、中置信、低置信,高置信直接报警,中置信推给人工复核,低置信丢弃。这样既不漏,也不至于天天误报。第二是按区域统计,把鸡舍画面划成几个区,分别统计异常数量,饲养员能直接定位到哪个区域有问题。第三是时间序列,把每天同一时段的异常数画成曲线,连续上升就提前预警,而不是等爆发。
验证方法上,我习惯用一段没参与训练的现场视频做盲测,人工数一遍异常鸡只,再和模型输出对比,算一个简单的准确率和召回率。这个数字比验证集 mAP 更有说服力,因为它是真实场景。如果召回低于 0.8,就回去补样本;如果误报太多,就调高 conf 或加后处理规则,比如连续三帧都检测到才报警。
最后说个我自己的教训:别一上来就追求大模型。YOLOv5s 在鸡舍场景里往往够用,推理快、显存小、边缘设备跑得动。我见过有人非要用 YOLOv5x,结果 Jetson 上跑不到 5 帧,最后还得换回来。先用小模型跑通闭环,再根据漏检情况决定要不要换大模型,这个顺序能省很多时间。希望帮到你。
本文还有配套的精品资源,点击获取