Week 9:Detection & Segmentation 核心脉络
本章要解决的核心目标是:让视觉模型从 image-level recognition 走向 spatial understanding。也就是说,不只是回答“图里有什么”,而是回答“在哪里”“每个像素是什么”“每个实例是谁”“模型为什么这么
Week 9:Detection & Segmentation 核心脉络
本章要解决的核心目标是:让视觉模型从 image-level recognition 走向 spatial understanding。也就是说,不只是回答“图里有什么”,而是回答“在哪里”“每个像素是什么”“每个实例是谁”“模型为什么这么判断”“能否用 prompt 直接迁移到新任务”。
整体进化树可以概括为:
Image Classification
↓ 只预测类别,没有空间位置
Semantic Segmentation
↓ 给每个 pixel 分类,但不区分实例
Object Detection
↓ 给每个 object 输出类别 + bounding box
Instance Segmentation
↓ 给每个 object 输出类别 + box + mask
Visualization / Understanding
↓ 理解模型关注哪里:filters, saliency, CAM, Grad-CAM
Foundation Vision Models
↓ 用 prompt 做 zero-shot / interactive segmentation:SAM
1. Semantic Segmentation:从 patch 分类到全卷积分割
Semantic segmentation 的任务是:给图像中每一个像素分配一个语义类别。输入是图像 ,输出是像素级标签图:
其中 是图像高宽, 是语义类别数。注意它只关心“这个像素属于什么类别”,不关心同类物体之间的实例差异。例如两头 cow 都标成 cow,不区分 cow-1 和 cow-2。
重要程度:★★★★★。这是分割任务的基础定义,考试很容易问 semantic segmentation、object detection、instance segmentation 的区别。
最早的直觉方法是 sliding window:对每个像素周围取一个 patch,然后用 CNN 判断中心像素类别。形式上,对像素位置 ,取局部 patch:
然后预测:
其中 是 patch 半径, 是 CNN 分类器, 是类别 的 score。
这个方法的动机是:单个像素无法判断语义,必须看上下文。例如黑色像素可能是 cow,也可能是 shadow,所以要看周围区域。但它的问题很严重:相邻 patch 高度重叠,却要重复跑 CNN,计算极其浪费。也就是说,它解决了 context 问题,但没有解决 shared computation 问题。
于是自然过渡到 fully convolutional idea:不要对每个 patch 单独跑 CNN,而是对整张图一次性提取 feature map,然后对每个空间位置分类。最直接形式是:
其中 是卷积特征图, 是通道数, 是每个像素的类别 score map。
但问题是:如果一直保持原图分辨率 做卷积,计算量太大;如果像分类 CNN 一样用 pooling 或 stride 下采样,又会导致输出空间尺寸变小,不满足 pixel-wise prediction。因此 FCN 的核心折中是:encoder 先 downsample 获得高级语义,再 decoder upsample 恢复空间分辨率。
典型结构是:
Input image
↓ convolution / pooling / strided convolution
Low-resolution semantic feature
↓ unpooling / transposed convolution / interpolation
High-resolution prediction map
↓ op("argmax") over classes
Pixel labels
2. Upsampling:从非参数放大到可学习上采样
语义分割中的核心矛盾是:深层 CNN 要下采样以扩大 receptive field、降低计算量;但 segmentation 要输出原图大小。因此必须上采样。
第一类是非学习式上采样。Nearest Neighbor upsampling 直接复制值。例如:
Bed of Nails upsampling 是插零:
Nearest Neighbor 简单但不可学习,Bed of Nails 通常配合后续卷积使用.
第二类是 Max Unpooling。它和 Max Pooling 成对出现。Max Pooling 下采样时不仅记录最大值,还记录最大值所在位置,即 pooling switches。上采样时把低分辨率值放回原来最大值的位置,其余填零。它的优点是能部分恢复 pooling 前的空间结构;缺点是只恢复最大激活的位置,仍然很稀疏。
第三类是 Transposed Convolution,也叫 deconvolution,但严格说不是卷积的逆,而是普通卷积线性算子的转置。普通卷积 stride 可以看作 learnable downsampling:filter 在输入上移动 个像素,对应输出移动一个位置。Transposed convolution 则反过来:输入移动一个位置,filter 在输出上移动 个像素;重叠区域求和。
1D 例子最容易记:
输入为 ,filter 为 ,stride 为 1,则输出可以理解为:
重叠后得到:
更一般地,transposed convolution 的每个输入元素都会“撒出”一个乘以该输入值的 filter pattern,多个 pattern 在输出空间重叠处相加。
重要程度:★★★★★。考试常问 transposed convolution 与 normal convolution 的区别,以及为什么它是 learnable upsampling。
3. U-Net:用 skip connection 修复空间细节丢失
FCN 的问题是:encoder 深层 feature 语义强,但空间细节弱;浅层 feature 分辨率高,但语义弱。U-Net 的核心思想是 encoder-decoder 加 skip connection,把 encoder 中高分辨率的浅层特征直接传给 decoder 对应层。
结构直觉:
Encoder: high resolution → low resolution, local detail → semantic abstraction
Decoder: low resolution → high resolution, recover spatial prediction
Skip: concatenate encoder features into decoder
如果记为 encoder 第 层特征为 ,decoder 对应层上采样特征为 ,则 U-Net 常用:
然后再经过卷积:
其中 通常在 channel dimension 上拼接。
U-Net 的意义是:它不是单纯“先压缩再恢复”,而是把 localization detail 通过 skip connection 直接送回去。因此特别适合医学图像、边界敏感的分割任务。
重要程度:★★★★☆。不一定考细节公式,但很容易考动机:为什么 FCN 需要 skip connection?为什么 U-Net 对 segmentation 有效?
4. Object Detection:从单目标定位到多目标检测
Object detection 的输出不是像素类别,而是对象集合:
其中 是第 个 object 的类别, 是 bounding box,通常表示为:
其中 可以表示 box 左上角或中心点, 是宽高。
单目标检测可以看成 classification + localization。网络共享一个 feature vector,例如:
分类头输出:
定位头输出:
训练损失是 multitask loss:
其中:
其中 是真实类别, 是真实框, 控制分类和定位损失的权重。
多目标检测的关键困难是:每张图 object 数量不同,因此输出长度不是固定的。普通 C N N 分类器输出固定维度向量,无法直接输出可变长度集合。因此早期做法是:对图像中大量候选 crop 分别分类为 object 或 background。
问题是:所有位置、尺度、长宽比都枚举,计算量巨大。
重要程度:★★★★★。检测任务的基本输出形式、multitask loss、可变数量输出问题都很核心。
5. R-C N N 系列:共享计算越来越多
R-C N N 的核心流程是:
Input image
↓ Selective Search 提出约 2000 RoIs
Warp each RoI to 224×224
↓ 每个 RoI 单独过 C N N
Feature vector
↓ S V M 分类
↓ bbox regressor 修正框
Detection result
R-C N N 的 bbox correction 通常不是直接预测最终 box,而是预测相对 proposal 的变换:
常见参数化是:
其中 是 anchor/proposal box, 是 ground-truth box。预测时反变换:
R-C N N 的失败点非常明确:每张图约 2000 个 RoI,每个 RoI 都要独立过 C N N,极慢,且没有共享卷积计算。
Fast R-C N N 的改进是:先对整张图跑 backbone 得到 feature map,再把 proposal 映射到 feature map 上做 RoI Pool / Crop + Resize。流程变成:
Input image
↓ Backbone C N N once
Conv feature map
↓ RoI proposals projected onto feature map
RoI pooling / crop-resize
↓ per-region "head"
classification + bbox regression
它解决了 R-C N N 的重复 C N N forward 问题。但 Fast R-C N N 仍然依赖外部 proposal 方法,例如 Selective Search,而 Selective Search 通常在 C P U 上运行,仍然慢。
Faster R-C N N 的核心创新是 Region Proposal Network,R P N。R P N 和 detector 共享 backbone feature map,直接在 feature map 每个位置预测 anchor 是否包含 object,以及对应 box correction。
如果 feature map 是:
每个位置有 个 anchors,则 R P N 输出 objectness:
和 box transforms:
每个 anchor 对应: hat(t)x,hat(t)y,hat(t)w,hat(t)h 然后按 objectness score 排序,取 top proposals,例如约 300 个,再送入 Fast R-C N N detector “head”。
R-C N N 系列的进化逻辑是:
| 方法 | Proposal 来源 | C N N 计算方式 | 主要瓶颈 | 改进点 | | ———— | —————- | ————————– | ——————- | ——————— | | R-C N N | Selective Search | 每个 RoI 单独 C N N | 约 2000 次 forward,极慢 | 使用 proposal 降低枚举空间 | | Fast R-C N N | Selective Search | 整图一次 C N N,共享 feature | proposal 仍外部生成 | 共享卷积计算 | | Faster R-C N N | R P N | R P N 与 detector 共享 backbone | 结构更复杂 | proposal 也由网络生成,接近端到端 |
重要程度:★★★★★。这是检测方法演进的主线,考试非常可能考 Why R-C N N slow / how Fast R-C N N fixes / why Faster R-C N N faster。
6. Single-Stage Detector:Y O L O / S S D / RetinaNet
Two-stage detectors 先生成 proposals,再对 proposals 分类回归。Single-stage detectors 直接在 dense grid 上预测 boxes 和 classes,不显式分 proposal stage。
Y O L O 的基本思想是:把图像划分成 网格,每个 grid cell 预测 个 bounding boxes 和类别概率。输出维度通常是:
其中 是每个 cell 的 box 数, 是类别数,每个 box 的 5 个量通常是: x,y,w,h,upright(“confidence”) confidence 可以理解为:
每个 cell 还预测类别概率:
最终类别置信度常写成:
Y O L O 的优势是快,因为整张图只 forward 一次;缺点是 dense prediction 容易产生大量候选框,需要 N M S,且早期 Y O L O 对小物体、密集物体不如 two-stage 方法。
RetinaNet 的关键思想是 Focal Loss,用来解决 single-stage dense detector 中正负样本极度不平衡的问题。标准二分类交叉熵为:
其中:
Focal Loss 是:
其中 是 focusing parameter, 是类别平衡系数。当样本很容易分类时, 接近 1, 很小,loss 被降低;模型会更关注 hard examples。
重要程度:★★★★☆。课件中重点展示 Y O L O 输出结构;RetinaNet 只列为 single-stage detector,但如果期末涉及检测方法对比,Focal Loss 很值得掌握。
7. D E T R:把检测改写为集合预测
D E T R 的核心转变是:不再使用 anchors、IoU thresholds、N M S,而是把 object detection 视为 set prediction。模型直接输出固定数量 个 object queries 的预测: hat(c)i,hat(b)i 其中没有 object 的 query 预测为 no-object 类。
D E T R 的训练关键是 Hungarian bipartite matching。给定真实 objects:
预测集合: hat(p)i,hat(b)i 其中 。先找一个最优匹配 :
匹配代价通常包括分类代价和 box 代价:
完成匹配后,再对匹配上的 prediction 做分类和 box regression loss,未匹配的 query 训练为 no-object。
D E T R 的意义是:它消除了很多手工工程组件,例如 anchors、N M S、proposal generation、复杂 IoU threshold assignment。它依赖 Transformer 的 global reasoning,用 object queries 表示一组待预测对象。
重要程度:★★★★★。D E T R 是现代检测的重要范式转变,重点是 set prediction + Hungarian matching + no anchors + no N M S。
8. Instance Segmentation:Mask R-C N N
Instance segmentation 要输出:
其中 是第 个实例的 binary mask:
它比 object detection 多了 mask,比 semantic segmentation 多了 instance identity。
Mask R-C N N 是 Faster R-C N N 的扩展:在 RoI feature 上除了分类头和 bbox regression “head”,再加一个 mask “head”。流程是:
Backbone + R P N
↓ proposals
RoI Align
↓ fixed-size RoI feature, e.g. 256×14×14
classification "head" → class scores
box "head" → 4C box coordinates
mask "head" → C × 28 × 28 masks
Mask “head” 对每个类别预测一个 mask:
训练时只对 ground-truth 类别对应的 mask 计算 binary cross entropy:
其中 , 是真实 mask 像素, 是预测概率。
整体 loss 是:
RoI Align 是 Mask R-C N N 的关键细节。它相比 RoI Pooling 去掉了粗暴量化,使用 bilinear interpolation 保留更准确的空间对齐。因为 mask prediction 对像素级对齐非常敏感,所以 RoI Align 对 instance segmentation 很重要。
重要程度:★★★★★。考试容易问:Mask R-C N N 相比 Faster R-C N N 加了什么?为什么需要 RoI Align?mask loss 怎么算?
9. Visualization:从看 filter 到看 saliency
模型解释部分的核心目标是:理解 C N N 到底学到了什么,以及哪些像素影响分类结果。
第一层 filter visualization 很直接。C N N 第一层卷积核形状如 AlexNet:
表示 64 个 filter,每个 filter 有 3 个 R G B channel,每个空间大小为 。ResNet / DenseNet 第一层常见为:
第一层 filter 通常能可视化出边缘、方向、颜色 blob 等低级视觉模式。
Saliency Map 的思想是:看类别分数对输入像素的梯度。给定类别 的 unnormalized score:
计算:
由于 ,所以梯度也是:
saliency map 通常取 R G B channel 上的绝对值最大值:
直觉是:如果某个像素轻微变化会强烈影响类别 score,那么该像素对分类重要。
重要程度:★★★★☆。Saliency via backprop 的公式很可能考,尤其是“对 unnormalized class score 求梯度,而不是 softmax probability”。
10. C A M 与 Grad-C A M
C A M,即 Class Activation Mapping,依赖特殊结构:最后一个卷积层后接 Global Average Pooling,再接 linear classifier。
设最后卷积特征为:
其中 是第 个 channel 在位置 的激活。Global Average Pooling 得到:
分类 score 为:
代入 G A P:
因此类别 的 C A M map 是:
其中 是 classifier 中类别 对 channel 的权重。直觉是:如果某个 channel 对类别 权重大,并且在某个空间位置激活强,那么这个位置对类别 重要。
C A M 的限制是:只能用于特定架构,通常要求最后 conv layer + G A P + linear classifier。
Grad-C A M 解决这个限制。它可以用于任意卷积层。给定某层 activation:
先计算类别 score 对 activation 的梯度:
然后对空间维度做 global average pooling,得到每个 channel 的重要性权重:
最后得到 Grad-C A M:
这里 ReL U 的作用是只保留对类别 有正贡献的区域。Grad-C A M 的物理直觉是:梯度告诉我们“如果增强这个 feature channel,会不会提高类别分数”;activation 告诉我们“这个 feature 在哪里出现”。二者相乘加权后,就得到类别相关的空间热力图。
重要程度:★★★★★。C A M / Grad-C A M 的公式、区别、Grad-C A M 的四步流程都是重点。
11. Foundation Vision Model 与 S A M
本章最后从传统 supervised vision tasks 过渡到 promptable foundation model。N L P 中 L L M 可以通过 prompt 做 zero-shot transfer,例如 summarization、conversation、content creation。视觉任务也希望有类似模型,但困难在于:视觉标注尤其 segmentation mask 标注非常贵,数据稀缺。
S A M,即 Segment Anything,试图把 segmentation 变成 promptable task:
prompt 可以是 point、box、text、mask。即使 prompt 有歧义,模型也要返回合理 mask。
S A M 的系统由三部分构成:
Image Encoder
↓ heavy ViT, M A E pretraining
Prompt Encoder
↓ point / box / text / mask embeddings
Mask Decoder
↓ lightweight transformer decoder + upsampling
Output masks + predicted IoU
Image encoder 是 heavy ViT,并使用 M A E 预训练。M A E 的关键思想是 masked autoencoding:随机 mask 掉大量 patches,例如 75%,encoder 只处理可见的 25% patches,然后 decoder 结合 mask tokens 重建像素。视觉中 M A E 和 N L P M L M 不完全一样,因为相邻图像 patch 冗余更强,重建像素不等于预测语义 token,所以需要较强 decoder,但 decoder 仍比 encoder 轻。
Prompt encoder 的编码方式:
Point prompt:点的位置编码 + 前景/背景 learnable embedding。
Box prompt:两个角点的位置编码 + 表示角点类型的 learnable embedding。
Text prompt:C L I P text encoder。
Mask prompt:卷积处理 mask,然后与 image embedding 做 element-wise sum。
Mask decoder 使用轻量 transformer decoder,包含 prompt self-attention、prompt-to-image cross-attention、M L P、image-to-prompt cross-attention,最后用 transposed convolution 上采样得到 mask。
S A M 会预测三个 masks:
原因是 prompt 可能有歧义,例如一个点可能对应 whole object、part、sub-part。训练时对多个 masks 只反传最小 loss:
同时还有一个 IoU prediction token,用来预测每个 mask 的质量并排序:
S A M 的数据引擎分三阶段:
Assisted manual stage:
120k images, 4.3M masks
↓
Semi-automatic stage:
180k images, 5.9M masks
↓
Fully automatic stage:
11M images, 1.1B masks
Fully automatic stage 用密集点 prompt,例如 grid,保留高置信度 mask,并用 NMS 去重。
SAM 的 zero-shot transfer 用法包括:edge detection、object proposals、instance segmentation。例如用 object detector 输出 bounding boxes,再把 boxes 作为 SAM prompt 得到 mask;也可以把 mask 再反馈给 decoder refine。
重要程度:★★★★☆。SAM 结构、promptable segmentation、三个 mask 输出、IoU prediction、model-in-the-loop data engine 是重点。
总结对比表
| 任务 | 输入 | 输出 | 是否有空间位置 | 是否区分实例 | 典型方法 | | ———————– | ————– | ———————– | ——– | ———– | ——————————- | | Classification | Image | Class label | 否 | 否 | CNN, ViT | | Semantic Segmentation | Image | Pixel label map | 是,像素级 | 否 | FCN, U-Net | | Object Detection | Image | Boxes + classes | 是,box 级 | 是 | R-CNN, Faster R-CNN, YOLO, DETR | | Instance Segmentation | Image | Boxes + classes + masks | 是,mask 级 | 是 | Mask R-CNN, SAM-based pipeline | | Saliency / CAM | Image + model | Importance map | 是 | 不一定 | Saliency, CAM, Grad-CAM | | Promptable Segmentation | Image + prompt | Valid mask(s) | 是 | 由 prompt 决定 | SAM |
最核心考试记忆链
本章最重要的逻辑不是背模型名字,而是理解每一步为什么出现:
Classification 不够:没有位置
→ Semantic segmentation:每个像素分类
→ Sliding window 太慢:重复计算
→ FCN:共享卷积特征
→ FCN 下采样丢分辨率:需要 upsampling
→ Transposed conv / unpooling:恢复空间尺寸
→ U-Net:skip connection 恢复细节
Detection 输出数量可变
→ crop 分类太慢
→ R-CNN 用 proposal 减少搜索
→ R-CNN 每个 RoI 跑 CNN 太慢
→ Fast R-CNN 共享整图 feature
→ proposal 仍慢
→ Faster R-CNN 用 RPN 学 proposal
→ single-stage detector 用 dense prediction 换速度
→ DETR 用 set prediction 消除 anchors 和 NMS
Segmentation + Detection
→ Mask R-CNN:Faster R-CNN + mask "head" + RoI Align
理解模型
→ filter visualization 看低层特征
→ saliency 看输入梯度
→ CAM 用 classifier weights 定位
→ Grad-CAM 用 gradients 泛化到任意层
Foundation model
→ SAM 把 segmentation 变成 promptable task
→ image encoder + prompt encoder + mask decoder
→ 多 mask 输出处理歧义
→ data engine 扩大 mask 数据