简介这份YOLO养殖场肉鸡目标检测数据集面向从事农业智能化、家禽养殖监测及计算机视觉应用的研究者与开发者用于训练模型自动定位鸡只位置可服务于养殖场数量统计、行为分析与健康监测等场景。资源包共1001个文件包含500张jpg图像与500个同名xml标注文件另附1个txt说明文件压缩包约883.41MB标注格式可直接转换为YOLO训练所需标签。图像覆盖多角度、多光照条件下的肉鸡目标适合yolov5、yolov7、yolov8等主流检测算法直接开展训练与迁移学习。目前已有704人学习下载配套博文提供了数据集与检测结果参考便于读者快速核对标注质量、评估模型表现并复现训练流程适合作为课程设计、科研实验或养殖智能化项目的训练数据基础。1. 养殖场肉鸡目标检测从一群挤在一起的鸡说起肉鸡养殖场里装摄像头做目标检测很多人第一反应是不就是数鸡吗。真到现场拍一段视频回来跑推理你会发现画面里几百只白羽肉鸡挤成一片羽毛颜色几乎一致遮挡严重光照还随棚顶灯和自然光来回变。这时候通用 COCO 预训练模型基本抓瞎——它认识鸟但分不清肉鸡和背景里的料槽、饮水线、垫料。所以YOLO养殖场肉鸡目标检测检测数据集这件事的核心不是模型选哪个版本而是数据集怎么建、怎么标、怎么喂给 YOLO 系列模型让检测头真正学会区分肉鸡个体。这套方案适合三类人一是做智慧养殖、农业物联网的工程师需要把存栏量统计、活动量监测落地二是手里有一批养殖场监控视频、想自己训一个检测模型的学生和研究者三是已经跑通 YOLOv5/v8 通用数据集、想迁移到垂直场景的开发者。它解决的是通用模型在密集同类目标上失效这个具体问题路径是自建数据集 YOLO 微调而不是换个更大的 backbone 就能糊弄过去。下面按数据采集、标注、格式转换、训练、排查、进阶的顺序讲透参数和坑都给到能直接抄的程度。2. 肉鸡数据集怎么建采集、标注与格式转换2.1 采集阶段决定模型上限肉鸡检测的数据集采集环节的坑比训练环节多。我一般按场景维度而不是数量维度来规划采集因为密集同类目标对场景变化极其敏感。具体要覆盖的维度维度建议覆盖原因光照白天自然光、夜间补光灯、阴天散射光白羽在强光下过曝、弱光下与垫料对比度骤降密度稀疏50只/画面、中密、高密200只/画面高密场景遮挡是主要误差来源视角顶视、45度斜视、侧视顶视遮挡最少侧视个体重叠最严重日龄雏鸡、中鸡、出栏前体型差异可达 5 倍以上设备固定枪机、球机、手机补拍分辨率与畸变不同每个维度至少 3~5 段视频单段 30 秒到 2 分钟抽帧时不要连续抽连续帧高度相似等于浪费标注量。我一般用 1 秒 1 帧起步高密场景加密到 0.5 秒 1 帧。抽帧命令用 ffmpeg# 每 1 秒抽 1 帧输出到 frames 目录 ffmpeg -i coop_day.mp4 -vf fps1 frames/day_%04d.jpg # 高密场景每 0.5 秒抽 1 帧 ffmpeg -i coop_dense.mp4 -vf fps2 frames/dense_%04d.jpgfps1表示每秒抽 1 帧fps2是每秒 2 帧。抽完先人工过一遍把糊的、完全无鸡的、纯料槽的删掉否则这些图进训练集只会拉低精度。抽帧数量参考单场景 300~500 张全数据集 2000~5000 张起步肉鸡这种密集场景低于 2000 张很难训稳。2.2 标注规范密集场景的框怎么画标注工具用 LabelImg、X-AnyLabeling 或 CVAT 都行关键是规范统一。肉鸡标注最容易翻车的地方是框的边界鸡挤在一起时框该画到哪我的做法是只标可见部分被遮挡超过 70% 的个体直接标ignore或不标不要硬猜。框紧贴鸡的可见轮廓不要为了完整把旁边鸡的身体框进来。统一单类别chicken不要分公鸡/母鸡/雏鸡——除非你的业务真需要否则类别越多密集场景越难训。每张图标注完做一次交叉复核密集场景建议两人独立标、比对 IoU差异大的重新标。标注文件是 YOLO 格式的 txt每行class_id cx cy w h全部归一化到 0~1。这里有个高频错误用 LabelImg 存成 Pascal VOC 的 xml然后忘了转格式直接丢给 YOLO训练时 loss 不降、mAP 为 0。转换脚本import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_dir, out_dir, classes): 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() size root.find(size) w_img int(size.find(width).text) h_img int(size.find(height).text) lines [] for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue cls_id classes.index(cls) bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # 归一化并转为中心点宽高 cx (x1 x2) / 2.0 / w_img cy (y1 y2) / 2.0 / h_img bw (x2 - x1) / w_img bh (y2 - y1) / h_img lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_name os.path.splitext(xml_file)[0] .txt with open(os.path.join(out_dir, out_name), w) as f: f.write(\n.join(lines)) voc_to_yolo(annotations_xml, labels, [chicken])classes列表的顺序就是 class_id 的映射训练时的data.yaml必须和它一致否则类别全错。归一化用图像真实宽高不是标注框的宽高这点新手经常搞混。转换完抽查几张用可视化脚本把框画回图上确认没偏移。2.3 数据集划分与 data.yaml划分比例我一般用 8:1:1但密集场景要注意按视频段划分而不是按帧随机划分。同一段视频抽的帧高度相似随机划分会让训练集和验证集撞脸验证 mAP 虚高上线就崩。正确做法同一段视频的所有帧只进一个集合。# data.yaml path: /data/chicken_dataset train: images/train val: images/val test: images/test nc: 1 names: [chicken]nc是类别数names顺序必须和标注时的 class_id 对应。目录结构保持images/和labels/平行文件名一一对应day_0001.jpg对day_0001.txtYOLO 靠文件名匹配不匹配的图会被静默跳过这是训练集明明有 3000 张但只加载了 2000 张的常见原因。3. 用 YOLOv8 在肉鸡数据集上跑通训练3.1 环境配置与预训练权重选择环境这块Anaconda 建虚拟环境最省事Python 3.9~3.10 兼容性最好。ultralytics 官方包一条命令装完conda create -n chicken python3.10 -y conda activate chicken pip install ultralytics # 验证 GPU 可用 python -c import torch; print(torch.cuda.is_available())输出True说明 CUDA 正常。如果显存只有 8G 以下训练时把batch降到 8 或 4否则 OOM 直接中断。预训练权重用yolov8s.pt或yolov8m.pt起步——肉鸡这种单类别密集目标n太小容易欠拟合l/x在几千张数据上容易过拟合s/m是性价比区间。权重文件首次运行会自动下载也可以提前放到项目目录。3.2 训练命令与关键参数yolo detect train \ data/data/chicken_dataset/data.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ mosaic1.0 \ close_mosaic15 \ device0 \ projectruns/chicken \ nameexp1逐个说清楚epochs150是上限配合patience30早停验证集 30 轮不涨就停省时间。imgsz640是输入尺寸肉鸡个体在画面里占比小的话可以提到 960但显存和速度代价明显。lr00.01初始学习率lrf0.01是最终学习率系数余弦退火到初始的 1%。mosaic1.0是马赛克增强概率密集场景它能显著提升小目标和遮挡鲁棒性但close_mosaic15表示最后 15 轮关掉增强让模型在真实分布上收敛——这个参数很多人不设导致最终 mAP 偏低。device0指定第一块 GPU。训练过程看runs/chicken/exp1/results.csv重点盯三个指标metrics/mAP50、metrics/mAP50-95、train/box_loss。box_loss 持续下降但 mAP 不涨通常是过拟合或标注噪声两者都不动检查数据加载和类别映射。3.3 推理与置信度门限调整训完用best.pt推理yolo detect predict \ modelruns/chicken/exp1/weights/best.pt \ sourcetest_video.mp4 \ conf0.35 \ iou0.5 \ saveTrueconf0.35是置信度门限密集场景这个值很关键调高0.5漏检增多调低0.2误检和重复框增多。肉鸡场景我一般从 0.3 起调看漏检和误检哪个更不可接受。iou0.5是 NMS 的 IoU 阈值鸡挤在一起时NMS 会把相邻个体的框互相抑制掉这是密集检测的经典问题——如果发现明明两只鸡只框出一只把iou提到 0.6~0.7 试试或者换用agnostic_nms之外的软 NMS 方案。4. 肉鸡检测的避坑与排查清单4.1 现象训练 loss 正常但 mAP 一直是 0原因标注格式或类别映射错了。最常见的是 txt 里 class_id 从 1 开始VOC 习惯而 YOLO 要求从 0 开始或者data.yaml的names顺序和标注不一致。解决随便打开一个 label txt确认第一列是 0再核对data.yaml。用下面这段快速统计类别分布import glob, collections counter collections.Counter() for f in glob.glob(labels/train/*.txt): for line in open(f): if line.strip(): counter[line.split()[0]] 1 print(counter) # 应该只有 04.2 现象验证集 mAP 很高上线后漏检严重原因按帧随机划分导致训练/验证集同源验证集作弊。解决改成按视频段划分重新训。判断方法看验证集图片是不是和训练集来自同一段视频的相邻帧是的话基本中招。4.3 现象密集区域框互相吞并数出来的鸡比实际少原因NMS 阈值过低相邻个体的框被抑制。解决推理时把iou从 0.5 提到 0.6~0.7训练层面可以在数据里增加高密场景样本让模型学会区分紧邻个体。如果业务是计数还可以在 NMS 后加一个基于框中心距的合并逻辑但这是后处理补丁治标。4.4 现象夜间红外/补光画面几乎全漏原因训练集里夜间样本太少模型没见过这种分布。解决按 2.1 的光照维度补采夜间数据至少占总量 20%~30%。别指望靠增强亮度抖动模拟夜间红外成像的纹理和可见光差异太大增强补不出来。4.5 现象训练到一半 OOM 或速度骤降原因imgsz或batch超过显存或者 dataloader 的workers开太多抢 CPU。解决降batch到 8imgsz保持 640workers设成 CPU 核数的 1/2 左右Windows 下建议设 0 或 2多了容易卡死。5. 进阶把检测结果变成存栏量统计与活动量指标训出模型只是第一步养殖场真正要的是存栏量和活动量这两个能进业务系统的数字。存栏量统计不能直接数框——同一只鸡在连续帧里会被反复计数。我的做法是固定机位下对单帧做检测 计数多帧取中位数滤掉瞬时遮挡造成的跳变。如果机位会动就得引入简单的跟踪ByteTrack 这类按 track id 去重。活动量指标更实用统计单位时间内检测框中心点的位移总和归一化后作为群体活跃度。肉鸡发病前活动量会明显下降这个指标比单纯数鸡更有预警价值。实现上把每帧的框中心存下来相邻帧做最近邻匹配算位移import numpy as np def activity_score(centers_seq, dist_thresh50): # centers_seq: list of (N,2) arrays, 每帧的框中心 total 0.0 for i in range(1, len(centers_seq)): prev, cur centers_seq[i-1], centers_seq[i] if len(prev) 0 or len(cur) 0: continue # 计算两帧中心点距离矩阵 d np.linalg.norm(prev[:, None, :] - cur[None, :, :], axis2) # 每个当前点找最近的历史点距离小于阈值才算有效位移 min_d d.min(axis1) total min_d[min_d dist_thresh].sum() return total / max(len(centers_seq) - 1, 1)dist_thresh50是像素阈值超过它认为是新出现的鸡而不是移动避免误匹配拉高活动量。这个分数本身没有绝对意义要看相对变化连续几天的同一时段对比突然掉 30% 以上就值得去棚里看一眼。验证模型有没有真的学到东西除了看 mAP我习惯做两件事一是拿训练集里没出现过的场景比如换了个棚、换了光照跑一遍看漏检率二是把置信度门限从 0.2 扫到 0.6画一条 precision-recall 曲线找业务能接受的平衡点。这两步做完你才知道这个数据集和模型到底能不能上线而不是被验证集的高 mAP 骗过去。血泪经验就一条肉鸡检测的瓶颈永远在数据和场景覆盖不在模型结构。我见过太多人一上来就换 backbone、调损失函数结果补了两千张夜间和密集场景的图mAP 直接涨十几个点。先把数据集的维度补齐再谈模型优化这个顺序别搞反。希望帮到你。本文还有配套的精品资源点击获取