简介本资源面向智慧养殖与计算机视觉方向的开发者、研究生及算法工程师提供一套可直接用于养殖场生猪行为状态检测的YOLOv5训练权重与配套数据集解决猪只进食、站立、躺卧、攻击等四类行为识别模型的快速搭建与验证问题。压缩包共约2000个文件以jpg图像、txt标签为主另含py脚本、yaml配置、sh运行脚本及少量xml、md、pdf说明文档整体约274MB数据集已按train、val、test划分并配置好data.yamlYOLOv5、v7、v8、v9等主流框架均可直接开训。资源内附训练权重与完整目录结构便于复现检测效果、迁移到自有场景或作为课程设计、论文实验的基线方案。目前已有447人学习下载适合希望快速上手养殖场景目标检测的读者参考使用。1. 养殖场里跑 YOLOv5这套生猪行为检测权重和数据集到底能干什么去年帮一个做智慧养殖的朋友看现场他们最头疼的不是摄像头装多少而是猪舍里那几头猪到底在打架还是在吃食靠人盯屏幕根本盯不过来。这套资源就是冲着这个场景来的一份基于 YOLOv5 训练好的生猪行为状态检测权重配 1000 多张养殖场实拍数据集标签分四类——eat、stand、lie、attack还带一个 PyQt 可视化界面。数据集目录已经按 train、val、test 划好data.yaml 也配好了YOLOv5、YOLOv7、YOLOv8、YOLOv9 都能直接拿去训练。适合两类人一类是想快速验证猪只行为识别可行性的算法工程师另一类是要做养殖场智能化改造、需要现成权重和界面撑起 demo 的开发者。下面我按自己拆包复现的顺序把这份资源从结构到跑通再到避坑讲一遍。2. 拆开资源包目录结构、data.yaml 与四类标签的对应关系2.1 数据集目录长什么样先看 train.cache 和 val.cache拿到包之后别急着跑训练先把目录树看清楚。这份资源里最显眼的是 train.cache 和 val.cache 两个缓存文件它们不是图片是 YOLOv5 在第一次扫描数据集时生成的标签缓存用来加速后续 epoch 的读取。如果你换了数据集路径或者改了标签这两个文件必须删掉重建否则训练时读到的还是旧缓存loss 会莫名其妙不降。图片文件名里带 .rf. 那一长串是 Roboflow 导出时生成的唯一标识不影响使用但说明这批图经历过在线标注和增强导出分辨率可能被统一过。常见做法是先把包解压到一个纯英文路径下比如 D:\pig_behavior路径里不要有中文和空格YOLOv5 的 dataloader 在 Windows 下对中文路径兼容性一般。解压后你会看到 images 和 labels 两个大目录各自下面再分 train、val、test。labels 里是 txt 格式标签每行五个值类别索引、归一化中心 x、归一化中心 y、归一化宽、归一化高。类别索引 0 到 3 分别对应 data.yaml 里的顺序。2.2 data.yaml 四个参数怎么读nc 和 names 别写反data.yaml 是整份资源的入口配置内容不长但每个字段都关键# 生猪行为检测数据集配置 path: ./pig_dataset # 数据集根目录相对路径或绝对路径都行 train: images/train # 训练集图片目录相对 path val: images/val # 验证集图片目录 test: images/test # 测试集图片目录 nc: 4 # 类别数必须和 names 长度一致 names: - eat # 0 进食 - stand # 1 站立 - lie # 2 躺卧 - attack # 3 攻击/打架这里有个血泪经验nc 写成 4 但 names 只列了 3 个YOLOv5 启动时不会立刻报错而是在算 loss 的时候维度对不上才崩报错信息还指向模型输出层容易误判成权重问题。另外 path 如果写相对路径它是相对于你执行训练命令时所在的目录不是相对于 data.yaml 所在目录这点和很多人直觉相反。我一般直接把 path 写成绝对路径省得来回调。2.3 1000 张图够不够四类样本分布先统计再训练1000 多张图对四分类行为检测来说属于能跑但偏紧的规模。eat、stand、lie 这三类通常样本多attack 因为打架是偶发行为标注数量往往最少。训练前建议先跑一段统计脚本看看每类框的数量心里有数import os from collections import Counter label_dir rD:\pig_behavior\labels\train counter Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: cls int(line.split()[0]) # 每行第一个值是类别索引 counter[cls] 1 names [eat, stand, lie, attack] for i, n in enumerate(names): print(f{n}: {counter[i]} 个标注框)跑完如果 attack 明显少于其他类训练时就要考虑给 attack 加权或者用 mosaic、mixup 增强时注意别把 attack 样本淹掉。YOLOv5 默认的 copy-paste 增强对小类别有帮助但猪只场景里粘贴的猪和背景光照不匹配反而可能引入噪声这个后面避坑章节细说。3. 用这份权重和数据集跑通训练从环境到第一个 epoch3.1 环境配置conda 建环境、装依赖、验证 torch 能用 GPUYOLOv5 的环境配置是老生常谈但每次换机器都得走一遍。我一般用 conda 建一个干净环境Python 版本选 3.8 到 3.10 之间太新了有些依赖轮子还没跟上conda create -n pig_yolo python3.9 -y conda activate pig_yolo # 克隆 YOLOv5 源码注意选和你权重匹配的版本分支 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt # 验证 GPU 是否可用 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))最后一行如果输出 False说明 CUDA 和 torch 版本没对上别急着往下跑训练否则会用 CPU 硬扛一个 epoch 能等到天亮。常见做法是去 PyTorch 官网按你的 CUDA 版本重新装 torch而不是直接用 requirements.txt 里锁定的版本。requirements.txt 里的 torch 版本是作者当时的环境不一定适配你的显卡驱动。3.2 加载预训练权重做迁移学习还是从零训这份资源自带训练权重意味着你有两个选择一是直接用权重做推理验证效果二是在此基础上继续微调。如果你自己的场景和养殖场猪舍接近直接推理就行。如果光照、角度、猪的品种差异大建议用这份权重做初始化再拿自己的数据微调学习率调小到 0.001 左右。# 方式一直接用自带权重推理一张图 python detect.py --weights pig_best.pt --source test_images/ --conf 0.4 # 方式二用自带权重做初始化在数据集上继续训练 python train.py \ --weights pig_best.pt \ --data data/pig_behavior.yaml \ --epochs 100 \ --batch-size 16 \ --img 640 \ --lr0 0.001 \ --name pig_finetune--weights 指向自带权重--data 指向你改好路径的 data.yaml--img 640 是输入分辨率猪舍摄像头如果是 1080P缩到 640 后小猪仔可能只剩十几个像素检测会漏这种情况可以把 img 提到 960但显存占用会明显上升。--batch-size 16 在 8G 显存上跑 640 分辨率基本够用爆显存就降到 8。3.3 训练过程看什么loss 曲线、mAP 和混淆矩阵训练启动后别只盯着进度条重点看三个东西。第一是 box_loss 和 cls_loss 是否稳定下降如果 cls_loss 震荡厉害多半是学习率偏大或者 batch 太小。第二是验证集 mAP0.5YOLOv5 每个 epoch 结束会打印四分类任务里 attack 的 AP 通常最低如果它长期低于 0.3说明样本太少或特征不明显。第三是训练结束后生成的 confusion_matrix.png能直观看到哪两类容易混比如 lie 和 stand 在猪侧躺伸展时可能互相误判。# 训练完成后用验证集跑一遍输出各类别 AP python val.py \ --weights runs/train/pig_finetune/weights/best.pt \ --data data/pig_behavior.yaml \ --img 640 \ --task valval.py 输出的结果里每一类的 P、R、mAP0.5 都会列出来。如果 eat 的召回率明显低于精确率说明漏检多可能是进食时猪头被料槽挡住这种样本在标注时容易被标成 stand需要在数据层面复查。4. PyQt 界面怎么接检测结果从推理脚本到可视化窗口4.1 PyQt 界面和 YOLOv5 推理的衔接方式这份资源带的 PyQt 界面核心逻辑是把 detect.py 的推理流程封装成一个可调用的函数界面负责选图片、选视频、显示结果。常见做法是用 QThread 把推理放在子线程主线程只管刷新 QLabel 显示画面否则推理一卡窗口就假死。界面里一般会有置信度阈值滑块、IoU 阈值滑块、模型路径选择框这几个控件。from PyQt5.QtCore import QThread, pyqtSignal import cv2 import torch class DetectThread(QThread): frame_signal pyqtSignal(object) # 把带框的帧发回主线程 def __init__(self, model, source, conf0.4): super().__init__() self.model model self.source source self.conf conf self.running True def run(self): cap cv2.VideoCapture(self.source) while self.running and cap.isOpened(): ret, frame cap.read() if not ret: break # YOLOv5 推理model 是 torch.hub 加载的模型 results self.model(frame, size640) annotated results.render()[0] # 拿到画好框的帧 self.frame_signal.emit(annotated) cap.release() def stop(self): self.running False这段代码的关键点是 frame_signal 把 numpy 数组直接传给主线程的槽函数槽函数里再转成 QImage 显示。注意 results.render() 返回的是列表取第一个元素。如果界面显示颜色不对多半是 OpenCV 的 BGR 和 Qt 的 RGB 没转换加一行 cv2.cvtColor 就行。4.2 置信度阈值和 IoU 阈值在界面里怎么调界面上的两个滑块对应 detect.py 里的 --conf 和 --iou。conf 控制多低的置信度才保留框猪只场景里建议 0.35 到 0.5 之间太低会把料槽、栏杆误检成猪太高会漏掉被遮挡的猪。iou 控制 NMS 的合并阈值猪群密集时两只猪挨得近iou 设太高会把其中一只框吞掉设 0.45 左右比较稳。参数作用猪舍场景建议值调高后果调低后果conf置信度过滤0.35~0.5漏检增多误检增多iouNMS 合并阈值0.4~0.5密集猪只漏框同一猪多个框img推理分辨率640~960显存涨、速度降小猪漏检调参这事没有万能值我一般先在验证集上跑几组 conf 和 iou 的组合看 mAP 和误检情况再定界面默认值。界面上让用户能实时拖比写死在代码里实用得多。4.3 视频流推理的帧率优化别让界面拖垮检测速度视频推理时最容易翻车的是界面刷新比推理慢导致帧堆积、延迟越来越大。解决办法是推理线程里只保留最新一帧旧帧直接丢。可以在 run 循环里加一个判断如果 frame_signal 还没处理完就跳过当前帧的显示只做检测。另外 YOLOv5 的 model 加载时用 halfTrue 开半精度在支持 FP16 的显卡上能快不少但精度会掉一点点猪只行为检测这种任务基本无感。# 半精度推理显存和速度都有改善 model torch.hub.load(ultralytics/yolov5, custom, pathpig_best.pt) model.half() # 转 FP16 model.conf 0.4 model.iou 0.45如果界面还是卡检查是不是在子线程里做了图像格式转换和缩放这些操作尽量放到主线程或者用 OpenCV 的 GPU 模块。猪舍现场如果是多路摄像头建议每路一个线程但模型可以共享YOLOv5 的 model 对象在多线程下推理要注意加锁否则可能出玄学错误。5. 避坑与排查这份资源实际用起来最容易翻车的五个点5.1 现象训练 loss 一直是 nan原因标签里有归一化坐标越界解决清洗标签YOLOv5 对标签坐标要求是 0 到 1 之间的归一化值如果标注时框超出图片边界导出的 txt 里会出现大于 1 或小于 0 的值训练几个 step 后 loss 直接变 nan。排查方法是写个脚本扫一遍所有标签文件把越界的行揪出来。解决要么重新标注要么用脚本把坐标裁剪回 0 到 1。import os def check_labels(label_dir): bad [] for f in os.listdir(label_dir): if not f.endswith(.txt): continue path os.path.join(label_dir, f) with open(path) as fp: for i, line in enumerate(fp): parts line.strip().split() if len(parts) ! 5: bad.append((f, i, 字段数不对)) continue vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): bad.append((f, i, 坐标越界)) return bad for f, i, msg in check_labels(rD:\pig_behavior\labels\train): print(f, i, msg)5.2 现象换了数据集路径后训练读不到图原因train.cache 没删解决删缓存重建前面提过 train.cache 和 val.cache很多人改了 data.yaml 里的路径训练却还是报找不到图片或者读到的还是旧图。原因就是 YOLOv5 优先读 cache 文件里面的路径是上次生成的。解决办法很简单把 labels 目录下的 train.cache 和 val.cache 删掉重新跑训练YOLOv5 会自动重建。这个坑我踩过不止一次后来养成习惯只要动了数据集就先删 cache。5.3 现象attack 类几乎检测不出来原因样本太少且增强过度解决加权或单独采样attack 是四类里最难的样本少、动作快、遮挡多。如果训练时开了 mosaic 和 mixup小类样本被大量拼接和混合模型更难学到 attack 的特征。常见做法是关掉 mixup把 mosaic 概率降到 0.5或者在 loss 里给 attack 类更高的权重。YOLOv5 本身不直接支持类别加权但可以在数据集层面做 oversampling把 attack 样本复制几份参与训练。5.4 现象PyQt 界面显示的画面颜色发蓝原因BGR 和 RGB 没转换解决cvtColorOpenCV 读进来是 BGRQt 的 QImage 默认按 RGB 解析不转换的话猪会变成蓝色。解决就是在把帧转成 QImage 之前加一行 cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)。这个坑几乎每个第一次接 PyQt 和 OpenCV 的人都会遇到记住就行。5.5 现象推理速度突然变慢原因模型没切 eval 模式或没加 no_grad解决补上YOLOv5 的 model 如果忘了调 model.eval()BatchNorm 和 Dropout 还在训练模式推理结果不稳定且慢。另外推理时要用 torch.no_grad() 包住否则会建计算图显存越吃越多。这两行加上之后速度通常能快 20% 以上。model.eval() with torch.no_grad(): results model(frame, size640)6. 进阶技巧把这份权重用到树莓派或边缘盒子上这套资源在服务器上跑通只是第一步养殖场现场往往要在边缘设备上部署。我试过把 YOLOv5 权重转到 ONNX 再量化成 INT8在树莓派 5 上跑 640 分辨率大概能到 5 到 8 FPS够做低频行为统计但实时打架报警就有点勉强。导出 ONNX 的命令不复杂python export.py --weights pig_best.pt --include onnx --img 640 --opset 12导出后可以用 onnxruntime 加载也可以再用 TensorRT 或 OpenVINO 进一步加速。量化的时候注意校准集要覆盖猪舍的典型光照否则 INT8 精度掉得厉害attack 类可能直接消失。另一个技巧是把四分类拆成两级先检测猪只位置再对每个框做行为分类这样小目标检测的压力小一些attack 的召回率反而可能提升。验证量化后模型有没有掉点别只看 mAP要拿一段真实猪舍视频跑一遍人工数一下漏检和误检。我一般会抽 200 帧做对比如果 attack 漏检超过两成就放弃 INT8 回到 FP16。从那以后我每次部署边缘模型都强制走一遍「导出→量化→真实视频抽帧对比」的流程不再只看验证集数字。希望帮到你。本文还有配套的精品资源点击获取