
简介这份目标检测猪群数据集面向从事计算机视觉与智慧农业方向的开发者、学生及研究人员用于训练和评估Faster R-CNN、YOLO、SSD等目标检测模型解决猪群识别与定位的样本来源问题可应用于农业监控、动物健康监测与农场管理等场景。压缩包共2000个文件以1448张jpg原始图像和1448个xml标注文件为主整体约31.79MB图像存放于JPEGImages目录xml由labelimg工具生成并集中于Annotations目录逐图记录猪群边界框坐标与类别标签另含一个用途待定的新建文件夹。目前已有766人学习下载。借助像素级精确标注读者可直接开展模型训练与验证省去自行采集与标注的成本并据此搭建猪群自动检测流程为数量统计、疾病预防与生长状态预测等应用提供数据基础。1. 猪群数据集到底长什么样从猪场巡检到目标检测落地的第一道坎猪场里装摄像头做巡检最头疼的不是模型选哪个而是数据从哪来。目标检测猪群数据集说白了就是一批标注好的猪只图像每张图上用矩形框标出每头猪的位置附带类别标签。它解决的是“让模型学会在复杂猪舍环境里认出每一头猪”的问题适合做智慧养殖、猪只计数、异常行为预警的团队。很多人一上来就找开源数据集结果发现要么是学术论文里的几百张图要么是国外农场场景跟国内高密度、遮挡严重的猪舍完全对不上。我见过太多人拿着公开数据集训出来的模型换到自己猪场一跑漏检率直接飙到四成以上。这个数据集方向的核心难点不在标注本身而在于猪群场景的特殊性猪只互相遮挡、光照不均、地面反光、摄像头角度固定但猪在动。所以真正能用的猪群数据集必须从你自己的场景里长出来而不是靠下载。这一章先把“这是什么、能解决什么、适合谁”讲清楚后面几章再拆怎么采、怎么标、怎么训、怎么避坑。2. 自建猪群数据集的采集与标注从摄像头选型到标注文件落地2.1 摄像头架设与采集频率的取舍猪舍环境跟通用目标检测场景差别很大。氨气浓度高、粉尘大、光照要么是顶部灯带直射要么是窗户侧光猪只皮肤反光还特别强。我一般建议用 200 万像素以上的网络摄像头帧率不用太高15 到 20 帧足够因为猪的活动速度没那么快。关键是安装位置俯拍角度控制在 30 到 45 度之间太高了猪只重叠严重太低了背景干扰多。每栏至少装两个点位一个看采食区一个看休息区因为猪在不同区域的行为模式不一样单点位采集会导致模型对某些姿态过拟合。采集频率上不要连续录一整天。我通常按“每小时抽 5 分钟、连续采 7 天”的方式这样能覆盖不同时段的光照变化和猪只活动周期。采下来的原始视频先抽帧抽帧间隔按 2 到 3 秒一帧因为相邻帧差异太小标了也是重复劳动。抽帧脚本用 OpenCV 就能写核心是控制输出图像的分辨率和命名规则方便后续追溯。import cv2 import os # 输入视频路径和输出目录 video_path pig_pen_01.mp4 output_dir frames_pen_01 os.makedirs(output_dir, exist_okTrue) # 抽帧间隔每 2 秒取一帧 fps cv2.VideoCapture(video_path).get(cv2.CAP_PROP_FPS) interval int(fps * 2) cap cv2.VideoCapture(video_path) frame_count 0 saved_count 0 while True: ret, frame cap.read() if not ret: break if frame_count % interval 0: # 统一缩放到 1280x720减少后续标注和训练压力 frame cv2.resize(frame, (1280, 720)) filename os.path.join(output_dir, fpen01_{saved_count:05d}.jpg) cv2.imwrite(filename, frame) saved_count 1 frame_count 1 cap.release() print(f共保存 {saved_count} 帧)这段代码的逻辑很直接读视频、按间隔取帧、缩放、存图。参数上注意两点interval根据实际视频帧率算不要写死缩放尺寸建议统一到 1280x720 或 1920x1080后续标注工具和训练框架对这两个尺寸支持最好。存图命名带栏号和序号后面排查问题时能快速定位是哪一栏哪一时段。2.2 标注工具选型与猪只框的边界规则标注工具我用过 LabelImg、CVAT 和 Labelme。猪群数据集只做矩形框检测LabelImg 最轻量但团队协作时 CVAT 更合适支持多人同时标同一批图还能做审核流转。标注格式建议直接存 YOLO 格式的 txt每行是类别 中心x 中心y 宽 高归一化到 0 到 1 之间。如果后续想转 COCO 或 VOC写个转换脚本就行但一开始就存 YOLO 格式最省事。猪只框的边界规则是血泪经验框要贴紧猪只可见轮廓但遇到遮挡时只标可见部分不要脑补被挡住的部位。比如两头猪叠在一起前面那头完整标后面那头只标露出来的头或背不要画一个包含两头猪的大框。另外仔猪和育肥猪如果体型差异大建议分两个类别不然后续做计数时阈值很难调。标注一致性靠的是提前定规则文档我一般会写一页纸的标注规范配上正例反例图新来的标注员先标 50 张给老手审核通过率到 95% 以上才放开量。# 用 LabelImg 标注后YOLO 格式的目录结构应该是这样 # datasets/ # images/ # train/ val/ # labels/ # train/ val/ # 每个图像对应一个同名 txt放在 labels 对应子目录下目录结构看着简单但很多人栽在路径上。YOLO 训练时读的是images/train和labels/train的对应关系如果文件名不一致或者目录层级多一层训练直接报找不到标签。我习惯在标注完成后写个校验脚本检查每张图是否有对应 txt、每行是否五个值、坐标是否在 0 到 1 之间。2.3 数据增强策略针对猪群遮挡和光照的定向扩充猪群数据集的样本量通常不会太大一个栏舍采一周也就几千张。数据增强是必须的但不能无脑用通用增强。我一般会针对猪群场景做这几类随机裁剪模拟遮挡、亮度对比度扰动模拟光照变化、水平翻转增加姿态多样性。Mosaic 增强对猪群检测提升明显因为它能把四张图拼在一起变相增加小目标和遮挡样本。但要注意Mosaic 用多了会让模型对拼接边界产生误判建议在训练后期关掉。import albumentations as A transform A.Compose([ A.RandomCrop(width960, height540, p0.5), # 模拟部分遮挡 A.RandomBrightnessContrast(brightness_limit0.3, contrast_limit0.3, p0.6), A.HorizontalFlip(p0.5), A.Mosaic(p0.5), # 注意albumentations 的 Mosaic 需要额外配置 ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels]))参数上RandomCrop的尺寸不要小于 640否则小目标猪只容易丢。RandomBrightnessContrast的限度控制在 0.3 以内太大会让猪只纹理失真。Mosaic 的概率在训练前 80% 轮次设 0.5后 20% 设 0这个经验值来自多次对比实验。增强后的图要抽查确保框跟着变换走了不然标了等于白标。3. 从 YOLO 格式到训练配置猪群检测模型的参数怎么调3.1 数据集划分与 YOLO 配置文件写法数据集划分我一般按 7:2:1 分训练、验证、测试。但猪群数据有个坑同一栏舍的图不能同时出现在训练集和验证集里否则验证指标虚高实际换栏舍就崩。正确做法是按栏舍或按时间段划分比如 1 到 5 栏做训练6 到 7 栏做验证8 栏做测试。这样验证指标才能反映模型在新环境下的泛化能力。YOLO 的配置文件主要是data.yaml里面写清楚训练、验证、测试的路径类别数和类别名。如果是 YOLOv8 或 YOLOv11格式基本一致。注意路径用绝对路径还是相对路径取决于你从哪个目录启动训练我习惯用绝对路径省得后面换目录时找不到文件。# pig_data.yaml path: /home/user/pig_dataset train: images/train val: images/val test: images/test nc: 2 # 类别数育肥猪、仔猪 names: 0: fattening_pig 1: pigletnc和names必须对应顺序不能错。如果只检测猪不分类别nc写 1names写pig就行。但实际项目中我建议至少分仔猪和育肥猪因为体型差异大混在一起训模型会偏向大目标仔猪漏检严重。3.2 训练超参设置学习率、批次大小和输入尺寸的联动训练超参没有万能值但猪群检测有几个经验区间。输入尺寸我一般用 640 或 960640 速度快但小目标差960 对小猪检测更友好但显存吃紧。批次大小根据显存来8GB 显存跑 640 尺寸可以到 16跑 960 只能到 8。学习率初始值用 0.01配合余弦退火如果 loss 震荡就降到 0.001。权重衰减用 0.0005动量 0.937这些是 YOLO 系列的常用默认值猪群数据上不用大改。# YOLOv8 训练命令示例 yolo detect train \ datapig_data.yaml \ modelyolov8m.pt \ epochs200 \ imgsz960 \ batch8 \ lr00.01 \ lrf0.01 \ momentum0.937 \ weight_decay0.0005 \ warmup_epochs3 \ cos_lrTrue \ patience50 \ device0imgsz960和batch8是联动参数显存不够就降 batch 或降 imgsz。patience50表示验证指标 50 轮不提升就早停猪群数据一般 150 到 200 轮收敛。cos_lrTrue开启余弦退火对最终精度有 1 到 2 个点的提升。如果训练中途 loss 突然变成 nan先检查标注文件有没有坐标越界或空文件这是最常见的原因。3.3 评价指标怎么看mAP 之外还要盯紧漏检和误检mAP 是通用指标但猪群检测我更关注漏检率和误检率。漏检就是猪在图上但模型没框出来误检是把地面反光或饲料槽当成猪。这两个指标在验证集上要单独统计不能只看 mAP。我一般用混淆矩阵看每类的漏检和误检分布如果仔猪漏检高说明小目标特征没学好要么加小目标增强要么提高输入尺寸。如果误检集中在某个区域检查那个区域的训练样本是不是太少。另外猪群密度高的时候NMS 的 IoU 阈值要调。默认 0.7 在密集场景下会把相邻猪只的框合并导致计数偏少。我一般把 IoU 阈值降到 0.5 到 0.6让模型保留更多框后续再用业务逻辑去重。这个参数在推理阶段调不影响训练。4. 猪群数据集训练的避坑与排查那些让模型崩掉的细节4.1 标注文件里的空行和越界坐标现象训练启动后 loss 直接 nan或者报 “invalid bbox” 错误。原因标注 txt 里有空行或者坐标值大于 1 或小于 0。解决写个校验脚本遍历所有 labels 文件检查每行是否五个值、坐标是否在 0 到 1 之间、宽高是否大于 0。发现异常直接打印文件名和行号手动修或重新标。4.2 训练集和验证集分布不一致现象训练 loss 一直降验证 mAP 卡在 0.3 上不去。原因训练集和验证集来自不同栏舍或不同光照条件模型学到了训练集的特定背景。解决重新划分数据确保训练集和验证集覆盖相似的场景多样性。如果做不到就在训练集里加入验证集场景的少量样本做域适应。4.3 显存溢出与批次大小虚高现象训练一开始就报 CUDA out of memory。原因batch设太大或者imgsz设太高显存不够。解决先降batch到 4 或 2跑通后再逐步加。也可以用ampTrue开启混合精度显存占用能降三成左右。另外如果用了 Mosaic 增强显存占用会比不开高 20% 到 30%调参时要留余量。4.4 模型对仔猪漏检严重现象育肥猪检测 mAP 0.85仔猪只有 0.4。原因仔猪目标小训练样本少且和育肥猪混在一起训时模型偏向大目标。解决把仔猪单独作为一个类别增加仔猪样本的采样权重或者用 Copy-Paste 增强把仔猪贴到更多背景上。输入尺寸从 640 提到 960 也有帮助但要注意显存。4.5 推理时框重叠导致计数偏少现象模型检测结果可视化看着都对但计数比实际少。原因NMS 的 IoU 阈值太高相邻猪只的框被合并。解决推理时把 IoU 阈值降到 0.5或者用 Soft-NMS 替代标准 NMS。如果猪只特别密集还可以考虑用分割模型先分割再计数但标注成本会高很多。5. 猪群检测的进阶技巧用跟踪和重识别补上计数短板检测模型在猪群场景有个天然短板猪只互相遮挡时单帧检测会漏。这时候光靠调检测模型不够得引入跟踪。我一般用 ByteTrack 或 BoT-SORT 做多目标跟踪把检测框按时间关联起来即使某一帧漏检跟踪器也能靠前后帧补上。这样计数准确率能从单帧的 85% 提到 95% 以上。跟踪的代码用 Ultralytics 的track模式就能跑核心参数是tracker配置文件和persistTrue。from ultralytics import YOLO model YOLO(pig_yolov8m.pt) # 跟踪模式persistTrue 表示帧间保持轨迹 results model.track( sourcepig_pen_video.mp4, trackerbytetrack.yaml, persistTrue, conf0.4, iou0.5, showTrue )conf0.4是置信度阈值猪群场景建议比通用检测低一点宁可多检也别漏检后面跟踪器会过滤掉误检。iou0.5配合跟踪使用减少框合并。tracker配置文件里可以调track_high_thresh和track_low_thresh高阈值控制新轨迹生成低阈值控制轨迹延续猪群场景我一般把低阈值设到 0.1让轨迹更连续。另一个进阶方向是重识别。如果猪场里猪只数量固定可以训一个猪脸或猪背的 ReID 模型把检测框和个体 ID 绑定这样不仅能计数还能追踪每头猪的活动轨迹。ReID 的数据集需要每头猪至少 10 到 20 张不同角度的图标注成本高但一旦建起来后续做异常行为分析就方便很多。我自己的习惯是先把检测和跟踪跑稳再考虑要不要上 ReID因为 ReID 的维护成本不低猪只换栏或出栏后 ID 管理会很麻烦。最后说个验证技巧模型训完后不要只看验证集指标拿一段没参与训练的完整视频跑一遍人工数一遍猪跟模型计数对比。差 5% 以内算合格差 10% 以上就得回去查数据或调参。这个习惯帮我省了很多次上线后翻车。希望帮到你。本文还有配套的精品资源点击获取