# CLS 07 · 检测几何、匹配与评价 按问题继续 坐标、锚框偏移、训练/评价匹配、NMS/AP和真实检测训练连接 对应课堂(11 页) 可先阅读已有结果,再决定是否运行。重算时请核对各节记录的数据、参数、环境与日期。 **学习路径:** [一张图怎样变成一组框](/course/study/image-detection.html) 本册是检测单元的公式与结果解释,连接 [P27–35](/course/pages/l3-r2-p27.html) 和 [LAB 10 的图像到框训练](https://deepnote.com/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/a14237bfa9dd413d959ab4e458e11f42)。先按自己的问题读一段,不必在运行模型前读完全部。 - 框如何表示和修正:[四偏移往返](/course/blocks/box-offset-roundtrip.html)。 - 谁提供训练目标:[正例、背景与忽略项](/course/blocks/anchor-training-assignment.html)。 - 重复框如何影响结果:[NMS 与评价匹配](/course/blocks/nms-versus-matching.html)。 读完后选一个预测,指出它被判错是因为重复、定位不足还是背景,并写明阈值和匹配协议。要亲手改坐标/分数,到附属工作台 [LAB 09](https://deepnote.com/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/90d213b4e1e04c7e889ee6fc042b2358);要理解模型在何处出错,回到 [检测学习证据](/course/blocks/detector-learning-evidence.html)。 “这张图有杯子”可以由一个整图类别分数回答;“两只杯子分别在哪里”需要对象数、类别和位置。分类器即便准确,也没有被要求把分数分配给具体区域。全局平均池化还可能把左右位置汇总掉。检测因此要改变输出参数化、训练目标和评价协议,而不是给分类结果补画一个框。 ## 四个数怎样指向图像里的同一区域 轴对齐框可表示为 $(x_{\min},y_{\min},x_{\max},y_{\max})$,也可表示为中心与宽高 $(c_x,c_y,w,h)$。本册用连续边界、右下边界不额外加 1 的约定,并把坐标除以图像宽高归一化到 $[0,1]$。这与“像素编号含两端”的面积算法不同,混用会让小框 IoU 尤其失真。 真值 $G=(0.2,0.2,0.6,0.6)$,预测 $P=(0.3,0.2,0.7,0.6)$。二者面积都为 0.16,交集宽 0.3、高 0.4,面积 0.12;并集为 $0.16+0.16-0.12=0.20$,所以 $\mathrm{IoU}(P,G)=\frac{|P\cap G|}{|P\cup G|}=0.6.$ IoU 对同时缩放两框不变,却对相对位移敏感。把同样 0.1 的横移施加到宽 0.2 的小框,重叠比例会比宽 0.4 的框更差。检测中“小目标难”有一部分来自几何尺度,不能只归因于类别识别。 ![框重叠的精确几何与检测排序](/course/repair/assets/cls08-box-ap.svg) 左图以相同坐标比例展示 IoU=0.6;右表是一类、两个真值对象的排序算例,第二个预测虽也盖住对象,却因重复而算假阳性。 ## 锚框先给坐标一个起点,匹配再赋予训练身份 锚框是预设位置、尺度和长宽比的参考框,不是模型已经检测出的结果。输出头为每个锚框预测类别或 objectness,以及相对坐标改变量。一种不加额外尺度系数的参数化是 $t_x=(c_x^g-c_x^a)/w^a,\quad t_y=(c_y^g-c_y^a)/h^a,\quad t_w=\log(w^g/w^a),\quad t_h=\log(h^g/h^a).$ 锚框中心 $(0.4,0.4)$、宽高均为 0.4,真值中心移到 $(0.45,0.4)$ 且大小不变,目标就是 $(0.125,0,0,0)$。解码时用 $c_x^p=c_x^a+w^at_x$、$w^p=w^a\exp(t_w)$ 等逆运算。具体实现可能乘 10、5 等尺度因子,例如 D2L 的一套约定;编码和解码必须成对,不可只复制一边公式。 训练时要把锚框分配为正例、负例或忽略项。常见方案先保障每个真值有匹配,再按 IoU 阈值增加正例,把远离真值的锚框设为背景,中间区域可忽略。两阈值的具体值是协议选择,不是 IoU 的定义。位置回归只对正例计损失;背景没有“应该回归到哪里”的真值。若一幅图没有对象,仍应通过负例分类损失学会不报框,回归项则安全地归零,避免除以零。 写成 $L=L_{cls}+\lambda L_{box}$ 仍不够:两个分母怎样归一化、负例是否筛选、ignore 如何 mask,都决定了优化问题。大量背景锚框可能淹没少数正例;hard-negative mining 和 focal loss 是改变贡献权重的不同办法。学生可以沿 [D2L §14.4 锚框分配/偏移](https://d2l.ai/chapter_computer-vision/anchor.html) 与 [§14.7 TinySSD](https://d2l.ai/chapter_computer-vision/ssd.html) 核对输出张量、分类标签和回归 mask。 [此段独立阅读](/course/notebook-blocks/9264aa76ab44410a94ba0c31731e50ef.html) ## NMS 与评价匹配解决两个不同的重复问题 Non-maximum suppression(NMS)是推理后处理:通常按类把预测框按分数排序,保留最高分框,删除与之重叠超过阈值的其他框,再继续。它减少同一对象的重复报告,但不知道真值;挤在一起的不同对象也可能被误删。NMS 阈值影响交付的结果,不能在测试集上追着最好 AP 挑阈值。 评价匹配则拿最终预测与真值比较。在固定类别和 IoU 阈值下,按置信度从高到低,每个预测至多匹配一个尚未被使用的真值;同一真值只能被命中一次。于是“框覆盖了对象”还不保证是真阳性,它可能是已有更高分预测的重复框。 设共有两个真值,四个预测排序后的身份依次为 TP、FP(重复)、FP(背景)、TP。累计 precision 为 $1,1/2,1/3,1/2$,recall 为 $1/2,1/2,1/2,1$。若采用本册的全点插值 precision envelope 与 recall 增量积分,AP 为 $0.5\times1+0.5\times0.5=0.75$。这是明确定义的简化 AP;COCO 的 101 个 recall 阈值采样、多个 IoU 阈值平均和面积分组是更具体的另一套协议,不能把一个数未经说明叫“COCO AP”。 [LAB 09](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/90d213b4e1e04c7e889ee6fc042b2358?utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_content=90d213b4e1e04c7e889ee6fc042b2358&utm_term=get_notebook) 可改重复框分数,观察排序如何改变 AP;也可改 IoU 阈值,使一个原先合格的框失去匹配。准确率把大量背景当作普通样本时可能很高,却无法体现检测的定位与重复问题。 ## 沿一次真实训练追踪从图像到框 [LAB 10](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/a14237bfa9dd413d959ab4e458e11f42?utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_content=a14237bfa9dd413d959ab4e458e11f42&utm_term=get_notebook) 的主实验应按以下对象检查:RGB 图像和类别/框标注进入数据集,卷积骨干产生空间特征,输出头产生类别与偏移,匹配提供监督,损失更新参数,解码及 NMS 产生最终框,最后仅用保留图像评价。真值坐标只用于目标与评价,不能作为图像模型的输入特征。 主实验已在 2026-09-22 本地 CPU 完整运行。输入是 48×48 RGB 合成图,含红矩形、蓝椭圆、可变位置与尺度、多个对象及空图;颜色与形状相关,因此不是自然场景通用检测基准。按原始场景种子划分 768 训练、96 验证、192 保留图。45,806 参数的卷积检测器在单层网格上使用 288 个锚框,训练 28 epoch;正例阈值 0.45、忽略区间 [0.25,0.45),并保障每个真值有独立强制匹配。分类使用 hard-negative CE,位置项为正例 smooth-L1,解码后按类 NMS。 | 同一保留协议 | 两类平均 AP@IoU0.50 | 两类平均 AP@IoU0.75 | | --- | --- | --- | | 随机初始化 | 0.00746 | 0.00003 | | 训练后,原尺度 | 0.97303 | 0.70367 | | 训练后,仅对象尺寸减半 | 0.61490 | 0.17987 | AP 按各类全局分数排序、一个真值最多匹配一次、precision envelope 全点积分;不是 COCO 多 IoU 平均 AP。保留集有 33 张空图,展示阈值 0.4 下没有空图误报;这不代表所有阈值或所有背景都不会误报。AP50 与 AP75 的差距说明定位仍不够精细,尺度减半的下降说明训练分布外的小对象尤其困难。 ![真实模型的保留预测与失败](/assets/display/88df211a98edfb7b00515441.webp) ![仅对象尺寸减半时的预测](/assets/display/735d18643da4042bf639ef2c.webp) 保持权重与输入不变,仅把 NMS IoU 阈值从 0.35 放宽到 0.65,AP50 变为 0.95866;展示阈值下 recall 从 0.98311 到 1.0,precision 则从 0.94175 降到 0.41926。更多预测覆盖了剩余真值,也留下大量重复框。这组结果把 NMS 的取舍落实到了同一模型,而非抽象宣称后处理总会改善成绩。 四维高斯样本上的逻辑回归仍能说明 sigmoid 分类损失和参数更新,但它没有图像和位置输出,应保留为分类热身。完整检测器给出的错误则可以进一步分解:漏检、错类、框偏、重复、空图误报、尺度外推。这些区分决定下一步该改表示、匹配、损失、解码还是数据。 即使检测框全部正确,框里的杯把空洞和两杯接触边界仍未知。下一册 [CLS 08](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/2d81e2a1936043349eacb71c53c0defa?utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_content=2d81e2a1936043349eacb71c53c0defa&utm_term=get_notebook) 从这个具体缺口走向逐像素和实例输出。 #### 回看:共享卷积、RPN 与一阶段检测的计算位置 ## 共享特征减少重复计算,但对象身份仍要保留 早期区域 CNN 为很多候选分别提特征,重复处理重叠像素。Fast R-CNN 把卷积移到整图共享阶段,再在区域内读取特征;Faster R-CNN 用 RPN 从共享特征提出候选;SSD 在多个尺度的特征图上直接预测类别和位置。这些变化围绕候选产生、特征复用和预测阶段数组织,并不意味着所有方法在任何设备或目标尺度上只有一个速度排序。[Fast R-CNN](https://arxiv.org/abs/1504.08083) · [Faster R-CNN](https://arxiv.org/abs/1506.01497) · [SSD](https://arxiv.org/abs/1512.02325)。 共享整图特征不应抹掉区域身份。同一张特征图上取左杯和右杯两个区域,仍要得到各自预测;把所有空间位置先平均成一个向量,再期待检测头重建任意细节,可能遇到表示碰撞。是否保留坐标、感受野与采样密度,应与表示的分类能力一起检查。 [一阶段检测如何对应 LAB 10](/course/blocks/dense-detector-ssd-extension.html) [此段独立阅读](/course/notebook-blocks/8f46ef44ed4e4529beedf33817f14d3f.html)