ARTICLE DETAIL

资讯详情

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

猪行为识别实战:YOLOv5训练1272张图达到92.6%准确率

猪行为识别实战:YOLOv5训练1272张图达到92.6%准确率 简介这份猪圈猪行为识别数据集面向智慧养殖、动物行为分析与计算机视觉方向的研究者及算法工程师用于解决猪只日常行为自动监测与分类问题。数据覆盖喝、吃、睡觉、站立等典型行为类别平均正确识别率约92.6%可直接用于目标检测模型的训练与验证。资源包共2000个文件包含1272个txt标注文件、727张jpg图像以及1个yaml配置文件整体约85.86MB其中txt对应YOLO格式标注框jpg为猪圈实拍图像yaml用于定义类别与数据路径兼容YOLOv5的PyTorch训练流程。目前已有314人学习下载。借助该数据集读者可快速搭建行为识别基线模型验证不同网络结构在养殖场景下的表现并在此基础上做数据增强、类别平衡与误检分析为后续部署到实际猪圈监控系统提供可复用的数据基础与调参参考。1. 猪圈里的猪行为识别1272 张图、92.6% 准确率背后的真实落地账猪的行为识别这件事真正做过的人都知道难点从来不在模型选型而在数据。一个猪圈里同时有采食、饮水、躺卧、站立、拱地、打斗光照从早到晚变化猪只互相遮挡栏杆切割画面摄像头还常常装在斜上方。你拿一个通用 COCO 预训练的检测器直接跑mAP 能到 0.3 就算不错。所以当我看到「1272 张图片、可识别喝/吃/睡觉/站立、平均正确识别率 92.6%、YOLOv5 PyTorch 格式标注」这个组合时第一反应是这是一个规模不大但标注质量大概率过关的垂直数据集适合做行为识别方向的快速验证和二次迁移。它解决的核心问题是让你不用从零标注几千张猪圈图就能在 YOLOv5 上跑通一个多类别行为检测基线。适合谁做智慧养殖的算法工程师、农业院校做课题的研究生、想拿垂直场景练手 YOLOv5 的开发者。1272 张不算多但行为类别只有 4 类左右平均每类 300 张上下配合 YOLOv5 的 Mosaic 增强和迁移学习是能收敛的。92.6% 这个数字大概率是在验证集上的 mAP0.5 或分类准确率具体口径要自己复现时确认。2. 数据集拆解与 YOLOv5 格式校验先搞清楚你拿到的是什么2.1 行为类别定义与标注粒度猪的行为识别类别定义直接决定模型能不能用。喝、吃、睡觉、站立这四类看起来清晰实际标注时有几个模糊地带猪低头拱食槽算吃还是拱地侧躺闭眼算睡觉侧躺睁眼算不算站立和行走要不要分开这个数据集既然标了四类说明标注者做了取舍。你拿到后第一件事不是训练是抽样看 20 张图的标注框确认边界一致性。YOLOv5 格式的标注是每张图对应一个.txt每行class_id x_center y_center width height全部归一化到 0-1。行为识别和普通目标检测的区别在于同一个目标在不同帧可能属于不同行为但静态图片数据集里一张图一个行为标签框住的是猪只本体类别代表它当前的行为。这意味着模型学的是「猪的姿态外观 场景上下文」到行为的映射而不是时序动作。2.2 目录结构与格式校验脚本标准 YOLOv5 数据集目录长这样pig_behavior/ ├── images/ │ ├── train/ # 约 1020 张 │ └── val/ # 约 252 张 ├── labels/ │ ├── train/ │ └── val/ └── data.yaml拿到后先跑一个校验脚本检查图片和标签是否一一对应、坐标是否越界、类别 id 是否连续import os from pathlib import Path from PIL import Image IMG_DIR Path(pig_behavior/images/train) LBL_DIR Path(pig_behavior/labels/train) CLASS_NAMES [drink, eat, sleep, stand] # 按 data.yaml 顺序 bad [] for img_path in IMG_DIR.glob(*.jpg): lbl_path LBL_DIR / (img_path.stem .txt) if not lbl_path.exists(): bad.append((img_path.name, missing label)) continue w, h Image.open(img_path).size for line in lbl_path.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: bad.append((img_path.name, fbad fields: {line})) continue cid, x, y, bw, bh int(parts[0]), *map(float, parts[1:]) if cid len(CLASS_NAMES): bad.append((img_path.name, fclass id {cid} out of range)) if not all(0 v 1 for v in (x, y, bw, bh)): bad.append((img_path.name, fcoord out of range: {line})) print(fchecked {len(list(IMG_DIR.glob(*.jpg)))} images, {len(bad)} problems) for b in bad[:20]: print(b)逻辑说明遍历训练集图片检查同名标签文件是否存在、每行是否 5 个字段、类别 id 是否超出CLASS_NAMES长度、归一化坐标是否在 0-1 之间。参数上CLASS_NAMES必须和data.yaml里的names顺序完全一致否则类别会错位。跑完如果bad为空说明格式没问题如果有 missing label要么删图要么补标别硬训。2.3 data.yaml 的正确写法path: ./pig_behavior train: images/train val: images/val nc: 4 names: [drink, eat, sleep, stand]path是数据集根目录train和val是相对路径。nc必须等于names长度。常见翻车点有人把names写成中文YOLOv5 读取时编码报错有人nc写 4 但names只列了 3 个训练时索引越界。改完 yaml 后用python -c import yaml; print(yaml.safe_load(open(data.yaml)))确认能正常解析。3. 用 YOLOv5 在本地跑通猪行为识别的最小训练命令3.1 环境搭建conda PyTorch YOLOv5环境这块我一般用 conda 隔离避免和系统 Python 打架。PyTorch 安装要匹配 CUDA 版本先nvidia-smi看驱动支持的 CUDA 上限再去 PyTorch 官网选对应命令。假设 CUDA 11.8conda create -n pigyolo python3.9 -y conda activate pigyolo pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt逻辑说明python3.9是 YOLOv5 兼容性最稳的版本3.11 以上有些依赖会出问题。--index-url指定 CUDA 11.8 的 wheel 源别用默认源否则装成 CPU 版。装完验证python -c import torch; print(torch.__version__, torch.cuda.is_available())输出True才算 GPU 可用。如果False检查驱动版本和 CUDA 是否匹配别急着改代码。3.2 训练命令与关键参数最小可跑命令python train.py \ --data ./pig_behavior/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --project runs/pig \ --name exp1参数说明--weights yolov5s.pt用 COCO 预训练权重做迁移小数据集必须迁移否则收敛慢且容易过拟合。--img 640是输入尺寸猪圈图如果分辨率高可以试 800 或 960但显存要够。--batch 16在 8G 显存上跑 640 尺寸差不多显存不够就降到 8 或 4。--epochs 100对 1272 张图偏多实际 50-80 轮看 mAP 曲线早停即可。--device 0指定第一块 GPU。训练过程中重点看runs/pig/exp1/results.csv关注metrics/mAP_0.5和val/box_loss。如果 box_loss 震荡不降大概率是学习率太大或标注有问题如果 mAP 卡在 0.5 以下先回去查类别平衡。3.3 类别不平衡的处理1272 张图四类行为实际分布大概率不均。睡觉和站立可能占大头喝和吃偏少。YOLOv5 默认不做类别重加权但可以在data.yaml里加cls_pw或者用--hyp指定超参文件调cls损失权重。更直接的办法是过采样少数类把喝和吃的图片复制一份到训练集文件名加后缀避免覆盖。我一般会先跑一版看混淆矩阵confusion_matrix.png里如果喝被大量误判成吃说明这两类视觉特征太近需要加数据或调类别权重。4. 92.6% 准确率怎么复现验证口径与调参路径4.1 准确率口径确认92.6% 这个数字可能是 mAP0.5也可能是分类准确率还可能是 Top-1。YOLOv5 训练完输出的是 mAP0.5 和 mAP0.5:0.95。如果原数据集说的是「平均正确识别率」大概率是 mAP0.5 或者按图片级别的分类准确率。复现时先跑val.pypython val.py \ --data ./pig_behavior/data.yaml \ --weights runs/pig/exp1/weights/best.pt \ --img 640 \ --task val输出里mAP0.5如果接近 0.92说明口径对上了。如果只有 0.85别慌先看每类的 AP找出拖后腿的类别。4.2 提升 mAP 的四个实操方向第一输入分辨率。猪圈图里猪只占画面比例可能不大640 下小目标特征丢失。试--img 960mAP 通常能涨 2-4 个点代价是显存和训练时间。第二数据增强。YOLOv5 默认开了 Mosaic、HSV、翻转。猪圈场景里上下翻转不合理猪不会倒挂但左右翻转和 HSV 抖动合理。可以在hyp.scratch-low.yaml里把flipud设为 0fliplr保持 0.5。第三锚框重聚类。COCO 的默认锚框是给通用目标用的猪的宽高比偏扁。跑python utils/autanchor.py --data data.yaml --img 640重新聚类替换--anchors参数。第四模型规模。yolov5s 够快但容量小如果 mAP 上不去换 yolov5m 或 yolov5l1272 张图用 m 比较稳l 容易过拟合。4.3 推理与部署验证训练完用detect.py跑单张图看效果python detect.py \ --weights runs/pig/exp1/weights/best.pt \ --source ./test_images \ --img 640 \ --conf 0.4 \ --save-txt--conf 0.4是置信度阈值猪行为识别里如果漏检多就降到 0.25误检多就升到 0.5。--save-txt保存检测结果方便后续做行为统计。部署到边缘设备时用export.py转 ONNX 或 TensorRTpython export.py --weights best.pt --include onnx --img 640转完用onnxruntime验证输出和 PyTorch 一致再上设备。5. 猪行为识别落地避坑5 个血泪教训5.1 现象训练 loss 正常但 mAP 极低原因data.yaml里names顺序和标注文件里的class_id对不上。比如标注时 0eat但 yaml 里 0drink模型学出来的类别全错位。解决抽样 10 张图用labelImg或脚本可视化标注框和类别名确认顺序一致。改 yaml 后重新训练别在旧权重上继续。5.2 现象验证集 mAP 高但实际推理漏检严重原因训练集和验证集来自同一段视频的相邻帧分布几乎一样验证集虚高。实际部署换了个猪圈、换了光照模型直接崩。解决划分数据集时按时间段或摄像头分别随机分。如果只有一段视频至少按白天/夜晚分。验证集要包含不同光照和角度。5.3 现象喝和吃两类互相误判原因猪低头喝水时嘴部被水槽遮挡和低头吃食的视觉特征高度相似640 分辨率下几乎分不开。解决提高输入分辨率到 960或者在数据里补充水槽、食槽的上下文标注。也可以把喝和吃合并成「采食饮水」一类看业务能不能接受。5.4 现象训练到 30 轮后 mAP 不升反降原因过拟合。1272 张图对 yolov5m 来说偏少模型开始记训练集。解决加--patience 15早停或者加--dropout 0.2再或者用更强的数据增强。最直接的是换回 yolov5s或者冻结 backbone 前几层。5.5 现象转 ONNX 后推理结果和 PyTorch 不一致原因导出时--img尺寸和推理时不一致或者--dynamic没开导致 batch 维度固定。解决导出和推理用同一尺寸需要动态 batch 就加--dynamic。转完用同一张图分别跑 PyTorch 和 ONNX对比输出框的坐标和置信度差异在 1e-3 以内算正常。6. 从 1272 张到产线小数据集行为识别的进阶玩法1272 张图跑通基线只是起点。真正上产线你会遇到两个问题一是类别不够细喝、吃、睡、站只是粗粒度实际业务可能关心「异常躺卧」「频繁起立」这类健康指标二是静态图没有时序猪的行为本质是动作单帧容易歧义。我一般会这么推进先用这个数据集训一个 YOLOv5 检测器做猪只定位和行为粗分类然后把检测框按时间序列喂给一个轻量时序模型比如 1D CNN 或 GRU做行为平滑和异常检测。检测器负责「猪在哪、大概在干嘛」时序模型负责「这个行为持续了多久、是否异常」。这样既利用了现有标注又补上了时序信息。验证方法上别只看 mAP。做一个混淆矩阵看哪些类别对容易混再做一个按时间的 F1 曲线看模型在一天不同时段的表现。如果夜间 F1 明显掉说明红外或补光没做好不是模型问题。具体技巧推理时用--conf 0.25 --iou 0.45做 NMS猪只密集时 IoU 阈值调低到 0.4 避免漏检。如果部署在树莓派 5 这类边缘设备用 ONNX OpenCV DNN 跑yolov5s 在 640 下大概 5-8 FPS够做低频行为统计。想再快就转 TensorRT但树莓派上 TensorRT 支持有限ONNX 更稳。我自己踩过最深的坑是拿验证集 mAP 当产线指标结果上线第一周就翻车。后来养成习惯每次训练完必须拿一段没参与训练的完整视频跑一遍人工数 100 个行为片段算实际准确率。这个数字才敢拿去汇报。希望帮到你。本文还有配套的精品资源点击获取
返回列表