news 2026/9/24 19:17:14

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
猪行为识别实战: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,格式基本兼容,改一下训练命令即可,但没必要为了新而新。

格式单图标注文件是否需要转换适配 yolov5
yolov5 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 python=3.9 -y conda activate pigyolo # 安装 pytorch,cuda 版本按你显卡驱动选,这里以 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 和验证集的 mAP@0.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。你要找的是验证 mAP@0.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("mAP@0.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 轮就够,让模型适应新场景而不是把旧知识忘光。

指标含义行为识别里的关注点
mAP@0.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(maxlen=15) def smooth_behavior(frame_cls): window.append(frame_cls) if len(window) < 15: return None # 返回窗口内出现次数最多的类别 return max(set(window), key=window.count)

这段逻辑很朴素但极其有效。maxlen=15对应大约半秒到一秒的窗口,按你的摄像头帧率调。参数上,窗口太短过滤不掉抖动,太长会漏掉快速行为切换。猪的进食饮水通常持续几秒到几十秒,15 帧窗口是安全的起点。

微调自己的数据时,我的习惯是冻结 backbone 先训 10 轮,让检测头适应新类别分布,再解冻全部训 20 轮。学习率用 0.001 起步,配合余弦退火。这样既不会破坏预训练学到的通用特征,又能让模型贴合新猪舍。最后提醒一句,行为识别模型的寿命有限,猪会长大、栏舍会改造、摄像头会移位,建议每季度用新数据微调一次,别指望一个模型用三年。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 19:16:22

Java排序算法全解析:从面试八股到JDK源码与工程实践

要说Java面试里最出戏的环节&#xff0c;排序算法绝对排得上号。我面过不少候选人&#xff0c;简历上写着"熟悉常用数据结构与算法"&#xff0c;结果让手写个快排&#xff0c;三分钟憋出一个冒泡排序。反过来&#xff0c;也有人把快排背得滚瓜烂熟&#xff0c;但问他…

作者头像 李华
网站建设 2026/9/24 19:16:21

d3dx9_43.dll缺失深度解析:原因、修复方法与避坑指南

1. 报错现场&#xff1a;玩个老游戏&#xff0c;却弹出找不到d3dx9_43.dll先说个前几天刚遇到的事。我翻出一台旧笔记本想重温一下某款2010年左右的老单机游戏&#xff0c;下载完、解压、双击exe&#xff0c;结果屏幕直接弹出一个对话框&#xff1a;“由于找不到d3dx9_43.dll&a…

作者头像 李华
网站建设 2026/9/24 19:16:06

Maven安装配置全攻略:从环境变量到IDEA集成避坑指南

最近有个同事跑过来问我&#xff1a;Maven明明装好了&#xff0c;IDEA 里也配了&#xff0c;为什么新建项目还是卡在下载依赖那个转圈界面&#xff1f;我过去一看&#xff0c;他用的还是 Maven 默认的中央仓库地址&#xff0c;settings.xml基本没动&#xff0c;本地仓库也还在 …

作者头像 李华
网站建设 2026/9/24 19:15:36

在线SVG编辑器实战:从选型到导出,前端开发者避坑指南

1. 为什么我最终选择了在线SVG编辑器做前端和UI这些年&#xff0c;矢量图这件事一直绕不开。早期我习惯用桌面端的Illustrator或者Inkscape&#xff0c;功能确实强&#xff0c;但每次要改一个图标、调一条路径&#xff0c;都得先打开几百兆的软件&#xff0c;等它加载完字体和插…

作者头像 李华
网站建设 2026/9/24 19:13:54

软考培训班怎么选不踩坑,五个维度给你讲透

软考培训班从几百到上万都有&#xff0c;到底差在哪&#xff1f;好多人报班之前只看价格&#xff0c;报完才发现这也没有那也不含&#xff0c;再想退就难了。今天把选软考培训班要注意的五个维度给你讲清楚&#xff0c;照着对比就不会踩坑。选班看什么好多人选培训班就看一条&a…

作者头像 李华
网站建设 2026/9/24 19:13:12

996引擎-源码学习:客户端游戏事件时序与参数全解

996引擎-源码学习:客户端游戏事件时序与参数全解 996引擎客户端游戏事件时序与参数全解 一、范围与读法 二、先看整条客户端生命周期 三、分块时序与事件参数 3.1 系统启动与主界面初始化 3.2 地图切换、安全区与地图资源 3.3 主玩家属性、经验、血蓝与货币 3.4 实体进出视野、…

作者头像 李华