YOLOv5养殖场肉鸡健康检测:权重数据集与微调部署全解析

发布时间:2026/10/14 15:09:55
YOLOv5养殖场肉鸡健康检测:权重数据集与微调部署全解析
简介本资源面向从事智慧养殖与计算机视觉的开发者、学生及科研人员提供YOLOv5养殖场肉鸡健康状态检测的权重文件与配套数据集用于识别肉鸡异常与正常两类状态可直接支撑目标检测训练与推理任务。压缩包共983个文件约58.62MB包含441张jpg图像、435个txt标签、29个yaml配置、24个py脚本及3个pt权重等覆盖数据、配置、训练与部署脚本。数据集已按train、val、test划分完毕并附data.yamlnc为2类别为Abnormal与Normalyolov5、yolov7、yolov8、yolov9等算法均可直接训练。目前已有146人学习。读者可获得开箱即用的检测权重、规范标注数据与完整目录结构便于快速复现实验、迁移到自有养殖场景或作为课程与项目基线。1. 养殖场肉鸡健康巡检的模型起点这份权重和数据集到底能干什么养殖场里最怕的不是死鸡是那种看着还站着、其实已经蔫了的亚健康鸡。等它明显趴窝不动往往已经传染了一圈。人工巡检一天走几万步眼睛看花也未必抓得住早期异常。这份 YOLOv5 养殖场肉鸡健康状态检测权重加数据集解决的就是把「异常/正常」二分类检测从人工目视变成模型自动框选的问题。数据集已经按 train、val、test 切好标签是 txt 格式data.yaml 里 nc 为 2类别就两个Abnormal 和 Normal。权重文件配合这套数据可以直接推理也能拿来继续微调。适合谁做智慧农业视觉检测的开发者、想拿真实养殖场景练手 YOLO 系列的学生、以及需要快速搭一个肉鸡健康巡检原型的工程团队。你不需要从零标注几千张鸡舍图省下的时间够你把精力放在部署和调参上。2. 数据集结构与标签格式先看懂再动手2.1 目录布局与 data.yaml 的对应关系拿到压缩包先别急着训练把目录结构理清楚。这份数据集的典型布局是根目录下分 train、valid、test 三个子集每个子集里各有 images 和 labels 两个文件夹。data.yaml 里写的路径是绝对路径比如E:\python_code\dataset\Chicken_bad_data\train/images这是 Windows 下的写法。如果你在 Linux 或容器里跑必须改成相对路径或挂载后的实际路径否则 YOLO 启动时直接报找不到图片。# data.yaml 关键字段说明 train: ./dataset/Chicken_bad_data/train/images # 训练集图片目录 val: ./dataset/Chicken_bad_data/valid/images # 验证集图片目录 test: ./dataset/Chicken_bad_data/test/images # 测试集图片目录 nc: 2 # 类别数固定为2 names: - Abnormal # 索引0异常鸡只 - Normal # 索引1正常鸡只这里有个容易翻车的点names 的顺序决定了标签里 0 和 1 的含义。如果你自己重新标注把 Abnormal 和 Normal 写反了模型会把病鸡当健康鸡推理结果完全反着来。改完 yaml 后建议用一行 Python 验证路径是否存在。import yaml, os with open(data.yaml, r, encodingutf-8) as f: cfg yaml.safe_load(f) for k in [train, val, test]: p cfg[k] print(k, p, 存在 if os.path.exists(p) else 路径错误)逻辑很直白读 yaml逐个检查三个路径。参数上注意 yaml 里的路径如果是相对路径相对的是你执行训练命令时的工作目录不是 yaml 文件所在目录。很多人把 yaml 放在 dataset 根目录却在上一级目录执行命令结果路径全错。常见做法是 cd 到 yaml 所在目录再跑训练或者干脆写绝对路径。2.2 txt 标签的归一化坐标与 labels.cacheYOLO 格式的标签是每行一个目标格式为class_id x_center y_center width height后四个值都是相对图片宽高的归一化值范围 0 到 1。这份数据集已经转好了你不需要再跑转换脚本。但要注意 labels.cache 文件的存在——YOLOv5 第一次读取标签时会生成缓存之后训练直接读缓存加速。如果你修改了标签内容却没删缓存模型读到的还是旧标签这就是典型的「改了没生效」玄学问题。# 修改标签后强制重建缓存 rm -f train/labels.cache valid/labels.cache test/labels.cache参数说明labels.cache 是二进制缓存不要手动编辑。删除后下次训练会自动重建。如果你在 Docker 里跑注意缓存文件可能被镜像层固化挂载数据卷时确认缓存目录可写。另外 events.out.tfevents 开头的文件是 TensorBoard 日志记录训练过程的 loss 和 mAP 曲线不是数据文件别误删也别当成标签。2.3 训练集、验证集、测试集的划分逻辑这份数据集已经划分好了但你要知道划分是否合理。健康检测场景下如果同一只鸡的连续帧被分到 train 和 val 两边验证指标会虚高因为模型见过几乎一样的图。理想情况是按鸡舍、按时间段划分而不是随机打散。你可以用下面这段代码快速统计三个子集的图片数量和类别分布判断有没有严重不均衡。import os, glob from collections import Counter def count_labels(label_dir): counter Counter() for txt in glob.glob(os.path.join(label_dir, *.txt)): with open(txt) as f: for line in f: cls line.strip().split()[0] counter[cls] 1 return counter for split in [train, valid, test]: img_n len(glob.glob(fdataset/Chicken_bad_data/{split}/images/*)) lbl count_labels(fdataset/Chicken_bad_data/{split}/labels) print(split, 图片数:, img_n, 类别分布:, dict(lbl))逻辑说明遍历每个子集的 labels 目录统计每个类别的框数量。参数上如果 Abnormal 和 Normal 比例超过 1:5训练时建议加类别权重或者用 focal loss。常见做法是先跑一遍统计心里有数再开训别等 mAP 上不去才回头查数据。3. 用这份权重跑推理从单图到批量检测3.1 环境准备与依赖版本权重是 YOLOv5 格式的推理环境需要 PyTorch 和 ultralytics/yolov5 仓库代码。版本上YOLOv5 的权重在不同小版本间基本兼容但如果你用 YOLOv8 的代码去加载 v5 权重会报 state_dict 键名不匹配。常见做法是直接用 YOLOv5 官方仓库clone 下来后安装 requirements。git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt # 确认 torch 版本CPU 推理用 cpu 版即可 python -c import torch; print(torch.__version__)参数说明requirements.txt 里锁定了 torch、torchvision、numpy 等版本。如果你已经有 GPU 环境先装好对应 CUDA 的 torch 再跑这行否则 pip 可能给你装 CPU 版。国内网络拉 GitHub 慢的话用镜像源装依赖但仓库代码本身建议完整 clone别只下单个文件因为推理脚本依赖 utils 目录下的模块。3.2 单张图片推理与结果解读权重文件一般是 best.pt 或 last.pt放在 weights 目录下。推理命令一行搞定但输出目录和置信度阈值要按场景调。python detect.py \ --weights best.pt \ --source ./test_images \ --img 640 \ --conf 0.35 \ --iou 0.45 \ --device 0 \ --save-txt \ --project runs/detect \ --name chicken_test逻辑说明--weights 指定权重路径--source 可以是单图、目录或视频流--img 是推理分辨率训练时用的 640推理保持一致--conf 是置信度阈值健康检测建议 0.3 到 0.4太低会框出大量误检太高会漏掉蔫鸡--iou 是 NMS 的 IoU 阈值鸡只密集时调到 0.5 以上减少漏框--device 0 表示第一块 GPUCPU 推理写 cpu--save-txt 会输出每张图的检测框坐标方便后续统计。跑完在 runs/detect/chicken_test 下看结果图重点看 Abnormal 框有没有漏。3.3 批量检测与结果统计养殖场巡检往往是几千张图或一段视频单张跑太慢。把 source 指向目录YOLOv5 会自动遍历。如果你想统计每张图里异常鸡的数量解析 save-txt 输出的标签文件即可。import os, glob def summarize(result_dir): total_abnormal 0 total_normal 0 for txt in glob.glob(os.path.join(result_dir, labels, *.txt)): with open(txt) as f: for line in f: cls int(line.split()[0]) if cls 0: total_abnormal 1 else: total_normal 1 print(异常框数:, total_abnormal, 正常框数:, total_normal) summarize(runs/detect/chicken_test)逻辑说明遍历输出标签按类别累加。参数上注意 save-txt 输出的类别索引和 data.yaml 的 names 顺序一致0 是 Abnormal。这个统计可以接到报警逻辑里如果某张图异常框超过阈值就标记该区域需要人工复查。常见做法是把结果写进 CSV按时间戳排序方便追踪鸡舍健康趋势。4. 微调训练让权重适配你自己的鸡舍4.1 训练命令与关键超参这份权重可以直接推理但如果你自己的鸡舍光照、角度、鸡种和数据集差异大微调能明显提升。YOLOv5 训练命令如下重点是 --data 指向你的 yaml--weights 加载预训练权重。python train.py \ --weights best.pt \ --data data.yaml \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --workers 4 \ --hyp data/hyps/hyp.scratch-low.yaml \ --project runs/train \ --name chicken_finetune逻辑说明--weights best.pt 表示在已有权重上继续训练比从头训收敛快--batch 16 是常见起点显存不够就降到 8--epochs 100 对微调足够如果数据量小可以降到 50--workers 是数据加载线程Windows 下建议设 0 或 2 避免多进程报错--hyp 用 low 增强配置因为养殖场图片本身变化不大过度增强反而有害。训练过程中看 runs/train/chicken_finetune 下的 results.csv重点盯 mAP0.5 和 val loss。4.2 学习率与冻结层的取舍微调时学习率不能太大否则预训练权重被冲垮。YOLOv5 默认用余弦退火初始 lr0 在 hyp 文件里。如果你数据量少于 2000 张建议把 lr0 降到 0.001 甚至 0.0005。另外可以冻结 backbone 前几层只训检测头。# 冻结前10层 python train.py --weights best.pt --data data.yaml --freeze 10 --epochs 80参数说明--freeze 10 表示冻结前 10 层这些层提取的是通用纹理特征鸡舍场景和通用物体有重叠不必重训。冻结后显存占用降低训练速度提升。但如果你数据量和原数据集差异极大比如从室内鸡笼换到户外散养冻结太多反而限制模型适应这时候 freeze 设 0 全量微调更稳。我一般先 freeze 10 跑一轮看 mAP如果验证集指标低于预期再解冻全量跑。4.3 训练过程监控与早停训练不是跑满 epoch 就好过拟合了反而坏事。YOLOv5 自带早停 patience 参数默认 100意思是连续 100 轮验证指标没提升就停。你可以调小到 30省时间。python train.py --weights best.pt --data data.yaml --patience 30 --epochs 150逻辑说明patience 30 表示 30 轮无提升就停。参数上配合 --save-period 可以定期存 checkpoint防止训练中断丢进度。监控时打开 TensorBoard看 train/box_loss 和 val/box_loss 是否背离背离就是过拟合信号。常见做法是保存 best.pt 和 last.pt 两个权重best.pt 用于推理last.pt 用于恢复训练。5. 避坑与排查那些让模型「看着能跑其实废了」的细节5.1 路径报错data.yaml 里的反斜杠与工作目录现象训练启动即报FileNotFoundError: train: No such file or directory。原因yaml 里写的是 Windows 绝对路径E:\python_code\...在 Linux 或 Docker 里不存在或者你在错误的工作目录执行命令导致相对路径解析错位。解决把 yaml 里的路径改成相对于执行目录的路径或者用环境变量注入。Docker 里建议把数据挂载到/datayaml 写/data/train/images。5.2 标签缓存不更新改了 txt 但模型学的是旧标签现象修正了部分标签后重新训练指标没变化推理结果还是老样子。原因labels.cache 缓存了旧标签YOLOv5 优先读缓存。解决删除 train、valid、test 下所有 labels.cache再启动训练。注意 Docker 镜像里如果缓存被打进层要挂载可写卷覆盖。5.3 类别不均衡导致 Abnormal 漏检现象mAP 看着不低但实际推理时病鸡漏检严重。原因Normal 样本远多于 Abnormal模型偏向多数类。解决统计类别分布如果 Abnormal 占比低于 20%在 hyp 里调高cls_pw或者用--balance采样。也可以在 loss 里给 Abnormal 更高权重。我一般先跑统计脚本确认比例再决定要不要加权。5.4 推理置信度阈值设太高现象测试图上明明有蔫鸡模型没框出来。原因--conf 默认 0.25但微调后模型对 Abnormal 的输出概率偏低0.25 也可能漏。解决把 --conf 降到 0.15 到 0.2 试一轮看召回率变化。但别降太低否则正常鸡被框成异常巡检员会疲于奔命。常见做法是画 PR 曲线找 Abnormal 类的最优阈值。5.5 Docker 环境下的文件权限与缓存目录现象容器里训练报PermissionError: labels.cache。原因挂载的数据卷只读或者容器内用户对缓存目录没写权限。解决启动容器时加-v /host/data:/data:rw确保可写或者设置环境变量YOLO_CACHE_DIR指向可写目录。Dockerfile 里别把 labels.cache 复制进去让它运行时生成。6. 进阶技巧把检测结果接进巡检流程6.1 用置信度分层做二次复核模型输出的每个框都有置信度别一刀切。我一般把 Abnormal 框按置信度分三档高于 0.6 直接报警0.3 到 0.6 标记待复核低于 0.3 忽略。这样既不会漏掉明显的病鸡也不会让巡检员被低置信度框淹没。实现上解析 save-txt 时多读一列置信度即可。def triage(label_file, high0.6, low0.3): alerts, reviews [], [] with open(label_file) as f: for line in f: parts line.split() cls, conf int(parts[0]), float(parts[5]) if cls 0: if conf high: alerts.append(conf) elif conf low: reviews.append(conf) return alerts, reviews逻辑说明parts[5] 是置信度列YOLOv5 save-txt 格式里坐标占 1 到 4置信度在第 5 位。参数 high 和 low 按你的误检容忍度调。这个分层逻辑可以直接接到巡检 App 的推送规则里。6.2 视频流推理与帧间去重养殖场摄像头是视频流逐帧检测会有大量重复框。常见做法是每 N 帧抽一帧推理或者用跟踪算法给框加 ID同一只鸡只报一次。YOLOv5 的 detect.py 支持 --source 传视频文件或 RTSP 流但去重要自己加。简单方案是记录上一帧的框位置IoU 超过 0.5 就认为是同一目标不重复计数。6.3 模型导出与边缘部署如果要在鸡舍边缘设备上跑把 PyTorch 权重导出成 ONNX 或 TensorRT 能提速。YOLOv5 自带 export.py。python export.py --weights best.pt --include onnx --img 640 --batch 1参数说明--include onnx 导出 ONNX 格式--batch 1 适合边缘单帧推理。导出后可以用 onnxruntime 加载不依赖 PyTorch。注意导出时的 img 尺寸要和推理一致否则精度掉点。导出后建议用几张测试图对比 ONNX 和 PyTorch 的输出确认没偏差再上线。6.4 数据回流与持续迭代上线后把误检和漏检的图存下来定期人工复核后加进训练集重新微调。这个闭环能让模型逐步适应你鸡舍的光照变化和鸡群日龄增长。我一般每两周回流一次每次加几百张用 last.pt 继续训 20 个 epoch。从那以后我每次上线新模型前都强制走一遍「测试集推理 → 分层统计 → 误检抽样」的流程不看到实际框选效果绝不部署。希望帮到你。本文还有配套的精品资源点击获取