ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于YOLOv7的生猪行为检测:数据集、权重与边缘部署实战

基于YOLOv7的生猪行为检测:数据集、权重与边缘部署实战 简介本资源面向智慧养殖与计算机视觉方向的学习者与开发者提供基于YOLOv7的养殖场生猪行为状态检测训练权重及配套数据集可用于猪只进食、站立、躺卧、攻击等四类行为的识别任务适合算法入门、课程设计或实际项目落地参考。压缩包共约2000个文件包含1211个txt标签、680张jpg图像、49个yaml配置、31个py脚本及14个ipynb笔记本等整体约608MB数据集已按train、val、test划分完毕并附data.yaml文件yolov5、yolov7、yolov8、yolov9等算法可直接加载训练。目前已有244人学习下载。资源内还提供TensorRT、ONNXRuntime推理示例及YOLOv7与YOLOv5系列对比实验笔记便于读者快速验证模型效果、理解不同版本差异并在此基础上开展迁移训练与性能调优。1. 养殖场里跑 YOLOv7这套生猪行为检测权重和数据集到底能干什么猪舍里最怕的不是猪不吃食而是半夜两头猪突然打起来没人知道。传统做法靠饲养员巡栏一圈走下来半小时等发现咬尾、压栏、异常躺卧往往已经晚了。这套资源就是冲着这个场景来的一份已经标注好的养殖场生猪行为状态检测数据集加上基于 YOLOv7 训练出来的权重能直接识别 eat采食、stand站立、lie躺卧、attack攻击四类行为。数据集按 train、val、test 划分完毕标签是 txt 格式data.yaml 也配好了yolov5、yolov7、yolov8、yolov9 都能直接拿去训练。压缩包里还塞了 TensorRT、ONNXRuntime 的推理 notebook 和几组 YOLOv7 与 YOLOv5 的对比脚本说明作者不只是丢了个模型而是把训练、验证、部署这条链路都跑过一遍。适合做智慧养殖、行为识别、边缘部署的从业者也适合想拿真实场景数据集练手 YOLO 系列的人。2. 数据集结构与标签格式先搞清楚 nc4 背后怎么组织2.1 data.yaml 与目录约定拿到数据集第一件事不是急着 train而是把目录结构和 data.yaml 对齐。这份资源的 data.yaml 很干净nc: 4 names: - eat - stand - lie - attacknc 是类别数names 的顺序就是标签里 class_id 的映射0 对应 eat1 对应 stand2 对应 lie3 对应 attack。顺序一旦改动标签和权重就全错位这是血泪经验里最常见的一类翻车。目录上常见做法是 images 和 labels 平行放各自再分 train、val、testdataset/ ├── data.yaml ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/YOLO 系列读标签时会按图片路径把 images 替换成 labels 再找同名 txt所以 images 和 labels 下的文件名必须一一对应缺一个标签文件训练时那张图就会被当成背景白白浪费样本。2.2 txt 标签的五个字段每行标签是class_id x_center y_center width height后四个都是归一化到 0~1 的值。这里有两个容易忽略的点一是坐标是相对整张图宽高归一化的不是像素二是 x_center、y_center 是框中心点不是左上角。很多从 VOC 转过来的标注会在这一步出错框整体偏移半格。转换脚本里我一般会加一步校验import os def check_label(path, img_w, img_h): with open(path) as f: for line in f: cls, x, y, w, h map(float, line.split()) # 归一化值必须在 0~1越界说明转换时没除对基准 assert 0 x 1 and 0 y 1, f{path} 中心点越界 assert 0 w 1 and 0 h 1, f{path} 宽高越界 # 框不能超出图像边界 assert x - w/2 -1e-6 and x w/2 1 1e-6, f{path} 左/右越界 assert y - h/2 -1e-6 and y h/2 1 1e-6, f{path} 上/下越界这段校验跑一遍能提前拦掉大部分脏标签。参数上img_w、img_h 要传原图尺寸如果你已经归一化过就不用再除。实际项目里我见过因为标注工具导出时用了缩放后尺寸导致整批框偏小一圈训练 loss 一直下不去最后靠这个断言才定位到。2.3 四类行为的样本分布问题eat、stand、lie、attack 这四类里attack 通常是长尾。猪打架是偶发事件1000 多张图里 attack 可能只占百分之几而 lie 和 stand 占大头。直接训练会出现模型对 attack 召回极低甚至全预测成 lie。常见做法有两种一是对 attack 做过采样复制样本时同步改文件名避免覆盖二是在 loss 里给 attack 更高权重。YOLOv7 本身没有直接的类别权重参数但可以在数据加载阶段用重采样或者训练后用混淆矩阵确认 attack 的召回再决定要不要补数据。别一上来就调网络结构先看数据分布这是我踩过坑之后的习惯。3. 用这套权重和数据集跑训练从环境到第一个 epoch3.1 环境与依赖YOLOv7 官方仓库对 PyTorch 和 CUDA 版本比较敏感。我一般用 Python 3.8 PyTorch 1.12 CUDA 11.3 这套组合比较稳。装依赖时注意 requirements.txt 里的 torch 版本如果你机器上已经装了别的版本别直接覆盖先建虚拟环境conda create -n yolo7 python3.8 -y conda activate yolo7 pip install torch1.12.1cu113 torchvision0.13.1cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt参数说明cu113 对应 CUDA 11.3如果你驱动是 11.6 以上可以换 cu116 的包。requirements.txt 里还有 matplotlib、tqdm 这些别漏。装完跑一句python -c import torch; print(torch.cuda.is_available())返回 True 再往下走否则后面训练会莫名其妙报 device 错误。3.2 从权重出发的两种训练方式这份资源带了训练权重意味着你有两条路一是直接拿权重做推理验证效果二是在权重基础上继续训练适配自己的猪舍。推理先跑通确认权重没坏python detect.py --weights yolov7.pt --source dataset/images/test --img-size 640 --conf-thres 0.25 --device 0参数上--img-size 要和训练时一致这份权重大概率是 640--conf-thres 0.25 是常用起点attack 这种小目标可以降到 0.15 看召回--device 0 指定第一块 GPU。结果会存到 runs/detect/exp 下打开图看框和类别对不对尤其确认 attack 有没有被漏掉。如果要继续训练命令大致是python train.py --weights yolov7.pt --data dataset/data.yaml --img-size 640 --batch-size 16 --epochs 100 --device 0 --workers 8--batch-size 16 是 8G 显存下的保守值显存够可以上 32--workers 8 是数据加载线程机器核少就降到 4不然会卡在 dataloader。--epochs 100 对 1000 多张图偏多容易过拟合我一般先跑 50 看 val 的 mAP 曲线涨不动就停。3.3 训练日志里该盯什么训练开始后控制台会打印 box_loss、obj_loss、cls_loss 和 precision、recall、mAP。box_loss 管定位obj_loss 管有没有目标cls_loss 管分类。如果 cls_loss 一直高多半是类别不平衡或标签错位如果 obj_loss 高但 box_loss 低可能是背景图太多。val 的 mAP0.5 是主指标但别只看它把混淆矩阵导出来看 attack 和 lie 有没有互相混。我见过模型 mAP 挺高结果 attack 全被预测成 lie实际用起来等于没有攻击检测。所以训练完一定跑一遍验证集的可视化别只信数字。4. 推理与部署TensorRT、ONNXRuntime 和那几个对比 notebook4.1 为什么包里带了这么多 notebook资源里有 YOLOv7-Dynamic-Batch-TENSORRT.ipynb、YOLOv7-Dynamic-Batch-ONNXRUNTIME.ipynb还有 compare_YOLOv7_vs_YOLOv5m6_half 等一堆对比脚本。这说明作者考虑的是落地猪舍边缘设备算力有限PyTorch 直接跑太慢要转 TensorRT 或 ONNXRuntime 加速。Dynamic Batch 意味着可以一次推理多张图适合多路摄像头。对比 notebook 则是拿 YOLOv7 和 YOLOv5 不同尺寸比精度和速度帮你选型。如果你只是做研究PyTorch 权重够用如果要上边缘盒子这几个 notebook 就是现成的参考。4.2 导出 ONNX 与 TensorRT 的关键参数导出 ONNX 一般这么写python export.py --weights yolov7.pt --img-size 640 640 --batch-size 1 --dynamic --simplify --include onnx--dynamic 开启动态 batch--simplify 会调 onnx-simplifier 精简图结构减少推理时的冗余节点。--batch-size 1 是导出时的基准动态轴开了之后实际可以喂不同 batch。导出后拿 onnxruntime 跑一遍验证输出和 PyTorch 一致再转 TensorRT。转 TRT 时注意精度FP16 在大多数边缘卡上速度和精度平衡最好INT8 需要校准集猪舍场景光照变化大INT8 容易掉点除非你做了充分校准否则先用 FP16。4.3 对比脚本怎么用compare_YOLOv7_vs_YOLOv5m6_half.ipynb 这类脚本half 指 FP16 推理。跑之前确认你的环境装了对应依赖脚本里一般会加载两个模型、同一批图、分别计时、算 mAP。注意计时要在 warmup 之后前几次推理有初始化开销直接算会偏慢。对比结果里YOLOv7 通常精度略高但速度略慢YOLOv5m6 更快。选哪个取决于你的边缘设备如果帧率要求高、猪只行为变化不快YOLOv5 够用如果要抓 attack 这种短时行为YOLOv7 的精度优势更值。5. 避坑与排查训练和部署里最容易翻车的几件事5.1 现象训练 loss 正常但 mAP 一直是 0原因data.yaml 里的路径写错或者 names 顺序和标签 class_id 不一致。YOLO 读不到标签时不会报错会把所有图当背景loss 照样降但 mAP 起不来。解决先跑一遍前面 2.2 的标签校验再确认 data.yaml 里 train、val 路径是相对路径还是绝对路径和你的启动目录对齐。5.2 现象attack 类几乎检测不到原因attack 样本太少模型偏向多数类。解决先看混淆矩阵确认是不是全预测成 lie然后对 attack 过采样或在验证集里单独统计 attack 的召回。别急着改网络数据层面先处理。5.3 现象转 TensorRT 后精度掉很多原因INT8 校准不足或导出 ONNX 时 --dynamic 和 --simplify 组合导致某些算子被错误融合。解决先用 FP16 对比确认 FP16 掉点是否可接受如果必须 INT8校准集要覆盖不同光照、不同猪舍场景至少几百张。导出时可以先不加 --simplify看原始 ONNX 的精度再逐步加优化。5.4 现象训练中途 CUDA out of memory原因batch-size 太大或 --workers 太多导致内存泄漏。解决降 batch-size同时把 --workers 降到 4 或 2YOLOv7 的 mosaic 增强会占额外显存可以在最后几个 epoch 关掉 mosaic用 --close-mosaic 10。5.5 现象推理结果框位置整体偏移原因训练和推理的 img-size 不一致或者 letterbox 填充方式不同。解决确认 detect.py 的 --img-size 和训练一致如果自己写推理代码letterbox 的缩放比例和填充要按 YOLOv7 官方实现来别自己拍脑袋写。6. 把权重用出价值验证、微调和边缘部署的一个具体技巧拿到一份别人训好的权重最忌讳直接上生产。我一般会先做三件事一是用测试集跑一遍导出每类的 precision、recall、mAP确认 attack 的召回能不能接受二是抽 20 张误检和漏检的图肉眼看看是标注问题还是模型问题三是把权重在自己的猪舍视频上跑一段看实际场景的泛化。这三步走完才知道这份权重是能直接用还是需要微调。微调时有个技巧不要一上来就全量训练。先冻结 backbone只训 head 几个 epoch让分类层适配你的场景再解冻全量小学习率微调。YOLOv7 里可以通过调整训练脚本的 freeze 参数实现常见做法是 freeze 前 10 层。学习率用 0.001 起步比从头训练的 0.01 小一个量级避免把预训练权重冲掉。边缘部署上如果用的是 Jetson 这类设备TensorRT 是首选。动态 batch 的 notebook 可以直接参考但注意猪舍多路摄像头时batch 不是越大越好要平衡延迟和吞吐。我一般会先测单路延迟再逐步加 batch 看显存和帧率找到拐点。另外猪舍网络可能不稳定推理结果最好本地缓存别依赖实时上传。从那以后我每次拿到新权重都强制先跑一遍测试集混淆矩阵和 20 张误检图再决定要不要微调。这个习惯帮我省了很多返工。希望帮到你。本文还有配套的精品资源点击获取
返回列表