首页/新闻资讯/正文详情

猪群目标检测数据集实战:VOC转YOLO与训练避坑指南

发布时间:2026/9/23 19:35:49 来源:云帆数科 栏目:资讯中心
猪群目标检测数据集实战:VOC转YOLO与训练避坑指南
简介这份目标检测猪群数据集面向从事计算机视觉与深度学习的学习者和开发者尤其适合正在实践Faster R-CNN、YOLO、SSD等检测模型、需要真实农业场景数据练手的人群。资源以猪群识别与定位为核心任务可服务于农业监控、动物健康监测与农场数量统计等应用方向。压缩包共2000个文件以1448张jpg原始图像和1448个xml标注文件为主整体约31.79MB其中JPEGImages存放高清原图作为训练基础Annotations内的XML由labelimg工具生成记录了每头猪的边界框坐标与类别标签可直接作为模型训练输入。目前已有766人学习下载。借助这套像素级标注数据读者能够快速搭建并验证猪群检测流程理解标注格式与图像目录的对应关系为农业自动化与精准养殖相关项目提供扎实的数据支撑。1. 猪群目标检测数据集从标注文件到训练管线的落地拆解猪场里数猪这件事靠人眼盯监控基本等于白给——猪会挤在一起、会趴着不动、会被栏杆挡住半张脸人工计数误差能到两三成。这份「目标检测猪群数据集」就是冲着这个场景来的上千张猪群实拍图配 labelimg 生成的 XML 标注目录结构是 Annotations / JPEGImages / 新建文件夹 三件套属于拿来就能喂给 YOLO、Faster R-CNN、SSD 这类检测器的标准 Pascal VOC 格式。它适合两类人一类是想跑通目标检测全流程但手头没数据的新手另一类是做农业监控、动物健康监测、农场盘点需要一份真实场景数据做 baseline 的从业者。下面我按「先看清结构、再动手转换、最后踩坑收尾」的顺序拆一遍。2. 数据集结构与 VOC 格式先搞懂 XML 里到底存了什么2.1 三个目录各自的职责拿到压缩包解压后第一件事不是急着写训练脚本而是把目录职责理清楚。这份数据集的结构是典型的 Pascal VOC 布局但有个「新建文件夹」是原包自带的用途没写明我一般会先把它单独挪出去避免后面写路径时被它干扰。目录内容在训练管线里的角色Annotations每张图对应的 XML提供边界框坐标和类别标签JPEGImages原始 JPG 图像模型输入源新建文件夹用途未标注先隔离确认内容后再决定去留Annotations 里的 XML 是 labelimg 生成的核心信息就三块filename对应哪张图、size宽高和通道数、若干个object每个目标一个含name类别和bndbox的 xmin/ymin/xmax/ymax。这里有个容易被忽略的点——size里的宽高必须和 JPEGImages 里实际图片的宽高一致否则坐标会整体偏移。我见过有人拿标注好的 XML 去配另一批缩放过的图训练 loss 死活不降查了半天才发现是尺寸对不上。2.2 一个 XML 的字段逐行拆解先看一份典型的标注文件长什么样心里有数了再写解析代码。annotation folderJPEGImages/folder filename102.jpg/filename !-- 必须与图片文件名完全一致 -- size width640/width !-- 图像实际宽度 -- height480/height !-- 图像实际高度 -- depth3/depth !-- 通道数RGB 为 3 -- /size object namepig/name !-- 类别名全数据集要统一 -- poseUnspecified/pose truncated0/truncated !-- 是否被截断 -- difficult0/difficult !-- 是否难样本 -- bndbox xmin112/xmin ymin88/ymin xmax430/xmax ymax360/ymax /bndbox /object /annotationname字段是整个数据集里最需要先统一的东西。如果有的 XML 写pig、有的写Pig、有的写猪训练时类别数会莫名其妙变多模型学出来的东西就是乱的。我一般会先跑一遍全量统计把所有出现过的name值列出来确认只有一种写法再往下走。truncated和difficult这两个字段在 VOC 评估里有用但训练时大多数框架默认忽略除非你明确要做难样本挖掘。2.3 先做一次全量体检再谈训练在写任何转换脚本之前先跑一段体检代码把「图片和 XML 是否一一对应」「坐标是否越界」「类别名是否统一」这三件事查清楚。这一步花五分钟能省掉后面几小时的 debug。import os import xml.etree.ElementTree as ET from PIL import Image img_dir JPEGImages xml_dir Annotations names set() mismatch [] oob [] # out of bound for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() fname root.find(filename).text img_path os.path.join(img_dir, fname) # 检查图片是否存在 if not os.path.exists(img_path): mismatch.append(fname) continue w, h Image.open(img_path).size for obj in root.findall(object): names.add(obj.find(name).text) box obj.find(bndbox) xmin int(box.find(xmin).text) ymin int(box.find(ymin).text) xmax int(box.find(xmax).text) ymax int(box.find(ymax).text) # 坐标越界检查 if xmin 0 or ymin 0 or xmax w or ymax h: oob.append((fname, xmin, ymin, xmax, ymax)) print(类别集合:, names) print(图片缺失数:, len(mismatch)) print(坐标越界数:, len(oob))这段代码的逻辑很直白遍历所有 XML取出filename去 JPEGImages 里找对应图找不到就记进mismatch找到后读实际宽高逐个 object 检查 bndbox 有没有超出图像边界。names集合用来确认类别是否统一。跑完如果mismatch和oob都是 0、names只有一个值说明数据干净可以进入转换环节。如果有越界框常见原因是标注时手抖拖出了边界处理方式是把坐标 clamp 到[0, w]和[0, h]范围内而不是直接删掉——删掉会丢样本。3. 转成 YOLO 格式坐标归一化与训练配置3.1 为什么训练前要转格式Pascal VOC 的 XML 存的是绝对像素坐标而 YOLO 系列要的是归一化后的中心点坐标加宽高格式是class_id cx cy w h全部除以图像宽高落在 0 到 1 之间。不转行不行行但你就得自己改 dataset 的解析逻辑不如直接用现成转换脚本走标准流程。转完之后每张图对应一个.txt文件名和图片同名放在一个 labels 目录里再配一个classes.txt或data.yaml声明类别。3.2 转换脚本与参数说明import os import xml.etree.ElementTree as ET from PIL import Image # 类别映射根据体检结果填写顺序即 class_id classes [pig] class_to_id {c: i for i, c in enumerate(classes)} xml_dir Annotations img_dir JPEGImages out_dir labels os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() fname root.find(filename).text img_path os.path.join(img_dir, fname) w, h Image.open(img_path).size lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_to_id: continue # 跳过未登记类别 cls_id class_to_id[cls_name] box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) # 坐标裁剪防止越界 xmin max(0, min(xmin, w)) xmax max(0, min(xmax, w)) ymin max(0, min(ymin, h)) ymax max(0, min(ymax, h)) # 转中心点 宽高再归一化 cx (xmin xmax) / 2.0 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) # 输出同名 txt txt_name os.path.splitext(fname)[0] .txt with open(os.path.join(out_dir, txt_name), w) as f: f.write(\n.join(lines))几个参数要盯住classes列表的顺序决定了class_id一旦定了就不能改改了要重新转cx/cy/bw/bh保留六位小数是 YOLO 官方脚本的习惯精度够用坐标裁剪那两行是后悔药防止个别越界框把归一化值搞成负数或大于 1训练时这类值会直接让 loss 炸掉。转换完记得抽查几张把 txt 里的数值反算回像素坐标和原 XML 对一下确认没转错。3.3 data.yaml 与训练入口转完格式配一个data.yaml就能开训。以 YOLOv8 为例path: ./pig_dataset train: images/train val: images/val nc: 1 names: [pig]nc是类别数这份数据集只有猪一个类所以是 1。names的顺序必须和转换时的classes完全一致。训练命令常见写法是yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsz640其中imgsz要和标注时的图像尺度匹配——如果原图是 640 宽设 640 最省事如果原图更大设小了会把猪缩得更小小目标检测难度直接上升。这份数据里猪群经常扎堆属于典型的小目标和遮挡场景imgsz我一般不会低于 640。3.4 划分训练集与验证集数据集本身没有划分 train/val得自己切。常见做法是按 8:2 随机分但猪群数据有个坑同一栏舍、同一时段的连续帧如果被分到两边验证集指标会虚高因为模型见过几乎一样的画面。我一般会先按拍摄批次或时间段分组再在组间划分这样验证结果才可信。划分脚本用random.seed(42)固定随机种子保证每次复现一致。4. 避坑与排查标注和训练里最容易翻车的几件事4.1 现象训练 loss 一直不降mAP 卡在 0 附近原因最常见的是类别名不统一或者data.yaml里的names顺序和转换脚本里的classes对不上导致模型学的类别和标签错位。其次是 XML 里的size和实际图片尺寸不一致坐标整体偏移。解决回到 2.3 的体检脚本先确认names集合只有一个值再抽查三张图把 XML 的 bndbox 画到原图上肉眼看一下框是否贴合。如果框整体偏就是尺寸问题重新读实际宽高转换。4.2 现象验证集 mAP 很高实际部署一塌糊涂原因训练集和验证集划分时没有按批次隔离同一场景的相似帧泄漏到了验证集模型等于在「背答案」。解决按拍摄时段或栏舍分组后再划分确保验证集里的场景在训练集里没出现过。这一步做完指标通常会掉几个点但那个数字才是真实的。4.3 现象小目标猪仔检测不到大猪框得挺好原因猪群数据里小猪仔像素面积小YOLO 默认的 anchor 或特征层对小目标不友好加上imgsz设得偏小小目标被进一步压缩。解决把imgsz提到 640 以上必要时用带 P2 小目标检测层的模型变体训练时开启 mosaic 增强让小目标在拼接图里获得更多出现机会。如果还是不行考虑切片推理把大图切成小块分别检测再合并。4.4 现象密集猪群只框出一个大框或者框重叠严重原因猪挤在一起时边界模糊标注时如果偷懒框了一个大框盖住一群模型就学成「一坨即一头」。NMS 的 IoU 阈值设得不当也会导致相邻框被误删。解决标注阶段就要求逐头框挤在一起的也要分开标哪怕框有重叠。训练时把 NMS 的 IoU 阈值适当调高比如从 0.45 调到 0.6减少密集场景下的误抑制。4.5 现象转换后的 txt 里出现负数或大于 1 的值原因原 XML 里有越界框转换时没做裁剪归一化后就成了非法值。解决在转换脚本里加坐标 clamp就是 3.2 里那四行max(0, min(...))。已经转完的可以写个校验脚本扫一遍所有 txt把非法行对应的图挑出来重新标。提示每次改完标注或转换脚本都重新跑一遍体检和抽查别信「应该没问题」。5. 进阶技巧用 labelimg 补标与数据增强的边界补标这件事绕不开 labelimg。这份数据集的 XML 就是它生成的后续要加新图或修错框还是用它最顺手。启动后把Open Dir指到 JPEGImagesChange Save Dir指到 Annotations格式选 PascalVOC快捷键W画框、D下一张、A上一张。有个血泪经验labelimg 的Save Dir如果没设对标完的 XML 会默认存到图片同目录回头你按 Annotations 路径去读就找不到白标一下午。我现在的习惯是启动后第一件事就确认保存目录标三张就去看一眼文件有没有落对地方。数据增强方面猪群场景适合用 HSV 抖动、随机翻转、mosaic但有两类增强要慎用。一是垂直翻转猪正常不会肚皮朝上翻了之后模型学到的是不存在的姿态二是大角度旋转猪舍监控视角基本固定旋转过头会让模型对正常视角反而陌生。我一般只开水平翻转加轻度 HSVmosaic 开到 0.5 左右再高容易把密集猪群拼得面目全非。验证阶段除了看 mAP建议单独统计一下「漏检率」和「误检率」。猪群场景里漏检比误检更致命——漏一头可能意味着健康监测漏掉一个异常个体。我会把验证集里所有漏检的图挑出来按猪的像素面积分档看如果漏检集中在小目标档就说明该上切片推理或换小目标友好的模型结构了。从那以后我每次拿到新数据集都强制先跑一遍体检脚本、再抽查十张标注、最后按批次划分验证集这三步走完才允许自己开训。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

OpenClaw轻量级目标检测框架解析与应用实践
OpenClaw轻量级目标检测框架解析与应用实践

1. 项目背景与核心价值OpenClaw(小龙虾AI)是近期在计算机视觉领域引起广泛关注的一个开源项目。这个项目最初由国内某高校研究团队开发,旨在通过深度学习技术解决水产养殖行业中的小龙虾智能分拣难题。经过两年迭代,现在已经发展成… · 2026/9/23 19:35:23

Xbox手柄驱动不是下载文件,而是Windows系统服务
Xbox手柄驱动不是下载文件,而是Windows系统服务

1. 项目概述:为什么一个“Xbox手柄驱动下载”标题值得写五千字? 你搜“xbox手柄驱动下载”,页面刷出来一堆带“新手也能快速安装”的标题,点进去却发现要么是跳转Microsoft Store的模糊指引,要么是捆绑软件的第三方下… · 2026/9/23 19:35:23

珠宝行业前景源码解析:3个报错让你项目崩盘
珠宝行业前景源码解析:3个报错让你项目崩盘

珠宝行业前景源码解析:3个报错让你项目崩盘 上周接了个急活,给某线下珠宝连锁做会员系统重构。老板拍胸脯说“这行现在好,数据量不大”,结果一上线,后台日志刷得跟瀑布似的。 最要命的是那条 NullPointerException 。… · 2026/9/23 19:35:17

基于Java的五子棋对战系统设计与实现:从Swing界面到Socket通信
基于Java的五子棋对战系统设计与实现:从Swing界面到Socket通信

简介:基于Java实现的五子棋对战系统课程设计源码,适合Java初学者、在校生及对游戏开发感兴趣的开发者,用于学习项目整体架构与图形界面交互。资源压缩包18.26MB,共290个文件,主体为265个GIF图像、17个Java源文件、3个X… · 2026/9/23 20:14:59

3招搞定分辨率高的卫星地图源码速查手册
3招搞定分辨率高的卫星地图源码速查手册

3招搞定分辨率高的卫星地图源码速查手册 面试被问原理答不上来,当场卡壳?别慌,手里没份【分辨率高的卫星地图】核心逻辑的【速查手册】,谁敢说自己懂地图开发?… · 2026/9/23 20:14:59

克里希源码解析:3步搞定复制代码跑不通的坑
克里希源码解析:3步搞定复制代码跑不通的坑

克里希源码解析:3步搞定复制代码跑不通的坑 刚接手运维项目,手里拿着从网上复制的克里希配置脚本,结果服务器一跑就报错?别慌,这种“代码看着对,运行就炸”的情况,90%的新手都遇到过。问题往往不在代码本身,而在你根本没搞懂背后的执行逻辑。今天… · 2026/9/23 20:14:59

TVM VTA 设计与开发指南:可配置深度学习加速器的软硬件全栈解析
TVM VTA 设计与开发指南:可配置深度学习加速器的软硬件全栈解析

编译器深度学习模型优化 【免费下载链接】tvm Open deep learning compiler stack for cpu, gpu and specialized accelerators 项目地址: https://gitcode.com/gh_mirrors/tvm7/tvm 点击查看 免费下载 VTA(Versatile Tensor Accelerator,通… · 2026/9/23 20:14:59

汽车电控系统底层信号链路故障诊断方法
汽车电控系统底层信号链路故障诊断方法

1. 为什么修车师傅总说“查不到故障码,但车就是不对劲”?你有没有遇到过这种情况:仪表盘没亮故障灯,OBD读不出任何故障码,可车子就是怠速不稳、加速迟滞、冷车难启动,或者空调压缩机莫名其妙不工作&#xf… · 2026/9/23 20:14:52

浪潮NF5460M4硬件排障实战:BIOS/BMC/物理层深度解析
浪潮NF5460M4硬件排障实战:BIOS/BMC/物理层深度解析

简介:本资源是浪潮官方发布的《浪潮英信服务器NF5460M4用户手册V1.1》,面向企业级IT运维人员、系统管理员、技术支持工程师及服务器初学者,聚焦高性能服务器的部署、管理与故障处置核心需求。手册全面覆盖硬件架构(含CPU/内存/存储… · 2026/9/23 20:14:52

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码