Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3.7 检测、分割与视觉基础模型

分类回答「图里是什么」。但绝大多数真实视觉系统的输出不是一句话,而是一组带位置信息的结构:检测要给出「哪里有某个目标」的框,分割要给出「每个像素属于什么」。

从分类走到检测/分割,不只是「输出不同」,而是评测口径、损失函数、训练样本构造方式全都要换。这一节把这些换法逐项讲清,并给出一个反复出现的判断:检测与分割任务上,准确率是最没有信息量的指标之一。

这节的六个问题
  1. 分类 / 检测 / 语义分割 / 实例分割的输出分别是什么?(3.7.1)
  2. IoU、NMS、AP 各自解决什么问题?AP 怎么手算?(3.7.2)
  3. 两阶段与单阶段检测的分歧点在哪里?(3.7.3)
  4. FCN / U-Net / DeepLab 如何把分类网络变成分割网络?(3.7.4)
  5. DETR 为什么能去掉锚框与 NMS?代价是什么?(3.7.5)
  6. 「提示式分割」(SAM)为什么是范式变化?(3.7.6)

3.7.1 四类任务的输出结构

定义 3.7.1 · 四类视觉任务的输出

给定输入图像 xx:

  • 图像分类:输出单个类别 y∈{1,…,C}y\in\{1,\dots,C\}(或类别分布)。
  • 目标检测(object detection):输出一个变长集合

{(bi,ci,pi)}i=1K,bi=(x1,y1,x2,y2) 或 (cx,cy,w,h), ci∈{1,…,C}∪{背景}, pi∈[0,1].\bigl\{(b_i,c_i,p_i)\bigr\}_{i=1}^{K},\qquad b_i=(x_1,y_1,x_2,y_2)\ \text{或}\ (c_x,c_y,w,h),\ c_i\in\{1,\dots,C\}\cup\{\text{背景}\},\ p_i\in[0,1].

  • 语义分割(semantic segmentation):输出与输入同分辨率的标签图 Y∈{1,…,C}H×WY\in\{1,\dots,C\}^{H\times W},不区分同一类别的不同个体。
  • 实例分割(instance segmentation):输出若干实例,每个实例带一个像素级掩码 mi∈{0,1}H×Wm_i\in\{0,1\}^{H\times W} 与类别 cic_i——既分类别又分个体。
从「一个标签」到「一个集合」,难在哪里

三处结构性变化:

  1. 输出长度可变:分类的输出维度固定(CC 个 logits),检测的输出个数随图片变化。这直接冲突于「固定维度张量」的框架设计,也引入了「模型该输出几个框」这个新问题。
  2. 排列不变性:若模型预测了 3 个框,把它们重排顺序不应改变损失值。因此检测损失不能简单地逐位置比较(那是把框当成有序列表),必须用集合匹配(在 DETR 里做成匈牙利匹配,3.7.5;在两阶段 / 单阶段里用锚框 + 指定正负样本的方式绕过)。
  3. 背景的压倒性比例:一张 224×224 图里,感兴趣目标的像素可能不到 1%1\%。这意味着「所有位置都判背景」的模型能得到极高的像素准确率却毫无用处——这就是本节反复强调「不能只看准确率」的算术根源(例 3.7.1)。

从分类到「定位 + 分类」最朴素的做法是滑动窗口:用一个固定大小的窗口在图上逐位置、逐尺度滑动,每裁出一个窗口就送进 CNN 分类器判断「这里有没有目标」。它概念直白、易于实现,也正好把 3.2.5 的感受野与步幅用在实际任务上——3.10 节的 Lab 2 就从它起步。

它的低效是可以量化的:224×224224\times224 图上用 32×3232\times32 窗口、步幅 4 滑动,位置数为 (⌊(224−32)/4⌋+1)2=492=2401\bigl(\lfloor(224-32)/4\rfloor+1\bigr)^2=49^2=2401;再叠加 5 个尺度,需要 12,00512{,}005 次独立前向。而相邻窗口的输入几乎完全重叠——计算被浪费了。这正是「共享卷积特征」的动机:卷积本身已经在所有位置滑动,何必再手动循环(见 3.7.3)。

3.7.2 IoU、NMS 与 AP:三个必须能算的量

定义 3.7.2 · 交并比(IoU)

两个框 A,BA,B 的交并比(intersection over union)为交面积除以并面积:

IoU(A,B)=∣A∩B∣∣A∪B∣=交面积面积(A)+面积(B)−交面积∈[0,1].\mathrm{IoU}(A,B)=\frac{|A\cap B|}{|A\cup B|}=\frac{\text{交面积}}{\text{面积}(A)+\text{面积}(B)-\text{交面积}}\in[0,1] .

它同时是匹配判据(判定预测框是否算命中)、评估阈值(AP@0.5 等)与损失函数的基础(GIoU / DIoU / CIoU 等都是它的可微化改造)。

IoU 为什么要用「交并比」而不是「交面积占比」

如果用「交面积 / 预测框面积」,那么把框做得极大就能让这个比值变高——退化成一个"我全都框住"的作弊策略。用交集除以并集则同时惩罚「漏」与「多」:大框覆盖了目标但超出很多时,并集变大、IoU 变小。所以 IoU 是一个同时约束位置与尺度的度量,这是它能当匹配与评估标准的原因。

它也有一个著名的缺陷:当两个框不相交时 IoU 恒为 0,梯度消失,无法指导「该往哪个方向靠近」。这直接催生了 GIoU(在并集运算之外再引入最小闭包框,使不重叠时仍有非零梯度)、DIoU(加入中心点距离)、CIoU(再加长宽比一致性)等改进,它们被广泛用作检测框回归损失。

定义 3.7.3 · 非极大值抑制(NMS)

检测器通常在同一个目标附近输出多个高度重叠的候选框。非极大值抑制(non-maximum suppression)的去重流程:

1. 把候选框按置信度 p 从高到低排序
2. 取当前最高分的框 B,保留它
3. 删除所有与 B 的 IoU > 阈值的剩余框(阈值常取 0.5;该阈值是超参数)
4. 重复 2-3,直到没有剩余框
NMS 的直觉与它的两处代价

直觉:同一目标附近的多个预测框互相 IoU 很高,而不同目标之间 IoU 通常较低。所以「高分框吃掉与自己高度重叠的低分框」就能去重。「非极大值抑制」这个名字就来自这个动作——只保留局部极大值。

代价一:阈值敏感。阈值太小(如 0.3)→ 相邻的不同目标(如人群中的两张脸)互相抑制,造成漏检;阈值太大(如 0.8)→ 同一目标的多个框都保留,造成重复框。这也解释了为什么「NMS 的阈值」经常出现在检测器的调参清单里。

代价二:它对遮挡场景不友好。两个真实目标若高度重叠(例如一个人被另一个人挡住大半),高分框会把真实存在的低分目标框抑制掉。Soft-NMS(用分数衰减代替硬删除)等改进就是为了缓解这一点。

补充:NMS 是不可微的、也是串行的,因此无法直接嵌进训练图、也不利于并行加速。DETR 一类方法的动机之一就是用集合预测的训练方式从根上避免需要 NMS(3.7.5)。

平均精度 AP 与 mAP 的计算口径
计算某个类别的 AP:
1. 收集该类别的所有预测(跨全部测试图),按置信度 p 从高到低排序
2. 逐个判定:与某个未被匹配的 GT 的 IoU ≥ 阈值 → TP(并按"一个 GT 只匹配一次"的规则占位),
   否则 → FP;被漏掉的 GT 计入 FN
3. 维护累计 TP、FP,得到每个 rank 的 precision = TP/(TP+FP) 与 recall = TP/|GT|
4. 用插值法求 PR 曲线下的面积,得到 AP
两种常见口径:
- VOC 风格:11 点插值。在 recall = 0, 0.1, ..., 1.0 上取"右侧最大 precision"再平均。
- COCO 风格:101 点 recall + precision 单调包络(全点插值),并对 IoU 阈值
  0.50:0.05:0.95 共 10 个阈值求平均。COCO 报告的 "AP"(常写作 mAP)即这 10 个阈值的均值;
  AP50 / AP75 分别是 IoU=0.5 / 0.75 单阈值下的 AP。
mAP = 各类别 AP 的平均值。

(COCO 的阈值集合、101 点 recall 与 10 阈值平均的口径可直接对照官方评测代码 pycocotools;VOC 的 11 点插值表述以 VOC 官方评测说明为准——该处官方出处需核实。)

例 3.7.1 · 手算一次 AP,并看清「准确率为什么会骗人」

某类别共有 ∣GT∣=10|\mathrm{GT}|=10 个真实目标(已标注、不重叠)。模型输出 12 个预测,按置信度从高到低排列,它们是否为 TP(与某个未被匹配的 GT 的 IoU ≥ 0.5)依次为:

TP, TP, FP, TP, FP, TP, TP, FP, TP, FP, TP, FP.\text{TP},\ \text{TP},\ \text{FP},\ \text{TP},\ \text{FP},\ \text{TP},\ \text{TP},\ \text{FP},\ \text{TP},\ \text{FP},\ \text{TP},\ \text{FP}.

(a)写出每个 rank 的 precision 与 recall;(b)用 11 点插值求 AP;(c)计算「把全部像素 / 全部位置都判为背景」这种平凡预测的准确率,并说明为什么准确率在这里没有信息量。

解

(a) 逐个 rank 累计 TP 与 FP:

rank 1 2 3 4 5 6 7 8 9 10 11 12
判定 TP TP FP TP FP TP TP FP TP FP TP FP
累计 TP 1 2 2 3 3 4 5 5 6 6 7 7
累计 FP 0 0 1 1 2 2 2 3 3 4 4 5
precision 1.000 1.000 0.667 0.750 0.600 0.667 0.714 0.625 0.667 0.600 0.636 0.583
recall 0.1 0.2 0.2 0.3 0.3 0.4 0.5 0.5 0.6 0.6 0.7 0.7

(b)11 点插值:在 r=0,0.1,…,1.0r=0,0.1,\dots,1.0 处取「recall ≥ r 的所有样本中最大的 precision」(即右侧包络):

rr 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
最大 precision 1.000 1.000 1.000 0.750 0.714 0.714 0.667 0.636 0 0 0

AP=111(1.000×3+0.750+0.714×2+0.667+0.636+0)=6.48111≈0.589.\mathrm{AP}=\frac{1}{11}\bigl(1.000\times3+0.750+0.714\times2+0.667+0.636+0\bigr)=\frac{6.481}{11}\approx\mathbf{0.589}.

换成 COCO 风格的做法(先做 precision 单调包络,再对 recall 积分)会得到约 0.5480.548——同一组预测、两种口径差出 44 个百分点。这提醒我们:报告 AP 时必须说清口径,否则数字不可比较。

(c)平凡预测的准确率:设图中共有 100 万个候选位置,其中 10 个是真实目标。全部判背景的正确率

1−101,000,000=99.999%.1-\frac{10}{1{,}000{,}000}=99.999\% .

但它把 10 个真实目标全部漏掉了(recall =0=0,precision 未定义/无意义)。所以在这种极端类不平衡下,准确率是一个几乎无信息的指标——必须看 precision / recall、AP,或者至少是平衡后的指标。这正是 Lab 2 里反复强调的判断(3.10 节)。

∎

3.7.3 两阶段与单阶段检测

定义 3.7.4 · 锚框与两阶段 / 单阶段
  • 锚框(anchor box):在特征图的每个位置预先放置 kk 个不同尺度 / 长宽比的参考框,模型不直接回归"目标在哪",而是回归相对锚框的偏移量。这解决了「没有参考时,坐标回归的目标值尺度差异过大」的优化问题。
  • 两阶段(two-stage):先由区域提议(region proposal)产生候选框(可能有上千个),再对候选框做分类 + 位置精修。
  • 单阶段(one-stage):不做独立的提议步骤,直接在密集位置上同时预测类别与框偏移。
锚框为什么有用,代价是什么

有用的原因(优化视角):直接回归绝对坐标时,目标值可能横跨 0–400(像素),而且不同图片的尺度差异大——这让回归头的输出分布很宽,难收敛。改为回归相对锚框的偏移(如 log⁡(w/wa)\log(w/w_a)、log⁡(h/ha)\log(h/h_a))后,目标值集中在 00 附近,且尺度被归一化,优化容易得多。这也是 3.1 归纳偏置思想在回归任务上的又一次应用:把先验结构(目标大致是什么形状尺度)写进参数化方式。

代价:锚框引入一堆超参数(尺度、长宽比、每位置个数、与真值匹配的 IoU 阈值)。它们与数据集强相关——在人群检测和遥感舰船检测上最优的锚框配置完全不同。而且密集锚框会产生极端的正负样本不平衡(背景锚框可能占 99%99\% 以上),这正是 focal loss 一类「让难样本主导梯度」的损失出现的背景。DETR 的动机之一就是彻底去掉锚框与 NMS(3.7.5)。

两条路线的对照
两阶段(R-CNN 系) 单阶段(YOLO / SSD 系)
流程 提议 → 对候选框分类 + 回归 一次前向在密集位置直接预测
代表 R-CNN(2014)、Fast R-CNN(2015)、Faster R-CNN(2015)、FPN(2016) YOLO(2015)、SSD(2015)
速度 相对慢 相对快,适合实时
早期精度 通常更高(两阶段对候选框做了二次精修) 早期略逊,主因是正负样本极不平衡;focal loss 等设计大幅缩小差距
关键组件 RoI pooling / RoIAlign、RPN、特征金字塔 多尺度特征图、锚框 / 无锚框(anchor-free)、focal loss

演进的三条腿(值得记住的因果链):① R-CNN → Fast R-CNN:把「每个候选框单独跑一次 CNN」改成「整图跑一次 CNN,再在特征图上裁剪 RoI」,消除重复计算;② Fast → Faster:把「候选框生成」也做成可学习网络(RPN),从而端到端可训;③ FPN:把深层语义与浅层高分辨率通过自顶向下 + 横向连接融合,使小目标也能被检出——这是几乎所有现代检测器都会用的结构。

3.7.4 语义分割:FCN、U-Net、DeepLab

定义 3.7.5 · 全卷积网络与编码器—解码器
  • 全卷积网络(FCN):把分类网络尾部的全连接层替换为卷积层,从而接受任意尺寸输入、输出与输入同分辨率的稠密预测图。中间的下采样丢掉的分辨率用上采样(转置卷积或插值)恢复。
  • 编码器—解码器(encoder–decoder):编码器逐级下采样提取语义(感受野变大、分辨率变小),解码器逐级上采样恢复分辨率;并在对应尺度之间加跳连(skip connection),把编码器保留的高分辨率细节直接送给解码器。
为什么分割网络必须要有跳连

下采样是不可逆的信息损失(3.2.7 已经说明转置卷积只能放大形状、不能恢复信息)。但语义分割要的恰恰是像素级边界,而边界信息主要保存在浅层高分辨率特征里。

于是出现了矛盾:想分类准确 → 需要深、需要大感受野 → 需要下采样 → 分辨率丢失 → 边界变糊。跳连就是调停这个矛盾的机制:让解码器同时看到「深层语义」与「浅层边界」。U-Net 把这个结构做成了对称的 U 形,成为医学影像分割的经典选择(医学图像数据少、边界精度要求高,这个结构恰好对上)。

空洞卷积是第三条路(3.2.2):不下采样,靠扩张核扩大感受野。它的优点是不损失分辨率,缺点是计算量大、且空洞采样会漏掉细结构。DeepLab 系列把空洞卷积与空间金字塔池化(在多个空洞率上并联)结合,同时捕捉多尺度上下文。

三条代表路线与它们的取舍
方法 核心机制 优点 代价
FCN(2014,arXiv:1411.4038) 全卷积 + 上采样 首个端到端像素级预测,概念奠基 上采样过粗,边界精度差
U-Net(2015,arXiv:1505.04597) 对称编解码 + 同尺度跳连 小数据也能训好;边界锐利;医学影像标配 参数量随跳连通道数上升;全分辨率计算量大
DeepLabv3+(2018,arXiv:1802.02611) 空洞卷积 + 多空洞率空间金字塔 + 编解码 多尺度上下文;不损失分辨率 空洞采样可能漏细结构;算力较高

评估指标:语义分割最常用的两个量是

pixel accuracy=预测正确的像素数总像素数,mIoU=1C∑c∣Pc∩Gc∣∣Pc∪Gc∣,\text{pixel accuracy}=\frac{\text{预测正确的像素数}}{\text{总像素数}},\qquad \mathrm{mIoU}=\frac{1}{C}\sum_{c}\frac{|P_c\cap G_c|}{|P_c\cup G_c|},

其中 PcP_c 是预测为类 cc 的像素集合、GcG_c 是真值集合。mIoU 是更可信的主指标——因为它对每个类别单独计算再平均,不会被大量容易的背景像素主导(与 例 3.7.1 的教训一致)。

定义 3.7.6 · 实例分割与 Mask R-CNN

实例分割要求区分同一类别的不同个体,输出「每个实例的掩码 + 类别」。Mask R-CNN(2017,arXiv:1703.06870)在 Faster R-CNN 的检测分支旁并联一个掩码分支:对每个候选框输出一个 KK 通道、m×mm\times m 的掩码(每个类别一个通道),取对应类别通道后按候选框缩放回原尺寸。它同时完成检测与实例分割。

掩码分支为什么与检测分支分开

一个设计细节值得注意:掩码分支对每个类别独立输出一个掩码,而不是让掩码与类别联合建模。这样做的前提是分类与掩码解耦——让分类分支负责"是什么",掩码分支只负责"像素级的形状",两者各司其职。

另外 RoIAlign(把候选区域对齐采样到固定尺寸)替换了早期 RoIPool 的量化取整,避免了特征图与输入坐标之间的错位,这对像素级掩码的精度至关重要——这是「一个取整操作毁掉一个小目标的精度」这类问题的经典案例。

3.7.5 DETR:把检测变成集合预测

定义 3.7.7 · DETR 的集合预测与匈牙利匹配

DETR(2020,arXiv:2005.12872)用一个 Transformer 编解码器直接输出 NN 个预测(NN 固定且大于图中目标数的上限),每个预测是「类别 + 框」。训练时用匈牙利匹配(bipartite matching,即二分图最小代价完美匹配)把 NN 个预测与真值集合一一配对,再对配对上的预测计算集合损失:

σ^=arg⁡min⁡σ∈SN∑i=1NLmatch(yi,y^σ(i)),\hat\sigma=\arg\min_{\sigma\in\mathfrak{S}_N}\sum_{i=1}^{N}\mathcal L_{\text{match}}\bigl(y_i,\hat y_{\sigma(i)}\bigr),

其中未匹配到真值的预测被指定为「无目标」(no object)类别。原文的表述是:使用二分匹配的集合损失(bipartite matching set-based loss)直接做端到端的目标检测。

为什么这个做法能去掉锚框和 NMS

关键在「一对一匹配」:匈牙利匹配强制每个真值只被一个预测负责(反之每个预测最多匹配一个真值)。于是模型在训练中学到的是「不要输出重复框」——重复框会在匹配阶段被指派为「无目标」,其损失会惩罚这种重复。NMS 的作用(去重)被训练目标本身吸收了,推理时不再需要。

代价(必须如实说明):① 收敛慢——一对一匹配提供的监督信号比「密集锚框 + 多对多匹配」稀疏得多(每个预测只在一个位置得到正监督),因此 DETR 需要显著更长的训练轮数;这一点由 Deformable DETR(2020,arXiv:2010.04159)明确批评并改进,后者用可变形注意力只关注少数采样点,同时提升收敛速度与小目标性能。② 小目标性能较弱——原始 DETR 的注意力在整图上做,高分辨率细节被稀释;后续工作大多恢复到多尺度特征图。

小目标为什么难:2242224^2 图里一个 10×1010\times10 的小目标只占 0.2%0.2\% 的像素;如果 token 网格是 14×1414\times14,它可能不够一个 token。所以任何全局注意力 + 粗网格的架构天然对小目标不友好——这是 3.5 节与本节共同的结论。

3.7.6 视觉基础模型:SAM 的提示式分割

定义 3.7.8 · 提示式分割(promptable segmentation)

Segment Anything Model(SAM,2023,arXiv:2304.02643)把分割从「针对某一类目标训练一个模型」改成「给定一个提示,返回对应的掩码」。提示可以是:

  • 一组点(前景 / 背景)、
  • 一个框、
  • 一个粗略掩码、
  • 文本(在 SAM 的原始形式中主要由前三种构成;文本提示在后续的多模态工作中接入)。

模型在提示条件下输出掩码,因此同一个模型可以分割任意物体,无需针对新类别重新训练。原文报告的训练数据规模是 11M 图像上的 1B(十亿)个掩码,数据集名 SA-1B。SAM 2(2024,arXiv:2408.00714)把这套范式扩展到视频,用流式记忆处理时序。

「提示式」为什么是范式变化

之前的语义 / 实例分割模型都是封闭类别的:训练时见过哪几类,就只能分割哪几类。要加一个新类别,就得重新标注数据、重新训练。

SAM 的路线是:把「分割什么」从模型的参数里挪到用户的提示里。参数只负责「怎么把提示扩展成一个连贯的物体掩码」,因此它可以泛化到训练时没见过的物体。这与大语言模型的 few-shot 提示是同一个思想:把任务规格从训练阶段搬到推理阶段。

代价与边界(必须写清楚):① 掩码质量依赖提示质量——一个落在物体边缘的点可能给出完全不同的结果;② 它不输出语义标签——SAM 给的是"这块像素属于同一个物体",而不知道它是什么,因此实际系统通常把 SAM 当作「分割后端」,前面接一个检测器或分类器;③ 大模型(ViT-H 图像编码器约 6 亿参数量级)的推理成本不低;④ 训练数据的标注偏差会被继承(3.9 节)。

现代视觉系统的典型组装方式
分类阶段(你需要知道"是什么"):骨干([3.4](sec34.md)–[3.5](sec35.md))+ 分类头
    ↓
定位阶段(你需要知道"在哪"):检测器([3.7.3](#sec-3.7.3))或 DETR 类集合预测([3.7.5](#sec-3.7.5))
    ↓
精细边界(你需要像素级精度):分割网络([3.7.4](#sec-3.7.4))或提示式模型(本小节)
    ↓
语义(你需要"这是什么"的标签):接一个分类器 / 多模态模型([3.8 节](sec38.md))

一个反复出现的工程判断:不要用一个大模型同时解决所有环节。真实系统通常是「多个专门组件的流水线」,因为每一环的失败模式不同、可独立调试、可独立替换。端到端单模型在研究与演示中很漂亮,但在需要可解释、可追责的生产系统里,分环节流水线往往更实用。

本节常见误解
  1. 「检测看准确率就够了」:错得很彻底。背景位置占绝大多数,全判背景就能有极高的"准确率"却零召回(例 3.7.1)。检测/分割必须看 precision / recall / AP / mIoU。
  2. 「AP 与 mAP 是同一件事」:AP 是单个类别的 PR 曲线下面积;mAP 是各类别 AP 的平均。而在 COCO 口径下,官方报告里那个写作 "AP" 的量本身已经是「10 个 IoU 阈值上的平均」,所以「COCO 的 AP」同时跨类别与跨阈值两次平均。报数字时必须说明口径。
  3. 「NMS 是检测的必要步骤」:它是训练目标没做去重时的补救措施。DETR 用一对一匹配从训练层面消除重复,因此推理不需要 NMS。
  4. 「IoU 既能当损失也能当指标,所以可以直接拿来做梯度」:IoU 在框不重叠时恒为 0、梯度消失,必须用 GIoU / DIoU / CIoU 这类可微且有非零梯度的替代量。
  5. 「转置卷积能恢复下采样丢掉的信息」:不能(3.2.7)。分割的边界精度靠跳连 / 高分辨率特征保住,而不是靠上采样算子本身。
  6. 「SAM 是一个分割一切类别的模型」:它输出的是掩码(物体的边界)而不是语义标签。它不回答"这是什么",只回答"哪块像素属于同一个东西"——把它当成分类器是最常见的误用。
  7. 「数据模型越大就不需要标注了」:SAM 的 11B 掩码本身就是海量标注(半自动标注流水线),它的能力建立在标注规模上,而不是"不需要标注"。
即时自测 · 3.7

Q1 两个框 A=(0,0,10,10)A=(0,0,10,10)、B=(5,5,15,15)B=(5,5,15,15),求它们的 IoU。(面积按坐标差计算,边界不算入。)

Q2 检测器在同一张脸上输出了 5 个框(IoU 互相都在 0.8 以上)。NMS 的阈值设 0.3 与设 0.8 分别会发生什么?请给出两种失败模式的名称。

Q3 用一句话解释:为什么「全部判背景」的 99.9% 准确率是无用的?在有 1 万个候选位置、10 个真实目标的检测任务里,请把这个数字算出来。

Q4 FCN 与 U-Net 的关键差别是什么?为什么医学影像分割偏爱 U-Net?

Q5 DETR 为什么不需要 NMS?它的主要代价是什么?

Q6 SAM 的「提示式分割」在工程上解决了什么问题?它的两条主要局限是什么?

参考要点

Q1 交:x∈[5,10]x\in[5,10]、y∈[5,10]y\in[5,10] → 5×5=255\times5=25。面积各为 100100。并 =100+100−25=175=100+100-25=175。IoU =25/175≈0.143=25/175\approx0.143。

Q2 阈值 0.30.3:这 5 个框互相 IoU 均 >0.3>0.3,所以 NMS 只保留最高分的那一个 → 去重成功。但如果附近有另一张真实但低分的脸(与自己那张脸的框 IoU 也 >0.3>0.3),它会被误删 → 漏检。阈值 0.80.8:互抑制减弱,同一张脸可能保留多个框 → 重复框。所以两个失败模式分别是「阈值过小 → 漏检」与「阈值过大 → 重复框」。

Q3 准确率 =1−10/10,000=99.9%=1-10/10{,}000=99.9\%,但 recall =0=0(一个目标都没找到),precision 无意义。这类指标被大量负例"稀释"的现象是类不平衡的典型后果;检测任务应看 AP / precision-recall。

Q4 FCN 把全连接换成卷积、用上采样恢复分辨率,但没有跳连,因此高分辨率细节在下采样时已丢失、边界较粗;U-Net 用对称编解码 + 同尺度跳连把浅层细节直接送进解码器。医学影像(如 CT / MRI 的器官与病灶边界)通常数据量小、但对边界精度要求高,U-Net 的跳连正好同时满足「小数据可训」与「边界锐利」。

Q5 因为训练用一对一匈牙利匹配:每个真值只被一个预测负责,重复预测会被指派为"无目标"并受到损失惩罚,因此模型自己学会了不输出重复框,NMS 的作用被训练目标吸收。代价:① 监督信号比密集锚框稀疏,收敛明显更慢(由 Deformable DETR 明确指出);② 原始版本对小目标不友好(全局注意力 + 粗网格使小目标细节被稀释)。

Q6 它把「分割什么」从模型参数搬到推理时的提示里,因此同一个模型可以分割训练时没见过的物体,不必为每个类别重新标注与训练。局限:① 不输出语义标签(只给边界,不知道"是什么"),实际系统需要接分类器或多模态模型;② 掩码质量依赖提示质量,且模型规模大、推理成本高(另外训练数据的标注偏差会被继承)。

分割的失败分析:把「指标不好」拆成可定位的原因

只看 mIoU 无法指导改进。真正有用的是按物体尺寸分组统计,因为分割的误差分布高度依赖目标大小:

分组(按目标面积占比) 常见失败模式 主要嫌疑
大目标(>15%) 内部空洞、边界模糊 上采样太粗 / 跳连不足 / 类别不均衡
中目标(1%–15%) 边界偏移一两个像素 通常可接受;若 IoU 明显低,检查标注一致性
小目标(<1%) 完全漏检或整块错类 下采样过度(跳距 jj 太大,3.3.2)、空洞采样漏掉细结构
细长目标(电线、道路、血管) 断裂成多段 空洞卷积的网格效应 / 仅用方形感受野

三条诊断顺序(先便宜后昂贵):① 可视化——把预测与真值叠加成对比图,比看数字快十倍;② 按尺寸分组统计——定位到是哪一类目标在贡献误差;③ 检查标注一致性——多人标注的同一批图像若 IoU 只有 0.80.8 左右,那么模型的 0.820.82 已经接近标注上限,继续调模型是徒劳。第三条最常被忽略,也最容易导致"永远调不上去"的困境。

关于 mAP 与 AP 的一个常见混淆:在 COCO 口径下,官方榜单上写作 AP 的那个数字,本身已经是「10 个 IoU 阈值上的平均」;而 mAP 这个缩写在不同社区指代不同——有时指「跨类别平均的 AP」,有时就是 COCO 的 AP。报告数字时必须写清是三件事中的哪几件:跨类别?跨 IoU 阈值?还是单类别单阈值? 不写就无法复现,也无法与别人的结果比较。

延伸阅读
  • Girshick et al., Rich feature hierarchies for accurate object detection and semantic segmentation(2014,arXiv:1311.2524)——R-CNN;Fast R-CNN(2015,arXiv:1504.08083);Ren et al., Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(2015,arXiv:1506.01497)。
  • Redmon et al., You Only Look Once: Unified, Real-Time Object Detection(2015,arXiv:1506.02640);Liu et al., SSD: Single Shot MultiBox Detector(2015,arXiv:1512.02325);Lin et al., Feature Pyramid Networks for Object Detection(2016,arXiv:1612.03144)。
  • Lin et al., Focal Loss for Dense Object Detection(2017,arXiv:1708.02002)——正负样本极不平衡的解法。
  • Long et al., Fully Convolutional Networks for Semantic Segmentation(2014,arXiv:1411.4038);Ronneberger et al., U-Net: Convolutional Networks for Biomedical Image Segmentation(2015,arXiv:1505.04597);Chen et al., Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation(DeepLabv3+,2018,arXiv:1802.02611)。
  • He et al., Mask R-CNN(2017,arXiv:1703.06870)。
  • Carion et al., End-to-End Object Detection with Transformers(2020,arXiv:2005.12872);Zhu et al., Deformable DETR(2020,arXiv:2010.04159)。
  • Rezatofighi et al., Generalized Intersection over Union(GIoU,2019,arXiv:1902.09630);Zheng et al., Distance-IoU Loss(DIoU/CIoU,2019,arXiv:1911.08287)。
  • Kirillov et al., Segment Anything(2023,arXiv:2304.02643);Ravi et al., SAM 2: Segment Anything in Images and Videos(2024,arXiv:2408.00714)。COCO 评测口径对照官方代码 pycocotools(iouThrs=[.5:.05:.95]、101 点 recall、maxDets=[1,10,100])。

本节小结:检测与分割的输出是变长集合 / 稠密标签图,因此评测与损失必须换——IoU 是匹配与评估的共同基础,NMS 是训练未做去重时的补救,AP 必须说清口径(VOC 11 点 vs COCO 101 点 + 10 个 IoU 阈值),而准确率在极端类不平衡下没有信息量(例 3.7.1)。检测有「两阶段精修」与「单阶段密集预测」两条路线,分割有「跳连保细节」(U-Net)与「空洞卷积保分辨率」(DeepLab)两条路线,DETR 用集合预测从训练层面消除重复框与锚框(代价是收敛慢),SAM 把分割任务规格搬到提示里、成为可复用的分割后端。下一节把视觉接到语言上:多模态的对齐、生成与编辑。