A7R6 对焦分类器

Model audit & extension plan · 2026-08-19

这台清晰度小模型究竟学了什么,以及怎样让它真正“看眼睛”

当前最终方案是一台 YOLO26n-cls 两类 patch 分类器:它不找鸟、不分割鸟,也不能接受文字提示;它对 SAM 鸟体内选出的六块 224×224 原生像素区域分别判断 clear / not_clear,再取清晰概率均值。CUB 与 NABirds 关键点最直接的价值,是把“随机找高梯度区域”升级为“明确看眼、头、翼与身体”,同时为 SAM 2.1 提供更可靠的正点。

本地语料 1,838 张鸟体输入 3×224×224 RGBSAM 2.1 + 原生像素 patch证据日期 2026-08-19
1.53M本地实测参数量;最终二分类权重 3.19 MB / 3.04 MiB
13,680v12 数据集 patch 数;来自 644 张不重复本地鸟体
97.90%v12 验证集 1,284 patch 的 top-1;并非独立未来日期指标
0 / 368当前语料 P80–P100 全审计中判定为失焦的图片数
Executive decision

先给结论:关键点有用,但不需要先重做模型

关键点不会自动让二分类器变聪明。它必须进入取样、SAM 提示、评分汇总或训练损失,才会真正改变系统关注的位置。最稳妥的第一步是保留现有权重,先改 patch 位置和权重。

01

它是分类器,不是检测器

最终模型只有 YOLO26n 分类 backbone 和官方 Classify 头,没有检测 neck,也没有 bbox、mask 或关键点输出。两类 softmax 只回答一个 224 像素 patch 更像“清晰”还是“不清晰”。

02

关键点同时帮助两处

眼、喙、胸、背、翼、尾等高置信点可作为 SAM 2.1 前景点,枝叶作为背景点;同一批点又可定义清晰度 patch 和部位权重。一次关键点预测服务分割与质量评分两条支线。

03

“提示”应当是空间监督

当前网络不是视觉语言模型,不能靠一句“更关注眼睛”。应当用眼部中心裁切、显式权重、可见性门控,以及后续眼部样本的过采样 / 损失加权来表达偏好。

最重要的边界:

当前 125 张真实困难负样本来自对同一 1,838 张语料反复审计,并全部进入训练;“P80–P100 无失焦”因此是当前语料上的主动学习验收,不是独立测试集上的泛化证明。下一批拍摄日期必须整组留出,模型、阈值和权重冻结后再测。

官方资料本地实测建议起点风险与边界
Chapter 01

当前完整推理链路

模型本身只做最后一格。前面的 16-bit 解码、曝光中性化、SAM 掩模、中心选择和灰底合成共同决定它看见什么;其中任何一步偏离训练分布,都可能比换一个更大网络影响更大。

Step 116-bit 鸟框从 ARW 处理链读取线性 RGB TIFF;当前实验不是直接读取普通 8-bit JPEG。
Step 2稳健曝光中性化按 SAM 掩模内每个 RGB 通道的 P1–P99 分别映射到 0–1。
Step 3SAM 2.1 掩模当前数据由单个主体正点起步,并在重叠差时追加先验框重试。
Step 4选 6 个中心掩模内部的去噪 Scharr 梯度能量排序,中心间抑制约 74 px。
Step 5224 原生 patch固定 224×224 像素直接截取;越界反射填充,不把鸟缩放到统一大小。
Step 6软掩模灰底mask 以 σ=2 羽化,鸟体外合成到 0.5 中性灰,降低背景与硬边捷径。
Step 7概率均值六个 patch 得到 P(clear),最终 scoreMean 为算术平均。
曝光中性化(对每个颜色通道 c,统计范围仅限 SAM 掩模 M):
L_c = Q_0.01(I_c | M)             H_c = Q_0.99(I_c | M)
I'_c(x) = clip((I_c(x) - L_c) / max(H_c - L_c, ε), 0, 1)

当前 patch 与整图得分:
s_k = Pθ(clear | patch_k),  k = 1…6
S_body = (1 / 6) · Σ s_k
为什么是原生像素 patch?

清晰度依赖传感器像素层面的边缘扩散。固定 224 像素窗口避免先把不同大小鸟统一放大,再让插值模糊与真实离焦混在一起。小鸟不会被人工“放大得更糊”,但眼睛可能根本没有足够像素可评估,这应另报为 not_assessable

迁移到 1616×1080 PreviewImage。

流程可以沿用,但 PreviewImage 的锐化、降噪、色调曲线与 JPEG 编码不同于当前 16-bit TIFF。应先冻结模型,在新日期 PreviewImage 上做校准;若排序漂移,再用少量同域 patch 微调,不能直接把现有指标照搬。

Chapter 02

模型结构:backbone + 分类头,没有 neck

本地加载最终 best.pt 得到 1,533,666 参数。前 10 个模块提取 7×7×256 特征;最后一个官方分类头把特征投影到 1,280 维、全局平均池化,再输出两个 logits。

输入

3×224×224 RGB

8-bit sRGB PNG / 推理数组。SAM mask 不作为第四通道;它只参与 patch 选择与灰底合成。

YOLO26n 分类 backbone · 1,200,864 参数

Conv s23→16 · 112×112
Conv s2 + C3k216→32→64 · 56×56
Conv s2 + C3k264→128 · 28×28
Conv s2 + C3k2128→128 · 14×14
Conv s2 + C3k2128→256 · 7×7
C2PSA256 通道局部注意力 · 7×7

官方 Classify 头 · 332,802 参数

Conv 1×1: 256→1280

AdaptiveAvgPool → 1×1

Dropout(p=0.15)

Linear: 1280→2

输出 clearnot_clear 的 softmax 概率。

问题当前事实含义
是检测器继续训练的吗?不是。起点是 ImageNet 预训练的 yolo26n-cls.pt没有沿用鸟框 detector 的检测 head、neck 或 bbox 能力。
哪些权重被更新?freeze=0,分类 backbone 与新两类头全部参与优化。不是只训最后一层;最终表征已经被本地清晰度任务整体改写。
换了自定义 CORAL / CORN 头吗?没有。仍是 Ultralytics 官方两类 Classify 头。当前输出不是有序等级,只是二类概率;若以后做 4 级清晰度才考虑有序回归。
为什么官方 n-cls 约 2.8M,而这里 1.53M?ImageNet 原权重有 1,000 类;本地头改为 2 类,线性层与类别相关参数大幅减少。权重文件从原分类模型缩到 3.19 MB,适合本地批量推理。
最准确的一句话描述:

这不是“四通道 YOLO 清晰度网络”,也不是“检测器换头”;它是一台在 SAM 鸟体原生像素 patch 上全量微调的三通道 YOLO26n 图像分类器。

Chapter 03

v12 数据集如何组成

最终 manifest 记录 13,680 个无损 PNG patch,来自 644 张不重复鸟体;同一张图可以同时提供“原始参考”和“合成模糊”两种训练角色,因此角色数之和为 660。

来源角色源图数patch 数标签如何产生主要风险
人工接受的清晰候选3554,260clear从前一轮 P80–P100 审计带中排除失败样本后等分位抽取;每图 6 中心×2 独立色调/噪声变体。不是逐部位清晰度标注;眼部可能不可见或像素不足。
同源合成模糊3554,260not_clear与清晰 patch 同中心;一版轻模糊、一版重模糊,随机 Gaussian 或 motion kernel。合成 PSF 不能覆盖所有真实离焦、抖动与主体运动。
人工困难负样本1253,000not_clear多轮 P80–P100 全审计发现的真实失焦 / 噪声冒充细节;每图 6 中心×4 变体,全部送入训练。没有独立 hard-negative 验证;同语料主动学习会抬高验收表现。
低分伪负样本1802,160not_clear从前一轮得分底部 30% 等分位抽取;每图 6 中心×2 变体。未逐张人工确认,可能混入低曝光但真实有细节的样本。

训练 / 验证数量

Splitclearnot_clear合计
train3,7928,60412,396
val4688161,284
total4,2609,42013,680

防止网络学错捷径

  • 模糊先作用于 RGB,随后再与同一个羽化 mask 合成,避免用 mask 边界锐度区分类别。
  • 曝光 gamma、gain、offset、RGB 通道增益和亮 / 色噪声与标签独立采样,避免“噪声大 = 清晰”。
  • 背景固定为 0.5 中性灰,减少树枝、天空、叶片背景与标签的偶然关联。
  • 同一原图的清晰与合成模糊保持在同一 split;普通样本按约 20 张编号组拆分,降低连拍泄漏。
仍然存在的数据口径问题。

125 张人工困难负样本为了让下一轮立即纠错,被强制全部放入 train;所以 97.90% 验证集主要检验“接受清晰候选 vs 合成模糊 / 低分伪负样本”,没有测到一批从未参与主动学习的真实困难负样本。报告保留这一缺口,不能用 patch 验证准确率替代未来拍摄验收。

Chapter 04

训练方法与主动学习闭环

最终 v12 不是一次训练得到。它从 ImageNet 分类权重起步,在本地二类任务上全量微调,再用每轮顶部误判作为下一轮困难负样本;v12 本身从 v11 最佳权重继续 8 epoch。

01

初始化

官方 yolo26n-cls.pt 含 1,000 个 ImageNet 类。本地训练自动把头映射为 clear / not_clear,同时保留卷积与 C2PSA 的预训练视觉特征。

02

全量微调

freeze=0,AdamW、batch 64、224 px、MPS、关闭 AMP;色相 / 饱和度 / 亮度增强由离线生成器负责,训练器只保留水平翻转。

03

错误驱动更新

每轮按新分数重排 1,838 张,人工审查顶部 20%;把“噪声高但失焦”的样本加入下一轮负类。候选方法和训练集同时演进,所以失败数不要求单调。

v12 配置为什么
输入 / epoch / batch224 / 8 / 64保持原生像素窗口;v12 是低学习率校准轮,不是从头训练。
优化器AdamW初始学习率 1×10⁻⁴,余弦衰减到 8%,weight decay 5×10⁻⁴。
正则dropout=0.15分类头池化后随机失活;水平翻转 0.5,禁用自动增强和随机擦除。
稳定性seed=260819,deterministic训练和数据生成均记录随机种子;AMP 关闭,减少 MPS 数值差异。
耗时344.442 s约 5 分 44 秒;这是 v12 单轮,不含前序主动学习和人工审计。
顶部审计节点当轮 P80–P100 失焦数解释
m7937早期神经 patch 方案仍被曝光拉高后的噪声欺骗。
m115 → m11736 → 10引入真实困难负样本后显著下降。
m12713聚合和候选变化导致局部回退,说明失败数不是训练 loss。
m150 → m1555 → 4继续补充顶部 hard negatives。
m156 → m161 → m16613 → 7 → 3扩展审计和再校准,逐步收敛到最终训练集。
m171 / v12 mean0 / 368当前 1,838 张语料的最终全量顶部验收。
为什么最终用六块均值?

Top2Mean 容易被少数高噪声 patch 劫持,Min 又会被遮挡或无纹理 patch 过度拉低。均值在当前语料上最好地平衡了局部清晰和局部失败;引入关键点后,可以用部位权重替代匿名均值,而不必先更换分类器。

Chapter 05

指标证据与该怎样解读

验证集混淆矩阵是 patch 级证据;顶部全审计是当前图片级证据。两者回答的问题不同,且都不能代替跨日期、跨场景的冻结测试集。

v12 八个训练 epoch 的训练损失、验证损失和 top-1 曲线
本地实测 · v12 八个 epoch。训练 loss 持续下降,验证 top-1 在 97%–98% 附近波动;最佳记录 97.897%。
v12 验证集 clear 与 not_clear 的混淆矩阵
本地实测 · 验证 1,284 patch:clear 正确 446 / 468,not_clear 正确 811 / 816,总计 1,257 / 1,284。

Clear 召回

95.30%

446 / 468。仍有 22 个清晰 patch 被判为不清晰;这比“放过失焦”更偏保守。

Not-clear 召回

99.39%

811 / 816。这里大部分负类是合成模糊或伪负样本,不等于真实失焦召回。

当前语料吞吐

10.60 图/s

1,838 图、每图 6 patch 共 173.406 秒,约 63.6 patch/s;包含预处理和 MPS 分类。

强证据与弱证据分开。

125 张已知失焦困难样本在 v12 均值排序中最高只到 P51.74,这是对当前已知错误的强回归证据;但它们已经参与训练。真正能证明泛化的证据,应是另一日期、另一场景、整段连拍都未进入任何一轮训练 / 阈值选择的冻结集。

Chapter 06

CUB 与鸟类关键点能带来什么

关键点训练与清晰度训练是两个任务。公开数据先教模型“眼、喙、翼在哪里”;本地清晰 / 模糊监督再教它“这些部位是否对上焦”。不能把 CUB 全部图片直接当作清晰正样本。

数据源公开标注对本项目的用途限制
CUB-200-201111,788 图、200 类;每图 15 部位点、312 属性、1 个框;官网另提供 segmentation。第一版鸟类 pose / 部位定位;可同时评估关键点辅助 SAM 是否改善 mask。策展照片偏清晰;与 ImageNet 预训练存在图片重叠警告;非商业研究 / 教育用途。
NABirds V148,562 图、555 类;部位标注、框与专家校验类别。扩大物种、姿态、性别与年龄外观变化;比 CUB 更适合做关键点泛化。非商业研究条款;不得公开再分发原图,训练前需接受并遵守数据协议。
Animal Parts15K 图、100 个脊椎动物类;眼和足关键点 + bbox。补充跨物种眼 / 足定位先验,尤其适合“眼睛优先”预训练对照。不是鸟类专集,部位集合很少;图像来自 ILSVRC,需单独取得原图。
Penn Aviary15 只群居鸟的多视角关键点与 mask。遮挡、群鸟、视频一致性与关键点—mask 联合研究。圈养、多视角、少个体,与野外 A7R6 长焦照片域差明显。

对 SAM 2.1 的直接帮助

  • 当前预处理主要用一个“先验 mask 最深内部点”作为正点;鸟体被枝叶切开时,一个点可能只选中身体一部分。
  • 高置信眼 / 喙 / 胸 / 背 / 翼 / 尾可提供 2–5 个分散的前景点,告诉 SAM 这些可见区域属于同一只鸟。
  • 枝条、叶片、水花等遮挡物上给背景点;官方接口中 label=1 为前景、label=0 为背景。
  • 只使用可见且高置信的关键点。遮住的翼或脚不应作为正点,否则会要求模型“猜”不可见区域。

对清晰度分类器的直接帮助

  • 把当前“梯度最高的匿名位置”换成语义明确的眼、头、翼和身体中心,减少选到噪声、mask 边界或细枝。
  • 同一台二分类器可分别输出 s_eyes_heads_wings_body,先显式加权,不需要改第一层通道。
  • 关键点置信度提供可见性门控:眼睛太小、遮挡或未检出时,不把“无法评估”误写成“失焦”。
  • 后续人工只需复核部位级困难样本,能更准确地收集“眼清晰、翼模糊”或“身体清晰、眼失焦”的训练对。
CUB 还有一份现成 segmentation 下载。

这对训练 / 评估鸟体分割很有价值,但它不等于你的 A7R6 枝叶遮挡域。建议把 CUB mask 用作预训练或离线评估,再从本地照片中人工修正一小批复杂遮挡 mask 作为最终门槛;否则 SAM 在干净策展图上的提升可能无法迁移。

Chapter 07

怎样告诉系统“眼睛最重要”

这里有三种强度递增的办法。建议从第一级开始:它只改变取样与汇总,最快验证业务偏好;只有确实优于六块均值后,再投入部位标签和新结构。

A

不重训:关键点定点 + 显式权重

在主眼、头、可见翼、身体和尾部各截取一个 224×224 原生 patch,仍用 v12 输出清晰概率。按摄影偏好手工设权重,并对不可见部位归一化。

立即可做最小风险

B

轻微调:部位采样与损失加权

用关键点自动生成部位 patch;训练 batch 中让眼 / 头占 50%–60%,对真实眼部失焦样本提高 loss 权重,同时保留身体样本,避免模型只会看黑白眼缘。

需要本地标签

C

后续结构:共享 backbone 的多部位头

同一 backbone 编码多个 ROI,分别输出眼、头、翼、身体清晰度与可评估性,再由可学习或固定规则汇总。可解释性更强,但不应作为第一版。

中长期

推荐的第一版部位加权(i 表示部位,v_i 为可见性 / 关键点置信度门控):
S_focus = Σ_i (w_i · v_i · s_i) / Σ_i (w_i · v_i)

建议起始权重:
w_eye = 0.50   w_head/bill = 0.20   w_wing = 0.15   w_body = 0.10   w_tail/feet = 0.05

眼部规则:
s_eye = max(s_left_eye, s_right_eye)  # 仅在对应眼可见且达到最小原生像素支持时参与
v_i = 0                              # 遮挡、低置信、像素不足:标记 not_assessable,不当作模糊

可选训练目标(有部位标签后):
L = L_image(S_focus, y_image)
  + λ_part · Σ_i w_i v_i BCE(s_i, y_i)
  + λ_rank · max(0, margin - s_original + s_synthetic_blur)
为什么不把关键点画在图上再喂给网络?

彩色圆点会成为非常强的人造纹理,网络可能学会点的形状和位置。更稳妥的是让关键点控制裁切中心与权重;若以后确实要让网络显式感知部位类型,应在池化后的特征上加入 part embedding,或增加平滑热图通道并重新训练,而不是在 RGB 上画点。

小鸟与固定输入尺寸。

关键点模型为了定位可以把鸟框缩放到 640;清晰度模型不能沿用这个放大图。它应回到 1616×1080 PreviewImage 原坐标,在关键点处截取固定 224 原生像素。若眼睛只有极少像素,就报告“眼部不可评估”并退回身体得分,不能把插值后的模糊当成真实失焦。

关键点如何具体提示 SAM 2.1
# 示意:一只鸟一次调用;坐标均映射回原始 PreviewImage
positive = [primary_eye, bill_or_crown, breast_or_back, visible_wing]
negative = [branch_point, leaf_point]  # 仅在确认属于遮挡物时加入

results = sam(
    image,
    points=[positive + negative],
    labels=[[1] * len(positive) + [0] * len(negative)],
    bboxes=[bird_bbox_xyxy],
)

正点的目标是覆盖同一可见鸟体的不同区域,负点用于排除框内遮挡物。点越多不保证越好:错误关键点会强迫 SAM 纳入错误区域,因此应先按关键点置信度、是否落在鸟框内、与初始 mask 的一致性做门控。

Implementation roadmap

推荐的五阶段扩展路线

先让每一步有独立验收指标。不要同时更换关键点模型、SAM 提示、清晰度结构和数据口径,否则即使排序变好,也无法知道是哪一步起作用。

1

统一关键点协议并训练 pose 基线

以 CUB 的 15 部位为主表,兼容 NABirds 的部位集合;保存 x, y, visible, confidence。先用 YOLO26n/s-pose 在公开数据预训练,再用 500–1,000 张本地鸟框裁切微调。定位模型可以对鸟框 resize;清晰度 patch 不可以。

2

只改 SAM 提示,量化 mask 改善

对同一批本地复杂枝叶样本比较“单正点”与“bbox + 2–5 正点 + 可选负点”。报告 mask IoU、边界 F-score、遮挡物误纳率和漏掉翼 / 尾的比例;无改善就不进入清晰度链路。

3

冻结 v12,只改部位取样与权重

在新日期完整照片上同时跑匿名六块均值与眼部优先公式。按连拍组比较“主眼清晰帧是否更靠前”、顶部 20% 失焦数和人工选片一致率。这一步不训练,能单独证明关键点取样的价值。

4

建立本地部位清晰度小集再微调

优先标模型分歧大的眼 / 头 patch,而不是随机标全部照片。每个连拍组给出相对排序,额外标 not_assessable、离焦、运动模糊;原图、合成模糊与同连拍必须留在同一 split。

5

冻结下一日期作为最终测试

模型、关键点阈值、部位权重和 SAM 选择规则全部冻结后再打开测试日期。按鸟框面积 / 眼部像素支持、曝光、ISO、遮挡、飞行 / 停栖分片;顶部审计必须覆盖全部图片,而不是只看 20 张分位样本。

模块首要指标必须分片通过后才做什么
鸟类关键点按鸟框归一化的 PCK;眼 / 喙单独报告侧身、正面、飞行、遮挡、小鸟把高置信点送入 SAM 和 patch 取样。
SAM 2.1mask IoU、boundary F-score、遮挡物误纳率树枝穿体、叶片遮挡、翼尖 / 尾羽替换当前单正点掩模。
眼部优先评分连拍组排序一致率、P80–P100 失焦数眼可见 / 不可见、眼像素支持、身体清晰但眼虚决定是否微调 v12。
未来清晰度模型跨日期真实测试、校准误差、部位可评估性PreviewImage 域、不同 ISO / 曝光、不同物种再考虑多部位头或有序清晰度等级。
最终建议。

先训练独立的鸟类关键点模型,但不要把它和清晰度网络绑在一起训练。第一版让关键点只承担两件事:为 SAM 2.1 生成更可靠的几何提示,以及在原始 PreviewImage 坐标上确定眼 / 头 / 翼 / 身体 patch。现有 v12 二分类器保持不变,用显式权重完成“眼睛优先”。只有新日期对照实验确认提升后,才用本地部位清晰度数据微调或扩展多部位头。

Evidence & provenance

来源与审计范围

模型结构、参数、样本数、训练配置、混淆矩阵、推理耗时和当前语料审计来自 2026-08-19 本地权重与 manifest;公开数据与接口能力来自官方资料。建议权重为方案起点,不是已验证最优值。

官方资料

  1. Ultralytics · YOLO Image Classification:分类任务、ImageNet 预训练、224 输入与输出概率。
  2. Ultralytics · Pose Estimation:关键点坐标、可见性、自定义 pose 训练与输出。
  3. Ultralytics · SAM 2:SAM 2.1 的 bbox、正点与负点提示。
  4. Meta Research · SAM 2 官方仓库:可提示分割模型与实现。
  5. Caltech · CUB-200-2011:11,788 图、15 部位、属性、框、segmentation 与许可提示。
  6. Visipedia datasets:CUB 与 NABirds 的部位标注说明。
  7. Cornell Lab · NABirds V1使用条款
  8. Oxford VGG · Animal Parts
  9. ECCV · 3D Bird Reconstruction / Penn Aviary

本地证据

  • best.pt:最终 v12 权重,加载后本地核算 1,533,666 参数。
  • args.yamlresults.csvtraining-summary.json:v12 训练参数、8 epoch 指标与 344.442 秒耗时。
  • v12 dataset manifest.json:644 张不重复源图、13,680 patch、类别与 split 构成。
  • v12 score JSON:1,838 图、每图 6 patch、173.406 秒与各种聚合分数。
  • m171 manual audit:P80–P100 共 368 图全量复核,当前记录 0 个失焦失败。
  • 前序报告:175 种方法与噪声鲁棒最终方案。本报告不重复排行榜,专门解释最终模型和关键点扩展。
发布边界。

报告未嵌入 CUB、NABirds 或本地鸟图,只引用公开页面和本地汇总图。数据集许可说明仅用于工程筛选,不构成法律意见;下载、训练、衍生数据分发和未来商业用途应重新核对当期条款。