← 全部汇报

Group Meeting · Report 01

种鸡 / 家禽智能监测从公开数据集到自己的检测实现

汇报日期 2026-09-30Poultry Vision · Object Detection源:种鸡智能监测课题_数据集与实现_v2.pptx

标签说明:本人实测 在本机亲手跑出/检查出的数据 公开资料 来自论文或已有资料

01背景:规模化鸡舍为什么必须靠算法

几千到几万只规模的鸡舍,日常管理长期依赖人工巡视——数鸡、看精神状态、找病鸡、观察采食,做不到连续、个体级别的观测:

目标:用「摄像头 + 检测算法」替代「人的眼睛」——逐图计数、个体定位、框内再分析。

为什么是目标检测

方案能回答什么为什么不够用
人工巡检全部问题,但只是抽样效率低、有应激、不连续、主观
称重台 / 环境传感器群体平均体重、温湿度只有群体均值,定位不到个体
红外对射 / 光电计数粗略「过了多少只」拥挤同时通过时失效
传统图像处理稀疏场景下的数量估计参数逐场景手调,换鸡舍就失效
图像分类 CNN「这张图里有没有鸡」回答不了「在哪、有几只」
目标检测有没有 + 在哪 + 是什么,逐个个体输出需要标注数据与算力——正是本课题要补的

02两套公开数据集,互为补充公开资料

笼养蛋鸡的精细化多模态观测 × 规模化肉鸡的复杂场景检测——在采集设备、场景尺度、标注规模上互补。

对比项BClayinghensPIO
对象笼养蛋鸡地面平养肉鸡
模态可见光(RGB)+ 热红外(TIR)可见光(RGB)
图像数量61,1331,487
标注量63,693 个鸡头327,288 个实例
采集时段2022.04 – 2024.072023 年,连续 6 周
场景5 个蛋鸡舍,约 960 笼位/轮1 个商业鸡舍 + 1 个原型鸡舍
发表Sensors 2024, 24(19), 6385Scientific Data 2026, 13:801

BClayinghens · 笼养蛋鸡 RGB-TIR

  • 巡检机器人沿磁导航轨道;可见光 1920×1080 + FLIR A300 热像仪(9 Hz,320×240),间隔约 1 秒、后期坐标对齐。
  • 10 列 × 8 层笼架,每笼 6–8 只,日龄 200–300 天。
  • 可用于鸡头检测、跟踪、姿态、行为、个体识别、鸡头温度与健康评估。
  • 增强:R 通道随机增强(ΔR ∈ [10,100])、色相/亮度、高斯噪声(σ=51)、拉普拉斯与泊松噪声。

PIO · 规模化肉鸡检测

  • 1,920×1,088,YOLO 格式框,覆盖第 1–6 周完整生长周期。
  • 原型鸡舍 4 台相机、每帧约 100 只;商业鸡舍 36 台、每帧约 700 只。
  • Hikvision DS-2CD1027G0-L;OpenCV 多进程每段视频抽 250 帧;附原始视频可二次抽帧。

难在哪:多小、多密

15×31 px640 输入下的中位框尺寸(原图 46×52 px)
220平均每图目标数
1,151训练集单图最高目标数(第 1 周雏鸡)
594验证集单图最高目标数

这两组数字直接决定显存占用、batch 上限与 max_det 取值——是训练配置的真正依据。

构建自己的数据集:四条原则

02+数据的种类、分类与清洗:我对 PIO 做的一次完整体检本人实测

我做了什么
  1. 写了体检脚本 J:\poultry\data_audit.py,对 PIO 全部 1,487 张图、327,288 个框逐张检查。
  2. 按官方命名表 FilePrefixCode.xlsx 把数据拆成 鸡舍 × 周龄 共 13 组,统计每组图片数和标注密度。
  3. 逐项检查标签质量:缺失、空标签、列数、坐标越界、过小框、重复框,以及 classes.txt 混入标注目录。
  4. 用 MD5 + 感知哈希(dHash)查重,发现训练集与验证集之间存在直接泄漏,还有大量「同图不同标注」。
13 组按鸡舍 × 周龄分组(C/P × W1–W6 + K)
0标签缺失 / 空标签 / 坐标越界
59 张验证集图片与训练集像素完全相同(占 13%)
112 组同一张图有两份不同的标注

① 数据有哪些种类

维度常见种类本课题的情况
成像模态可见光 RGB、热红外 TIR、深度、多光谱PIO 只有 RGB;BClayinghens 是 RGB + TIR 配对
标注类型分类标签、检测框、分割掩码、关键点检测框(单类别「Pollo」= 鸡)
标注格式YOLO txt、COCO json、VOC xmlYOLO:每行 类别 cx cy w h,坐标按图宽高归一化到 0–1
数据来源不同场地、设备、时间段C = 商业鸡舍,P = 原型鸡舍,W1–W6 = 第几周;另有 19 张 K-* 不在命名表中

② 我的分组统计:数据不是均匀的

分组训练集验证集平均框/图(训练)
商业 C-W114514502
商业 C-W220061374
商业 C-W311965282
商业 C-W411063255
商业 C-W514398
商业 C-W614962131
原型 P-W1 … P-W681 / 28 / 41 / 81 / 23 / 2549 / 18 / 26 / 64 / 15 / 1278 / 87 / 63 / 46 / 53 / 41
K-*(来源待核实)190308

③ 我的清洗检查结果

检查项结果处理
图片有无对应标签 / 空标签0 / 0无需处理
列数错误、坐标越界0 / 0无需处理
过小框(< 4 px)训练 12 个、验证 3 个占比极低,保留,但记录在案
标签目录里的 classes.txt被当成 1 个标签文件是「1,036 个标签 vs 1,035 张图」的原因,统计时要排除
自带 dataset.yaml路径写的是作者的 Docker 路径 /app/data重写成本机 data.yaml
实际分辨率1920 × 1080论文写 1,920 × 1,088,以实测为准
像素完全相同的图片122 组其中 57 组跨训练/验证(验证集 59 张),43 组在训练集内部
重复图片的标注是否一致112 组不一致同一张图两次标注差到 21 个框(如 C-W2-0027 / 0181:264 vs 243)
感知哈希近重复63 张(≤ 5/256)相邻视频帧几乎一样,同一段视频被拆到了训练和验证两边
验证集与训练集中完全相同的一对图片
左:验证集 C-W2-V0006.jpg;右:训练集 C-W2-0165.jpg。逐像素平均差 = 0,完全是同一张图

这意味着什么:约 13% 的验证图模型在训练时已经「见过答案」,所以上文 1/3/5 轮以及 25 组基准的验证指标可能偏高。下一步:先去重、统一重复图的标注,再按「同一段视频/同一时间段整体归到同一边」重新划分,然后重跑 5 轮,对比去重前后的 mAP 差多少。

顺带学到的:公开数据集也要自己体检,不能默认它是干净的;划分要按「视频/时间段」分组,而不是按单张图随机分;MD5 只能抓完全相同的图,相邻视频帧要用感知哈希。

想学着这么做:先读 Ultralytics 文档的 Datasets → Detect 了解 YOLO 标注格式 → 自己写几十行脚本统计「图/框/分组」→ 再加查重(hashlib + 感知哈希)→ 有余力再看 FiftyOne、cleanlab 这类数据质量工具。本站 论文写作与方法 第 02–03 节有数据清洗与划分的完整清单。

03技术路线与检测原理

25组模型,每组 200 轮训练 + 验证
4个家族:YOLOv5 / v8 / v9 / v10
+RT-DETR三种主干,作 Transformer 参照
1套统一框架 Ultralytics
特征图 · 逐级下采样→8400 候选点(80²+40²+20²)→解码 · 距离→框→三项损失 box / cls / dfl(l1)→NMS 去重

完整推导见 种鸡智能监测 第 05 节。

03+术语与工具:这些名词和脚本是什么、怎么用本人实测

上面几节里出现了不少专有名词和脚本名字,这里统一摊开讲清楚——既是给自己留的备忘,也是「我的什么能给别人用」的具体清单。

① 数据集里的术语

术语意思出现在哪
RGB / TIR可见光相机 / 热红外相机。TIR 拍的是温度分布,不是可见光图像BClayinghens 双模态
YOLO 格式标注每行一个框:类别 cx cy w h,后四个数按图片宽高归一化到 0–1(不是像素值)PIO、BClayinghens 的标签 .txt
笼位 / 轮BClayinghens 里,巡检机器人沿轨道走一圈算「一轮」采集;「笼位」是蛋鸡笼架上的一个格子数据集对比表
商业鸡舍 / 原型鸡舍PIO 的两个场地:商业 = 真实规模化鸡舍(36 台相机);原型 = 小规模实验场地(4 台相机)数据集对比表
Precision / Recall查准率:预测出的框里有多少是对的;查全率:真实目标里有多少被找到了基准表、复现记录
mAP@50 / mAP@50-95检测框和真实框重叠达到 50% 就算对,算出的平均精度;后者是 50%–95% 多档取平均,标准更严格,更能反映框画得准不准基准表、1/3/5 轮对比
reg_max / DFL / l1_loss框回归用的两种方式:DFL 把框的边界当分布预测,更精细;reg_max=1 时退化成直接回归(l1_loss)三个发现 ③
max_det单张图最多允许输出的检测框数量,超过这个数的目标会被直接丢弃三个发现 ②
YOLO 标注格式图解:一个框对应 cx cy w h
YOLO 格式实拍图解:真实标注框 + 归一化坐标 cx/cy/w/h(取自 C-W1-0001.jpg)
商业鸡舍与原型鸡舍对比照片
PIO 数据集两种场地:商业鸡舍(36 台相机)vs 原型鸡舍(4 台相机)
BClayinghens 数据集 RGB 与 TIR 热红外配对样例
BClayinghens 的 RGB / TIR 配对样例(论文原图,CC BY):左列可见光,右列热红外,六种真实拍摄场景

② 用到的工具,各自是干嘛的

工具是什么为什么用它
Ultralytics把 YOLOv5 / v8 / v9 / v10 和 RT-DETR 统一到同一套 Python 接口和训练流程的框架换模型只改一行代码,25 组实验才能公平对比(见「技术路线」)
Anaconda(conda 环境)Python 环境和包管理器,每个项目一套独立的依赖,互不冲突避免这个项目的 PyTorch/CUDA 版本和别的项目打架
PyCharmPython 集成开发环境(IDE),带图形化的运行/调试按钮和 conda 环境选择器配好一次环境后,右键就能跑,不用每次手打命令行
CUDA(cu128)让 PyTorch 能调用 GPU 算力的驱动库,版本要对应显卡型号RTX 50 系显卡必须用 cu128;版本装错会悄悄退回 CPU 跑,慢几十倍还不报错
check_dataset.py数据集统计脚本:图片数、标签数、类别分布,标出缺标签和格式异常拿到任何新数据集,第一件事先跑它
data_audit.py我自己写的体检脚本(见「数据清洗」节),比上面那个多查 MD5/感知哈希查重、坐标越界、过小框、训练-验证泄漏专门用来抓「数据集看起来没问题,其实有泄漏」这类隐蔽问题
train.py训练入口脚本:顶部几行开关改 EPOCHS/BATCH/MODEL,其余直接运行换模型、调轮数不用碰训练逻辑代码

③ 怎么上手:从零到跑出一次训练

装 Anaconda + PyCharm→建 conda 环境→装 torch + ultralytics→check_dataset.py 核对数据→改 train.py 开关→跑训练→看 results.csv / best.pt
# 建一个干净的环境(Anaconda Prompt 里执行)
conda create -n poultry python=3.10 -y
conda activate poultry

# 装训练依赖(RTX 50 系显卡必须用 cu128,其他显卡按官网选对应版本)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
pip install ultralytics

# 先体检数据集,确认标签没问题、没有泄漏,再训练
python check_dataset.py
python data_audit.py

# 改 train.py 顶部的 EPOCHS / BATCH / MODEL 这几行开关,然后直接运行
python train.py

完整的 PyCharm + Anaconda 保姆级教程(每一步截图、常见报错速查表、Conda 环境踩坑记录)在 种鸡智能监测 第 07–08 节,这里只摘环境搭建和常用命令。

0425 组模型基准结果公开资料

按 mAP@50 降序,取自各模型 results.csv 自动汇总(200 轮中的最优值)。

这 25 组是 BClayinghens 数据集上的结果,来自资料页已有的汇总表,不是我在本机、在 PIO 上训练的;我自己的训练结果见下方「复现记录」。

#模型PrecisionRecallmAP@50mAP@50-95
1yolov9-m0.95970.95090.97920.7274
2yolov9-e0.95850.95730.97870.7440
3yolov9-c0.95960.95540.97810.7395
4yolov8-m0.96470.94890.97710.7677
5yolov5-m0.96270.95130.97590.7262
…其余 20 组(含 RT-DETR 三个主干),完整表见 种鸡智能监测
25yolov10-n0.91870.92540.95940.6451

mAP@50 最优是 yolov9-m(0.9792);mAP@50-95 最高的是 yolov8-x(0.7743)——两个指标的冠军不是同一个模型。

05训练中的三个关键发现本人实测

① batch 受标注密度制约,不只看显存

RTX 5070 Ti(16 GB)上 batch=16 占用 11.5 GB 正常;batch=64 撑到 17.6 GB 崩溃。报错是具有欺骗性的 SystemError: cvtColor,顺异常链挖到底是 numpy 的 ArrayMemoryError。根子在单图平均 220、最高 1,151 个框。

② max_det 默认值会截断召回

框架警告「Dataset images contain up to 594 objects (val=594), but max_det=300」。把 max_det 从 300 改到 600,避免召回被人为压低。

③ 读 best.pt 实测出的结构细节

参数量 2.57M,步长 8/16/32,候选点 8400。reg_max=1:results.csv 表头是 l1_loss 而非 dfl_loss——源码中 use_dfl = reg_max > 1,DFL 分支被移除。还有 E2ELoss 与 one2many + one2one 双检测头,权重按轮数从 0.8:0.2 线性衰减到 0.1:0.9,标签分配用 TaskAlignedAssigner。

06复现流程与记录:我自己训练的数据本人实测

我亲手训练的数据(PIO · yolo26n · RTX 5070 Ti)
训练轮数mAP@50mAP@50-95耗时日期
冒烟测试 exp_yolo26n_1ep-410.6450.29156 s2026-09-17
短训 exp_yolo26n_3ep_b1630.8140.45489 s2026-09-29
短训 exp_yolo26n_5ep_b1650.8560.496107 s2026-09-29
0.856目前最好 mAP@50(5 轮)
18.4 s每轮耗时 → 200 轮约 1 小时
15.4 / 16Gbatch=16 时显存峰值
2 次崩溃定位为内存不足,WORKERS 4→2 解决

注:验证集约 13% 与训练集重复(见「数据清洗」),以上指标可能偏高,去重后会重跑对比。

P1–P2 建项目/环境→P3–P4 PyTorch cu128(50 系必须)→P5–P6 接入并校验数据→P7–P8 改 EPOCHS/BATCH/max_det→P9–P10 训练看 loss→P11–P12 读 results.csv / best.pt

以下均为本机实测:J:\poultry\runs\detect\exp_yolo26n_1ep-4(yolo26n,1 epoch 冒烟测试,2026-09-17),用来验证流程跑得通,不是上面 25 组、200 轮的正式结果,两者不要混着比。

raw/images/train  1,035 张      raw/labels/train  1,036 个(含 classes.txt 误算)
raw/images/val      452 张      raw/labels/val      452 个
yolo26n.pt · cuda:0 · batch=16 · imgsz=640 · max_det=600

Precision 0.5725   Recall 0.6916   mAP@50 0.6445   mAP@50-95 0.2906
单 epoch 55.9 s    box/cls/l1 loss  2.486 / 3.240 / 0.0046
第 1 周雏鸡场景标注样例
标注样例:镀锌网笼里的雏鸡,绿框为真实标注
训练集标注分布
labels.jpg:训练集标注分布,共 253,429 个框
loss 与指标
results.png:仅 1 个 epoch,故只有单点
混淆矩阵
confusion_matrix.png:检出 60,896 / 漏检 12,963 / 误检 126,012
验证集预测
val_batch0_pred.jpg:验证集真实预测框(尚未收敛)
PR 曲线
BoxPR_curve.png:本轮精确率-召回率曲线

1 / 3 / 5 轮短训对比本人实测

同一配置(yolo26n · batch=16 · imgsz=640 · max_det=600)只改轮数。前 5 轮 mAP@50 从 0.645 升到 0.856;首轮约 34 s(含缓存与预热),之后每轮约 18.4 s,据此估算 200 轮正式训练约 1.0 小时(不含提前停止)。

1/3/5 轮末轮验证集指标对比柱状图
1 / 3 / 5 轮末轮验证集指标(PIO 验证集 452 张、73,859 个框),数值见下表
指标(末轮)1 轮3 轮5 轮
Precision0.5730.8230.862
Recall0.6920.7370.783
mAP@500.6450.8140.856
mAP@50-950.2910.4540.496
累计耗时56 s89 s107 s
5 轮训练终端输出
5 轮训练的运行输出(由本机日志渲染):逐轮 loss 与验证指标,GPU 显存峰值 15.4G / 16G
5 轮模型验证集预测局部
5 轮 best.pt 对 C-W1-V0001.jpg 的预测(局部放大):检出 272 只,仍可见漏检
5 轮 results.png
5 轮 results.png:loss 下降与指标上升曲线

踩坑:WORKERS=4 时两次在第 1 轮中途崩溃(numpy ArrayMemoryError / cv2 Insufficient memory——是内存而不是显存不足:每个数据加载进程都在做 mosaic 拼图,框极密时很吃内存)。降到 WORKERS=2 后正常跑完,该参数不影响训练结果。数据来源:J:\poultry\runs\detect\exp_yolo26n_3ep_b16 与 exp_yolo26n_5ep_b16。

完整训练:143 轮(手动停止)本人实测

在 1/3/5 轮短训基础上,正式跑了一次长训练:yolo26n · batch=16 · imgsz=640 · max_det=600 · workers=0。mAP@50 在 30 轮左右就基本走平,143 轮时精度已很接近收敛,于是手动停止,没有跑满 200 轮。

0.950最佳 mAP@50(第 137 轮)
0.931 / 0.901最终 Precision / Recall(best.pt 复验)
0.643mAP@50-95(best.pt)
143 / 200手动停止,未跑满(见下方踩坑记录)
143 轮训练曲线:box_loss / mAP@50 / mAP@50-95
143 轮完整曲线:box_loss 持续下降,mAP@50 约 30 轮后进入平台期——这是手动叫停的依据
指标1 轮3 轮5 轮143 轮
Precision0.5730.8230.8620.931
Recall0.6920.7370.7830.901
mAP@500.6450.8140.8560.947
mAP@50-950.2910.4540.4960.643
累计耗时56 s89 s107 s≈2.1 h
143 轮混淆矩阵
confusion_matrix.png(best.pt 复验)
143 轮 PR 曲线
BoxPR_curve.png:mAP@50 = 0.947@all classes
143 轮模型验证集预测局部
143 轮 best.pt 对 C-W1-V0001.jpg 的预测(同一张图,局部放大):检出 448 只(真实标注 395 只)
5 轮模型同一张图预测,作对比
对比:5 轮时同一张图只检出 272 只——训练更充分后召回明显提升,但 448>395 说明也出现了一些误检

这次真正的踩坑记录:连续崩溃 3 次,报错都是同一个 cv2.error: Insufficient memory,但每次系统还有 14–17 GB 空闲内存——不是真的内存不够,更像是本机 OpenCV 5.0.0 + Python 3.14(非常新的组合)在长时间 mosaic 拼图下偶发的分配失败,分别发生在 WORKERS=4、WORKERS=2、WORKERS=0 三种配置下,说明和 worker 数无关。解决办法不是继续调参,而是写了个自动续训脚本:崩溃后用 resume=True 从 last.pt 接着跑,最终靠这个机制把 3 次崩溃都"渡过去",没有丢失已训练的轮数。数据来源:本机实测,J:\poultry\runs\detect\exp_yolo26n_200ep_b16(2026-09-30 ~ 10-01)。

07论文写作要点

数据处理与清洗数据集搭建模型训练调参与实验设计优化与部署结果分析与图表论文结构拆解期刊与投稿写作与审稿应对

详见 论文写作与方法。

08学习路径与下一步

巩固基础

机器学习→视觉概念对照;YOLO 家族演进与改进工具箱;35 条指标与超参名词。

深化实验

自有养殖场数据独立验证;补全消融实验;扩展到多模态(TIR 温度)。

推进产出

按目标期刊整理初稿;复现记录补真实截图;规划部署与落地验证。

Collaboration Loop

协同思考:这次汇报能给别人什么、想向别人借什么

① 我做了什么

梳理两套公开家禽数据集,在统一框架下跑完 25 组检测基准,总结出 batch、max_det、reg_max 三个与「小而密目标」强相关的训练发现,并跑通了本机复现流程;对 PIO 做了完整数据体检,发现验证集 13% 与训练集重复、112 组同图不同标注。

② 我的什么可以被其他方向复用

课题组的共识是:一个方法如果只能解决种鸡这一个窄问题,价值有限;能跨动物、跨植物、跨场景迁移,价值才大。按这个标准过一遍:

③ 我想向其他同学借鉴什么

依据课题组《各课题研究方向之间的关系》:种鸡负责「个体长期监测 + 繁殖性能关联」,马岗鹅负责「开放环境 + 密度变化 + 健康异常」,茶花负责「长时间尺度动态表型 + 智能育种」,农业智能体负责「知识整合 + 工具调用 + 诊断决策闭环」——下面是种鸡方向接下来正好用得上另外三条线成果的地方:

未来方向(见下)里的三阶段路线和上面这三条借鉴需求是同一条主线:把种鸡的「阶段一:个体+跟踪+行为」做扎实,同时留意能不能直接用到马岗鹅/茶花已经跑通的方法。

Next Direction

未来方向:从「看见鸡」到「理解种鸡生产性能」

上面几节做的检测(数鸡、定位)只是起点。种鸡方向真正要交付的,不是再训一个 YOLO 模型,而是把检测结果接到一条长期的关联链条上,最终服务于种鸡精准管理和辅助育种。

个体
检测 · 身份识别 · 长期跟踪
→ 行为
采食 · 饮水 · 活动 · 休息 · 产蛋
→ 体况
体况评分 · 体温(热红外)
→ 蛋品质
产蛋记录 · 品质指标
→ 孵化性能
孵化率 · 繁殖性能

已有基础只到第一环:群体级目标检测(本页 01–06 节)。从「个体」往右的四环都还没做,是接下来的重点。

大概怎么做:三阶段

阶段一 · 当前 把感知做扎实

在现有检测模型基础上加个体身份识别与长期跟踪,再做行为识别、体况评分。产出:带 ID 的个体轨迹 + 行为标注集。

阶段二 行为 ↔ 生产性能

前提是阶段一能稳定输出个体级行为统计,且能拿到个体/笼位级的产蛋、蛋品质、孵化记录。产出:行为统计与生产记录对齐的数据库、关联分析模型。

阶段三 早期预警

前提是阶段二找到了与性能下降相关的行为信号。产出:异常行为 / 生产性能下降的预警模型,以及「提前多久能发现」的评估。

研究生阶段的重心大致对应「阶段一」:把它做扎实,并把数据采集设计成能直接支撑阶段二(统一时间戳、个体 ID、生产记录对得上)——这样后面接手的人、或自己继续读博,都能直接往下做,不用推倒重来。

现在就能开始的几件事

方面具体做什么
技术上先跑通用现有最优检测模型 + Ultralytics 自带的跟踪器,在 PIO 的原始视频上跑出第一版个体轨迹;统计 ID 切换(同一只鸡被误判成新个体)有多频繁、主要发生在什么情况下;把家禽跟踪/行为识别相关论文读进文献库
和导师、养殖场确认种鸡场的实际采集条件(机位、有无热红外);能不能拿到个体或笼位级的产蛋、蛋品质、孵化记录;体况评分用哪一套标准
先定规范行为类别表和标注规范初稿;个体 ID、时间戳的统一规则;与课题组其他方向(马岗鹅等)对齐数据规范,避免各做各的

这条路线和三阶段划分来自课题组的协同研究技术路线图,完整版(含研究现状对照表、7 步全流程详解)见 种鸡智能监测 · 后续研究规划;本节只摘和下次汇报直接相关的部分。