鸟类二分类实测复盘:
蜻蜓误报与系统性失效
基于 1,232 张完整鸟片、逐张人工复核和位移/尺度/遮挡实验,解释蜻蜓高置信误报、鸟证据稀释、背景捷径、失焦漏检与阈值困境,并给出下一轮训练规划。
先给结论:它会排序,但现在不能替你删片
模型已经学到一部分“鸟片外观”,却没有形成稳定、位置无关的“鸟存在”判断。高分端可以作为“很可能有鸟”的排序信号;低分端仍混入真实鸟片,不能写回 Lightroom 作为自动淘汰依据。
蜻蜓高分不是随机波动
热力图和遮挡实验都指向蜻蜓主体;但仅移动约 9 像素,预测即可从 0.947 降到 0.007。它识别的是脆弱的局部纹理/构图组合,不是稳定的鸟语义。
真正瓶颈是空间监督
对同一张鸟片裁紧后,概率可从 0.0003 升到 0.986。分类器“看得懂裁出的鸟”,但全画面池化会把小鸟证据稀释。
存在与质量必须拆开
严重失焦的鸟仍然是“有鸟”;若二分类器把它当作无鸟,后续锐度模型甚至没有评价机会。存在、对焦、姿态应是独立任务。
下一版仍可做二分类,但要换训练方式
短期用鸟/昆虫/其他的内部三类或昆虫辅助头,配合尺度、位置一致性训练;中期切到单类鸟检测,才与后续鸟框、眼部和姿态坐标需求一致。
测试口径与整体结果
推理完全遵循最终使用方式:整张照片缩放并补边到 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 不确定 |
人工:有鸟;整图概率 0.999988。主体大、轮廓完整、背景简单,是当前模型最擅长的输入形态。
三个阈值,没有一个适合“自动删无鸟片”
| 鸟阈值 | 定位 | TP / FN | FP / TN | 精确率 | 召回率 | 特异度 | F1 |
|---|---|---|---|---|---|---|---|
| 0.015 | 保鸟优先 | 1005 / 11 | 182 / 33 | 84.67% | 98.92% | 15.35% | 91.24% |
| 0.14447 | 平衡点 | 883 / 133 | 94 / 121 | 90.38% | 86.91% | 56.28% | 88.61% |
| 0.69284 | 高置信鸟 | 365 / 651 | 5 / 210 | 98.65% | 35.93% | 97.67% | 52.67% |
注:混淆矩阵排除唯一不确定样本 _DSC6829.JPG。阈值来自本批数据的事后分析,只用于诊断,不可视为生产阈值。
为什么 _DSC7211.JPG 这种蜻蜓会得 0.947?
它不是把所有蜻蜓都当鸟,而是把“红色长腹部+暗色胸部+重叠透明翅+水平枯枝+浅景深”这一特定组合,当成了强烈的鸟证据。更关键的是,这个判断对主体位置和输入尺度极端敏感。
人工:无鸟、红蜻蜓;整图鸟概率 0.947239。侧面长腹、合拢翅与枯枝在低分辨率下形成“身体/尾部/栖枝”的粗轮廓。
人工:无鸟、红蜻蜓;整图鸟概率 0.015166。拍摄时间、参数和主体几乎相同,主体中心仅改变约 9 px(按 384 输入计)。
位置扰动:语义不变,分数翻转
| 样本/变换 | 原概率 | 变换后 | 变化 |
|---|---|---|---|
| 7211 → (+9, −9) | 0.947 | 0.007 | −0.940 |
| 7212 → (−9, +9) | 0.015 | 0.902 | +0.887 |
| 7205 → (+4, +6) | 0.962 | 0.105 | −0.857 |
| 7208 → (−3, −5) | 0.107 | 0.931 | +0.824 |
尺度扰动:384 是“误报甜点位”
同组 5 张高分红蜻蜓在 384 px 平均 0.898;到 640 px 降至 0.040、768 px 降至 0.022。说明错误依赖特定采样尺度,而非稳定物种判断。
模型到底在看哪里?看的是蜻蜓,而不只是背景
最强响应落在蜻蜓胸部/翅根附近。蜻蜓框只占方形输入约 6%,却承载约 42%–49% 的热力图质量。
遮挡证据
用局部模糊块逐区遮挡时,高分 5 张蜻蜓遮住主体后的鸟概率平均下降 0.874;遮住最敏感的背景区域,平均只下降 0.089。
P(bird | insect box removed) ≈ 0.002
所以更准确的表述不是“枯枝背景让它误报”,而是:蜻蜓主体提供主要触发,枯枝与构图决定触发是否被放大。
为什么大部分其他蜻蜓反而很低?
蓝色、斜向身体、四翅分离,昆虫形态非常明确,没有形成红蜻蜓组的“鸟身+尾部”低频轮廓。
主体更小、更暗,翅膀交叉可见,栖枝为单根斜草;触发条件不完整。
与 7211 同类的侧面红蜻蜓、水平枯枝与柔化背景,构成最稳定的高分误报模板。
人工:无鸟;概率 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 昆虫辨识能力未被蒸馏或冻结保护 |
问题一:全画面会把真实鸟证据稀释掉
同一权重、同一鸟,只改变输入视野。裁紧后高分说明分类特征并非完全没学会;失败发生在“从整张照片找到小鸟并保留其信号”这一步。
人工:有鸟。白色飞鸟在复杂画面中占比小,384 缩放后细节迅速消失。
只缩小视野、不改权重,鸟概率增加约 66 倍。
人工:有鸟。多只雁被荷叶遮挡;“鸟的数量更多”没有换来更高存在概率。
鸟体比例提高后概率增加约 8.6 倍,说明全局平均池化在复杂背景中稀释局部证据。
人工:有鸟。竖幅、枝条密集、鸟靠近中部;整图结果几乎等同“确定无鸟”。
这是最强反证:模型能识别裁出的鸟,却不能在整图中稳定发现它。
人工:有鸟;整图 0.142。它刚好落在平衡阈值附近,轻微构图变化就可能翻转。
人工:有鸟;整图 0.841。与 6284 同场景,但主体更孤立、居中、少遮挡,分数显著更高。
问题二:背景与构图捷径会压过“有无鸟”
连续三帧给出一个近乎反转的排序:边缘残鸟高分、空芦苇也高分、完整飞鸟却低分。模型在利用拍摄场景、主体位置和纹理共现,而不是单调累加鸟证据。
人工:有鸟。白鸟在左上角被画框截断;尽管姿态不完整,芦苇场景和大块白色主体仍触发高分。
人工:无鸟。紧邻前后帧的空芦苇仍接近严格鸟阈值,直接证明背景共现可独立触发。
人工:有鸟。完整白色飞鸟反而低分;裁紧后可升到约 0.879。
问题三:把“有鸟”与“拍得好”混在了一起
你的最终系统要先确认鸟存在,再评价眼部、羽毛锐度与姿态。失焦鸟片可以在质量阶段淘汰,却不能在存在阶段被当作负类。
人工:有鸟(连拍上下文确认);严重失焦。作为质量片应低分,但 presence 标签必须为 1。
人工:有鸟;肉眼可见飞鸟,但边缘和羽毛细节不足。当前模型把“模糊”学成了部分无鸟证据。
Presence
画面是否存在鸟;模糊、遮挡、半只鸟仍是正类。输出用于保底召回或启动检测。
Focus / quality
眼部、头部、羽毛是否锐利;需要鸟框与局部 ROI,输出独立质量分。
Pose / aesthetics
关键点可见数量、头向、展翅与构图;应从检测/姿态网络取得空间输入。
标注纪律:像 _DSC6829.JPG 这种仅为棕色虚影、人工也不能确定的样本,应标为 ignore/uncertain,不要硬塞进鸟或非鸟,否则网络会学习审阅者的随机猜测。
问题四:阈值困境与连拍依赖
概率分布有一定排序价值,但低分区不“纯”。把阈值降到足够保鸟时,绝大多数无鸟片也会被保留;把阈值抬高以清除误报时,又会漏掉大量真实鸟片。
四个分数带的真实构成
可用与不可用
可用于高分优先浏览
≥0.693 区间有 98.65% 是鸟,可把它放到候选队列前面。
低分只能进入复核队列
<0.015 仍有 25% 是真实鸟;直接删除会丢掉 11 张已确认鸟片。
不能据此覆盖 Lightroom 低星
当前分数既受主体尺度影响,也受画面位置、背景和清晰度影响。
下一轮训练:先修稳定性,再扩模型
目前最划算的不是立即换更大模型,而是补齐错误分布、修正采样和监督。下面按可以立刻执行、下一版训练、最终架构三个层级推进。
冻结当前版本的用途
只做“高分优先”排序和人工审阅,不自动删除、不覆盖原 Lightroom 评分。保存本批 1,232 张作为域内回归集。
采 hard negative,而非复制
纳入整段红蜻蜓连拍;再拍摄/收集不同颜色、尺度、姿态、枯枝与草地中的蜻蜓、蝴蝶、飞虫。新场景整组只进测试。
强制位置与尺度一致
正负类对称使用全图/裁切/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 池。
与最终“慧眼替代模型”的衔接
短期:分类器作廉价预筛
二分类 V2 只回答有无鸟,保持高召回;多尺度或不确定样本交给下一阶段。
中期:单类 bird detector
用检测框提供主体位置和占比,直接解决全画面小目标稀释,并为眼部/羽毛 ROI 准备坐标。
随后:bird pose 与局部锐度
关键点网络提供眼、喙、翼、尾等坐标;独立质量网络评价眼部和羽毛锐度;姿态 MLP 使用可见点和几何关系。
最后:BioCLIP / OSEA 做鸟种
在检测框内进行鸟种识别;最终评分融合存在、主体占比、锐度、姿态、物种置信度,但各分项保留,便于解释和调权。
证据索引与不确定性
报告中的结论均来自本地批次、模型输出、人工复核和针对性实验;配图由原始 JPG 生成展示副本,已移除 EXIF,不影响原照片。
可复核文件
- predictions.csv:1,232 张逐图概率与预测。
- summary.json:输入目录、模型、预处理、耗时与统计。
- manual_review_summary.md:77 张联系表的逐张人工真值。
- 模型 SHA-256:7cd7a54b…743cbc8。
- 专项实验:固定补边平移、多输入分辨率、Grad-CAM、主体遮挡、原始 ImageNet 权重探针。
解释边界
- 人工真值依赖可见原图与连拍上下文;1 张维持不确定。
- Grad-CAM 是相关性解释,不是因果证明;主体遮挡实验补充了干预证据。
- 不同模型概率未做统一校准,只比较类别排序与相对变化。
- 单日批次受地点、物种、镜头、天气和拍摄习惯影响,不能外推为通用性能。
- 所有建议都应在独立序列测试集上重新验证后再写入 Lightroom。