Bird Pose Demo

Zero-download executable plan · 2026-07-22

先用 1,200 张现成数据,跑通鸟框 + 15 点 Pose 微调

最值得先做的不是再跑一个整图二分类器,而是把本机已有 CUB-200-2011 的鸟框与 15 个部位点转换成 YOLO Pose,加载现成 YOLO26s Detect 权重,再混入昆虫、飞机、风筝和常见动物负样本。这个 Demo 不需要新增下载或人工标注,却能直接验证未来正式系统的几何中枢。

设备:Apple M5 / 32 GB环境:Ultralytics 8.4.100 / MPS不使用 CUB 官方 test增量磁盘预算 < 2 GB
1,200计划数据:800 张有鸟 + 400 张无鸟
15 点眼、喙、翼、腿、背胸腹、尾等部位
11.55M单类、15 点 YOLO26s-Pose 训练参数
1–2 天从转换、smoke、训练到报告的实施工期
Executive decision

推荐 Demo:CUB-15 → YOLO26s-Pose

目标不是在通用榜单刷出一个高数字,而是最低成本证明四件事:标签能转换、Detect 权重能迁移、M5 能完成 Pose 训练、模型能同时返回鸟框与可用关键点。

01

直接验证正式主线,而不是再做旁路实验

使用单类 bird Pose 模型:鸟是唯一前景类,无鸟图片使用空标签;每个鸟实例同时输出 bbox、bird confidence 和 15×(x,y,visibility)。它正好覆盖未来“有无鸟、框定主体、给对焦网络送 ROI、给姿态 MLP 送坐标”的共同输入。

建议训练配置:YOLO26s-Pose,640 px,batch 4,15 epoch,MPS,seed 42;先执行 64 图 1 epoch smoke,再跑完整 3 epoch 校准,最后决定是否完成 15 epoch。

为什么不用现成分类 PoC

100 张 YOLO26s-cls 已经证明整图二分类链路能运行,但它没有框,且实测把蝴蝶和水面反光报成鸟、漏掉远小鸟。重复它不会验证关键点和 ROI。

为什么暂不碰七月全量照片

当前 4,696 张七月候选图没有完整的框与关键点真值。它们适合在 Demo 跑通后做盲推理、错误挖掘和人工标注,不适合充当第一轮监督训练数据。

已有输入

CUB 鸟框 + 15 点

只从官方 train 内按物种抽样,官方 test 原样封存。

已有输入

困难无鸟图

昆虫/蜘蛛、飞行物、动物、自然环境人物;空标签。

Fine-tuning

YOLO26s-Pose

nc=1kpt_shape=[15,3],加载 Detect backbone/head 可兼容权重。

验收输出

框、点、误报与可视化

box/pose 指标、负样本 FPR、逐点 PCK、接触表和可重载权重。

官方格式/能力本机实测/审计条件化时间估算不能外推的边界
01 · Local inventory

已经下载的内容,足够跑通完整 Demo

以下数字来自当前工程逐文件或 manifest 审计,不是网络资料的泛化描述。原始数据应保持只读,Demo 只生成 manifest、标签、链接和训练产物。

本机资产当前规模可用于 Demo 的监督本次角色限制
CUB-200-201111,788 图;官方 train 5,994 / test 5,794;200 种每图鸟框、15 点坐标与可见性主正样本多为单鸟、大主体、居中;不是本地复杂野外分布。
困难负样本 v18,491 图 / 8,491 空标签;约 2.4 GB经过 bird 排除规则的无鸟整图主负样本仍需人工抽查;来源许可不等同于可自由再分发。
YOLO26 Detect 权重n / s / m 已在本机;合计约 67 MBCOCO 预训练视觉特征与检测头兼容参数迁移初始化本机没有 Pose checkpoint,但不妨碍从 Detect 迁移。
七月候选照片4,696 图真实目标域,尚无完整框/点真值Demo 后盲测不能把旧模型“no_box”结果当真值。
100 张分类 PoC50 bird / 50 no_bird;测试 17/20整图二分类标签保留基线无位置;测试集仅 20 张,统计区间很宽。
COCO birdtrain 3,237 图 / 10,542 非 crowd 鸟框鸟框,无鸟类 15 点正式 Detect 阶段不能直接作为 15 点 Pose 正样本并把所有点写成不可见。

CUB 标注完整

15 点文件共有 176,820 行,恰好等于 11,788×15;train 每种 29–30 张,能够做完全一致的物种分层抽样。

负样本覆盖当前痛点

4,781 张 COCO、1,431 张 Open Images、2,279 张 iNaturalist;其中昆虫/蛛形纲 3,710 张,正对蝴蝶误报。

机器还有余量

Apple M5、10 核 GPU、32 GB 统一内存,约 142 GB 可用磁盘。计划数据的实际图像字节约 178 MB;即使复制和保留多轮 checkpoint,也按 <2 GB 增量控制。

CUB 关键点的实际可见率

11,788 图全量审计
喙 beak
99.6%
前额
98.4%
喉 throat
98.7%
后颈 nape
96.0%
尾 tail
93.0%
左眼
49.7%
右眼
51.6%
左翼
55.8%
右翼
56.6%
腿(左右)
约 72%
可见率低不等于数据差:

侧面鸟通常只看见一只眼,翼/腿会被身体或羽毛遮挡。首个 Demo 必须学习 visibility,而不能要求每张图 15 点全部出现。官方 train 中 5,667/5,994 图至少可见 10 点,只有 2 图 15 点全可见。

02 · Demo options

六个能做的 Demo,只有一个同时验证框和点

“能训练”不是选择标准。优先级取决于它能否消除正式流程中最大的工程不确定性,以及失败后能否指出下一步该修数据、训练还是结构。

候选 Demo无需新下载无需新标注能输出鸟框能输出关键点对正式路线的价值判断
CUB-15 YOLO26s-Pose15 点直接验证几何中枢、ROI 和姿态输入首选
单类 Detect:CUB/COCO + negatives最容易达到较好 presence,但仍要再迁移 Pose失败回退
重复 100 张 YOLO26s-cls已有链路已跑通,新增信息很少不重复
CUB 200 鸟种分类 / BioCLIP adapter验证物种识别,但不解决前端几何后续独立做
人工合成模糊的 focus 分类器可自动依赖已有框/点依赖已有点只验证 ROI/训练管线,容易学习合成伪影管线 smoke
关键点数量 → 姿态 MLP缺少偏好标签作为输入会把模型可见度循环当作真值现在不要做
回退策略不是换目标:

若 Pose smoke 因格式、loss 或 MPS 兼容问题失败,先用同一批图片把标签截断为 5 个 bbox 字段,训练 YOLO26s Detect 1–3 epoch;确认数据读取与检测 loss 正常后,再恢复 15 点。这样能定位故障层,而不是退回整图二分类。

03 · Dataset recipe

1,200 图:物种分层正样本 + 误报导向负样本

样本规模刻意保持小,但拆分要严谨:正样本只用 CUB 官方 train,负样本按错误类型配额抽样;所有选择写入 manifest 和 seed,不能靠复制文件时的随机顺序。

SplitCUB 有鸟困难无鸟合计正样本比例选择规则
train60030090066.7%200 种×每种 3 张;负样本按四类配额。
val20010030066.7%200 种×每种 1 张;与 train 的 sha256 不重合。
保留CUB 官方 test 5,794 图其余 8,091 图不参与 Demo后续正式实验或更大盲测;不因看过结果而变成调参集。

正样本:每物种同额抽取

  • 从 CUB 官方 train 内,按物种名称排序后以 seed 42 洗牌。
  • 每种前 3 张进 train,第 4 张进 val;每种原本有 29–30 张,抽样可行。
  • 计划 800 张正样本实际图像字节约 75 MB。
  • 不根据“看起来漂亮/清晰”挑图,避免隐性筛选。

负样本:围绕已知误报配置

  • 50% 昆虫/蜘蛛:蝴蝶、蛾、蜻蜓、蜂、甲虫等。
  • 30% 飞行物:airplane、kite、frisbee。
  • 15% 常见动物:猫、狗、熊、马、羊、牛。
  • 5% 自然环境人物;train/val 分别为 300/100。

为什么不是正样本越多越好

Demo 与正式训练目标不同

保持 2:1 正负

这不是现实世界先验,而是一个可控的训练采样比。负样本太少,Pose 可能在昆虫与飞行物上过度响应;负样本太多,小 Demo 又会稀释随机初始化关键点头的学习。

先验证 200 种覆盖

每种只取 3 张不够学物种,但足以让鸟体外形、视角与羽色比单一地点更丰富;物种标签不进入 YOLO,它仍只有一个 bird 类。

正式流程再加真实本地图

CUB 的鸟框面积中位数约占整图 32.2%,p10 仍约 14.1%。它无法代表七月照片里的远小鸟,因此 Demo 通过后必须加入本地 tiny-bird 与复杂背景。

数据泄漏边界:

Open Images 的 validation/test 来源图已被当前负样本集合使用,未来不能再把同一来源集合当作独立 Open Images benchmark。正式项目必须依靠新日期本地照片建立组隔离 test;同一连拍组不能跨 split。

04 · CUB → YOLO Pose

转换器是 Demo 里最需要认真验收的代码

训练失败往往不是模型问题,而是归一化、左右点交换、不可见点或越界框处理错误。转换器必须同时生成标签、manifest、异常日志和可视化接触表。

每个正样本标签恰好 50 个字段

class cx cy w h
back_x back_y back_v
beak_x beak_y beak_v
...
throat_x throat_y throat_v

# 5 + 15 × 3 = 50 tokens

空标签就是无鸟

images/train/example_negative.jpg
labels/train/example_negative.txt

# txt 文件存在但内容为空
# 不建立 non-bird 类,也不画“背景框”
转换步骤规则必须审计失败处理
图像尺寸以实际 JPEG 宽高为准,不从 bbox 推断。可打开、宽高 > 0、hash 记录。损坏图退出,不静默跳过。
鸟框x1,y1,w,h → clip 后的归一化 cx,cy,w,h所有值在 [0,1]、面积 > 0。CUB train 有 14 个框精确越界;clip 并逐条记录。
可见关键点CUB visible=1 → YOLO v=2x/y 在图内且归一化后在 [0,1]。train 有 1 个可见点越界;改为 0 0 0 并记录,不把它硬推到边缘。
不可见关键点CUB visible=0 → 0 0 0不可见点不能保留任意坐标。转换器断言,不符合即失败。
水平翻转左右眼、腿、翼成对交换。翻转前后画 16 张骨架图。关掉 fliplr,直到 flip_idx 视觉通过。
负样本同名空 txt。图片与标签一一对应、内容长度 0。缺标签或非空即失败。

数据 YAML 的核心契约

Ultralytics 运行时会按数据覆盖 nc / kpt_shape
path: data/cub15_pose_demo
train: images/train
val: images/val

names:
  0: bird

kpt_shape: [15, 3]
flip_idx: [0, 1, 2, 3, 4, 5, 10, 11, 12, 9, 6, 7, 8, 13, 14]

kpt_names:
  0: [back, beak, belly, breast, crown, forehead,
      left_eye, left_leg, left_wing, nape,
      right_eye, right_leg, right_wing, tail, throat]
不要把 COCO bird 框直接混进这一版 Pose:

COCO bird 有框但没有 CUB 的 15 点。如果把 15 点全写成 v=0,模型会把“无关键点”当作大量监督模式,影响 visibility 和关键点头。正式流程应先用 CUB+COCO+负样本训练 Detect,再把其兼容权重迁移到只含真实 15 点标签的 Pose 阶段;若要混合 box-only 样本,需要自定义 loss mask,而不是伪造不可见点。

05 · Beginner-readable implementation

一个 Notebook 负责教学,脚本负责可重复执行

Notebook 每个单元解释“为什么”和“期待看到什么”,但数据构造、审计和评测逻辑放进可测试脚本。这样初学者能逐格阅读,重复执行时又不会复制出第二套业务逻辑。

建议目录

experiments/yolo26s_bird_pose_demo/
├── README.md
├── requirements-lock.txt
├── configs/bird_pose15_demo.yaml
├── notebooks/
│   ├── 01_cub15_pose_demo.ipynb
│   └── 01_cub15_pose_demo.executed.ipynb
├── scripts/
│   ├── build_cub15_pose_demo.py
│   ├── audit_pose_dataset.py
│   ├── evaluate_pose_demo.py
│   └── make_demo_report.py
├── data/{manifest.csv,split_policy.json,...}
├── runs/
└── artifacts/

产物必须能回答的问题

  • manifest.csv:每张图来自哪里、属于哪个 split、hash 是什么?
  • split_policy.json:seed、配额和过滤规则是什么?
  • audit_summary.json:有多少框/点被修正,是否有非法标签?
  • metrics.json:框、点、presence、负样本 FPR 分别怎样?
  • model_manifest.json:权重 hash、依赖版本、训练参数和阈值是什么?

Notebook 的 10 个单元

每格都含说明、预期输出与失败提示
1

环境与硬件自检

打印 Python、torch、Ultralytics、MPS 可用性、剩余磁盘;断言版本和数据根目录存在。

2

认识 CUB 标注

展示一张图、原始 bbox 与 15 点名称;解释像素坐标、归一化和 visibility。

3

生成固定 manifest

按每物种 3+1 和负样本四类配额选择 1,200 图,写入 hash 与 split;再次运行结果完全相同。

4

转换并审计标签

生成 hardlink(同盘)或 copy fallback、50-token 正标签和空负标签;输出越界修正日志。

5

可视化 16–32 张

覆盖侧面、正面、飞行、遮挡和翻转样例;人在训练前确认眼/翼左右关系。

6

1 epoch smoke

64 图子集跑 YOLO26s-Pose;确认数据加载、loss、反向传播、验证与 checkpoint 全部完成。

7

3 epoch 时间校准

使用完整 900 图 train,记录后 2 个 epoch 中位数和峰值内存,再估算 15 epoch 墙钟时间。

8

15 epoch Demo 微调

从同一配置重跑,保存 best.ptlast.pt、args、曲线和逐 epoch CSV。

9

分层评测

报告 box mAP、pose mAP、逐点 PCK、图片级召回、负样本 FPR,并生成预测接触表。

10

重载与打包

在新对象中加载 best.pt 对 10 图再推理,冻结阈值与 hash,生成自包含 HTML 运行报告。

06 · Training configuration

先校准时间,再承诺完整运行

当前本机有 YOLO26 Detect 推理与分类 PoC 实测,但没有 15 点 Pose 训练实测。时间必须明确标为估算,并由完整 split 的 3 epoch 校准替换。

阶段数据 / epoch模型M5 初始时间窗成功标志
格式 smoke48 train + 16 val / 1 epochYOLO26s-Pose约 2–8 分钟无 NaN、完成验证、生成可重载 checkpoint。
时间校准900 train + 300 val / 3 epochYOLO26s-Pose约 8–30 分钟后两轮耗时稳定,峰值内存无系统压力。
主 Demo同上 / 15 epochYOLO26s-Pose约 30–120 分钟指标可计算、点不坍缩、负样本可评估。
快速回退同一数据去掉关键点 / 3 epochYOLO26s Detect约 5–20 分钟用于区分数据/检测与 Pose head 问题。

建议首跑参数

model = YOLO("yolo26s-pose.yaml")
model.load("models/yolo26s.pt")

model.train(
    data="configs/bird_pose15_demo.yaml",
    device="mps", imgsz=640,
    epochs=15, batch=4, workers=2,
    seed=42, cache=False,
    fliplr=0.5, flipud=0.0,
    degrees=8, translate=0.08, scale=0.25,
    close_mosaic=5, plots=True,
)

本机已验证的迁移事实

  • stock YOLO26s-Pose 架构为 11,870,498 参数(默认 80 类/17 点口径)。
  • 改为 1 类/15 点后,训练结构为 11,551,772 参数
  • 本机把 yolo26s.pt Detect 权重装入 stock Pose 时,Ultralytics 报告 708/879 items transferred
  • 关键点输出层仍需从随机初始化学习,所以 1 epoch 只证明管线,不证明精度。
校准公式:

预计总时间 = 后两轮 epoch 中位数 × 目标 epoch × 1.15。额外 15% 覆盖验证、绘图、保存与热降频。若 batch 4 出现内存压力,先降到 2;不要同时改分辨率、batch、增强和模型尺寸,否则无法判断原因。

时间窗不是成绩:

30–120 分钟是基于当前数据规模和历史 M5 容量规划的条件化估算,不是已经跑出的 Pose 训练时间。100 张分类 PoC 的 14.6 秒不能按图片数直接外推到检测/姿态,因为输入尺寸、head、loss 与验证成本都不同。

07 · Evaluation & exit gates

“跑通”必须比 loss 下降更严格

一个有用的 Demo 要证明数据、模型、指标和产物都可以复现。下面的阈值是工程退出条件;它们不是当前成绩,也不代表真实七月照片上的生产精度。

层级必须报告Demo 退出门槛失败时优先检查
数据1,200 图/标签、token 数、hash、split 重叠、异常日志100% 审计通过;train/val hash 零重合路径、硬链接、bbox clip、visibility 和 flip_idx。
训练box/pose/cls loss、每轮耗时、峰值内存、版本无 NaN/Inf;完成 smoke 与 best.pt 保存MPS 兼容、增强、batch、非法坐标。
鸟框box mAP50、mAP50–95、图片级 bird recall建议 AP50 ≥ 0.70框转换、置信度、随机初始化 head、图像方向。
关键点pose mAP、PCK@0.05/0.1、每点 PCK、visibility整体 PCK@0.1 ≥ 0.60;眼/喙 ≥ 0.50点顺序、左右翻转、不可见编码、点坍缩。
无鸟按冻结阈值的 FPR、specificity、每类误报数建议 specificity ≥ 0.80昆虫/飞行物配额、阈值与负样本污染。
重载10 图重推理、权重 SHA-256、输出 schema结果可生成,框与点 shape 正确checkpoint、依赖版本、推理阈值未冻结。

框指标

Ultralytics 的 box mAP 回答框是否接近 CUB 真值;另算“只要任一 bird box 超阈值就算有鸟”的图片级 recall,连接实际 presence 需求。

逐点 PCK

以鸟框尺度归一化关键点误差,分别报告 PCK@0.05 与 0.1。眼/喙对后续对焦 ROI 更关键,不能只看整体 pose mAP。

负样本 FPR

对 100 张 val negative 逐图统计是否出现任意 bird 框,并按昆虫、飞行物、动物、人物拆分。阈值在 val 内选择,只用于 Demo。

接触表至少覆盖的 12 类案例

视觉检查仍不可省略

侧面鸟

左右眼/翼可见性是否合理。

正面鸟

两眼、胸腹与翼点是否稳定。

飞行鸟

翼、尾、腿的可见度与坐标。

遮挡鸟

不可见点是否低置信而非乱飞。

小主体

CUB 中 bbox 面积较小的 p10 分片。

边缘主体

clip 后框与点是否仍在图内。

蝴蝶/蛾

当前最重要的 hard negative。

蜻蜓

长翼与鸟形误报。

飞机

天空中的轮廓误报。

风筝/飞盘

飞行小目标误报。

猫狗/牲畜

自然背景中的动物轮廓。

自然环境人物

复杂背景与局部纹理误报。

Demo 通过不等于可替代慧眼:

CUB 的主体通常大而清晰,验证集仍来自同一数据域;100 张负样本也不足以估计真实每千张误报。这个实验只回答“框+点训练管线是否正确、M5 是否可用、负样本是否能进入 Pose 训练”,不能回答七月远小鸟召回、真实失焦点定位或最终照片评分。

08 · From Demo to production

通过后,再开始真正昂贵的数据闭环

正式流程不要一次性把检测、姿态、对焦、物种与 Lightroom 写回全部串起来。每阶段只增加一种新监督,并保留同一套输出 schema 与回归集。

Day 1 · 数据转换与 smoke

实现幂等 converter/audit,生成 1,200 图 manifest、接触表;运行 64 图 1 epoch。任何点顺序或越界问题都在此修完。

Day 1–2 · 3 epoch 校准 + 15 epoch Demo

冻结配置,得到 box/pose/PCK/FPR、错误样例和模型 manifest。未达门槛先查转换与增强,不立即换大模型。

Week 1 · 七月照片盲推理与人工最小标注

不写回 Lightroom;先输出影子报告。优先人工标 300 张鸟框 + 100 张 15 点,并收集蝴蝶、水面、枝叶、远鸟、半鸟和严重模糊。

Week 2 · 正式 Detect v1

用 CUB/COCO bird、本地框和 8,491 负样本训练单类 Detect;建立新日期/连拍组隔离 test,冻结 presence 阈值。

Week 3–4 · Pose v1

从正式 Detect 权重迁移到 CUB + 本地真实关键点;只有证据表明小鸟像素不足时才试 1024、切片或 P2。

Month 2+ · Focus / Pose MLP / species

Pose 先产出眼、头、羽毛 ROI;再用真实连拍偏好训练对焦网络与姿态 MLP,物种裁切交给 BioCLIP/OSEA。最后才进行 Lightroom 影子验证与可回滚写回。

Demo 结束后的决策树

每种失败都指向不同动作
观察说明下一步不要做
框好、点好、负样本低误报管线通过进入本地框/点标注与正式 Detect→Pose 两阶段。不要把 CUB val 数字宣传成生产精度。
框好、点差点顺序/可见性/增强或关键点头训练不足检查 flip 接触表,延长到 30 epoch,比较 n/s 但保持数据不变。不要先加更多无点 COCO 图。
框和点都差优先怀疑转换、头初始化或训练配置截断为 Detect 跑同数据;若 Detect 正常,再定位 Pose 配置。不要立刻换 YOLO26m/x。
CUB 好、七月远鸟差典型域偏移/目标像素不足标本地 tiny-bird,比较 1024、条件切片和 P2。不要用 CUB 加倍替代本地数据。
昆虫仍高误报负样本类别/采样或阈值不足从实际错误中做 hard-negative mining;每轮只加确认无鸟图。不要新建“蝴蝶=第二检测类”,除非业务需要框蝴蝶。
眼点在模糊图不稳定Pose 只给几何,不自动等于清晰度输出不确定度和 not-judgeable;用真实清晰/失焦 ROI 训练 focus 网络。不要把眼点置信度直接当对焦分。
明确的启动条件:

只要转换审计、1 epoch smoke 和 best.pt 重载通过,就值得完成 15 epoch。只有当完整 Demo 的框 AP、PCK 或负样本 FPR 明显异常,才暂停并按上表定位。这个顺序把成本限制在 1–2 个工作日和 <2 GB 新增空间,同时保留进入正式流程所需的全部接口。

与线上旧报告的边界:

已有报告分别回答长期系统架构、100 张分类 PoC 结果和原始 YOLO26 误差。本报告独立回答“现在不下载新数据,下一次具体跑什么、怎样构造 1,200 图、Notebook 写什么、怎样验收并衔接正式流程”,不替换旧实验记录。

Sources & evidence

资料、实测与估算分开记录

格式和能力引用官方资料;本机数字来自当前文件、manifest、环境和模型实例化;时间与退出阈值明确标为估算或项目门槛。

本机审计口径

逐行读取 CUB images、官方 split、bounding boxes、parts 和 part locations;实际打开官方 train 图片核对尺寸与越界;读取 8,491 张负样本 manifest 与 summary;实例化单类 15 点 YOLO26n/s-Pose 计算参数量,并把本机 Detect 权重加载到 stock Pose 架构记录迁移项。公开报告不包含私人照片路径、设备序列号、凭据或可还原私人图库的信息。

许可提示:

Ultralytics 提供 AGPL-3.0 与商业许可路径;CUB、COCO、Open Images 和 iNaturalist 图片/标注各有独立条款。这个 Demo 可在本地做技术验证,若未来分发数据、权重或用于商业产品,需重新核对当期许可。本报告不构成法律意见。