上一讲第 8 讲:注意力机制与 Transformer 下一讲第 10 讲:视频理解

第 9 讲:目标检测、图像分割与可视化理解

Object Detection, Image Segmentation, Visualizing and Understanding —— 从 Vision Transformer 的温故开始,沿着计算机视觉核心任务的主线一路推进:语义分割的全卷积网络与上采样、分类加定位的回归思路、目标检测的两阶段 R-CNN 系列与单阶段 YOLO、纯 Transformer 的 DETR、实例分割的 Mask R-CNN,最后落到可视化与理解:显著图、CAM与 Grad-CAM

本讲概览:

本讲覆盖计算机视觉的几类核心算法与任务:检测(detection)与分割(segmentation),以及可视化与理解(visualization and understanding)。老师开宗明义地调侃:如今"没人再关心目标检测了,因为一行代码就能搞定"——但在过去十到十五年里,这些任务上积累的大量算法演进非常值得学习,因为当你有一天要自己设计新模型时,需要知道去哪里找、怎么设计。可视化与理解则在许多应用里举足轻重:例如医疗数据场景中,"肿瘤在哪里"往往比"有没有肿瘤"更重要。讲座先用一段开场回顾补完上一讲 Vision Transformer 的细节与现代改进(Pre-LN、RMSNorm、SwiGLU、MoE),再依次讲语义分割、目标检测(两阶段与单阶段、DETR)、实例分割(Mask R-CNN),最后以神经网络的可视化与理解收尾。

一、开场回顾:Vision Transformer 与现代改进

1.1 ViT 流程温故:patch、token 与位置编码

上一讲我们完成了从 RNN 到 Transformer 的过渡:Transformer 由若干层组成,每层包含多头自注意力(multi-head self-attention)层归一化(layer norm)MLP;编码器负责编码输入序列,若需要生成图像或语言等序列输出,则用结构类似的解码器把编码器的 token 作为输入、逐个生成期望的输出。我们也讨论过:自注意力虽然比 RNN 和卷积更贵——计算量和显存需求都更大——但换来了对序列好得多的建模能力,在各类任务上的结果都更好,因此成为当今多数应用的主流选择。

用 Transformer 处理图像的方式即 Vision Transformer(ViT):把图像切成 \(S \times S\) 的小块(patch,课上是 \(3 \times 3\) 的例子),每个 patch 经线性投影变成一个 \(D\) 维向量,称为 token。但切块本身丢失了像素在图像中的二维位置信息,所以要额外添加位置嵌入(positional embedding)——实现方式很多:可以按序列编号 1、2、3……简单地编码,也可以用二维的 \(x\)/\(y\) 坐标编码后相加。加上位置信息的 token 随即送入标准的 Transformer 层(自注意力、layer norm、MLP,一切照旧),输出层为每个输入 token 生成对应的输出向量。

要做图像分类,有两种标准做法:

另有一个与语言建模的微妙差别:图像是一次性全部看到的,不需要掩码(masking)——语言是严格的时间序列,不能偷看未来;而视觉 Transformer 看到的是整张图,不存在这个问题。训练的监督方式则完全沿用之前讲过的工具:反向传播、softmax 交叉熵损失等。老师说:"这就是 ViT 的全部(ViT in a nutshell)。"

1.2 现代 Transformer 的四个常用改进

多年来这套架构的基本形态没有变,今天的许多现代模型仍在使用这些组件,但有若干为提升性能与训练稳定性的经验性优化,值得快速过一遍:

  1. 把 LayerNorm 挪进残差分支(Pre-LN)。原始后归一化(post-norm)设计中,归一化在残差连接之后:信号刚加完残差就被归一化改写数值,网络因此永远无法表达恒等映射(identity function)——而残差连接本来最想要的恰恰就是恒等。解法是把 layer norm 移到残差分支内部:一个放在自注意力之前,一个放在 MLP 之前。归一化仍然在场,恒等性也保住了。
  2. RMSNorm(root mean square normalization,均方根归一化):一种更基础的归一化——对每个特征做归一化时不再减均值,只除以均方根。经验上能让训练更稳定;虽然也有一些"为什么有效"的理论解释,但被采纳的主要原因就是稳定性。
  3. SwiGLU MLP:把普通两层 MLP 换成带门控非线性(gated nonlinearity)的版本——权重矩阵从两个(\(W_1\)、\(W_2\))变成三个,其中一个分支充当"门"调制另一分支。诀窍在于把隐藏层宽度取为 \(8/3\) 倍(约 \(2.67d\) 而非 \(4d\)),参数量与传统 MLP 持平,却能在该层学到更高维的非线性,小架构也受益。
  4. 混合专家(Mixture of Experts,MoE):不再只有一组 MLP,而是并行放置多组 MLP(多个"专家"),通过一个路由器(router)把每个 token 路由到 \(E\) 个专家中的 \(A\) 个(\(A\) 个激活专家)。这样显著增加参数量却几乎不增加计算量,帮助学到更鲁棒的模型。老师强调:如今所有的大语言模型(LLM)用到的都是这类改进。

关于 MoE 的两个课堂问答。其一,"不同专家有什么直觉?"——因为专家们并行训练、初始化各不相同,它们往往各自学到某一侧面(有时高度相关)。本质仍是加参数加算力:当数据需要模型同时掌握多个概念(例如多种概率分布/多个模态)时,多专家让网络有力量把这些模式分开。其二,"专家数量是超参数吗?"——是,而且实践中通常预先设定,不必过度精调。

本节的核心结论:ViT 的标准配方是"切 patch → 线性投影成 token → 加位置编码 → 标准 Transformer 层 → class token 输出或池化输出 → softmax 交叉熵监督"。现代改进(Pre-LN、RMSNorm、SwiGLU、MoE)大多是经验性选择,目标是让更深更大的 Transformer 训练更稳、单位算力的表达力更强。

二、计算机视觉的核心任务版图

回到本讲主线。课程伊始反复出现的那张任务版图,把视觉任务按"回答的问题"层层递进:

老师再次吐槽:这些任务如今看起来"过时"——检测一行代码就能调用——但过去十到十五年间这里发生过密集的算法演进,理解这条脉络是为了将来自己设计模型时知道去哪里找思路。同时预告最后一块内容:可视化与理解——例如医疗应用中,可视化/理解往往比分类或检测本身更重要:医生想知道肿瘤在哪里、为什么,而不只是有没有。

三、语义分割:给每个像素一个标签

3.1 任务定义与最朴素的做法

语义分割要求把图像中每一个像素归入某个类别(物体或场景元素的标签),训练目标是:测试时输入一张图,输出一张与原图对应的标签图(label map)

最直觉的做法是逐像素分类:对每个像素,取它和周围的邻域 patch,训练一个分类网络(架构随意——CNN、ResNet、ViT 都行,因为这就是在给一小块图像做分类)输出该像素的标签。但有两个致命问题:其一,单看一个像素本身几乎不可能判断它属于什么——上下文(context)至关重要,必须看周围区域(这也是为什么要取 patch);其二,也是更致命的:太慢——对图中每个像素都完整跑一遍网络,生成整张分割图将"永远跑不完"。

3.2 全卷积网络(FCN):一次前向输出整张标签图

更好的思路:训练一个网络,输入整张图、直接输出整个像素标签图——不是一个标签,而是一个标签矩阵。这要求网络的输入层与图像同尺寸、输出层也保持"膨胀"状态;全连接层在这里用不了(我们要生成的是一张图),因此整网保持卷积——这就是全卷积网络(fully convolutional network,FCN)。FCN 是分割领域最基础也最广泛使用的算法族。

但直接让所有层都保持全分辨率有个大问题:图像大、层大、参数极多——早年 GPU 算力有限时,这是训练的真正瓶颈。于是算法演化成了如今熟悉的样子:从全分辨率逐级下采样(用池化、步幅卷积等已学过的操作),到网络中部形成分辨率低但通道数厚的表示,再逐级上采样回到原图尺寸生成输出像素。下采样我们是熟悉的(第三讲讲过池化与 strided convolution);真正的新问题是——上采样怎么做?我们没有"反池化"或"反向步幅卷积"这样的现成操作,必须发明能逆转下采样新算子。

3.3 怎么训练:逐像素 softmax 求和

讲上采样之前,老师停下来问了大家一个问题:这个"图像进、图像出"的网络,损失函数怎么定义?有同学答对:既然每个像素都在做分类,那就对图中所有像素求和,每一项都是普通的 softmax 损失——

$$ L = \sum_{\text{所有像素 } i} L_{\mathrm{softmax}}( f(x)_i, y_i ) $$

然后照常反向传播即可,不需要任何新工具。那训练需要什么监督信号?需要逐像素的 ground truth 标签图——这类算法是全监督的。早年有大量工作靠人 sitting down 手工逐像素标注来喂饱这些算法;如今有了工具,不再需要那样原始的方式。

3.4 上采样第一族:反池化(unpooling)

上采样本身并不神秘,第一种方案是无参数的反池化,常见三种:

3.5 上采样第二族:转置卷积——可学习的上采样

上面这些都只是固定操作、没有参数。可学习上采样同样可行,其思路是把卷积"反过来用"。先复习:卷积层是把滤波器作用于每个像素邻域产生输出;要下采样时用步幅为 2 的步幅卷积(strided convolution),每步跳 2 格生成输出。上采样则对称地做:让低分辨率图上的一个输入位置对应放大后图像中的一片区域,定义一组可学习的权重把该输入映射到输出区域;相邻输入的映射区域会重叠,重叠处的输出取求和

深入

一维例子走一遍。设输入只有两个值 \(a\)、\(b\),学习一个长度为 4 的滤波器(权重 \(w_1 \ldots w_4\))。把滤波器作用在 \(a\) 上,写出 4 个输出;作用在 \(b\) 上,再写出 4 个输出——两组输出在中间重叠 3 格,重叠位置的结果 = 来自两个位置的贡献相加。最终 2 个输入变成 5 个输出(\(4 + 4 - 3\) 重叠),分辨率升高,且"怎么放大"由 \(w\) 学出来。二维同理:拿一个 \(3 \times 3\) 的权重块,对输入的转置版本做卷积,产出比输入更大的输出——这就是转置卷积(transposed convolution),普通卷积的"反向"。

为什么叫"转置"?卷积本质是一个(巨大的)矩阵乘 \(y = Cx\);把同一个矩阵转置来用(\(y = C^\top x\)),维度便从小变大——这就是名字的由来。课上细节放进了附加幻灯片,老师留作课后自查。有同学问"滤波器是训练出来的吗?"——是,它和其他卷积层完全一样,所有滤波器都参与训练。

3.6 U-Net:把编码器的细节抄送给解码器

把上面的"下采样—上采样"结构画成图,形状像字母 U,这就是大名鼎鼎的 U-Net——其实与前面讲的架构一模一样,只是画法像 U。下采样阶段扩大感受野但损失空间信息;上采样阶段恢复到图像分辨率。U-Net 的独特之处在于:分割需要解码端保留空间细节——下采样弄丢的分辨率,如果上采样端拿不回来,输出边界就会发虚(boundaries are faded)。因此 U-Net 把编码器各层的特征图直接拷贝、作为解码器对应层的输入(跳跃连接,skip connections),把图像的结构信息带进解码端,生成锐利得多的输出。

老师特别强调 U-Net 的现实地位:直到今天,如果不借助基础模型(foundation model),医疗影像分割里的很多应用仍在用 U-Net 或其变体取得最优结果。语义分割小结:全卷积网络 + 逐像素 softmax 求和训练;下采样用熟悉的卷积/池化,上采样用反池化(最近邻、床钉、最大反池化)或可学习的转置卷积;U-Net 用跳跃连接保住细节。
拓展

语义分割的后续演进。FCN/U-Net 之后还有两条值得知道的路线:一是 DeepLab 系列用空洞卷积(dilated/atrous convolution)在不降低分辨率的前提下扩大感受野,配合 CRF 后处理 refine 边界;二是 Transformer 时代用 ViT 编码器 + 屏蔽注意力 / 掩码分类头做集合预测式的分割,如 Mask2Former(其"对象查询"思想直接继承自下文的 DETR);SegFormer 则用轻量金字塔 Transformer 编码 + 简单 MLP 解码。医学领域 nnU-Net(自适应配置的 U-Net)至今仍是强力基线——印证老师所说"U-Net 及其变体仍在产线服役"。

四、从语义分割到实例分割:同一类里的"这一只"和"那一只"

语义分割只有像素标签:如果图里有两只同类的狗,它完全没有办法告诉你哪些像素属于第一只、哪些属于第二只——它只管输出"这里是狗、那里也是狗"。而实例分割(instance segmentation)要求更进一步:这些像素属于这一个实例的狗,旁边那些属于另一只狗。要做到这一点,模型必须先理解图像中的多个独立对象——这就把话题自然引到了本讲的重量级主角:目标检测。它是图像分类之后计算机视觉最核心的问题之一,多年来催生了海量算法,课上"飞过"一部分、重点讲几个。

五、目标检测:从回归一个框到 YOLO 与 DETR

5.1 单个对象:分类 + 定位,一个多任务损失搞定

先考虑最简单的情形:图里只有一个对象。那么网络需要输出两样东西:类别分数(分类的老问题)和边界框(bounding box)的坐标——\(x\)、\(y\)、\(h\)、\(w\) 四个数。怎么训练?非常直接:类别分数用softmax 损失,框坐标用 \(L_2\) 损失(一个简单的距离度量、回归损失)。两个损失相加构成复合多任务损失(multi-task loss),一次反向传播同时学两件事:

$$ L = L_{\mathrm{softmax}}(\text{类别分数}) + \lambda \cdot L_2(\text{框坐标}) $$

老师评价:"这很简单,可行(simple, doable)。"——前提是图里只有一个对象。

5.2 多个对象:定长输出失效

多对象场景下这条路线立刻崩塌:输出层是定长的,而对象数量不定。三个对象要输出 12 个数(\(3 \times 4\) 坐标)外加各自动类别,对象更多时数字更多——你无法预先知道该留多少输出位。这条"把分类直接扩展成检测"的路子不可扩展(not scalable)

5.3 滑动窗口:暴力扫描的组合爆炸

经典替代方案:既然每个小窗口内可以看作单对象问题,那就把窗口在图上滑一遍。对每个边界框判断"猫 / 狗 / 背景",从坐标 \((0, 0)\) 开始,遍历所有 \(x\)、\(y\)、\(w\)、\(h\) 的组合,逐步找出各类对象概率最大的框。想法直接,但框的组合数是天文数字——依旧不可扩展。文献中(2014 年及更早)的应对思路是:别扫所有框,先找出"很可能有对象"的区域——区域提议(region proposals)。有了靠谱的区域提议,检测就变成一个"简单得多"的问题。

5.4 R-CNN:对每个提议区域跑一遍 CNN

R-CNN 的流程:拿到区域提议后,把每个提议的 patch 抠出来,对每个 patch 跑一遍 CNN 做分类;不仅如此,还可以细化(refine)边界框——即分类的同时回归出对提议框坐标的小修正。这套"分类 + 修框"的组合能工作,是 2014 年以前的代表算法;但毛病显而易见:——每个框都要完整跑一次卷积网络。

5.5 Fast R-CNN:整图只卷一遍,区域在特征图上看

关键的改进利用了卷积的一个本性:卷积操作保持空间对应关系——无论下采样还是上采样,我们总有办法追踪特征图上的位置对应原图的哪里。于是不必对每个 patch 单独跑网络,而是对整张图跑一次大卷积,得到覆盖全图的特征图;区域提议直接映射到特征图上对应区域,在特征图的区域上跑一个较小的网络,输出两样东西:框偏移(该不该把框挪一挪、挪多少)和物体类别。这就是 Fast R-CNN——把"N 次大卷积"变成"1 次大卷积 + N 次小计算"。

5.6 区域提议网络(RPN):把"提议"也学出来

有同学问:提议区域的数量是预先定义的吗?——简短回答:是。这就要说区域提议网络(region proposal network,RPN)。做法:从一个 CNN 出发,在图像的不同位置随机起始一批框,通过多层卷积逐步细化那些"包含对象概率高"的区域(因为我们手里有对象的类别标签和位置标注,这个过程是可以监督训练的),同时每个框回归出坐标修正。最终取概率最高的前 \(K\) 个(top-\(K\))作为该图的提议。课上示例图只有一个对象,所以大多数提议都聚在那一个对象周围;一般场景下不同对象会各自吸引高概率提议。

拓展

RPN 里"在不同位置、以不同尺度预设一组参考框再去回归修正"的思想,在文献里就是大名鼎鼎的 anchor(锚框):在每个空间位置铺若干预设长宽比的框,网络只需学习"每个 anchor 是否有对象 + 怎么微调"。Faster R-CNN = 共享主干 + RPN + Fast R-CNN 头,是两阶段检测的巅峰形态。老师课上没有展开 anchor 细节("坐标和维度细节留给你们课后查"),建议对照原论文补全。

5.7 两阶段的代价

老师坦言:R-CNN、Mask R-CNN 这类算法如今已不再实际使用,因为计算上太重。原因之一正是结构性的:需要两个分离的网络——一个区域提议网络,一个分类加框细化网络——相当于每张图至少跑两遍才能完成检测。但理解"我们如何走到今天"非常重要;老师还建议课后亲手把坐标和维度算一遍,收益会很大。

5.8 单阶段检测:SSD 与 YOLO

于是有了单阶段(single stage)目标检测器:SSD,以及其中最流行的 YOLO(You Only Look Once)。做任何计算机视觉工作的人几乎都听说过 YOLO——直到今天,虽然它的早期版本(至少)是个卷积重度网络,大量工业应用仍以 YOLO 作为检测基座:它,同时检测质量很好。

名字即算法:只看一次——对图像做一次前向传播,同时吐出所有边界框。机制:把图像划分成 \(S \times S\) 的网格(课上的例子是 \(7 \times 7\)),构建一个全卷积网络,对每个网格单元输出三样东西:

所有网格同时算完(同一个网络、一次前向),于是全图得到 \(S \times S \times B\) 个框、每个框带一个概率(幻灯片上用边的粗细表示概率)。有同学问"第二张图(密密麻麻的框)怎么来的?"——就是这个:\(7 \times 7\) 每格 2 框,共 98 个候选,各自带概率。接下来用阈值化(thresholding)筛掉低概率框,再用论文中的非极大值抑制(non-maximum suppression,NMS)等算法挑出最终的高概率检测。老师强烈建议有空去翻 YOLO 的代码仓库——新版本层出不穷,在医学、机器人和大量工业应用中被广泛使用。

深入

把 NMS 和检测评价标准算清楚。老师提到"阈值化 + NMS"但没展开,这里补全。检测里衡量两个框的重叠用 IoU(Intersection over Union,交并比)

$$ \mathrm{IoU}(A, B) = \frac{|A \cap B|}{|A \cup B|} $$

算个具体例子。狗的真值框为 \((100, 100, 200, 200)\)(左上、右下角点),面积 \(100 \times 100 = 10000\);预测框为 \((80, 80, 200, 200)\),宽高各 120,面积 \(14400\)。交集是 \((100, 100, 200, 200)\),面积 \(10000\);并集 \(= 10000 + 14400 - 10000 = 14400\)。IoU \(= 10000 / 14400 \approx\) \(0.69\)。若判定阈值取 \(0.5\),这个预测算命中(TP);若预测框是 \((150, 100, 250, 200)\),交集只剩 \(50 \times 100 = 5000\),并集 \(15000\),IoU \(\approx 0.33\),则判为未命中。

NMS 流程(以"猫"类为例):① 按置信度排序:框 \(A\) \(0.95\)、框 \(B\) \(0.80\)、框 \(C\) \(0.70\);② 保留最高的 \(A\),计算其余框与 \(A\) 的 IoU——\(B\) 与 \(A\) 的 IoU \(= 0.62 \gt\) 阈值 \(0.5\),\(B\) 被抑制;\(C\) 与 \(A\) 的 IoU \(= 0.08 \lt 0.5\),保留;③ 在剩余框中重复,直到处理完。最终输出 \(A\)、\(C\) 两个不重复的猫框。

mAP(mean Average Precision,平均精度均值)是检测的标准评价指标。单类 AP 的求法:把该类所有预测按置信度降序排列,逐个判定 TP/FP(判定标准就是 IoU 是否达标),边扫边算精确率 \(P = \mathrm{TP} / (\mathrm{TP} + \mathrm{FP})\)召回率 \(R = \mathrm{TP} / \text{全部真值数}\),得到 PR 曲线,曲线下面积(按 VOC 连续插值取包络)即 AP。小例子:设"狗"有 3 个真值,5 个按分数排好的预测为 TP、TP、FP、TP、FP,则各点 \((R, P)\) 为 \((0.33, 1.00)\)、\((0.67, 1.00)\)、\((0.67, 0.67)\)、\((1.00, 0.75)\)、\((1.00, 0.60)\);按召回率每前进一段乘以"该段之后最大精确率"求和:\(0.33 \times 1.00 + 0.33 \times 1.00 + 0.33 \times 0.75 \approx\) \(AP = 0.92\)。对所有类别取平均即 mAP(比如狗 \(0.92\)、猫 \(0.81\)、自行车 \(0.74\),则 mAP \(\approx 0.82\));COCO 风格还会对 IoU 阈值 \(0.50 \sim 0.95\) 每隔 \(0.05\) 各算一遍再平均,得到更严格的 \(\mathrm{mAP}@[.5:.95]\)。

5.9 两阶段 vs 单阶段 vs DETR:一张表看清

维度两阶段(R-CNN / Fast R-CNN / Mask R-CNN)单阶段(YOLO / SSD)DETR 系
基本流程先提候选区域(RPN 取 top-\(K\)),再逐区域分类 + 回归一次前向直接在网格/锚点上出全部框和分数Transformer 编码器 + 解码器 + 对象查询,一次前向出固定数量预测
速度慢:两个分离网络、每图至少两遍(老师原话:如今已不实际使用)快,可实时,工业界主力推理可并行;原版训练收敛极慢
后处理需要 NMS需要阈值化 + NMS无需 NMS(一对一匹配的集合预测)
定位与精度精度高,尤其小对象(逐区域精修)早期略逊于两阶段,靠规模与结构改进追平原版小对象弱,后续改进版登顶

5.10 DETR:用 Transformer 的查询机制做检测

更近期的一条路线是 DETR(DEtection TRansformer)——纯粹基于上一讲讨论过的 Transformer 组件:自注意力与交叉注意力模块同样可以为我们生成目标检测和边界框。论文是 2020 年的(距今约五年),老师直言它如今"已过时(deprecated)、没人在真实应用里用它",但作为如何用 Transformer 做检测的范例非常好。流程:

  1. 与 ViT 相同,把图像切成 patch,patch 经过 CNN 形成 token,加上位置编码——这些就是输入 token;
  2. 送入 Transformer 编码器(多层"自注意力 + 归一化 + MLP"),输出处理后的 token;
  3. 聪明的一步在解码器:Transformer 解码器一方面以编码器的输出 token 作为输入(交叉注意力的来源),另一方面我们定义若干查询(object queries)——它们本身就是可训练参数。放 5 个、10 个或 20 个查询,意思就是"这张图里我最多想检测 20 个对象";
  4. 解码器内部:查询之间先做自注意力,再与编码器输出做交叉注意力,层层堆叠后,每个查询得到一个输出向量,经前馈网络(FFN)转成类别标签 + 边界框坐标——某些查询的输出则是"无对象(no object)";
  5. 最终输出:一组"边界框 + 类别"。

这段问答非常密集,老师的澄清句句关键:

拓展

DETR 的后续与"零样本"的回答。老师说的"deprecated"指 2020 年的原版 DETR:它收敛极慢(数百 epoch)、小目标差。后续修补成就了新王朝:Deformable DETR 只在一小撮采样点上做稀疏注意力,收敛大幅提速;DINO(DETR with Improved deNoising anchOr boxes,2022)结合去噪训练与对比匹配,在 COCO 上首次超越最强 CNN 检测器;RT-DETR 做到实时,大规模下反超 YOLO。至于课上"零样本"之问,今天的答案是开放词汇/零样本检测:Grounding DINO、OWL-ViT 等用图文对齐(CLIP 式)把类别从固定向量解放成自由文本,检测"训练里没见过的类"已是现实。此外,检测评价中与 mAP 并列的还有 COCO 的 \(\mathrm{AP}_{\text{small/medium/large}}\) 等分尺寸指标。

六、实例分割:Mask R-CNN——给每个检测框再发一张 mask

有了检测,回到开头的那个问题:怎么做实例分割?答案其实不难,就是把 R-CNN 的思路再往前推一步。回顾流水线:图像 → CNN → 区域提议网络给出边界框 → 边界框变成类别标签和框坐标细化。Mask R-CNN 在此之上再加一个输出头,把任务变得更加多任务化:再接一层卷积,为每个对象在像素级生成掩码(mask)。这个 mask 与输入图像(或该层特征图)同尺寸——用全卷积网络的话,这正是我们熟悉的那种输出。

于是对每个检测出的对象(框),我们都能拿到它的像素级 mask:椅子在不同框设置下的 mask、床和人的 mask、图中婴儿的 mask……Mask R-CNN 的检测结果非常好,能可靠地检出并分割各种训练过的已知对象;业界也有大量现成 API 与开源版本可以直接探索。

R-CNN 流水线 + 一条 mask 分支 = Mask R-CNN。输出从"类别 + 框"变成"类别 + 框 + 逐像素 mask",用与 FCN 同源的卷积头生成,实例的区分由"每个提议区域各自出一张 mask"天然实现。

老师再次强调这些经典任务的现实价值:虽然今天的计算机视觉已经远超这些任务,但假设你有工业应用——比如在生产线上把烂西红柿和好西红柿分开做质量控制——你仍然需要先检测出对象、再把它们分类成好/坏,而且要实时完成。这就是为什么理解这些步骤与流水线依然重要。当然,如今也有大家熟悉的大规模模型可以一把梭。

拓展

SAM:分割也进入了"基础模型"时代。呼应老师那句"如果你不想用基础模型,U-Net 仍是最优"——2023 年 Meta 的 SAM(Segment Anything Model)用 11 亿个 mask 训练了可提示(promptable)分割:给一个点、一个框甚至一句文本,掩码解码器就输出对应对象的 mask,对没见过的对象具备零样本泛化;配套的 SA-1B 数据集把"逐像素标注"这个早年靠人 sitting down 画标签的苦活变成了历史注脚。SAM 2 进一步把统一模型推广到视频。检测/分割领域的当代格局:YOLO 系与 RT-DETR 负责实时闭集检测,Grounding DINO + SAM 等负责开放词汇理解与可提示分割。

七、可视化与理解:网络到底在看哪里

最后一块内容(老师原计划讲十分钟):可视化与理解。从 2013、2014 年直到 2020 年代,可视化神经网络一直是热门课题——它帮助我们窥见网络到底学到了什么。以下是最重要、你也最可能在自己应用里用到的几种。

7.1 从线性分类器的"模板"到第一层滤波器

回忆线性分类器:观察学到的线性函数权重,可以把每个类别可视化为一张模板(template)——比如"汽车"类的模板看上去就是一辆正面朝向的车。神经网络可以做类似的事:可视化它的卷积滤波器。对第一层滤波器(输入只有 3 个通道时)可以当成 RGB 图直接画出来——能看到网络学到的是一些基本形状、方向和简单图案。限制在于:只有通道数少的层才能这样直接可视化;CNN 中间层动辄几十上百通道,没法简单地画成可见图像。总体规律是:浅层学局部简单模式,越往后越整体、越大;想看深层的模式需要一种叫导向反向传播(guided backpropagation)的方法,不再像第一层这么简单。

7.2 显著图:对像素求梯度

第二个重要概念是显著图(saliency map):很多应用里你需要知道哪些像素重要。医疗例子again:做"肿瘤 vs 无肿瘤"分类时,自动化场景下没人在乎"有没有肿瘤"这个二值答案,每个人都在乎肿瘤在图像的哪个位置

做法出乎意料地简单,用的正是我们最熟悉的梯度。训练网络时,我们一直是拿损失(或类别分数)对权重求导来更新权重;现在把求导的对象换成像素值——"每个像素变化一点点,'狗'的分数会变多少?"这正是梯度的定义:

$$ S_{\text{显著}} = \frac{\partial s_{\mathrm{class}}}{\partial x_{\mathrm{pixel}}} $$

把这个梯度可视化出来,就得到一张显著图:梯度大的像素,就是对分类起作用的像素——改动它们,"狗"的分数就会变。对网络训练过的各个类别分别跑一遍,就得到各类各自的显著区域。这个方法在很多情形下都相当有效。

7.3 CAM:把类别分数追根到特征图

有时我们不想一路反传到像素,而是想看每个类别的激活如何作用于中间特征——这就是类别激活图(class activation map,CAM),理解 CNN 最广泛使用的算法族之一。逻辑链条:卷积层之后做池化得到特征图(feature maps),特征图再变成类别分数;把数学展开,类别分数可以写成特征图各位置的加权和。由于卷积始终与图像空间一一对应(空间一致性贯穿所有运算),我们可以把类别预测一路追溯回特征图的具体空间位置。用学到的权重去乘特征图、求和,就得到类激活图——它告诉你在图像空间里,是哪些区域在驱动某个类别的分数:

$$ M_c(x, y) = \sum_k w_k^c \cdot f_k(x, y) $$

课上的例子(一座教堂类建筑)非常直观:palace(宫殿)、dome(穹顶)、church(教堂)、altar(祭坛)、monastery(修道院)这些相近类别各自有一张激活图——穹顶的图亮在圆顶上、祭坛的图亮在内部结构上——不同类别由图像的不同区域驱动,一目了然。

CAM 的局限:这套算法只能用在最后一个卷积层上——只有那里"权重直接乘特征"的数学形式才成立。而大多数 CNN 的末尾并非单个卷积层,中间还隔着全连接等各种操作。

7.4 Grad-CAM:用梯度加权,任意卷积层都能看

解决这个局限的变体叫 Grad-CAM(gradient-weighted class activation map,梯度加权类激活图):算法骨架与 CAM 相同,只是权重不再直接取分类头的学习权重,而是对选定卷积层的特征图求类别分数的梯度——相当于把截至该层的权重与梯度聚合起来作为权重——再用它去加权该层特征图,过一个 ReLU 只保留正值,然后(靠着卷积的空间对应)一路映射回图像空间,得到每个对象的热力图。因为权重来自梯度,卷积层与分类头之间隔着什么操作都不怕,任意卷积层都可以可视化。总结:CAM 只能看最后一个卷积层;Grad-CAM 用梯度加权,几乎处处可用——CNN 的可视化靠 Grad-CAM 这类算法

7.5 Transformer:注意力图天生免费

那 Transformer / ViT 呢?它们天生自带"激活图"。还记得上一讲 Justin 展示的那张语言注意力矩阵——每个输出词对每个输入词都有一个注意力权重。对像素可以如法炮制:把 patch 间的注意力权重映射回像素空间,就能在像素空间可视化 ViT 的特征——对每个输出(每个查询/每个头),画出它在关注图像的哪些 patch。所以对 ViT 和 Transformer 来说,可视化容易得多:注意力权重现成就在那里;CNN 才需要 Grad-CAM 这类专门的算法。老师以一句"没想到真把今天想讲的主题都讲完了"收尾,并预告下一讲:视频理解(video understanding)

拓展

可视化工具箱的其余成员。除了课上讲的这些,经典方法还有:导向反向传播(guided backprop,反传时只保留正梯度,得到比显著图更干净的可视化,常与 Grad-CAM 逐点相乘得到 guided Grad-CAM);遮挡实验(拿灰块扫过图像看分数掉多少);以及"优化一张图像让某神经元/某层激活最大化"的特征可视化(DeepDream、DeepDream 一系的 feature visualization)。对 Transformer 则有 attention rollout(把各层注意力相乘累积以刻画信息流动)。需要留意的一点批判性共识:注意力权重并不严格等于"解释"(attention is not explanation),注意力图更多是提示而非因果证明——医疗等高风险场景落地时应结合多种方法交叉验证。

本讲要点回顾

上一讲第 8 讲:注意力机制与 Transformer 下一讲第 10 讲:视频理解