STILLFRAME · FIELD TEST
Bird presence model · 2026-07-25 field audit

鸟类二分类实测复盘:
蜻蜓误报与系统性失效

基于 1,232 张完整鸟片、逐张人工复核和位移/尺度/遮挡实验,解释蜻蜓高置信误报、鸟证据稀释、背景捷径、失焦漏检与阈值困境,并给出下一轮训练规划。

完整画面输入 · 无预裁切 YOLO26n 分类网络 · 384 px 人工复核 77 张联系表 实验日期 2026-07-26
1,232
7 月 25 日 JPG,全部推理成功
1,016
人工确认有鸟;另有 1 张不确定
182
阈值 0.015 下仍被判为鸟的无鸟照片
5 / 5
严格阈值下误报均来自同一组红蜻蜓连拍
00 · Executive verdict

先给结论:它会排序,但现在不能替你删片

模型已经学到一部分“鸟片外观”,却没有形成稳定、位置无关的“鸟存在”判断。高分端可以作为“很可能有鸟”的排序信号;低分端仍混入真实鸟片,不能写回 Lightroom 作为自动淘汰依据。

1

蜻蜓高分不是随机波动

热力图和遮挡实验都指向蜻蜓主体;但仅移动约 9 像素,预测即可从 0.947 降到 0.007。它识别的是脆弱的局部纹理/构图组合,不是稳定的鸟语义。

2

真正瓶颈是空间监督

对同一张鸟片裁紧后,概率可从 0.0003 升到 0.986。分类器“看得懂裁出的鸟”,但全画面池化会把小鸟证据稀释。

3

存在与质量必须拆开

严重失焦的鸟仍然是“有鸟”;若二分类器把它当作无鸟,后续锐度模型甚至没有评价机会。存在、对焦、姿态应是独立任务。

4

下一版仍可做二分类,但要换训练方式

短期用鸟/昆虫/其他的内部三类或昆虫辅助头,配合尺度、位置一致性训练;中期切到单类鸟检测,才与后续鸟框、眼部和姿态坐标需求一致。

使用边界:本报告统计来自单日、连拍密集的个人拍摄批次,不是独立同分布的通用基准。相邻帧高度相关,因此“1,232 张”不能等价为 1,232 个独立场景。
01 · Test protocol

测试口径与整体结果

推理完全遵循最终使用方式:整张照片缩放并补边到 384×384,不先裁鸟、不使用框、不切 tile。人工按原图与连拍上下文逐张确认有鸟/无鸟。

输入与模型

项目本次设置
照片2026-07-25,1,232 张 JPG,约 8 GiB
预处理EXIF 纠正方向;保持比例;RGB 114 补边至 384
模型YOLO26n-cls 二分类微调,Stage A 最优权重
推理Apple MPS,batch 32,245.2 秒,5.02 张/秒
复核1,016 有鸟,215 无鸟,1 不确定
水面上一只清晰且居中的雁类,模型给出接近一的鸟概率
正常高分参照 · _DSC6432.JPG
人工:有鸟;整图概率 0.999988。主体大、轮廓完整、背景简单,是当前模型最擅长的输入形态。

三个阈值,没有一个适合“自动删无鸟片”

鸟阈值定位TP / FNFP / TN精确率召回率特异度F1
0.015保鸟优先1005 / 11182 / 3384.67%98.92%15.35%91.24%
0.14447平衡点883 / 13394 / 12190.38%86.91%56.28%88.61%
0.69284高置信鸟365 / 6515 / 21098.65%35.93%97.67%52.67%

注:混淆矩阵排除唯一不确定样本 _DSC6829.JPG。阈值来自本批数据的事后分析,只用于诊断,不可视为生产阈值。

02 · Dragonfly failure

为什么 _DSC7211.JPG 这种蜻蜓会得 0.947?

它不是把所有蜻蜓都当鸟,而是把“红色长腹部+暗色胸部+重叠透明翅+水平枯枝+浅景深”这一特定组合,当成了强烈的鸟证据。更关键的是,这个判断对主体位置和输入尺度极端敏感。

红蜻蜓停在枯枝上,模型错误地给出很高鸟概率
高置信误报 · _DSC7211.JPG
人工:无鸟、红蜻蜓;整图鸟概率 0.947239。侧面长腹、合拢翅与枯枝在低分辨率下形成“身体/尾部/栖枝”的粗轮廓。
与上一张近似的红蜻蜓照片,但模型鸟概率很低
近邻帧却低分 · _DSC7212.JPG
人工:无鸟、红蜻蜓;整图鸟概率 0.015166。拍摄时间、参数和主体几乎相同,主体中心仅改变约 9 px(按 384 输入计)。
核心发现:把 7211 的有效画面平移约(+9, −9)px,概率从 0.947 降至 0.007;对 7212 做反向平移(−9, +9)px,概率从 0.015 升至 0.902。重复同一张图片 32 次始终得到 0.947,排除了 dropout、batch 或 MPS 随机波动。

位置扰动:语义不变,分数翻转

样本/变换原概率变换后变化
7211 → (+9, −9)0.9470.007−0.940
7212 → (−9, +9)0.0150.902+0.887
7205 → (+4, +6)0.9620.105−0.857
7208 → (−3, −5)0.1070.931+0.824

尺度扰动:384 是“误报甜点位”

256 px
0.431
384 px
0.947
512 px
0.217
640 px
0.013
768 px
0.009
1024 px
0.007

同组 5 张高分红蜻蜓在 384 px 平均 0.898;到 640 px 降至 0.040、768 px 降至 0.022。说明错误依赖特定采样尺度,而非稳定物种判断。

模型到底在看哪里?看的是蜻蜓,而不只是背景

DSC7211的Grad-CAM热力图,热点集中在蜻蜓胸部和翅膀附近
Grad-CAM · _DSC7211.JPG
最强响应落在蜻蜓胸部/翅根附近。蜻蜓框只占方形输入约 6%,却承载约 42%–49% 的热力图质量。

遮挡证据

用局部模糊块逐区遮挡时,高分 5 张蜻蜓遮住主体后的鸟概率平均下降 0.874;遮住最敏感的背景区域,平均只下降 0.089

P(bird | original 7211) = 0.947
P(bird | insect box removed) ≈ 0.002

所以更准确的表述不是“枯枝背景让它误报”,而是:蜻蜓主体提供主要触发,枯枝与构图决定触发是否被放大。

为什么大部分其他蜻蜓反而很低?

清晰的蓝色蜻蜓,四片翅膀分离可见,模型鸟概率极低
_DSC7410.JPG · 0.000012
蓝色、斜向身体、四翅分离,昆虫形态非常明确,没有形成红蜻蜓组的“鸟身+尾部”低频轮廓。
较小且颜色较暗的蜻蜓停在斜草茎上,模型分数较低
_DSC7215.JPG · 0.021
主体更小、更暗,翅膀交叉可见,栖枝为单根斜草;触发条件不完整。
红蜻蜓停在水平枯枝上,被模型高置信误判为鸟
_DSC7205.JPG · 0.962
与 7211 同类的侧面红蜻蜓、水平枯枝与柔化背景,构成最稳定的高分误报模板。
与高分蜻蜓连拍接近但位置略有变化的红蜻蜓,模型分数仅中低
同秒连拍也不稳定 · _DSC7208.JPG
人工:无鸟;概率 0.107。与 7205 同秒、同参数,却因几像素位置和姿态变化,从 0.962 掉到 0.107。

原始预训练模型其实“认识蜻蜓”

未做二分类微调的 ImageNet 预训练 YOLO26n-cls,在 7211 上 Top-5 依次为:

原始类别概率
dragonfly(蜻蜓)0.3265
damselfly(豆娘)0.1369
walking stick(竹节虫)0.0988
mantis(螳螂)0.0596
cricket(蟋蟀)0.0403

原模型全部鸟类概率之和仅 0.1268;二分类全量微调后变成 0.9472。两者概率未校准,不能直接比较数值,但类别排序说明:微调破坏/覆盖了原有昆虫细粒度表征。

训练数据为何没压住这个错误?

训练设计实际规模引入的问题
正类构成13,320:CUB 全图 5,993;COCO 全图 3,237;COCO tile 4,090约 75.7% 正类是 CUB 或裁切 tile,主体显著;与真实全画面小鸟分布不一致
负类构成13,320:昆虫 6,660;飞行物 3,330;动物 2,664;自然人 666均为全图,正负类的裁切方式不对称,模型可能借“主体大小/构图”判断类别
蜻蜓素材876 个物化视图,仅约 270 张唯一 iNaturalist 原图重复 3–4 次不等于增加构图多样性;缺少中国野外红蜻蜓+枯枝的域内 hard negative
增强fliplr、HSV;scale=0;无平移/尺度抖动模型没有被约束“同一蜻蜓移动几像素后仍须是负类”
微调范围全骨干+分类头全部更新,普通二类交叉熵容易发生灾难性遗忘;原始 ImageNet 昆虫辨识能力未被蒸馏或冻结保护
结论:这不是“蜻蜓样本数量为零”,而是域差异、重复样本、正负预处理不对称、缺少位置/尺度一致性约束、全量微调遗忘叠加造成的。
03 · Problem one

问题一:全画面会把真实鸟证据稀释掉

同一权重、同一鸟,只改变输入视野。裁紧后高分说明分类特征并非完全没学会;失败发生在“从整张照片找到小鸟并保留其信号”这一步。

整张照片中的白色飞鸟较小,方框标注其位置,模型整图分数很低
_DSC6746.JPG · 整图 0.012
人工:有鸟。白色飞鸟在复杂画面中占比小,384 缩放后细节迅速消失。
裁紧后的白色飞鸟占据较大画面,模型分数大幅升高
同一张裁紧 · 0.813
只缩小视野、不改权重,鸟概率增加约 66 倍。
荷塘全景中有多只雁类但被荷叶遮挡,模型整图分数低
_DSC6284.JPG · 整图 0.092
人工:有鸟。多只雁被荷叶遮挡;“鸟的数量更多”没有换来更高存在概率。
裁出荷塘中的几只雁后,模型分数明显提高
同一张裁紧 · 0.788
鸟体比例提高后概率增加约 8.6 倍,说明全局平均池化在复杂背景中稀释局部证据。
竖幅树林照片中有一只鸟,方框标注,模型整图分数接近零
_DSC7403.JPG · 整图 0.000313
人工:有鸟。竖幅、枝条密集、鸟靠近中部;整图结果几乎等同“确定无鸟”。
裁出树枝间的鸟后,模型分数接近一
同一张裁紧 · 0.986
这是最强反证:模型能识别裁出的鸟,却不能在整图中稳定发现它。
水面远处有一只很小的鸟,模型分数位于低置信区
小主体典型 · _DSC6314.JPG
人工:有鸟;整图 0.142。它刚好落在平衡阈值附近,轻微构图变化就可能翻转。
一只相对孤立且居中的雁,模型鸟概率较高
对照 · _DSC6292.JPG
人工:有鸟;整图 0.841。与 6284 同场景,但主体更孤立、居中、少遮挡,分数显著更高。
结构含义:384 输入经骨干得到约 12×12 特征图,再经通道变换、全局池化和二类线性层。它没有框级损失告诉网络“哪几个格子是鸟”,因此小目标信号很容易被大量背景格子平均掉。
04 · Problem two

问题二:背景与构图捷径会压过“有无鸟”

连续三帧给出一个近乎反转的排序:边缘残鸟高分、空芦苇也高分、完整飞鸟却低分。模型在利用拍摄场景、主体位置和纹理共现,而不是单调累加鸟证据。

画面左上边缘有一只被截断的大白鸟,模型分数较高
_DSC7162.JPG · 0.706
人工:有鸟。白鸟在左上角被画框截断;尽管姿态不完整,芦苇场景和大块白色主体仍触发高分。
只有芦苇和绿色背景,没有鸟,但模型给出较高鸟概率
_DSC7163.JPG · 0.659
人工:无鸟。紧邻前后帧的空芦苇仍接近严格鸟阈值,直接证明背景共现可独立触发。
画面中有清楚的大白色飞鸟,但模型概率很低
_DSC7164.JPG · 0.069
人工:有鸟。完整白色飞鸟反而低分;裁紧后可升到约 0.879。
不能简单归因于“竖幅”或某一种背景:样本仍是一个连拍序列,尚不足以证明普遍因果;但它足以证明当前分数不具备“鸟证据越强,概率必然越高”的单调性。
05 · Problem three

问题三:把“有鸟”与“拍得好”混在了一起

你的最终系统要先确认鸟存在,再评价眼部、羽毛锐度与姿态。失焦鸟片可以在质量阶段淘汰,却不能在存在阶段被当作负类。

严重失焦的飞鸟轮廓,结合连拍上下文可确认有鸟,模型分数很低
_DSC6965.JPG · 0.012
人工:有鸟(连拍上下文确认);严重失焦。作为质量片应低分,但 presence 标签必须为 1。
一只明显但失焦的飞鸟,模型给出较低概率
_DSC6967.JPG · 0.043
人工:有鸟;肉眼可见飞鸟,但边缘和羽毛细节不足。当前模型把“模糊”学成了部分无鸟证据。

Presence

画面是否存在鸟;模糊、遮挡、半只鸟仍是正类。输出用于保底召回或启动检测。

Focus / quality

眼部、头部、羽毛是否锐利;需要鸟框与局部 ROI,输出独立质量分。

Pose / aesthetics

关键点可见数量、头向、展翅与构图;应从检测/姿态网络取得空间输入。

标注纪律:像 _DSC6829.JPG 这种仅为棕色虚影、人工也不能确定的样本,应标为 ignore/uncertain,不要硬塞进鸟或非鸟,否则网络会学习审阅者的随机猜测。

06 · Problem four

问题四:阈值困境与连拍依赖

概率分布有一定排序价值,但低分区不“纯”。把阈值降到足够保鸟时,绝大多数无鸟片也会被保留;把阈值抬高以清除误报时,又会漏掉大量真实鸟片。

四个分数带的真实构成

< 0.015
11 鸟 / 33 无鸟
0.015–0.144
122 / 88
0.144–0.693
518 / 89
≥ 0.693
365 / 5
有鸟无鸟

可用与不可用

可用于高分优先浏览

≥0.693 区间有 98.65% 是鸟,可把它放到候选队列前面。

!

低分只能进入复核队列

<0.015 仍有 25% 是真实鸟;直接删除会丢掉 11 张已确认鸟片。

×

不能据此覆盖 Lightroom 低星

当前分数既受主体尺度影响,也受画面位置、背景和清晰度影响。

连拍统计陷阱:高阈值 5 个误报全部来自同一红蜻蜓序列;不少漏检也集中在同一鸟的相邻帧。下一轮必须按“拍摄序列/场景”分组切分训练与测试,并同时报告 burst-level 指标,避免相邻帧泄漏与虚假的样本量膨胀。
07 · Action plan

下一轮训练:先修稳定性,再扩模型

目前最划算的不是立即换更大模型,而是补齐错误分布、修正采样和监督。下面按可以立刻执行、下一版训练、最终架构三个层级推进。

P0 · 立即

冻结当前版本的用途

只做“高分优先”排序和人工审阅,不自动删除、不覆盖原 Lightroom 评分。保存本批 1,232 张作为域内回归集。

P1 · 数据

采 hard negative,而非复制

纳入整段红蜻蜓连拍;再拍摄/收集不同颜色、尺度、姿态、枯枝与草地中的蜻蜓、蝴蝶、飞虫。新场景整组只进测试。

P2 · 训练

强制位置与尺度一致

正负类对称使用全图/裁切/tile/模糊;加入随机平移、缩放、多分辨率与一致性损失,让同一对象移动后标签不翻转。

推荐的二分类 V2 实验矩阵

实验改动目的通过标准
A · 位置一致性同图生成 4 个随机平移/缩放视图;交叉熵+预测一致性消除 7211 ↔ 7212 式翻转±16 px / 0.75–1.25× 内最大概率差 <0.15
B · 三类内部头bird / insect / other,使用时再将后两类合并为无鸟保留昆虫细粒度边界域内蜻蜓严格误报率 <1%,鸟召回不下降
C · 冻结/蒸馏冻结早期骨干或蒸馏原 ImageNet logits/特征减少昆虫表征的灾难性遗忘预训练昆虫探针准确率保留 ≥90%
D · 多尺度推理384+640 或 384+768 概率共识临时抑制尺度甜点位先在真实小鸟回归集验证,不能以召回下降换误报

数据集规划:以“序列”为最小管理单元

正类:至少 8,000–15,000 张域内全图

  • 主体占比按 <0.5%、0.5–2%、2–10%、>10% 分层。
  • 飞行、栖枝、水鸟、遮挡、半只鸟、逆光与复杂枝条均衡。
  • 保留失焦和运动模糊鸟;标签仍是鸟,另加 quality 属性。
  • 全图为主,crop/tile 作为增强视图,不作为只属于正类的捷径。

负类:至少 8,000–15,000 张,优先域内难例

  • 蜻蜓、豆娘、蝴蝶、蛾、蜂、飞虫,包含停枝与飞行状态。
  • 空枝、芦苇、荷塘、天空、石块、叶片、远处高光与虚影。
  • 飞机、风筝、飞盘,以及中国拍鸟环境中的猫、狗、牛羊、马、人。
  • 每一轮从真实照片挖 top-k 假阳性,去重后加入 hard-negative 池。
切分原则:同一秒/同一连拍/同一主体/同一背景必须整体进入 train、val 或 test 中的一个,不能拆散。测试集保留至少 1,000 个独立序列,另外维护“红蜻蜓”“小鸟”“失焦鸟”“空芦苇”四个专项回归集。

与最终“慧眼替代模型”的衔接

1

短期:分类器作廉价预筛

二分类 V2 只回答有无鸟,保持高召回;多尺度或不确定样本交给下一阶段。

2

中期:单类 bird detector

用检测框提供主体位置和占比,直接解决全画面小目标稀释,并为眼部/羽毛 ROI 准备坐标。

3

随后:bird pose 与局部锐度

关键点网络提供眼、喙、翼、尾等坐标;独立质量网络评价眼部和羽毛锐度;姿态 MLP 使用可见点和几何关系。

4

最后:BioCLIP / OSEA 做鸟种

在检测框内进行鸟种识别;最终评分融合存在、主体占比、锐度、姿态、物种置信度,但各分项保留,便于解释和调权。

08 · Evidence & limits

证据索引与不确定性

报告中的结论均来自本地批次、模型输出、人工复核和针对性实验;配图由原始 JPG 生成展示副本,已移除 EXIF,不影响原照片。

可复核文件

  • predictions.csv:1,232 张逐图概率与预测。
  • summary.json:输入目录、模型、预处理、耗时与统计。
  • manual_review_summary.md:77 张联系表的逐张人工真值。
  • 模型 SHA-256:7cd7a54b…743cbc8
  • 专项实验:固定补边平移、多输入分辨率、Grad-CAM、主体遮挡、原始 ImageNet 权重探针。

解释边界

  • 人工真值依赖可见原图与连拍上下文;1 张维持不确定。
  • Grad-CAM 是相关性解释,不是因果证明;主体遮挡实验补充了干预证据。
  • 不同模型概率未做统一校准,只比较类别排序与相对变化。
  • 单日批次受地点、物种、镜头、天气和拍摄习惯影响,不能外推为通用性能。
  • 所有建议都应在独立序列测试集上重新验证后再写入 Lightroom。