猪场视觉算法实战:yolov7生猪行为检测从数据集标注到边缘部署全链路
发布时间:2026/9/28 16:46:34来源:尧图网络
简介这份资源面向从事智慧养殖与计算机视觉的算法工程师、研究生及竞赛选手提供基于YOLOv7的养殖场生猪行为状态检测训练权重与配套数据集可直接用于猪只进食、站立、躺卧、攻击四类行为的识别任务解决从零采集标注数据成本高、模型难以快速复现的问题。压缩包共约2000个文件以1211个txt标签、680张jpg图像为主另含yaml配置、py脚本、ipynb笔记本及少量md、pdf文档整体约608MB目录已按train、val、test划分并附data.yamlYOLOv5至YOLOv9等算法均可直接开训。资源还包含TensorRT、ONNXRuntime动态批量推理及多组YOLOv7与YOLOv5对比实验笔记便于读者快速验证模型性能、迁移到自有场景并复现检测结果。目前已有244人学习下载适合需要完整数据与权重快速上手生猪行为识别项目的读者。1. 猪场里的视觉算法yolov7 做生猪行为状态检测到底能落地到什么程度猪场里最不缺的就是摄像头缺的是能看懂画面的人。一个万头育肥场几十路监控同时开着饲养员盯屏幕盯到眼花猪只打架、跛行、扎堆压栏这些信号往往等发现时已经晚了。yolov7 算法做生猪行为状态检测本质就是把「人盯屏」换成「模型盯屏」用目标检测框出每头猪再根据框的位置、姿态、时序变化判断它是在采食、躺卧、站立、打架还是异常蜷缩。训练权重和数据集是这套方案的两条腿——权重决定模型能不能识别猪数据集决定它认不认得你家猪场的猪。适合谁看做智慧养殖的算法工程师、想给猪场加 AI 功能的嵌入式开发者、以及手里已经有一批监控视频但不知道怎么变成训练数据的养殖技术负责人。这篇不聊虚的从数据集怎么标、权重怎么训、部署怎么跑一路讲到翻车现场。2. 生猪行为检测的数据集从监控视频到 YOLO 标注的完整链路2.1 猪只行为类别怎么定直接决定标注成本行为状态检测和单纯数猪是两回事。数猪只需要一个pig类行为检测要拆成多个类而类别一多标注量和歧义就指数级上升。我一般建议先做减法把行为收敛到 5 到 7 类覆盖猪场最关心的异常信号行为类别判定依据业务价值采食头部位于料槽区域身体前倾采食量异常预警饮水头部靠近饮水器饮水异常、疾病早期躺卧身体长轴水平四肢收拢正常但需区分异常蜷缩站立四肢支撑身体离地活动量统计打架两头猪头部对冲、身体接触咬尾、应激预警跛行行走时步态不对称肢蹄病筛查类别定完再标别边标边改。血泪经验是标注到一半加一个类前面几千张全得返工。跛行这类需要时序判断的行为单帧标注很难表达通常做法是先标站立和行走再用跟踪 ID 的轨迹做二次判定不要指望检测模型单帧输出跛行。2.2 从视频抽帧到 YOLO 格式脚本与四个边界坑监控视频不能直接喂给 yolov7得先抽帧、去重、再转成 YOLO 的 txt 标注格式。下面是我常用的抽帧脚本按固定间隔抽同时用帧差做简单去重避免大量静止画面浪费标注人力。import cv2 import os import numpy as np def extract_frames(video_path, out_dir, interval15, diff_thresh8.0): 按间隔抽帧并用帧间差异过滤静止画面 interval: 每多少帧抽一张 diff_thresh: 平均像素差阈值低于此值认为画面无变化跳过 os.makedirs(out_dir, exist_okTrue) cap cv2.VideoCapture(video_path) prev_gray None saved 0 idx 0 while True: ret, frame cap.read() if not ret: break if idx % interval 0: gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if prev_gray is not None: diff np.mean(cv2.absdiff(gray, prev_gray)) if diff diff_thresh: idx 1 continue prev_gray gray name os.path.join(out_dir, fframe_{idx:06d}.jpg) cv2.imwrite(name, frame) saved 1 idx 1 cap.release() print(f共保存 {saved} 张) extract_frames(pig_pen_01.mp4, frames/, interval15, diff_thresh8.0)逻辑说明interval15对应 25fps 视频约每 0.6 秒抽一帧猪只行为变化没那么快这个密度够用。diff_thresh是去重的关键猪场夜间画面几乎静止不去重的话一半标注图是重复的。参数怎么调如果猪只活动频繁把interval降到 10如果画面噪点多导致误判为有变化把diff_thresh提到 12 以上。抽完帧就是标注。用 labelImg 或 CVAT 都行导出 YOLO 格式每张图对应一个同名 txt每行是class_id x_center y_center width height全部归一化到 0 到 1。四个边界坑必须注意猪只重叠严重时框要按可见部分标不要脑补被遮挡的身体否则模型学到错误的宽高比。夜间红外画面和白天彩色画面要混合标注否则模型一到晚上就瞎。边缘只露出半头猪的要么标全要么直接删图别标一半会污染回归目标。类别 ID 从 0 开始连续别跳号yolov7 的names列表和 ID 必须严格对应。2.3 数据集划分与增强别让验证集「泄露」了标完的数据按 8:1:1 分训练、验证、测试。这里有个隐蔽的坑如果按随机抽帧划分同一头猪、同一场景的相邻帧会同时出现在训练集和验证集验证指标虚高上线就翻车。正确做法是按视频片段或按时间段划分让验证集的猪和训练集的猪尽量不重叠。数据增强用 yolov7 自带的 mosaic、mixup 就够但猪场场景要额外注意水平翻转可以用垂直翻转不要用猪不会倒着走色彩抖动幅度别太大否则红外和彩色的域差异会被放大。增强配置写在data/hyp.scratch.p5.yaml里后面训练章节会讲怎么改。3. yolov7 训练权重从官方预训练到猪场专用模型的微调路径3.1 为什么必须从预训练权重起步而不是从头训yolov7 在 COCO 上预训练的权重已经学到了边缘、纹理、动物轮廓这些通用特征。猪场数据集通常只有几千到几万张从头训收敛慢且容易过拟合。常见做法是加载yolov7.pt或yolov7-tiny.pt做迁移学习只让检测头和新类别适配。选哪个版本看部署硬件服务器端用yolov7.pt边缘盒子或 Jetson 用yolov7-tiny.pt精度差几个点但速度翻倍。微调时有个反直觉的点不要一上来就冻结主干。猪的形态和 COCO 里的狗、牛差异不小主干也需要适度调整。我一般前 10 个 epoch 用较小学习率让全部参数参与之后再视情况冻结。学习率用余弦退火初始lr00.01lrf0.1batch size 根据显存拉满。3.2 训练命令与关键参数一份可抄的配置假设数据集已经按 YOLO 格式放好目录结构是images/train、labels/train这样。先写数据配置文件pig_data.yamltrain: /data/pig/images/train val: /data/pig/images/val nc: 6 names: [feed, drink, lying, standing, fight, walk]然后启动训练python train.py \ --weights yolov7.pt \ --cfg cfg/training/yolov7.yaml \ --data data/pig_data.yaml \ --hyp data/hyp.scratch.p5.yaml \ --epochs 150 \ --batch-size 16 \ --img-size 640 640 \ --device 0 \ --workers 8 \ --name pig_behavior_v1逻辑说明--weights指定预训练权重--cfg是模型结构--data指向刚写的 yaml--hyp是超参文件。--img-size设 640如果猪只在小画面里占比很小可以提到 1280但显存和速度要权衡。--workers是数据加载线程设成 CPU 核数的 0.7 倍左右太高反而抢资源。关键参数怎么改--epochs150 是经验值看验证集 mAP 曲线连续 20 轮不涨就可以停--batch-size爆显存就减半同时把lr0按比例调小--hyp里mosaic概率默认 1.0猪场数据如果场景单一可以降到 0.5 防止过拟合。3.3 训练过程看什么loss 曲线和 mAP 的读法训练日志里重点盯三个量box_loss、obj_loss、cls_loss。box_loss 降不下去说明框回归有问题检查标注框是否规范obj_loss 高说明模型分不清前景背景可能是负样本太少或画面里猪只太稀疏cls_loss 高则是类别混淆比如躺卧和站立分不开需要补这两类的边界样本。mAP0.5 到 0.85 以上算可用mAP0.5:0.95 能到 0.6 就不错。但别只看数字一定要把验证集的预测结果可视化出来看。我踩过的坑mAP 0.9 的模型实际跑视频时把料槽的影子认成躺卧的猪因为训练集里没有这种负样本。所以训练完必须用detect.py跑几段真实视频肉眼过一遍。4. 行为状态判定检测框之外时序逻辑才是关键4.1 单帧检测到行为输出的映射规则yolov7 输出的是每头猪的框和类别但「打架」这种行为单帧可能只看到两头猪挨着需要连续几帧都满足接触条件才判定。我一般用一个轻量的状态机检测框中心距离小于阈值、且持续 N 帧才触发打架告警。躺卧和站立可以直接用框的宽高比加中心点高度做粗判再交给分类头细化。def judge_behavior(boxes, frame_h, contact_thresh80, persist5): boxes: [(x1,y1,x2,y2,cls_id), ...] contact_thresh: 两猪中心距离阈值(像素) persist: 连续帧数阈值 results [] for i, b in enumerate(boxes): w b[2] - b[0] h b[3] - b[1] ratio w / (h 1e-6) # 宽高比大于1.5且中心靠下倾向躺卧 if ratio 1.5 and (b[1] b[3]) / 2 frame_h * 0.6: results.append((i, lying)) else: results.append((i, standing)) # 接触判定交给外层时序缓冲 return results逻辑说明这个函数只做单帧粗判contact_thresh和persist需要根据摄像头安装高度和猪只实际大小标定。参数怎么定在画面里量一下两头猪打架时中心点大概多少像素取略小一点的值persist设 5 帧约 0.2 秒能过滤掉偶然靠近。4.2 用跟踪 ID 串起时序避免重复计数单帧检测每帧都输出新框直接统计会重复计数。常见做法是接一个轻量跟踪器比如 ByteTrack 或简单的 IOU 匹配给每头猪分配稳定 ID。有了 ID就能算每头猪的采食时长、躺卧时长、行走轨迹。跛行判定就是看同一 ID 的轨迹是否左右摆动、步长是否异常。跟踪这块的坑是 ID 切换猪只交叉或遮挡时 ID 会跳导致一头猪被算成两头。缓解办法是提高检测帧率、用外观特征辅助匹配或者在业务层做去重同一位置短时间内出现的 ID 合并。别追求 100% 准确猪场场景下 90% 的 ID 稳定性就够支撑行为统计了。5. 部署与推理yolov7 权重在猪场边缘设备上怎么跑起来5.1 权重导出与推理速度优化训练完的best.pt直接跑 PyTorch 推理在服务器上没问题但猪场现场多是 Jetson 或瑞芯微这类边缘设备得转成 ONNX 或 TensorRT。导出命令python export.py --weights runs/train/pig_behavior_v1/weights/best.pt \ --include onnx --img-size 640 640 --batch-size 1导出后可以用onnxruntime或 TensorRT 加载。Jetson 上用 TensorRT 的 FP16 模式yolov7-tiny 在 640 输入下能跑到 30fps 以上够一路摄像头实时分析。参数上注意--batch-size 1边缘设备通常单帧推理batch 大了显存吃不消。5.2 多路视频流的工程化处理一个猪场几十路摄像头不可能每路一个模型实例。常见做法是抽帧轮询每路摄像头按秒抽 1 到 2 帧排队送进同一个推理引擎结果按摄像头 ID 回写。这样单卡能覆盖 20 到 30 路。队列积压时丢最旧的帧保证实时性优先。行为告警写进消息队列再由业务系统推送给饲养员。6. 避坑与排查生猪行为检测上线后最容易翻车的五件事6.1 夜间红外画面精度骤降现象白天 mAP 0.88晚上掉到 0.5 以下。原因训练集以白天彩色画面为主红外灰度图的纹理分布差异大。解决按白天黑夜 1:1 补充红外标注数据或者在预处理阶段做直方图均衡化缩小域差异。6.2 猪只密集时漏检严重现象空栏时检测很准满栏时漏掉三分之一。原因密集遮挡导致 NMS 把相邻框误抑制且训练集缺少高密度场景。解决调高conf_thres到 0.4 以上减少误检同时用 soft-NMS 替代标准 NMS数据层面专门补拍满栏画面。6.3 打架误报频繁现象猪只正常挤在一起取暖被报成打架。原因单帧接触判定太敏感没有时序过滤。解决加persist帧数阈值并要求接触区域有相对运动静止贴靠不触发。6.4 模型换场景后集体失效现象A 栋猪舍训的模型搬到 B 栋精度暴跌。原因光照、摄像头角度、栏舍布局不同域偏移。解决新场景至少补标 500 到 1000 张做微调或者用风格迁移做数据增强。别指望一个模型打天下。6.5 边缘设备过热降频现象推理跑一小时后帧率从 30 掉到 10。原因Jetson 被动散热在猪场高温环境下扛不住。解决加主动风扇或把推理间隔从每帧拉到每 3 帧降低持续负载。7. 把行为数据用起来从检测结果到猪场管理指标的一个具体技巧模型跑通只是第一步真正值钱的是把行为数据变成管理动作。我常用的一个技巧是给每头猪算「行为熵」统计一个小时内采食、饮水、躺卧、站立、行走的时间占比算信息熵。健康猪的行为分布相对稳定熵值波动小发病早期的猪往往采食和饮水骤降、躺卧异常升高熵值会明显偏移。这个指标比单看某个行为时长更鲁棒因为它捕捉的是整体模式的变化。具体做法跟踪 ID 稳定后按小时聚合每头猪的行为序列算各类别占比向量再算熵值。设定基线用前三天数据之后每天对比偏移超过阈值就推预警。阈值别拍脑袋用历史发病记录做回溯标定。我一般会把熵值和采食时长两个指标一起看单看一个容易误报。验证方法也简单找几头已知有肢蹄病或呼吸道症状的猪回溯它们发病前 48 小时的行为熵曲线看是否提前出现偏移。如果偏移提前 12 小时以上出现这套预警就有实际价值。参数上聚合窗口 1 小时是平衡灵敏度和噪声的经验值太短噪声大太长预警滞后。最后说个我自己的教训别一上来就追求全行为类别覆盖。我第一个猪场项目标了 11 类行为训了两个月上线发现饲养员只关心打架和采食异常两个信号其余全是噪声。后来砍到 5 类精度上去了落地反而快。做养殖 AI业务价值永远比技术炫技重要。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网