猪行为识别数据集实战:1272张图与YOLOv8训练全解析

发布时间:2026/10/5 4:02:21
猪行为识别数据集实战:1272张图与YOLOv8训练全解析
简介这份猪行为识别数据集面向从事智慧养殖、动物行为分析与计算机视觉的开发者与研究人员用于解决猪圈场景下猪只日常行为自动分类的问题。数据集可识别喝、吃、睡觉、站立等典型行为平均正确识别率约92.6%适合目标检测与行为分类模型的训练、微调及算法验证。资源包共1275个文件包含1272张jpg图像与3个json标注文件压缩包约85.57MB图像覆盖多种猪圈实拍场景json采用coco格式可直接对接主流检测框架省去自行标注与格式转换的环节。目前已有214人学习下载具备一定参考热度。借助该数据集读者可快速搭建行为识别基线模型对比不同网络结构在真实养殖环境下的表现并据此优化数据增强与类别平衡策略为后续落地部署提供可靠的数据支撑。1. 猪行为识别数据集1272 张图、92.6% 准确率这份资源到底能不能直接上手养殖场里判断一头猪是在吃料、喝水、睡觉还是站着靠人盯监控基本不现实——一个栏舍几十头猪24 小时轮班看人力成本比设备还贵。这份猪行为识别数据集就是冲着这个场景来的1272 张猪圈实拍图片标注了喝、吃、睡觉、站立等行为类别平均正确识别率 92.6%标注格式是 coco json。如果你正在做 yolov8 训练自己的数据集这类落地任务或者想找一个真实养殖场景的行为识别数据集练手这份资源的价值在于它省掉了最耗时的采集和标注环节。它适合两类人一是做智慧养殖、动物行为分析的算法工程师二是想拿真实场景数据跑通检测行为分类流程的开发者。但 92.6% 这个数字有前提后面会拆开讲。2. 数据集结构与 coco json 标注先看清手里有什么再动手2.1 文件命名规律与图像来源从项目正文给出的文件名能读出不少信息。像9_1_mp4-10_jpg.rf.b25137884f2311f2a68a044e7069c456.jpg这种命名前缀9_1_mp4大概率是视频编号加帧序号说明图片是从监控视频抽帧来的不是摆拍。rf.后面那串哈希是标注工具导出时自动生成的唯一标识常见于 roboflow 这类平台的导出流程。10_00-1-1-_mp4-48则说明至少有两个视频源9 和 10 开头覆盖了不同时间段或不同栏舍。这个命名规律对训练有实际影响同一视频抽出的帧高度相似如果随机划分训练集和验证集会出现「同一头猪的相邻帧分别落在训练和验证里」的情况验证准确率会虚高。常见做法是按视频编号划分比如 9 开头的做训练、10 开头的做验证这样评估才接近真实泛化能力。2.2 coco json 的字段含义与读取coco json 格式的核心结构是images、annotations、categories三个数组。行为识别数据集和纯目标检测的区别在于类别标签对应的是「行为」而不是「物体」。喝、吃、睡觉、站立这四个类别标注框框的是猪的身体区域类别名描述的是这头猪当前在干什么。用 Python 读取并统计类别分布的代码如下import json from collections import Counter # 加载 coco json 标注文件 with open(annotations.json, r, encodingutf-8) as f: data json.load(f) # 建立 category_id 到类别名的映射 cat_map {c[id]: c[name] for c in data[categories]} print(类别列表:, cat_map) # 统计每个类别的标注框数量 counter Counter(ann[category_id] for ann in data[annotations]) for cid, cnt in counter.items(): print(f{cat_map[cid]}: {cnt} 个标注框) # 统计图片总数和标注框总数 print(图片总数:, len(data[images])) print(标注框总数:, len(data[annotations]))这段代码先建立类别 id 到名称的映射再用 Counter 统计每个类别的框数。跑完你就能看到喝、吃、睡觉、站立四类各有多少样本。如果某一类明显偏少比如「喝」只有几十个框训练时就要考虑过采样或类别权重否则模型会偏向多数类。2.3 标注质量的自检方法拿到 coco json 别急着训练先做两件事。第一用脚本把标注框画回原图肉眼抽查 20 张看框是否贴合猪的身体、类别是否标错。第二检查有没有越界框坐标超出图像宽高和零面积框。越界框在训练时会引发坐标归一化异常零面积框会让损失计算出 NaN。# 检查越界框和零面积框 img_map {img[id]: img for img in data[images]} bad 0 for ann in data[annotations]: img img_map[ann[image_id]] x, y, w, h ann[bbox] if w 0 or h 0: bad 1 print(零面积框:, ann[id]) if x 0 or y 0 or x w img[width] or y h img[height]: bad 1 print(越界框:, ann[id]) print(异常框总数:, bad)bbox字段是[x, y, width, height]格式x、y 是左上角坐标。这段逻辑就是逐框判断面积和边界。异常框数量如果超过总数的 1%建议先清洗再训练不然那 92.6% 的准确率你复现不出来。3. 用 yolov8 训练猪行为识别模型从配置到跑通3.1 环境准备与数据格式转换yolov8 不直接吃 coco json需要转成 yolo 的 txt 格式每行类别 x_center y_center width height坐标归一化到 0-1。转换脚本如下import json import os with open(annotations.json, r, encodingutf-8) as f: data json.load(f) # coco 的 category_id 可能不从 0 开始需要重映射为 0,1,2,3 cats sorted(data[categories], keylambda c: c[id]) cat_id_map {c[id]: i for i, c in enumerate(cats)} img_map {img[id]: img for img in data[images]} os.makedirs(labels, exist_okTrue) for ann in data[annotations]: img img_map[ann[image_id]] W, H img[width], img[height] x, y, w, h ann[bbox] # 转成归一化的中心点坐标和宽高 xc (x w / 2) / W yc (y h / 2) / H nw w / W nh h / H cls cat_id_map[ann[category_id]] name os.path.splitext(img[file_name])[0] .txt with open(os.path.join(labels, name), a) as out: out.write(f{cls} {xc:.6f} {yc:.6f} {nw:.6f} {nh:.6f}\n)关键点在cat_id_mapcoco 的 category_id 经常是 1、2、3、4 而不是 0 起始yolo 要求类别索引从 0 开始连续不重映射会直接报类别越界。归一化用 6 位小数足够精度再高对训练没帮助。3.2 data.yaml 配置与训练参数转换完要写 data.yaml指定训练、验证路径和类别名path: ./pig_behavior train: images/train val: images/val nc: 4 names: [drink, eat, sleep, stand]nc是类别数names顺序必须和转换时的cat_id_map一致否则标签全错。训练命令yolo detect train modelyolov8n.pt datadata.yaml epochs100 imgsz640 batch16选yolov8n是因为 1272 张图属于小数据集大模型容易过拟合。imgsz640是默认值如果原图分辨率远大于 640猪的细节会被压缩可以试 960 但显存要够。batch16在 8G 显存上比较稳爆显存就降到 8。3.3 训练过程要看哪些指标跑起来后重点盯三个box_loss是否稳定下降、mAP50是否在 50 轮后趋于平缓、验证集的precision和recall是否差距过大。如果 recall 明显低于 precision说明漏检多可能是「睡觉」这种姿态变化大的类别样本不够。92.6% 的平均准确率对应到 mAP50 大概在 0.9 上下如果你跑出来只有 0.7先回去查标注质量和数据集划分别急着调参。4. 行为识别的坑从数据划分到类别混淆的排查记录4.1 验证集准确率虚高现象训练完 mAP50 到 0.95换一批新视频测试掉到 0.7。原因随机划分导致同一视频的相邻帧同时进了训练和验证模型记住了背景而不是行为。解决按视频编号划分9 开头进训练、10 开头进验证重跑后验证指标会降但更真实。4.2 「站立」和「吃」互相误判现象模型把低头吃料的猪判成站立。原因这两个行为的身体姿态差异小主要区别在头部位置和朝向而标注框只框了身体头部信息被弱化。解决训练时开mosaic和mixup增强或者把标注框往上扩一点包含头部也可以在推理后加一个姿态后处理规则。4.3 小目标漏检现象远处的猪检测不到。原因1272 张图里猪的尺度差异大yolov8 默认 anchor 对小目标不友好。解决imgsz提到 960或者用yolov8s换更大的输入分辨率代价是推理变慢。4.4 类别不平衡导致「喝」被忽略现象「喝」的识别率明显低于其他三类。原因猪喝水时间短抽帧命中的样本少。解决统计各类框数后对「喝」类做过采样或在损失里加类别权重。先统计再动手别盲目调。4.5 coco json 里的 category_id 不连续现象转换后训练报IndexError或类别全乱。原因coco 的 category_id 是 1、2、3、4 或跳号。解决转换脚本里必须做 id 重映射这是最常见的翻车点没有之一。5. 进阶把行为识别接进实际监控流的验证方法训练出模型只是第一步真正落地要验证它在连续视频流上的表现。我一般会写一个抽帧推理脚本模拟实际监控的帧率看行为切换的连贯性——单帧准确率高不代表时序上不跳变。具体做法用 OpenCV 读一段猪圈视频每 5 帧推理一次把结果按时间戳存下来然后统计同一头猪的行为序列是否出现「吃→站→吃」这种不合理抖动。如果抖动频繁说明模型对相似姿态区分不稳可以在推理端加一个滑动窗口投票连续 3 帧多数一致才输出。另一个验证点是跨栏舍泛化。这份数据集的 1272 张图来自有限几个视频源换一个光照、栏杆样式不同的猪圈性能大概率下降。我的习惯是留出至少一个视频源完全不参与训练专门做跨场景测试这个数字才是你敢不敢上线的依据。92.6% 是数据集内的平均表现跨场景能保住 80% 以上就算可用。还有个实用技巧把「睡觉」和「站立」这两个静态行为先合并成一个「静止」类训练跑通后再拆开微调。因为静态行为的区分主要靠姿态细节直接四分类容易在早期就卡住。拆分类训练时冻结 backbone 只训 head学习率调到 1e-4通常 20 轮就能收敛。从那以后我每次拿到行为识别数据集都强制先跑一遍类别分布统计和标注可视化再决定怎么划分、怎么增强。这份猪行为数据集的价值在于它把采集和标注的脏活干了但 92.6% 能不能变成你自己的数字取决于你有没有认真对待划分和清洗这两步。希望帮到你。本文还有配套的精品资源点击获取