先记住一句话
检测输出对象集合与 box,语义分割给每个像素类别,实例分割还区分同类个体;DETR 把检测改写成集合匹配,SAM 把分割改写成由点/框/mask 提示控制的通用接口。
1. 先分清四种输出
| 任务 | 输出 | 例子 |
|---|---|---|
| Classification | 整图类别/概率 | “有猫” |
| Object detection | 每个对象的类别 + bounding box | “两只猫,各自位置” |
| Semantic segmentation | 每个像素的类别 | 所有猫像素都标 cat |
| Instance segmentation | 每个对象独立 mask + 类别 | 猫 A 与猫 B 分开 |
例 1:一张 4×4 图的输出数量
3 类 classification 只输出 3 个 logits;semantic segmentation 输出 $4\times4\times3=48$ 个 logits;若实例分割找到 2 个对象,每个还需独立 mask,因此“同类两个杯子”不会被合并成一个实例。
2. Two-stage 与 one-stage detection
Faster R-CNN 先用 Region Proposal Network 找可能有物体的区域,再对每个 proposal 分类和回归 box。它把“在哪里”和“是什么”分成两个阶段,通常精度强,但 pipeline 较复杂。
YOLO 把整图划分/特征化后,在一次 dense forward 中直接预测多个位置的类别、objectness 和 box,因此适合实时场景。现代 YOLO 版本细节变化很多,“YOLO”更像单阶段实时检测家族,而不是一个固定公式。
传统 detector 常依赖 anchors、正负样本分配、box regression 和 Non-Maximum Suppression(NMS)。NMS 用 IoU 去掉同一对象的重复高分框,但阈值和拥挤场景可能带来误删。
例 2:NMS 的一次决定
框 A 面积 100、框 B 面积 80,交集面积 60,则 union=$100+80-60=120$,IoU=$60/120=0.5$。若 A 分数更高、NMS 阈值 0.45,B 被删;阈值 0.6 时保留。阈值会直接影响重复框与拥挤对象。
3. DETR:把 detection 当集合预测
DETR 用固定数量的 object queries 输出一个无序集合。每个 query 预测一个类别(含 no-object)和 box。训练时用 Hungarian matching 在预测集合与真实对象之间寻找一一对应:
predicted queries: q1 q2 q3 q4 ...
↘ ↙ ↓
ground-truth set: dog cup person
匹配 cost 通常结合分类与 box 距离。每个真实对象只匹配一个 query,因此模型直接学习消除重复预测,可以去掉 anchors 和 NMS。代价是原始 DETR 收敛慢、小对象性能弱,后续 deformable/multi-scale 变体专门改进这些问题。
例 3:两预测、两真值的 Hungarian matching
cost matrix 为 $\begin{bmatrix}1&4\\3&2\end{bmatrix}$:方案 q1→g1、q2→g2 总 cost $1+2=3$;交换后为 $4+3=7$,所以选择前者。若还有第三个 query,它会匹配 no-object。
4. U-Net:dense prediction 为什么要 skip connection?
Encoder 下采样获得大 receptive field 和语义,decoder 上采样恢复分辨率。只靠 bottleneck 容易丢失边界细节,因此 U-Net 把 encoder 同尺度 feature 直接连接到 decoder:
high-resolution encoder feature ───────────┐
↓ downsample │ skip
bottleneck → upsample → concatenate ┘ → mask
这里的 skip 与 ResNet 的加法残差目的不同:U-Net 常通过 concatenation 把早期空间细节送到解码端。
例 4:U-Net concatenate 的 shape
Decoder 上采样 feature 为 $64\times64\times128$,同尺度 encoder skip 为 $64\times64\times64$。沿 channel 拼接得到 $64\times64\times192$,随后卷积再把通道变回目标宽度。
5. Mask R-CNN:在对象框内预测实例 mask
Mask R-CNN 在 Faster R-CNN 基础上并行增加 mask head。每个 RoI 既分类、回归 box,又输出一个低分辨率二值 mask。RoIAlign 避免坐标量化造成的 feature misalignment,这对像素级边界尤其重要。
它不是先做全图 semantic mask 再切对象,而是以 detection instance 为单位预测 mask,因此天然区分同类个体。
6. SAM:从固定任务到可提示分割
Segment Anything Model 拆成三部分:
- Image encoder:昂贵地编码整张图,可复用。
- Prompt encoder:编码正/负点、框或已有 mask。
- Mask decoder:快速结合图像与提示,输出候选 masks 和质量分数。
一个点可能对应对象、部件或局部区域,本身有歧义,所以 SAM 可以输出多个候选 mask。SAM 解决“这个提示所指区域是什么形状”,不必同时回答它的语义类别;语义命名常需与 detector、CLIP 或 VLM 结合。
7. 指标也属于任务定义
Intersection over Union:
检测常在多个 IoU 阈值上计算 Average Precision;分割常用 mIoU、Dice 或 boundary metrics。只看某一个阈值可能掩盖定位质量、类别不平衡或小对象问题。
例 5:IoU 与 Dice 手算
预测 mask 有 6 个像素,真值有 5 个,交集 4 个。Union=$6+5-4=7$,所以 IoU=$4/7=0.571$;Dice=$2|A\cap B|/(|A|+|B|)=8/11=0.727$。两指标数值不同但都奖励重叠。
“Foundation vision model”不表示它自动完成所有视觉任务。SAM 的强项是 promptable masks;类别、关系、跟踪和三维一致性仍可能需要其他模块。
自测:先算后展开
1. Semantic segmentation 与 instance segmentation 的差别?
前者给像素类别但不区分同类个体;后者为每个对象实例产生独立 mask。
2. DETR 为什么可以不用 NMS?
Hungarian matching 用一一对应监督固定 queries,每个真实对象只匹配一个预测,模型直接学习输出无重复集合。
3. SAM 为什么把 image encoder 与 mask decoder 分开?
图像特征可昂贵地预计算一次,而用户可反复改变 prompt,用轻量 decoder 快速得到新 mask。
4. 两个面积分别 40、50 的框交集 20,IoU 是多少?
Union=$40+50-20=70$,IoU=$20/70\approx0.286$。
5. 100 个 DETR queries、图中 7 个对象,通常多少 query 对 no-object 学习?
一一匹配后 7 个对应对象,其余 93 个对应 no-object。