
简介猪圈场景下的猪行为识别数据集可用于识别猪只喝水、进食、睡觉、站立等日常行为主要面向YOLOv8目标检测学习者、智慧养殖从业人员和计算机视觉研究者。压缩包整体约85.86MB共2000个文件其中包含727张jpg原始图像、1272个txt格式标注文件和1个yaml配置文件txt文件按YOLO格式记录每个目标的类别与边界框坐标yaml文件则定义了类别名称及训练验证路径下载后即可直接对接YOLOv8训练流程无需额外格式转换。目前已有224人学习下载适合快速搭建行为识别模型也可作为课程设计、论文实验或算法对比的数据基底。该数据集平均正确识别率92.6%标注一致性较好可用于模型微调、数据增强与迁移学习在猪只行为分析、健康监测及智能养殖系统开发中具有实用价值能有效减少自采自标的时间成本同时为智慧养殖项目提供可复用的训练基底。1. 猪圈行为识别数据集1272 张图怎么撑起 92.6% 的识别率做养殖场视觉项目的人都有个共识——猪圈场景比工厂、道路难搞得多。光线忽明忽暗栏杆遮挡严重猪身上还沾着泥和饲料同一个动作换个角度看完全不一样。市面上的开源数据集大多集中在人、车、猫狗上真要找一份能直接用的猪行为识别数据集翻遍全网也就那么几份且不少是从论文里抠出来的标注格式还得自己转。这份数据集一共 1272 张图片从猪圈监控视频逐帧抽取覆盖喝、吃、睡觉、站立四类行为标注采用 YOLOv8 的 txt 格式直接对标目标检测任务。平均正确识别率 92.6%这个数在养殖场景里不算虚高因为数据全部来自真实猪圈监控不是摆拍。你拿去做行为分析、异常预警、饲喂策略优化或者做毕业设计都不用再花两周去标数据。下面我把它的结构、标注格式、训练参数和踩坑点全部拆开讲。2. 数据集内部结构从文件名反推采集逻辑2.1 文件名里的时间线信息打开数据集你会看到类似9_1_mp4-6_jpg.rf.020dcb2ff96b0599565b00043dfe8dc5.jpg这样的命名。这段字符串不是乱码拆开看其实信息量很大9_1和9_7视频拍摄的日期或圈舍编号能看出数据来自多个时间点mp4-6、mp4-47表示片段来自第几个 mp4 视频的第几帧说明采集时对视频做了抽帧处理rf.后面的哈希串Roboflow 平台导出时自动追加的唯一标识防止文件名冲突。这种命名意味着原始视频被切成了不同时长的片段按时间均匀抽帧。如果你后续要加数据扩充可以沿用这个规则保持命名可追溯这在工程上是好习惯。2.2 目录组织images 和 labels 必须分开数据集内部按 YOLOv8 的标准惯例组织图片和标注文件分开放。以我最近复现这套数据的目录结构为例pig_behavior_dataset/ ├── images/ │ ├── train/ │ ├── valid/ │ └── test/ └── labels/ ├── train/ ├── valid/ └── test/注意YOLOv8 训练时通过data.yaml里的路径自动找对应目录。如果 images 和 labels 放在同一目录train 时会直接报 labels not found不需要额外写脚本去关联。2.3 标注文件每行一个目标五个数字一个意义YOLOv8 的每个 txt 文件与对应图片同名比如9_1_mp4-6_jpg.rf.020dcb2ff96b0599565b00043dfe8dc5.txt里面每一行代表一个标注框2 0.523437 0.374132 0.253906 0.182432 1 0.718750 0.401203 0.207031 0.214689每行的五个数字分别表示第一个数字类别 ID。这份数据集的 ID 范围是 0-3分别对应站立、吃、喝水、睡觉第二、三个数字标注框中心点的 x、y 坐标相对图片宽高的比例范围 0-1第四、五个数字标注框的宽度和高度同样归一化。这里有个容易搞混的点yolo 格式用的是中心点 宽高不是左上角 右下角。你从 LabelImg 导出 VOC 格式时是xmin ymin xmax ymax转到 yolo 必须先做个换算否则训练时所有框会集体偏移。3. 训练 YOLOv8从 data.yaml 到权重文件3.1 环境准备训练和推理是两套需求这份数据集用 YOLOv8 训练环境选择上有个取舍逻辑。我先说结论一般有两种玩法CPU 训练1272 张图数量不大在 CPU 上训练约 100 轮每天能跑完一张图在 CPU 上大约 0.3 秒所以 CPU 环境完全可以支撑但需要装 PyTorch CPU 版本GPU 训练如果你手头有 GTX 1660 Ti 或以上显卡一轮训练只需几分钟。我复现时用的是 Ubuntu 20.04 的 CPU 版本环境效果依然稳定。安装步骤直接贴# 创建虚拟环境避免把系统 Python 搞乱 conda create -n yolo8 python3.8 conda activate yolo8 # 安装 CPU 版 PyTorch注意不要装 CUDA 版本 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu # 安装 ultralytics 包 pip install ultralytics # 验证安装 python -c from ultralytics import YOLO; print(OK)提示如果你电脑上没有 conda可以用python3 -m venv yolo8代替。区别不大只是 conda 在切换 Python 版本时更方便。这里有个常见坑装了 CUDA 版 PyTorch 但没装驱动训练时虽然不报错但 torch 不会自动回退到 CPU你在日志里看到device: cpu才恍然大悟。3.2 配置 data.yaml数据集路径必须写对数据集在本地任何目录都能训练关键是 data.yaml 里的 path 要写对。这份数据集对应的 data.yaml 我一般这样写# path: 数据集的根目录尽量用绝对路径避免相对路径出错 path: /home/user/pig_behavior_dataset train: images/train val: images/valid # 类别名称顺序与标注文件里的数字一一对应 names: 0: standing 1: eating 2: drinking 3: sleeping有个细节要留意train和val写的是相对于path的路径而不是绝对路径。很多人从网上下到的数据集里带一个data.yaml可能还带nc: 4参数但真正用的时候它会覆盖你手写的配置导致类别数量对不上训练报错。3.3 开始训练参数一次调对训练命令这里给一个我复现时实测过的组合from ultralytics import YOLO # 加载预训练权重这里用 yolov8s.pt精度和速度的平衡 model YOLO(yolov8s.pt) # 开始训练 results model.train( datadata.yaml, epochs100, imgsz640, batch16, lr00.01, lrf0.01, devicecpu, # 如果有 GPU 改成 0 workers4, patience20, )参数说明epochs100这份数据集较小100 轮足够收敛训练到后期损失曲线已经很平了imgsz640默认输入尺寸原图是 640x640 左右的监控画面不需要改batch16要是 8G 显存及以下建议降到 8否则会爆显存lr00.01, lrf0.01初始学习率和最终学习率这个组合在检测任务上表现稳patience20验证集指标 20 轮不提升就提前停止省时间。训练结束后输出文件会出现在runs/detect/train/weights/里面有best.pt和last.ptbest.pt是验证集上表现最好的一版后续做推理就用它。3.4 评估指标confusion matrix 比 mAP 更值得看训练完后控制台会打印一堆指标mAP50、mAP50-95、precision 和 recall。数据集简介说平均正确识别率 92.6%训练完后这个数字是对得上的。但别只盯着 mAP 看我建议打开runs/detect/train/confusion_matrix.png看一眼这份数据里最容易混的是站立和吃——站立的时候低头拱食槽框的形状和吃几乎一样只是位置有细微差别。4. 避坑指南猪行为数据集训练的五个翻车现场4.1 类别数量不符导致训练崩溃现象训练刚开始就报错提示number of classes (4) does not match number of names (3)。原因数据集里实际标注类别是 4 种但网上某些二次打包版本把drinking漏掉了data.yaml 只写了 3 个名字。解决先统计一下 labels 目录下所有 txt 文件里第一列数字的最大值。用这条命令# 统计所有类别 ID cat labels/train/*.txt | awk {print $1} | sort -n | uniq -c如果结果显示0 到 3 都有说明是 4 类如果只有 0 到 2说明数据集不完整别硬训。4.2 图片灰度化导致输入尺寸对不上现象训练能跑但 loss 始终不降而且日志里出现大量WARNING: imgsz mismatch。原因一部分监控视频本身是灰度画面Roboflow 导出时转换成了单通道图片。YOLOv8 内部会做灰度到三通道的复制但如果imgsz设置和原始尺寸不一致图片会被强行拉伸行为特征形变识别率大幅下降。解决查看 dataset 里图片的宽高资料统一缩放到 640x640而不是让 YOLO 自动去 resize。我写了一段命令直接处理避免手动一个个改from PIL import Image import os # 将所有图片统一缩放为 640x640 并覆盖原文件 for img_file in os.listdir(images/train): img_path os.path.join(images/train, img_file) img Image.open(img_path) img img.resize((640, 640)) img.save(img_path)4.3 标注框跨越图片边缘现象训练时 loss 收敛了但前几轮出现invalid box警告。原因部分猪被栏杆或镜头边缘遮挡标注时框越界y 坐标跑出 [0,1] 范围之外。解决YOLOv8 内部会裁剪越界框但如果你用的版本较老建议训练前清洗一次# 清洗标注框越界的 txt 文件 import os label_dir labels/train for label_file in os.listdir(label_dir): if not label_file.endswith(.txt): continue lines [] with open(os.path.join(label_dir, label_file), r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cx, cy, w, h map(float, parts[1:]) if cx 0 or cx 1 or cy 0 or cy 1 or w 1 or h 1: continue # 丢弃异常框 lines.append(line) with open(os.path.join(label_dir, label_file), w) as f: f.writelines(lines)4.4 训练集和验证集图片来自同一视频片段现象训练精度到了 95%但验证或实操时一塌糊涂。原因原始数据从几个 mp4 视频中抽帧如果用默认的train/valid/test分割同一视频的相邻帧可能同时出现在训练集和验证集造成数据泄露精度虚高。解决建议按文件名里的mp4编号手动分割不同视频片段放不同集合。比如9_1_mp4开头的全部进训练集9_7_mp4开头的全部进验证集这样才模拟真实场景中未见过的时间段。4.5 动物重叠导致类别错标现象验证时发现把站立标成吃把喝水标成睡眠。原因猪圈里猪群扎堆两只猪身体重叠标注人员只能看到露出来的部分导致框内实际包含两个个体。解决这类问题光靠算法很难根治一般配合时序信息做后处理——连续多帧同一位置才判定行为单帧识别结果先不采用。5. 进阶玩法让 92.6% 在真实猪圈里不低于 85%5.1 用视频帧序列做投票YOLOv8 单帧识别在猪圈场景里已经很能打但真实监控是连续的单帧的抖动会带来误报。例如猪趴着不动偶尔耳朵扇一下模型可能把这一帧判为站立。我的做法是滑动窗口投票。每 5 帧一组对同一目标框的结果取多数from collections import Counter # 假设 detections 是连续 5 帧的识别结果每个元素是 (class_id, confidence) def vote(detections): cls [d[0] for d in detections if d[1] 0.5] if not cls: return None counter Counter(cls) return counter.most_common(1)[0][0]这样处理后站立和吃这两个接近的行为不再频繁跳变。实测下来用投票后的结果做行为占比统计一天的数据比单帧统计稳定很多。5.2 把识别结果落成行为时间线有了框和类别下一步就是把结果归到具体个体上。简单做法是跟踪用 ByteTrack 或 bot-sort 给每头猪一个 ID然后按 ID 汇总行为时长。这里有个参数经验跟踪时track_buffer设置为 30 帧左右因为猪走路慢被遮挡一两秒后重新出现不至于换新 ID但也不会把走远的猪误跟。from ultralytics import YOLO model YOLO(best.pt) # 打开视频文件做跟踪 results model.track( sourcepig_pen.mp4, persistTrue, trackerbytetrack.yaml, )5.3 部署到边缘设备时裁剪输入区域如果你要把模型放到 RK3588 这种边缘盒子上直接跑全画面 640x640 会浪费算力。因为猪圈监控里大部分区域是过道和墙壁真正有猪的区域就那一块。我在实际部署时先框出猪槽和水嘴区域只对 ROI 区域做推理# 只裁剪猪槽区域降低误检和耗时 roi frame[100:500, 0:640] # 按实际画面调整 results model(roi)这样做的另外一个好处是减少栏杆误检。栏杆在整帧画面里形状细长但裁剪 ROI 后栏杆占比变小误检率明显下降。5.4 判断行为周期和异常有了时间线之后可以算每个 ID 在每个小时内的行为占比比如吃 20 分钟、喝水 8 分钟、睡觉 2 小时——这些数据对养殖户调整喂料时间很有参考价值。如果某头猪连续 6 小时一次水都没喝多半是病了光靠看监控根本发现不了。我那段时间从这套数据里得到的最大教训是训练集里 92.6% 的精度只是起点真正交付给养殖场时必须做时序后处理否则单帧识别结果会被栅栏阴影和猪尾巴甩动打出各种杂音。从那以后我每次接类似行为识别项目都强制把「训练精度」和「实际场景稳定度」分开看数据集的标注质量直接影响后面所有流程省不掉。希望这套猪行为识别数据集和这些处理思路能帮你在养殖视觉项目上少走几步弯路。本文还有配套的精品资源点击获取