尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

家禽鸡小鸡检测数据集:2970张VOC+YOLO双格式实战训练指南

发布时间:2026/9/26 12:26:07

资讯中心
01
ARTICLE

家禽鸡小鸡检测数据集:2970张VOC+YOLO双格式实战训练指南

家禽鸡小鸡检测数据集:2970张VOC+YOLO双格式实战训练指南
简介这是一份面向目标检测初学者与算法工程师的家禽鸡只检测数据集聚焦母鸡、公鸡、小鸡等场景下的目标框标注任务可用于训练与验证YOLO、Faster R-CNN等主流检测模型也适合作为课程设计、毕业项目或小样本实验的数据基础。资源包共约2000个文件以1999个VOC格式xml标注文件和1个说明txt为主另含对应的jpg图片与YOLO格式txt标签压缩包整体约50.18MBVOC与YOLO双格式可直接对接不同训练框架省去格式转换环节。全部标注由labelImg手工完成统一类别为chicken共6358个标注框2971张图片与标注一一对应标注质量较为可靠。目前已有462人学习下载适合需要快速获取真实家禽检测数据、验证模型效果或开展迁移学习实验的读者使用。1. 家禽鸡小鸡检测数据集2970 张 VOCYOLO 双格式到底能跑出什么养殖场里数鸡这件事听起来简单做起来能把人逼疯。鸡舍光照忽明忽暗、小鸡扎堆重叠、笼养场景下目标密集到像素级粘连人工盘点一批 5000 只的鸡群误差经常在 3% 以上。这也是为什么最近一年「目标检测数据集」的检索量一直往上走——大家不是缺模型是缺一份能直接开训、标注质量过关的鸡只检测数据。这份 2970 张 VOCYOLO 双格式、手工标注的家禽鸡小鸡检测数据集解决的正是「从零标注成本太高、公开数据又对不上自己场景」这个卡点。它适合三类人想快速验证 YOLO 系列训练流程的算法新手、需要做养殖数量统计的工程落地者、以及拿它当标注规范参考的团队。下面我按「数据长什么样 → 怎么转怎么训 → 坑在哪 → 怎么调」的顺序把这份数据集从拆包到跑出第一个 mAP 的路径讲透。2. 拆开这份数据集VOC 与 YOLO 双格式的目录结构与字段含义拿到一个压缩包第一件事不是急着解压训练而是先搞清楚里面到底装了什么。这份数据集标注为 2970 张、VOCYOLO 双格式、手工标注意味着同一批图像配了两套标注文件。VOC 格式是 XMLYOLO 格式是每张图一个 txt。很多人拿到双格式数据直接只用 YOLO 那份结果遇到类别对不上、坐标越界的问题才发现 VOC 那份才是原始标注。所以先把结构摸清楚后面转换和校验才有依据。2.1 VOC 格式的 XML 字段逐个拆解VOC 的标注文件是标准 PASCAL VOC XML一张图对应一个同名 .xml。核心字段就几个但每个都有坑。下面是一份典型的鸡只标注 XML 结构annotation folderimages/folder filenamechick_0001.jpg/filename size width640/width !-- 图像宽必须和实际像素一致 -- height480/height !-- 图像高 -- depth3/depth !-- 通道数RGB 为 3 -- /size object namechicken/name !-- 类别名大小写敏感 -- poseUnspecified/pose truncated0/truncated !-- 是否被截断0/1 -- difficult0/difficult !-- 是否难样本训练时可过滤 -- bndbox xmin112/xmin !-- 左上角 x从 0 开始 -- ymin88/ymin xmax305/xmax !-- 右下角 x -- ymax260/ymax /bndbox /object /annotation这里要重点看三个地方。第一size里的宽高必须和真实图像一致手工标注时如果换了图没更新尺寸坐标就会整体偏移。第二name字段决定类别索引如果数据集里同时有chicken和Chicken转换后会变成两个类这是血泪经验里最常见的翻车点。第三difficult标记为 1 的样本在计算 mAP 时通常会被忽略但训练时是否保留要看你的策略——小鸡扎堆场景里难样本恰恰是提升召回的关键我一般会保留。2.2 YOLO 格式的归一化坐标与类别索引YOLO 格式每张图一个 txt每行一个目标格式是class_id x_center y_center width height全部归一化到 0~1。同样一张图对应的 YOLO 标注长这样0 0.325781 0.362500 0.301563 0.358333 0 0.612500 0.541667 0.218750 0.291667第一列0是类别索引对应一个classes.txt或data.yaml里的类别列表。后面四个值是中心点坐标和宽高都是相对图像宽高的比例。这里最容易出问题的是归一化基准如果 XML 里写的宽高是 640×480但实际图像是 1280×960转换出来的坐标会全部缩小一半框会偏到左上角。所以转换前必须用脚本校验一遍图像真实尺寸和 XML 声明尺寸是否一致。2.3 双格式并存时的目录组织与校验清单一份规范的双格式数据集目录通常长这样dataset/ ├── JPEGImages/ # 所有原图2970 张 ├── Annotations/ # VOC XML与图同名 ├── labels/ # YOLO txt与图同名 ├── classes.txt # 类别列表一行一个 └── data.yaml # YOLO 训练配置拿到手先跑一遍校验确认三件事图像数量、XML 数量、txt 数量是否都是 2970每张图是否都有对应的 XML 和 txt类别名是否统一。下面这段脚本就是干这个的import os from pathlib import Path img_dir Path(dataset/JPEGImages) xml_dir Path(dataset/Annotations) txt_dir Path(dataset/labels) imgs {p.stem for p in img_dir.glob(*.jpg)} xmls {p.stem for p in xml_dir.glob(*.xml)} txts {p.stem for p in txt_dir.glob(*.txt)} print(图像数:, len(imgs)) print(XML数:, len(xmls)) print(txt数:, len(txts)) print(缺XML的图:, imgs - xmls) # 有图没标注 print(缺txt的图:, imgs - txts) # 有图没YOLO标注 print(多余XML:, xmls - imgs) # 标注没有对应图这段脚本的逻辑很直接用文件名主干做集合运算差集就是缺失项。参数上唯一要注意的是扩展名有些数据集图像是 .png 或 .JPG 大写glob 模式要跟着改。跑完如果三个数量都是 2970 且差集为空说明数据完整性没问题可以进入下一步。如果差集非空先别急着训练缺标注的图要么补标要么剔除否则训练时会被当成纯背景拉低召回。3. 从 VOC 转 YOLO转换脚本、坐标计算与三个边界坑双格式数据集虽然省了标注但实际训练时大家基本都用 YOLO 格式因为 ultralytics 系的训练框架直接吃 txt。所以哪怕包里已经带了 YOLO 格式我也建议自己跑一遍转换脚本——一是验证两套标注是否真的一致二是转换过程本身就是一次数据体检。这一章把转换的坐标计算讲清楚再把三个最容易翻车的边界情况列出来。3.1 坐标转换的数学逻辑与脚本实现VOC 给的是绝对坐标的左上角和右下角YOLO 要的是归一化的中心点和宽高。转换公式不复杂但每一步都要除以图像宽高x_center (xmin xmax) / 2 / widthy_center (ymin ymax) / 2 / heightw (xmax - xmin) / widthh (ymax - ymin) / height下面是一个完整的转换脚本读 XML、写 txt同时做越界裁剪import xml.etree.ElementTree as ET from pathlib import Path from PIL import Image classes [chicken] # 类别列表顺序决定 class_id class_to_id {c: i for i, c in enumerate(classes)} xml_dir Path(dataset/Annotations) img_dir Path(dataset/JPEGImages) out_dir Path(dataset/labels) out_dir.mkdir(exist_okTrue) for xml_path in xml_dir.glob(*.xml): tree ET.parse(xml_path) root tree.getroot() # 用真实图像尺寸而不是XML里声明的尺寸 img_path img_dir / (xml_path.stem .jpg) with Image.open(img_path) as im: W, H im.size lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in class_to_id: continue # 跳过未知类别 bnd obj.find(bndbox) xmin float(bnd.find(xmin).text) ymin float(bnd.find(ymin).text) xmax float(bnd.find(xmax).text) ymax float(bnd.find(ymax).text) # 裁剪到图像范围内防止越界 xmin, xmax max(0, xmin), min(W, xmax) ymin, ymax max(0, ymin), min(H, ymax) if xmax xmin or ymax ymin: continue # 无效框直接丢弃 xc (xmin xmax) / 2 / W yc (ymin ymax) / 2 / H w (xmax - xmin) / W h (ymax - ymin) / H lines.append(f{class_to_id[name]} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) (out_dir / (xml_path.stem .txt)).write_text(\n.join(lines))逻辑上关键的一步是用Image.open读真实尺寸而不是信 XML 里的size。参数上classes列表的顺序就是最终 class_id必须和data.yaml里的names完全一致否则训练出来的模型会把鸡识别成别的类。坐标保留 6 位小数足够YOLO 内部也是按浮点处理。3.2 边界坑一坐标越界与零面积框手工标注时鼠标一抖xmax 可能超过图像宽度或者 xmin 等于 xmax 形成零面积框。这种框在训练时会导致 loss 计算异常表现为 loss 突然变 NaN 或者 mAP 一直上不去。上面的脚本用max(0, xmin)和min(W, xmax)做了裁剪并且用xmax xmin判断丢弃无效框。但要注意裁剪后如果框变得极小比如宽高只剩 1 像素也建议丢弃因为这种框对训练只有干扰。我一般会加一个最小面积阈值比如宽高都小于 4 像素就跳过。3.3 边界坑二类别名大小写与空格XML 里的name字段如果写成chicken尾部带空格或者Chicken直接拿去匹配class_to_id会匹配失败导致整张图的标注被跳过。更隐蔽的是有些标注工具会写入chicken\nstrip()能解决大部分问题但大小写必须统一。转换前先跑一遍类别统计from collections import Counter import xml.etree.ElementTree as ET from pathlib import Path counter Counter() for xml_path in Path(dataset/Annotations).glob(*.xml): root ET.parse(xml_path).getroot() for obj in root.findall(object): counter[obj.find(name).text] 1 print(counter)如果输出里出现多个变体先统一再转换。这一步花两分钟能省掉后面几小时的排查。3.4 边界坑三图像与标注文件名不一致有些数据集图像叫chick_0001.jpgXML 叫chick_0001.xml但 YOLO txt 可能叫chick_0001.txt这没问题。坑在于图像扩展名不统一比如一部分是 .jpg 一部分是 .png而脚本里写死了.jpg就会导致Image.open报文件不存在。解决办法是用glob同时匹配多种扩展名或者先统计一遍扩展名分布。另外文件名里的空格和中文也是隐患训练框架读取路径时可能出错建议转换前统一重命名为纯英文数字下划线。4. 用这份数据集训练 YOLO环境配置、data.yaml 与首轮训练参数数据校验和转换做完接下来就是把它喂给 YOLO。这一章按「环境 → 配置 → 启动 → 看结果」的顺序走参数给具体值命令能直接抄。需要说明的是YOLO 版本迭代很快下面用的是 ultralytics 系的通用流程具体版本差异在参数名上可能有微调但核心逻辑一致。4.1 环境配置conda 建环境与依赖安装我一般用 conda 隔离环境避免和系统里的其他包打架。Python 版本选 3.9 或 3.10 都行太新反而有些依赖轮子不全。conda create -n chick_det python3.10 -y conda activate chick_det # 安装 PyTorch按自己的 CUDA 版本选下面以 CUDA 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics # 验证 yolo checksyolo checks会打印环境信息重点看 CUDA 是否可用、PyTorch 版本是否匹配。如果显示 CPU only说明 CUDA 没装上训练会慢到无法接受。参数上--index-url后面的地址要和本机 CUDA 版本对应装错了会报CUDA error: no kernel image is available。4.2 data.yaml 的五个必填字段YOLO 训练靠一个 yaml 文件告诉它数据在哪、有几类。这份鸡只数据集只有一类yaml 长这样path: /home/user/dataset # 数据集根目录绝对路径最稳 train: JPEGImages # 训练图像目录相对 path val: JPEGImages # 验证目录数据少时可复用 names: 0: chicken # 类别索引和名称必须和转换脚本一致五个字段里path用绝对路径能避免「找不到文件」的玄学问题train和val是相对path的子目录names的索引必须从 0 开始且和 txt 里的 class_id 对应。如果只有一份数据没有单独验证集可以按 8:2 切分或者直接用同一份做 val但 mAP 会偏乐观心里要有数。4.3 首轮训练命令与关键参数取值启动训练的命令很短但参数决定成败yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/chick \ nameexp1逐个说参数。modelyolov8n.pt是预训练权重n 是最小模型适合先跑通流程如果显存够、精度要求高可以换 s 或 m。imgsz640是输入尺寸鸡只目标普遍偏小640 是平衡速度和精度的起点如果小鸡在图中占比很小可以提到 960 甚至 1280但显存占用会翻倍。batch16按显存调8G 显存跑 640 大概能到 16爆显存就减半。lr00.01是初始学习率预训练模型微调时这个值比较稳从零训练才需要更小的值。patience20是早停20 轮 mAP 不涨就停省时间。4.4 训练日志怎么看loss 曲线与 mAP 的合理区间训练启动后控制台会打印每轮的 box_loss、cls_loss 和 mAP50。判断训练是否正常看三点box_loss 和 cls_loss 应该在前 10 轮快速下降然后趋于平缓如果一直震荡或者不降多半是学习率太大或标注有问题mAP50 在 50 轮左右应该能到 0.8 以上鸡只这种单类目标检测任务标注质量好的话 0.9 也不难如果 mAP 卡在 0.3 以下先回去查标注别急着调模型。训练完的结果在runs/chick/exp1/下weights/best.pt是验证集上最好的权重拿它做推理。5. 避坑与排查这份数据集训练时最容易翻车的五个地方数据、转换、训练流程都走通了但实际跑起来还是会遇到各种问题。这一章把我在类似数据集上踩过的坑列出来每条按「现象 → 原因 → 解决」写遇到对应情况直接对号入座。5.1 现象训练 loss 正常但 mAP 始终为 0原因通常是类别索引错位。YOLO 的 txt 里 class_id 是 0但 data.yaml 的 names 如果写成1: chicken模型学到的类和验证时对不上mAP 直接归零。另一种可能是验证集路径写错模型在空目录上验证。解决先确认 txt 里第一列的最大值再确认 data.yaml 的 names 索引范围两者必须一致。然后手动检查val路径下是否有图像路径是相对path拼接的拼错了不会报错但会静默失败。5.2 现象显存溢出训练中途 OOM原因一般是imgsz或batch设太大或者图像本身分辨率远超imgsz预处理时占用额外显存。鸡舍图像如果是 4K 原图直接喂进去很容易爆。解决先把batch减半试还爆就降imgsz。另外可以在训练前统一把图像缩放到接近imgsz的尺寸减少预处理开销。如果显存实在小用yolov8n加batch4也能跑只是慢。5.3 现象mAP 虚高但实际推理漏检严重原因是训练集和验证集重叠。如果train和val指向同一个目录模型在验证时见到的都是训练过的图mAP 会虚高到 0.95 以上但换一批新图就原形毕露。解决老老实实切分训练集和验证集按 8:2 或 9:1确保验证集的图没在训练里出现过。切分时用随机种子固定方便复现。5.4 现象密集小鸡场景下框大量重叠、NMS 后只剩几个原因是小鸡扎堆时目标框高度重叠NMS 的 IoU 阈值默认 0.7会把相邻的鸡当成同一个目标抑制掉。解决推理时调低 NMS 的 IoU 阈值比如设到 0.5 甚至 0.4让重叠框保留更多。命令里加iou0.5。但阈值太低会引入重复框需要在验证集上试几个值找平衡。另外训练时可以用close_mosaic参数在最后几轮关闭马赛克增强让模型更适应密集场景。5.5 现象转换后的 txt 全是空文件原因是 XML 里的类别名和脚本里的classes列表对不上所有目标都被continue跳过了。或者 XML 的object节点路径写错findall返回空。解决先跑 3.3 节的类别统计脚本确认 XML 里的实际类别名再检查 XML 结构有些标注工具的根节点不是annotationfindall(object)会找不到。打印一个 XML 的前几行看看结构比猜快得多。6. 把 2970 张用到极致数据增强、类别平衡与推理阈值调优数据量 2970 张单类目标说多不多说少不少。如果只是跑一遍默认训练mAP 可能停在 0.85 左右但把增强策略和推理参数调一调同样的数据能再挤出几个点。这一章讲三个具体技巧都是我在实际项目里验证过有效的。6.1 针对小鸡密集场景的增强参数YOLO 默认的增强里马赛克mosaic对小目标检测帮助很大它把四张图拼成一张变相增加了小目标的出现频率。但鸡只场景有个特殊点小鸡颜色和背景垫料、笼具接近颜色抖动hsv_v太强反而会让模型学偏。我一般会把默认增强改成这样yolo detect train \ datadataset/data.yaml \ modelyolov8s.pt \ epochs150 \ imgsz960 \ batch8 \ hsv_h0.015 hsv_s0.5 hsv_v0.3 \ degrees5 translate0.1 scale0.5 \ mosaic1.0 close_mosaic15 \ projectruns/chick nameexp2hsv_v0.3比默认的 0.4 略低减少亮度扰动scale0.5允许图像缩放模拟不同拍摄距离close_mosaic15在最后 15 轮关闭马赛克让模型在真实分布上收尾。imgsz960是因为小鸡在原图里占比小提高输入分辨率能显著提升小目标召回代价是训练变慢但 2970 张的数据量扛得住。6.2 用验证集反推最佳置信度阈值训练完拿到 best.pt别直接用默认 conf0.25 推理。鸡只检测的置信度阈值对结果影响很大阈值高了漏检低了误检。正确做法是在验证集上扫一遍阈值找 F1 最高的点。下面这段脚本干这个from ultralytics import YOLO model YOLO(runs/chick/exp2/weights/best.pt) results model.val(datadataset/data.yaml, conf0.001, iou0.5) # 从验证结果里提取不同置信度下的 P/R/F1 # ultralytics 的 val 会输出曲线数据也可用 predict 手动扫 for conf in [0.1, 0.2, 0.3, 0.4, 0.5]: r model.val(datadataset/data.yaml, confconf, iou0.5) print(fconf{conf} mAP50{r.box.map50:.4f} mAP50-95{r.box.map:.4f})跑完看哪个 conf 的 mAP50-95 最高就用那个值做部署。注意conf0.001那次是为了拿完整的 P-R 曲线实际部署用扫出来的最优点。这个步骤花几分钟比拍脑袋设 0.25 靠谱得多。6.3 类别不平衡与难样本的处理这份数据集只有一类不存在多类不平衡但存在「易样本 vs 难样本」的不平衡。大部分鸡只清晰可辨少数扎堆、遮挡、模糊的样本才是决定模型上限的关键。如果发现召回上不去可以把difficult1的样本单独拎出来在训练时给更高权重或者干脆复制一份加入训练集。另一个技巧是调box和cls的损失权重YOLO 默认box7.5 cls0.5如果定位不准就加大 box如果分类混淆虽然单类不太会就加大 cls。这些参数在训练命令里加box8.0 cls0.6即可。最后说个我自己的习惯每次拿到新数据集先花半小时把校验脚本、转换脚本、类别统计跑一遍再花十分钟用最小模型跑 10 个 epoch 看 loss 是否正常下降。这四十分钟能挡掉后面 80% 的玄学问题。数据集这东西质量比数量重要2970 张标注干净的鸡只图比三万张糊成一团的强得多。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。