工程结论:通过
环境、数据构建、MPS 训练、阈值选择、测试、原图推理和权重重加载均已执行。模型与 20 张逐图预测可重算一致。
Experiment review & decision roadmap · 2026-07-20
基于 100 张七月照片和 Apple M5 本机实测,拆解 YOLO26s-cls 的 85% 测试结果、三类失败与统计边界,并给出从多尺度分类到单类检测器和 Lightroom 旁路验证的分阶段路线。
PoC 已经证明 Apple M5 能快速微调和部署 YOLO26s 分类模型。它没有证明 100 张数据能支撑自动删片、星级覆盖或鸟位置输出。
环境、数据构建、MPS 训练、阈值选择、测试、原图推理和权重重加载均已执行。模型与 20 张逐图预测可重算一致。
20 张测试图中每错 1 张就让单类指标变化 10 个百分点。Accuracy 的 95% Wilson 区间为 64.0%–94.8%,远不能支撑自动丢弃照片。
同时出现真鸟 0.136 和无鸟 0.955。单纯降低阈值会找回小鸟,也会快速放大水面、飞虫和自然背景误报。
如果永远只需要有无鸟,先做多尺度分类 v2;如果后面要评估对焦、姿态、鸟种或主体大小,应直接迁移到 YOLO26s Detect 单类 bird。
二分类模型只回答“有没有鸟”,星级通常表示照片质量和选片意图。第一阶段应写入临时关键词、颜色标签或候选集合,在旁路对照中审核漏检,不让模型直接决定删片。
使用的是 yolo26s-cls.pt 整图分类模型,基础权重来自 ImageNet,不是 COCO 检测权重。它每张图只输出一个类别和分数,不产生鸟框。
| 项目 | 实际值 |
|---|---|
| 机器 | MacBook Pro · Apple M5 · 10 核 · 32 GB |
| 训练后端 | PyTorch 2.13.0 · MPS |
| Ultralytics | 8.4.100 锁定实测版本 |
| 基础模型 | yolo26s-cls.pt · ImageNet 预训练 |
| 微调后参数 | 5,445,570(未融合) |
| 最佳权重 | 11,024,386 bytes · 约 10.51 MiB |
| 配置 | 实际值 |
|---|---|
| 输入 / batch | imgsz=320 · batch=8 |
| 优化器 | AdamW · lr0=3e-4 · weight_decay=5e-4 |
| 迁移策略 | freeze=8 · dropout 0.2 |
| 轻增强 | 水平翻转 0.5;HSV 0.005 / 0.15 / 0.15;裁切面积 90%–100% |
| 停止规则 | 请求 25 epoch;patience=7;实际 9 epoch |
| 耗时 | 1 epoch 烟雾测试 4.3 s;正式墙钟 14.6 s |
| 集合 | 鸟 | 无鸟 | 拍摄日期 | 作用 |
|---|---|---|---|---|
| Train | 30 | 30 | 07-03 / 04 / 05 / 06 / 08 | 优化模型参数。 |
| Validation | 10 | 10 | 07-07 | 选阈值和 checkpoint;不报最终精度。 |
| Test | 10 | 10 | 07-09 | 阈值冻结后的一次性评估。 |
源路径、源 SHA-256 与代理图哈希全部唯一且可重算。
没有拍摄日期跨 split;跨集 dHash 距离 ≤ 4 的近重复对为 0。
2026-07-03 至 07-09 当前盘点共 4,001 张;本次 100 张只占 2.5%,其余未进入这次标注。
最有价值的证据是“错在哪里”和“验证分布是否覆盖了测试分布”。本次测试发现了一个明显的验证—测试分布缺口。
| 指标 | 值 | 解读 |
|---|---|---|
| Accuracy | 85.0% | 平衡测试集的总体正确率。 |
| 鸟召回率 | 90.0% | 10 张鸟片漏 1 张。 |
| 无鸟特异度 | 80.0% | 10 张无鸟图误报 2 张。 |
| Precision / F1 | 81.8% / 85.7% | 该 precision 依赖当前 50 / 50 基准率。 |
| ROC-AUC / AP | 0.860 / 0.816 | 样本太少,仅作探索性排序指标。 |
| 数据 | 类别 | min | median | max |
|---|---|---|---|---|
| Validation | bird | 0.605 | 0.778 | 0.985 |
| no_bird | 0.013 | 0.047 | 0.457 | |
| Test | bird | 0.136 | 0.868 | 0.960 |
| no_bird | 0.011 | 0.169 | 0.955 |
验证集在 0.5 两边完全分开,所以阈值 0.5 看起来很稳。测试集出现了两个相反方向的高风险样本,说明 val 没有覆盖真实部署难度。
| 阈值 | Validation · 20 张 | Test · 20 张 | 含义 | ||||
|---|---|---|---|---|---|---|---|
| 召回 | 特异度 | 平衡准确率 | 召回 | 特异度 | 平衡准确率 | ||
| 0.15 | 100% | 80% | 90% | 90% | 50% | 70% | 降阈值未找回那张 0.136 的鸟,却已放大 5 个误报。 |
| 0.25 | 100% | 90% | 95% | 90% | 60% | 75% | 看似更“保守不漏鸟”,但没有解决小鸟且无鸟工作量上升。 |
| 0.50 | 100% | 100% | 100% | 90% | 80% | 85% | 按预先规则从 val 选出;仍需在大型新验证集重新冻结。 |
| 0.75 | 60% | 100% | 80% | 80% | 80% | 80% | 提高阈值不会消除高置信的飞虫和水面误报。 |
这个模型的当前价值是排序和挖样本,不是把 p_bird 解释成“真实概率”。现代神经网络常存在置信度失准,需在足够大且代表部署分布的验证集上做温度缩放或等价校准。
校准方法的一手论文。
这三张图不是“时好时坏”的随机噪声。它们分别揭示了小目标表示、语义假目标和背景捷径问题,对后续数据设计具有直接指导价值。
整幅照片压到 320×320 后,鸟只占少量像素;分类损失只要输出整图类别,没有损失项强迫模型保留鸟的几何位置。
蝴蝶同样具有两侧翼、小主体和自然背景,但训练集缺少足够的昆虫负样本。0.955 的高分说明它不只是阈值边缘样本。
鸟片训练样本中有许多水鸟和绿色水面。模型可能学到“这种水面经常有鸟”,或把反光小块当成远处主体。
| 失败 | 最可能根因 | 第一优先修复 | 不建议 | 验证分片 |
|---|---|---|---|---|
| 远距离小鸟漏检 | 320 输入丢失像素;整图分类没有框监督 | 512 / 640 全图 + 2×2 或 3×3 tiles;并行建立 Detect 基线 | 只把阈值从 0.5 降到 0.1 | tiny bird、阴天、逆光、远空 |
| 蝴蝶误报 | 翼展形态接近;昆虫负样本缺失 | 收集飞虫 / 蝴蝶 / 飞机等高分误报,作 hard negatives | 随机再加大量人像或城市无鸟图 | insect、aircraft、leaf、speck |
| 水面误报 | 背景与鸟标签的偶然共现;反光局部纹理 | 在同地点采“有鸟水面 / 无鸟水面”成对负样本 | 只做更强颜色增强 | water、reflection、grass、branch |
只要新增数据不能直接改善“小鸟、飞虫、水面”中的某一个错误分片,它就不是当前最优先的数据。两轮模型驱动的 hard-negative mining,通常比不加选择地多收几千张更快改变决策边界。
Accuracy、precision 和看起来很高的置信度都依赖数据怎样被选出。当部署中鸟片比例与 50 / 50 测试集不同时,人工要审的误报数会明显变化。
Accuracy 85% 的 95% Wilson 区间是 64.0%–94.8%;鸟召回为 59.6%–98.2%;特异度为 49.0%–94.3%。这些区间宽到无法做上线承诺。
val 和 test 分别只来自一个日期的人工精选子集,不是当日全量目录;07-09 还在早期实验中被看过,不是封存盲测。
日期隔离好于逐图随机切分,但同日仍共享天气、地点、鸟群和背景。单一日期的 20 张图不能表示新地点或新季节。
| 实际鸟片占比 | 真鸟找到 | 鸟片漏掉 | 无鸟判对 | 无鸟误报 | 候选集中真的有鸟 | 解读 |
|---|---|---|---|---|---|---|
| 5% | 45 | 5 | 760 | 190 | 19.1% | 人工审 235 张候选,只有 45 张真鸟。 |
| 10% | 90 | 10 | 720 | 180 | 33.3% | 候选里每 1 张真鸟对应约 2 张误报。 |
| 30% | 270 | 30 | 560 | 140 | 65.9% | 工作量开始接近可用,但仍漏掉 30 张鸟片。 |
| 50% | 450 | 50 | 400 | 100 | 81.8% | 与当前平衡测试集的 precision 一致。 |
这个表不是对 4,001 张库的实际预测,而是说明基准率如何改变人工审核量。类别不平衡时,Precision–Recall 比单看 ROC 更能反映候选集质量,见 Saito & Rehmsmeier, 2015。
本次为了训练方便人工做成了 50 / 50,并不知道一个完整拍摄日、一整库照片或“只导入拍鸟连拍”时的有鸟占比。下一版评估必须保留部署中的自然比例,不能再人为配平。
Ultralytics 官方把 Classify 定义为整图单标签任务;只在不关心对象位置时使用。如果下游需要框内对焦、姿态和鸟种,定位不是附加功能,而是主线监督信号。
| 路线 | 原生输出 | 解决当前哪个错误 | 成本 | 上限与风险 | 决策 |
|---|---|---|---|---|---|
| 当前 YOLO26s-cls | 整图 bird / no_bird | 已证明能学到本地鸟片分布 | 实测 14.6 s / 60 train / 9 epoch | 无位置;小鸟压缩;背景捷径 | 保留为基线 / 挖样器 |
| 多尺度分类 v2 | 全图 + tiles 分数汇总 | 对远鸟和边缘鸟更友好 | 512 的像素量约是 320 的 2.56×;tiles 按块数增加推理 | 只能给粗网格;多 tile 会放大假阳性 | 只需 presence 时的快速 v2 |
| YOLO26s Detect 单类 bird | 0…N 个框 + 置信度 | 保留小鸟位置;为框后质量评分提供 ROI | 3,000 图 / 640 / 50 epoch 本机约 5–10 h | 需标注所有鸟框;小鸟可再用 960 / tiles | 需位置或质量时的推荐主线 |
| Detect + 框后分类器 | 低阈值鸟框 → 二次 bird / no_bird | 对飞虫、树叶、反光做专门复核 | 比单检测器多一个 5M 级轻分类器 | 流水线更复杂,但数据可从误报中自然累积 | 生产精度与可解释性最好 |
先保留当前分类器,将输入升到 512,同时运行全图和 2×2 tiles,用 max / top-k / MIL 汇总。用大量自然无鸟图约束 tile 假阳性。
直接标一类 bird 框微调 YOLO26s Detect。图像级 presence = 至少一个通过阈值的鸟框;每个框再送入清晰度、鸟种和姿态模型。
它们的强项是框后的鸟种语义,不是针对本地长焦照片优化的前端定位。正确组合是“本地 bird detector → 鸟 crop → OSEA / BioCLIP”。
Ultralytics 官方文档特别提醒,分类任务默认的 RandomResizedCrop / CenterCrop 可能把极端宽高比图像的关键区域裁掉。本 PoC 通过先补边到方形保留了验证/推理的整图,训练时仍使用 90%–100% 面积的轻微随机裁切。边缘半鸟仍需单独压力测试。 Ultralytics Classify 文档。
现有 4,001 张 JPG 中,只有 100 张进入本次真值集。下一步不应随机继续抽 100 张,而应让当前模型帮助找出最能改变边界的样本。
在未标注照片中找 p_bird 最高但人工确认无鸟的图,重点标注飞虫、飞机、树叶、反光、石块和小黑点。
找人工或旧标签确认有鸟,但模型给低分的图:远鸟、阴天、逆光、半鸟、模糊鸟和多鸟。
在 0.3–0.7 附近抽样,同时强制加入新天气、新背景和新日期,避免所有新数据都来自模型已经熟悉的局部分布。
| 数据层 | 建议规模 | 标注 | 用途 | 人工优先级 |
|---|---|---|---|---|
| 封存部署测试集 | 800–1,000 张 | 按自然基准率逐图 presence;不使用模型提示 | 最终阈值和上线决策;必须按新日期/地点隔离 | P0 |
| presence v2 训练集 | 2,000–3,000 张 | bird / no_bird / ignore;困难负样本过采样 | 320 / 512 / tiles 分类受控对比 | P0 |
| bird detector 框 | 2,000–3,000 张正图 + 1,000–2,000 空图 | 有鸟图必须标全所有可见鸟;空图明确无鸟 | YOLO26s Detect 640 基线和 960 小鸟对照 | P0(需位置时) |
| 质量失败标签 | 800–1,500 张 | defocus / motion blur / occlusion / truncated / low-resolution 分开 | 后续对焦和连拍排序模型 | P1 |
| Open Images 补充 | 各 5k–15k 抽样 | 仅使用 human-verified Bird 正/负和完整框 | 扩背景和明确负样本;本地数据仍是决策域 | P2 |
至少有一只可辨认鸟(即使虚焦 / 半鸟) → bird_present = 1 全分辨率确认没有鸟 → bird_present = 0 只有极小黑点,人也无法确认 → ignore 同一连拍 / 原图 / 增强版本 → 必须在同一 split
“拍坏的鸟片”同时是 bird_present=1 和 quality_failed=1,绝不能因为虚焦就改成 no_bird。
它的图像级标签区分人工确认的正标签、负标签和未标注类别;只有明确 Bird-negative 才能作可信 no_bird。官方也明确说明这些负标签可用于 hard-negative mining。 Open Images V7 官方说明。
路线的目标不是尽快拿到一个更高的 Accuracy,而是用固定测试集回答:我们是缺数据、缺分辨率、缺定位监督,还是真的缺模型容量。
冻结 bird / no_bird / ignore 规则;从不参与训练与挖样的新日期/新地点保留 800–1,000 张。按完整拍摄日自然分布抽取,不再人工配成 50 / 50。
利用当前模型跑现有未入选图,做第一轮高分无鸟 / 低分真鸟标注。在完全相同的 test 上比 320 全图、512 全图和全图 + 2×2 tiles;不同时改三个变量。
如果 P1 仍在小鸟 / 边缘鸟分片达不到门槛,标 2,000–3,000 张有鸟图的全部鸟框,并加 1,000–2,000 张空图。先跑 YOLO26s Detect 640,再只对小鸟分片试 960 / tiles。
将检测框外扩 10%–20%,对鸟头/鸟体计算对焦、运动模糊、姿态和构图;物种识别再交给 OSEA / BioCLIP。连拍优先做组内排序,不急于给不相关照片一个绝对分。
先只写临时关键词 / 集合,记录人工改判。通过两个完整新批次后,再决定是否映射到颜色标签或星级。任何“自动删片”都必须使用更高的召回验收门槛。
| 工作 | 规模 | 当前 M5 计算时间 | 人工时间 | 最大不确定性 |
|---|---|---|---|---|
| presence v2 · 320 | 2,000–3,000 图 · 20–30 epoch | 约 0.5–1.5 h | 逐图标签约 4–8 h,含可疑黑点复核 | 数据解码、冻结层数、早停 |
| presence v2 · 512 | 同上 | 约 1–3 h | 不增加基础标签 | 像素量 2.56×,batch 可能下降 |
| 全图 + 2×2 tiles | 每图 5 个视图 | 约 2–6 h | 需额外审核 tile 误报 | 分数汇总规则和误报放大 |
| YOLO26s Detect · 640 | 3,000 图 · 50 epoch | 约 5–10 h | 2,000 图全框约 8–25 h | 每图鸟数、框标速度、MPS 热状态 |
| YOLO26s Detect · 960 精修 | 10–20 epoch | 额外约 5–14 h | 复用框标 | batch 下降与小鸟是否真受益 |
分类估算由当前 60 张训练图、9 epoch、320 的 14.6 s 实测按图片数、epoch 和像素量放大,再加固定开销与余量。检测估算来自当前 M5 的已有图像训练基准外推。一次 100–200 张 smoke test 应先于任何全量训练。
验收指标应围绕用户实际损失设计:漏掉一张好鸟片的代价,通常高于多看几张误报。因此筛片模式优先鸟召回,评分模式才追求更精细的排名。
至少 1,000 张自然分布照片,其中建议至少 300 张鸟片;日期、地点、连拍组与训练隔离。
建议探索目标:总鸟召回 ≥98%;tiny / blur / edge 各分片 ≥95%;无鸟误报率 ≤5%–10%。最终值应根据人工审核容量和漏片损失确定。
除总体 recall / specificity / PR-AUC 外,单独报小鸟、真实失焦、运动模糊、边缘半鸟、多鸟、水面、飞虫和树枝。
根据“最大允许漏检”选阈值,然后冻结。测试集只用于一次性报告,不凭测试错误反调到最佳数字。
p_bird 用大型验证集画校准曲线;星级另用对焦、运动模糊、姿态、主体大小和连拍排序训练,不把“有鸟概率”直接写成质量星级。
让 AI 结果与人工选片并排,记录所有漏检和高分误报。只有新拍摄批次也通过,才将写回从临时关键词升级到颜色标签或星级。
原始照片 → 低阈值 bird detector(优先召回) → 候选鸟框复核器(压飞虫 / 反光 / 树叶) → 框内对焦 / 运动模糊 / 姿态 / 主体占比 → 框内 OSEA / BioCLIP 鸟种语义 → 连拍组内排序 → Lightroom 临时集合,人工验证后再写星级
官方模型表和任务边界取自 2026-07-20 查阅的一手文档;耗时、数据和结果取自本地完整执行产物。估算与测量在正文中已分开标记。
旧 HTML 是面向学习和复现的已执行 Notebook;新版是面向项目决策的独立复盘,对相同实验增加了分布迁移、基准率、失败机制、数据投资、架构分叉和验收门槛。Stillframe 线上目录查询未找到同题报告,所以新版具有独立价值。