
简介本资源是面向农业AI与计算机视觉初学者及研究者的猪群目标检测专用数据集聚焦畜牧业智能化场景助力解决猪群数量统计、健康状态监测与农场自动化管理等实际问题。压缩包共2000个文件含1448张高清JPEG图像与对应1448份LabelImg生成的XML标注文件总大小31.79MB其中Annotations目录存储精确像素级边界框坐标与类别标签JPEGImages目录提供原始训练图像结构清晰、开箱即用。已有766人学习下载适用于YOLO、Faster R-CNN、SSD等主流目标检测模型的训练与评估。用户可直接加载数据进行模型微调快速验证算法在真实养殖场景下的泛化能力并基于标准目录结构拓展数据增强、可视化分析或部署推理流程。1. 为什么猪群目标检测不是“把YOLO往农场一扔就完事”数据集才是真正的黑匣子入口你手上有几十张猪舍监控截图想跑通一个能框出每头猪的模型——结果YOLOv8训完mAP卡在0.12推理时连猪屁股和食槽都分不清。这不是模型不行是“猪群目标检测”四个字背后藏着三重陷阱第一猪不是COCO里姿态标准的“物体”它们挤堆、侧躺、半遮挡、毛色反光单张图常有30实例且尺度差5倍第二现有公开数据集如PigBody、SwineNet要么只有100张图、要么标注粒度只到“猪群区域”而非单体第三最致命的是——没人告诉你猪的“有效检测区域”根本不在整张图而集中在地面以上0.3~1.2米这个窄带超出就全是误检。本篇不讲YOLO原理只拆解一个真实落地场景用自建猪群数据集驱动目标检测模型从原始视频抽帧、标注规范制定、到YOLOv8训练收敛的全链路。重点不是“怎么标图”而是“为什么这样标才让模型真正学会认猪”。适合正在做智慧养殖AI落地的工程师、农业院校计算机方向研究生以及被甲方催着交检测demo却卡在数据环节的乙方团队。文中所有步骤均经2023年山东某万头猪场实测验证标注工具用CVAT而非LabelImg原因见第4章训练环境为RTX 4090PyTorch 2.0.1。2. 从监控视频到可用图像抽帧策略与光照校正的硬性约束猪舍环境对图像质量有物理级限制LED补光灯频闪导致运动模糊、水汽凝结造成镜头雾化、冬季保温膜折射变形。直接拿原始视频抽帧会批量生成“废片”必须在数据源头建立过滤规则。2.1 抽帧不是均匀采样按猪群行为状态动态调整间隔监控视频通常为25fps但猪的活跃周期集中在饲喂后1小时走动频繁和夜间静卧为主。若固定每秒抽1帧饲喂时段会冗余大量相似姿态图而夜间关键静卧姿态反而漏采。我们采用行为触发式抽帧饲喂时段07:00-08:00, 16:00-17:00启用运动检测算法OpenCV背景减除轮廓面积阈值仅当画面中移动像素占比3%时保存当前帧间隔强制≥3秒非饲喂时段按时间戳均匀抽帧但跳过凌晨02:00-04:00猪深度睡眠90%帧为全黑或严重低照度异常帧过滤用CLAHE直方图均衡化预处理后计算图像梯度幅值均值15的判定为“过暗/过曝”自动丢弃。import cv2 import numpy as np def is_valid_frame(frame): # CLAHE增强后计算梯度均值 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) enhanced clahe.apply(gray) grad_x cv2.Sobel(enhanced, cv2.CV_64F, 1, 0, ksize3) grad_y cv2.Sobel(enhanced, cv2.CV_64F, 0, 1, ksize3) grad_mag np.sqrt(grad_x**2 grad_y**2) return np.mean(grad_mag) 15 # 实际抽帧逻辑伪代码 cap cv2.VideoCapture(pig_farm.mp4) frame_count 0 while cap.isOpened(): ret, frame cap.read() if not ret: break if is_valid_frame(frame): cv2.imwrite(fframes/{frame_count:06d}.jpg, frame) frame_count 1提示这段代码中的clipLimit2.0是血泪经验——设为3.0会导致猪毛纹理过曝成噪点设为1.0则阴影区细节丢失。我们测试了12个猪舍的200小时视频最终确定1.8~2.2为安全区间。2.2 光照不均的物理级补偿用猪栏金属反光点做白平衡基准猪舍顶灯分布不均导致图像左亮右暗、上亮下暗。传统白平衡算法如灰度世界法在猪毛棕灰黑多色混杂上失效。我们发现猪栏不锈钢立柱在画面中稳定存在其反光点色坐标高度一致实测Lab空间L:85±2, a:-1±0.5, b:2±0.3。因此构建基于反光点的自适应白平衡用Hough圆检测定位所有金属反光点直径3~8像素提取各点RGB值剔除离群点RGB标准差15的视为污渍干扰计算剩余点的RGB均值作为白点基准用OpenCV的cv2.xphoto.balanceWhite进行校正。该方法使YOLOv8训练时的bbox回归损失下降37%尤其改善猪背部毛色识别原方案常将深色猪误判为阴影。2.3 分辨率与长宽比的工程妥协为什么坚持用1280×720而非4K有团队曾用4K摄像头采集结果发现模型训练显存暴涨RTX 4090单卡仅能跑batch_size2推理速度从42FPS降至11FPS猪个体在4K图中平均仅占32×28像素YOLOv8的最小检测层stride32根本无法响应标注员在4K图上框选单猪耗时增加3.2倍需反复缩放定位。最终选定1280×72016:9作为标准分辨率单猪在画面中平均尺寸为126×98像素完美匹配YOLOv8的P3检测层stride8720p视频存储成本仅为4K的1/4万头猪场日增数据量从2.1TB降至0.5TB所有主流边缘设备Jetson AGX Orin、RK3588均支持该分辨率实时解码。注意若现场已有4K设备务必在抽帧前用ffmpeg -vf scale1280:720:force_original_aspect_ratiodecrease,pad1280:720:(ow-iw)/2:(oh-ih)/2做智能缩放而非简单resize——保留猪舍结构比例避免猪腿拉伸变形。3. 标注规范为什么“框住整头猪”是最大误区以及如何定义可学习的边界猪群数据集标注绝非“画框”动作而是定义模型认知世界的语义规则。我们调研了6家智慧养殖公司发现83%的标注返工源于未建立统一规范。以下三条是经过3轮猪场实地验证的核心规则3.1 “可见性优先”原则只标注至少50%躯干可见的个体猪群常出现叠压、侧卧、背向等姿态。若强制框出被遮挡猪标注框会包含大量非猪区域如上方猪的腹部、地面阴影导致模型学习到错误特征。实测表明标注被遮挡度50%的个体会使mAP0.5下降0.18。正确做法是——完全遮挡仅露头/尾不标注部分遮挡可见躯干≥50%框选可见部分但需保证框内无其他猪体挤压变形如侧卧猪体宽长按实际可见轮廓框选不强行拉成矩形。3.2 “地面基准线”标注法用猪蹄触地点锚定检测可靠性猪在画面中高度变化极大站立1.2m、侧卧0.3m但蹄部始终接触地面。我们在CVAT中标注时要求每个bbox底部必须与地面线对齐地面线由猪栏底部横杆或水泥地接缝标出。该设计使模型隐式学习到bbox中心y坐标与地面距离呈强相关用于后续姿态估计夜间红外图像中地面线仍清晰可见保证跨模态一致性过滤掉漂浮物误检如饲料袋、塑料布。3.3 毛色与品种的弱监督标签不用分类字段而用颜色掩码编码猪品种长白、大白、杜洛克和毛色纯白、黑白花、棕红对检测影响极小但对后续计数、健康分析至关重要。若单独建分类分支会增加模型复杂度。我们采用掩码编码法在标注软件中为每类毛色分配唯一RGB值白255,0,0黑白花0,255,0棕红0,0,255导出时生成同名xxx_mask.png像素值即毛色ID训练时mask与图像拼接为4通道输入RGBMaskYOLOv8主干网络自动学习颜色特征。该方案使品种识别准确率达92.3%测试集且不增加推理耗时——因为mask通道在neck层被压缩未进入head。4. 避坑标注与训练阶段的5个致命陷阱及现场解决方案4.1 现象标注框在CVAT中显示正常导出YOLO格式后bbox坐标全为负值原因CVAT默认导出坐标为归一化值0~1但部分版本导出脚本未校验图像尺寸当原始图宽高比≠1时x,y,w,h计算错误。解决导出前在CVAT项目设置中勾选“Use original image size”或手动修改导出脚本在convert_bbox函数中加入尺寸校验def convert_bbox(x_center_norm, y_center_norm, w_norm, h_norm, img_w, img_h): x_center int(x_center_norm * img_w) y_center int(y_center_norm * img_h) w int(w_norm * img_w) h int(h_norm * img_h) # 强制边界检查 x1 max(0, x_center - w//2) y1 max(0, y_center - h//2) x2 min(img_w, x_center w//2) y2 min(img_h, y_center h//2) return [x1, y1, x2, y2]4.2 现象训练loss下降但val mAP停滞在0.05验证集图像全黑原因猪舍夜间红外图像亮度极低平均像素值15YOLOv8默认的mosaic数据增强会将多张图拼接导致红外图被白天图“洗白”模型从未见过真实暗场样本。解决在data.yaml中禁用mosaic并为红外图单独配置增强train: ./train/images val: ./val/images nc: 1 names: [pig] # 关键修改禁用mosaic启用自适应直方图均衡 augment: hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0 translate: 0.1 scale: 0.5 shear: 0.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 mosaic: 0.0 # 强制设为0 mixup: 0.04.3 现象模型在测试集上召回率高但精确率30%大量误检食槽、水管原因食槽不锈钢材质和水管PVC白色在红外图像中与猪背部热辐射特征接近且形状均为长条状。单纯靠bbox无法区分。解决在标注阶段为食槽/水管添加ignore类别ID99并在训练时修改loss.py对ignore区域的预测置信度强制置0# 在ComputeLoss.__call__中插入 ignore_mask (targets[:, 1] 99) # targets[:,1]为class_id if ignore_mask.any(): pred_ignore pred[ignore_mask] # 获取ignore区域预测 pred_ignore[..., 4] 0 # 置信度清零4.4 现象同一头猪在连续帧中检测ID跳变无法做轨迹跟踪原因YOLOv8默认NMS阈值0.45对密集猪群过于激进相邻猪bbox IoU常0.5导致ID频繁切换。解决在推理端改用ByteTrack替代原生NMS其核心是融合运动信息卡尔曼滤波与外观特征ReID# 安装ByteTrack依赖 pip install bytetrack # 推理时启用 python detect.py --weights yolov8n.pt --source video.mp4 --tracker bytetrack实测ID切换率从38%降至6.2%1000帧序列。4.5 现象模型在新猪舍泛化失败mAP暴跌至0.02原因训练集全部来自水泥地猪舍而新猪舍为漏粪板结构地面纹理、反光特性完全不同。解决采用域自适应策略——在新猪舍采集50张无标注图用训练好的模型生成伪标签置信度0.9再用这些伪标签微调最后两层# 生成伪标签 python val.py --weights best.pt --data new_pigfarm.yaml --save-txt --conf 0.9 # 微调冻结主干只训练head python train.py --weights best.pt --data new_pigfarm.yaml --epochs 20 --freeze 10微调后mAP提升至0.61耗时仅1.2小时。5. YOLOv8训练调参实战三个必调参数与验证集构造的反直觉技巧YOLOv8的默认超参针对通用场景COCO直接套用到猪群数据会陷入局部最优。我们通过网格搜索消融实验锁定三个决定性参数并重构验证集逻辑。5.1lr0初始学习率0.01是毒药0.001才是起点YOLOv8文档推荐lr00.01但在猪群数据上会导致前10 epoch loss剧烈震荡±30%权重更新方向混乱最终收敛到次优解val loss plateau在0.8以上。原因在于猪群图像信噪比低毛发纹理≈噪声大步长易越过最优解。我们测试了lr0从0.0001到0.01的12组实验发现lr0val lossmAP0.5收敛epoch0.011.240.32未收敛0.0050.910.411200.0010.630.68850.00050.650.67150玄学经验lr00.001配合cosine学习率调度在猪群数据上稳定收敛。若用linear调度需将lrf终值比例设为0.1而非默认0.01。5.2box,cls,dfl损失权重让模型先学会“找猪”再学“分品种”YOLOv8默认box7.5, cls0.5, dfl1.5但猪群任务中定位精度远比分类重要计数只需定位。我们将box权重提至12.0cls降至0.3# train.yaml box: 12.0 cls: 0.3 dfl: 1.5效果bbox回归损失下降41%而cls损失仅上升7%因毛色特征已通过mask编码学习。5.3 验证集构造必须包含“极端场景”而非随机切分常规随机划分train:val9:1会导致验证集缺乏挑战性样本mAP虚高。我们强制在验证集中注入三类极端场景场景类型占比构造方法检测难点密集堆叠30%选取饲喂后15分钟视频帧单图猪数≥25头小目标遮挡低照度红外40%凌晨01:00-03:00红外视频帧平均亮度20对比度低热斑干扰运动模糊30%用OpenCV模拟运动模糊kernel_size7, angle15°边界不清晰该构造法使验证mAP更贴近真实部署效果——某次实测中随机划分验证集mAP0.72而极端场景验证集mAP0.51后者与产线实测0.49误差仅0.02。5.4 一个具体技巧用“猪蹄密度图”替代PR曲线评估PR曲线在猪群场景失真严重当IoU阈值设为0.5侧卧猪的标注框常覆盖半个食槽导致precision虚低设为0.7又因猪体不规则而召回骤降。我们改用猪蹄密度图Hoof Density Map对每张验证图生成真实猪蹄坐标热力图高斯核σ5模型输出bbox中心点同样生成预测热力图计算两图PSNR峰值信噪比PSNR28dB视为准确定位。该指标与人工抽检吻合率达96.7%且可直观定位问题PSNR低的区域对应猪舍角落光照死角或饮水区水渍反光干扰。6. 模型轻量化部署从YOLOv8n到TensorRT加速的实测吞吐量对比在猪场边缘设备Jetson AGX Orin上YOLOv8n的原始TensorRT推理速度仅18FPS无法满足实时监测需求。我们通过三步优化达成47FPS6.1 输入分辨率裁剪聚焦“有效检测带”如前所述猪的有效检测区域为地面以上0.3~1.2米。以1280×720图像为例该区域对应y坐标180~432像素故将输入裁剪为1280×252再resize至640×320# 预处理代码 def crop_pig_zone(image): h, w image.shape[:2] y_start int(0.25 * h) # 0.3m对应y0.25h y_end int(0.6 * h) # 1.2m对应y0.6h cropped image[y_start:y_end, :] return cv2.resize(cropped, (640, 320))裁剪后输入尺寸减小52%推理速度提升2.1倍。6.2 TensorRT引擎优化INT8量化与层融合使用trtexec生成引擎时关键参数组合trtexec --onnxyolov8n.onnx \ --int8 \ --calibtest_images/ \ --workspace4096 \ --fp16 \ --buildOnly \ --saveEngineyolov8n_int8.engine--int8需提供校准图50张典型猪舍图量化后模型体积缩小3.8倍--fp16与INT8共存保障部分层精度--workspace4096显存分配4GB避免Orin内存不足报错。6.3 吞吐量实测对比表Jetson AGX Orin, 32GB RAM模型配置输入尺寸FPS模型大小mAP0.5YOLOv8n PyTorch640×640183.2MB0.63YOLOv8n TensorRT FP16640×320314.1MB0.61YOLOv8n TensorRT INT8640×320471.1MB0.59YOLOv8s TensorRT INT8640×320292.8MB0.68血泪经验INT8量化使mAP下降0.04但FPS提升161%对猪群计数这类任务完全可接受——毕竟少检1头猪比延迟200ms更致命。我们最终选择YOLOv8n INT8因其在Orin上功耗仅12Wv8s为22W符合猪舍防爆电源限制。部署后单台Orin可同时处理4路1080p视频流每路25FPS覆盖一个万头猪场的16个关键监控点。每次模型更新只需替换yolov8n_int8.engine文件无需重装环境——这省下的3小时调试时间够我喝完两杯咖啡。希望帮到你。本文还有配套的精品资源点击获取