ARTICLE DETAIL

资讯详情

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

猪行为识别实战:1272张图YOLOv5训练与92.6%准确率复现

猪行为识别实战:1272张图YOLOv5训练与92.6%准确率复现 简介这份猪行为识别数据集面向智慧养殖、动物行为分析与计算机视觉方向的研究者及开发者可用于猪圈场景下的目标检测模型训练与行为分类实验。数据集覆盖喝、吃、睡觉、站立等典型行为类别平均正确识别率约92.6%适合作为YOLO系列检测模型的训练与验证素材也可用于课程设计、毕业项目或养殖场智能化监测方案的原型验证。资源包共2000个文件包含1272个txt标注文件、727张jpg图像以及1个yaml配置文件压缩包约85.86MB其中txt与yaml可直接对接YOLOv5的PyTorch训练流程jpg为对应实拍帧图像目录组织便于按类别检索与划分训练集。目前已有314人学习下载可作为行为识别任务中数据准备与模型调参的参考起点帮助读者快速搭建可复现的检测基线并评估各类行为的识别效果。1. 猪圈里的猪行为识别1272 张图、92.6% 准确率背后的真实门槛猪的行为识别这件事真正做过的人都知道难点从来不在模型选型而在数据。猪圈环境光照不均、猪只互相遮挡、躺卧姿态高度相似一个「睡觉」和「站立低头」的边界样本能让标注员吵上十分钟。这份数据集给出的数字是 1272 张图片、支持 yolov5 的 pytorch 格式标注、平均正确识别率 92.6%覆盖喝、吃、睡觉、站立等核心行为。对做智慧养殖、动物福利监测、边缘端猪舍巡检的团队来说这是一条能直接落地的起点而不是一份只能看的论文附件。它适合两类人一类是手里有猪舍摄像头、想把行为统计跑起来的工程团队另一类是想拿一个真实场景数据集练 yolov5 全流程的算法同学。接下来我按「数据长什么样 → 怎么转成 yolov5 能吃的格式 → 怎么训练和调参 → 坑在哪」这条线讲透。2. 拆开这份猪行为数据集类别定义、标注格式与选型理由2.1 四类行为的边界怎么划为什么 92.6% 不是随便报的行为识别数据集最怕的就是类别定义含糊。喝、吃、睡觉、站立这四个类看起来直白实际标注时全是灰区。喝和吃都发生在料槽水槽附近猪头朝下区别只在接触的是饮水器还是料槽睡觉和站立之间还有「趴卧但抬头」这种中间态。一份能跑到 92.6% 的数据集说明它的标注规范里对这些边界做了明确约定否则模型学到的就是噪声。我一般拿到这类数据集第一件事不是急着训练而是先统计每个类别的实例数和分布。1272 张图如果四类均衡每类大概 300 张上下如果某类只有几十张那 92.6% 的均值就会被大类拉高小类实际召回可能很难看。所以第一步永远是看分布而不是看那个总准确率。import os from collections import Counter # 假设标注是 yolov5 的 txt 格式每行: class x_center y_center w h label_dir 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 # 类别映射按数据集说明填这里假设 0喝 1吃 2睡觉 3站立 names {0: drink, 1: eat, 2: sleep, 3: stand} for k in sorted(counter): print(names.get(k, k), counter[k])这段脚本的作用是把每个类别的实例总数打出来。参数上只需要改label_dir指向你的标注目录names按数据集实际类别顺序填。跑完你会得到一张分布表如果发现某类实例数低于总数的 10%训练时就要考虑过采样或者调类别权重否则 92.6% 这个数字在你自己的场景里复现不出来。2.2 为什么是 yolov5 的 pytorch 格式而不是 COCO 或 VOC数据集标注成 yolov5 格式本质是每张图对应一个同名 txt每行五个值类别索引加归一化的中心点坐标和宽高。这个格式的好处是轻解析快直接喂给 yolov5 的 dataloader 不用转换。相比之下 VOC 是 XML、COCO 是单个大 JSON训练前都得写转换脚本。选 yolov5 而不是更新的版本对这份数据集来说是务实的选择。yolov5 的工程成熟度最高从训练到导出 ONNX、再到树莓派或 Jetson 部署整条链路文档最全踩坑最少。行为识别这种任务对实时性要求高、对极致精度要求没那么极端yolov5s 或 yolov5m 就够用。如果你非要用 yolov8格式基本兼容改一下训练命令即可但没必要为了新而新。格式单图标注文件是否需要转换适配 yolov5yolov5 txt同名 .txt否直接可用VOC XML同名 .xml需脚本需转换COCO JSON单个 .json需脚本需转换2.3 目录结构怎么摆data.yaml 怎么写yolov5 对目录结构有约定摆错了训练直接报找不到图片。常见做法是 images 和 labels 分开各自再分 train 和 val且图片和标注文件名必须一一对应。# 推荐目录结构 pig_behavior/ ├── images/ │ ├── train/ # 约 1000 张 │ └── val/ # 约 272 张 └── labels/ ├── train/ └── val/对应的 data.yaml 只需要四行核心内容path: ./pig_behavior train: images/train val: images/val nc: 4 names: [drink, eat, sleep, stand]nc是类别数names的顺序必须和标注里的类别索引严格对应错一位整个训练就废了。path用相对路径时训练命令要在项目根目录执行否则 yolov5 解析路径会翻车。这一步看着简单但它是新手最容易栽的地方我见过太多人因为 names 顺序写反训完发现「喝」全被识别成「吃」。3. 从零跑通 yolov5 训练环境、命令与关键参数3.1 pytorch 环境搭建conda 建环境到验证 GPU训练前先把 pytorch 环境搭干净。行为识别数据集不大但 yolov5 训练还是要 GPU 才现实CPU 跑 1272 张图会慢到怀疑人生。用 conda 隔离环境是标准做法避免和系统里的其他 pytorch 版本打架。# 创建独立环境python 版本选 3.9 兼容性最好 conda create -n pigyolo python3.9 -y conda activate pigyolo # 安装 pytorchcuda 版本按你显卡驱动选这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 验证 GPU 是否可用 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))torch.cuda.is_available()返回 True 才算环境通了。如果返回 False先查显卡驱动版本和 cuda 版本是否匹配再查是不是装成了 CPU 版。这一步不通后面训练会默认落到 CPU速度差几十倍。装完 pytorch 再拉 yolov5 代码和依赖git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt依赖里包含 opencv、matplotlib、tqdm 这些装完可以用python detect.py --source data/images跑一张官方示例图确认推理链路没问题再上自己的数据。3.2 训练命令与超参数batch、imgsz、epochs 怎么定环境通了就可以开训。yolov5 的训练入口是 train.py核心参数就那么几个但每个都影响结果。python train.py \ --data ./pig_behavior/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --project runs/train \ --name pig_exp1--weights yolov5s.pt用预训练权重这是小数据集能跑出好结果的关键从零训 1272 张图基本学不出东西。--img 640是输入分辨率猪圈场景里猪只占画面比例不小640 够用如果远距离小目标多可以提到 1280但显存和速度要权衡。--batch 16在 8G 显存上比较稳显存不够就降到 8。--epochs 100对这个小数据集偏多实际看验证集 mAP 曲线通常 50 到 80 轮就收敛了再训就是过拟合。训练过程中重点盯三个指标box_loss、cls_loss 和验证集的 mAP0.5。box_loss 管定位准不准cls_loss 管分类对不对。如果 cls_loss 一直不降多半是类别定义有歧义或者标注有错如果验证 mAP 早早到顶然后开始掉就是过拟合该早停或者加数据增强。3.3 数据增强与超参数小数据集的后悔药1272 张图属于小数据集数据增强是必须开的后悔药。yolov5 默认开了 mosaic、随机缩放、随机翻转这些对猪行为识别都友好因为猪在画面里的位置和朝向本来就随机。但有两个增强要小心上下翻转flipud会让猪四脚朝天现实中不存在建议关掉HSV 色调增强幅度别太大猪圈光照偏暖色偏太狠会让模型学歪。# 在 hyp 配置里调整或命令行覆盖 python train.py --data ./pig_behavior/data.yaml --weights yolov5s.pt \ --flipud 0.0 --fliplr 0.5 --hsv_h 0.015 --hsv_s 0.7 --hsv_v 0.4--flipud 0.0关掉上下翻转--fliplr 0.5保留左右翻转--hsv_h 0.015控制色调抖动幅度。这些值不是玄学是 yolov5 官方在小数据集上验证过的默认区间照抄基本不会错。如果你的猪舍是固定机位、光照稳定还可以把 hsv 再调小让模型更专注形状特征。4. 训练结果怎么读mAP、混淆矩阵与 92.6% 的复现条件4.1 看懂 results.csv 和混淆矩阵训练完 yolov5 会在 runs/train/pig_exp1 下生成一堆文件最有价值的是 results.csv 和 confusion_matrix.png。results.csv 每行一个 epoch记录了训练和验证的各项损失与 mAP。你要找的是验证 mAP0.5 的最高点出现在第几轮以及那一轮的精确率和召回率。混淆矩阵更直观它告诉你哪两类最容易混。猪行为识别里喝和吃混、睡觉和站立混是高频问题。如果混淆矩阵显示喝和吃互相误判严重说明这两类的视觉特征在数据里区分度不够要么补数据要么在标注规范里把「是否接触料槽」作为硬性判据重新过一遍标注。import pandas as pd df pd.read_csv(runs/train/pig_exp1/results.csv) df.columns [c.strip() for c in df.columns] # 找验证 mAP 最高的 epoch best df.loc[df[metrics/mAP_0.5].idxmax()] print(best epoch:, best[epoch]) print(mAP0.5:, best[metrics/mAP_0.5]) print(precision:, best[metrics/precision]) print(recall:, best[metrics/recall])这段代码读训练日志定位最佳轮次。参数上注意列名可能带空格先 strip 一下。跑完你会知道 92.6% 是在哪个轮次、什么精确率召回率组合下达到的。如果精确率高召回率低说明模型保守漏检多反过来则是误检多。行为统计场景通常更怕漏检所以召回率要优先保。4.2 92.6% 在什么条件下成立这个数字不是无条件成立的。它依赖几个前提验证集和训练集同分布、光照条件接近、猪只密度适中、没有严重遮挡。如果你把模型直接搬到另一个猪舍光照、摄像头角度、猪的品种都变了准确率掉到 70% 多很正常。这不是模型不行是域偏移。所以复现这个数字的正确姿势是先用数据集自带的划分跑一遍确认能到 90% 以上证明你的训练流程没问题然后再用自己的数据做微调。微调时学习率要调小通常设成初始训练的十分之一训 20 到 30 轮就够让模型适应新场景而不是把旧知识忘光。指标含义行为识别里的关注点mAP0.5IoU 0.5 下的平均精度整体水平看是否接近 92.6%precision查准率误检多不多影响统计可信度recall查全率漏检多不多行为统计更怕漏cls_loss分类损失不降说明类别有歧义5. 避坑与排查猪行为识别训练里最常见的 5 个翻车点5.1 现象训练 loss 正常但 mAP 一直是 0原因通常是 data.yaml 里的 names 顺序和标注类别索引对不上或者 val 路径下没有图片。yolov5 不会报错只会默默算不出正确结果。解决方法是先跑一遍python train.py前的数据检查用第 2 章的统计脚本确认每个类别都有实例再核对 names 顺序。另一个可能是标注文件里坐标没归一化值大于 1这种情况 loss 会异常大。5.2 现象显存爆了报 CUDA out of memory原因一般是 batch 太大或 imgsz 太高。1272 张图用 yolov5s、img 640、batch 16 在 8G 显存上通常没问题但如果换成 yolov5l 或者 img 1280就会爆。解决办法是先把 batch 降到 8 或 4再考虑降 imgsz。也可以用--batch -1让 yolov5 自动找最大 batch但自动模式有时会偏保守。5.3 现象喝和吃总是互相误判这是类别定义问题不是模型问题。猪低头接触水槽和接触料槽在低分辨率下几乎一样。解决办法有两个一是提高输入分辨率到 960 或 1280让水槽料槽的细节可见二是在标注阶段引入上下文比如把水槽料槽区域也标出来作为辅助信息。如果数据已经标好改不了就在推理后处理里加规则结合猪只位置和固定水槽区域做二次判断。5.4 现象验证集准确率很高实际部署一塌糊涂典型的过拟合加域偏移。验证集和训练集来自同一批视频分布太近模型记住了背景而不是行为。解决办法是划分验证集时按时间段或按摄像头分不要随机抽帧让验证集真正代表新场景。部署前一定要用完全没参与训练的新视频测一遍这个数字才有参考价值。5.5 现象推理速度慢达不到实时原因可能是用了大模型或者没导出优化格式。yolov5s 在 GPU 上跑 640 分辨率能到几百 FPS但如果部署在树莓派或 Jetson 上要导出成 ONNX 或 TensorRT。树莓派 5 上跑 yolov5s 的 ONNX 大概能到几 FPS够做低频行为采样但别指望高帧率实时。解决办法是根据硬件选模型边缘端优先 yolov5n 或 yolov5s并开启半精度推理。6. 把模型用起来微调技巧与行为统计的落地方式训练出模型只是第一步真正产生价值的是把逐帧检测变成行为统计。我一般会在推理后加一层时序逻辑单帧检测到「吃」不算数连续 15 帧里超过 10 帧是「吃」才记一次进食行为。这样能过滤掉猪只走动时的瞬时误判统计曲线会干净很多。from collections import deque # 简易时序平滑滑动窗口投票 window deque(maxlen15) def smooth_behavior(frame_cls): window.append(frame_cls) if len(window) 15: return None # 返回窗口内出现次数最多的类别 return max(set(window), keywindow.count)这段逻辑很朴素但极其有效。maxlen15对应大约半秒到一秒的窗口按你的摄像头帧率调。参数上窗口太短过滤不掉抖动太长会漏掉快速行为切换。猪的进食饮水通常持续几秒到几十秒15 帧窗口是安全的起点。微调自己的数据时我的习惯是冻结 backbone 先训 10 轮让检测头适应新类别分布再解冻全部训 20 轮。学习率用 0.001 起步配合余弦退火。这样既不会破坏预训练学到的通用特征又能让模型贴合新猪舍。最后提醒一句行为识别模型的寿命有限猪会长大、栏舍会改造、摄像头会移位建议每季度用新数据微调一次别指望一个模型用三年。希望帮到你。本文还有配套的精品资源点击获取
返回列表