一、核心思想:从"检测"到"分割"的一步之遥
Faster R-CNN能告诉你"哪里有物体 "(边界框)和"是什么物体 "(类别)。但它的输出是矩形框,框内可能包含背景或其他物体,不够精细。
Mask R-CNN的核心思想是:在Faster R-CNN的基础上,增加一个并行的分割分支,对每个候选区域预测一个二值掩码(Binary Mask),实现像素级的实例分割。
一句话总结 :Mask R-CNN = Faster R-CNN + 分割分支 ,但需要解决两个关键问题:RoI Align (解决对齐误差)和独立掩码预测(每个类别独立预测,避免竞争)。
二、三大核心创新(面试绝对重点)
创新1:RoI Align(取代RoI Pooling)
这是Mask R-CNN最核心、最著名的改进,面试官必问。
| 对比维度 | RoI Pooling(Faster R-CNN) | RoI Align(Mask R-CNN) |
|---|---|---|
| 量化操作 | 两次量化 :① 将候选框坐标映射到特征图时取整 ;② 池化时每个网格边界取整。 | 没有量化:保留浮点数坐标。 |
| 采样方式 | 每个网格取最大值(Max Pooling)。 | 每个网格均匀取4个采样点 (或更多),用双线性插值计算每个点的值,然后取最大值或平均值。 |
| 对齐精度 | 有偏差,尤其对小目标和分割任务影响大。 | 像素级对齐,对分割任务至关重要。 |
| 计算开销 | 快(整数操作)。 | 稍慢(浮点运算+插值),但可接受。 |
为什么RoI Pooling对分割不好?
分割需要像素级的精确性 。RoI Pooling的两次量化会导致约几个像素的偏移 ,这在分类任务中可能影响不大(因为分类只需要全局特征),但在分割任务中,几个像素的偏移就会导致掩码边缘不准确,严重影响分割质量。
创新2:分割分支与分类分支解耦
在早期的分割方法中(如FCIS、InstanceFCN),分割和分类是耦合 的------先做分割,再根据分割结果判断类别。这会导致类别竞争问题:如果一个像素可能属于多个类别,模型需要在这之间做权衡。
Mask R-CNN的做法是:每个类别独立预测一个二值掩码。
-
具体来说,分割分支输出
K × m × m的张量,其中K是类别数,m×m是掩码的分辨率(如 28×28)。 -
在推理时,先由分类分支确定RoI属于哪个类别
c,然后只取分割分支中第c个通道的m×m掩码,将其放大到原图大小作为最终分割结果。
这样做的优点 :每个类别的掩码预测互不干扰,不需要在类别间做Softmax竞争,因此能更好地处理重叠物体的分割。
创新3:多任务损失函数
Mask R-CNN的损失函数包含三个部分:
text
L = L_cls + L_box + L_mask
| 损失项 | 说明 |
|---|---|
| L_cls | 分类损失(交叉熵),与Faster R-CNN相同。 |
| L_box | 边界框回归损失(Smooth L1),与Faster R-CNN相同。 |
| L_mask | 分割损失(二值交叉熵) ,只对**正样本(包含物体)**的RoI计算,对每个像素独立地计算二值交叉熵损失。 |
关键点 :分割损失只对正样本计算 ,因为只有正样本才有真实的掩码标签。而且每个像素的损失是独立的,相当于对
m×m个像素做二分类(前景/背景)。
三、面试实战追问(深度考核)
-
问1:为什么Mask R-CNN要把分类和分割解耦?如果不解耦会怎样?
- 答 :如果像早期方法那样,先分割再分类(或共享一个Softmax),会导致类别竞争 ------不同类别的掩码会互相抑制。Mask R-CNN的做法是每个类别独立预测二值掩码 ,分类分支只负责告诉模型"该取哪个通道的掩码"。这样分割质量更高,尤其适合重叠物体的场景。例如,一个人骑着一匹马,人挡住了马的部分身体,解耦后人和马的分割可以同时存在,互不干扰。
-
问2:RoI Align的双线性插值具体是怎么计算的?
-
答 (展示数学功底):对于特征图上的一个浮点数坐标
(x, y),双线性插值取它最近的4个整数像素点(x1,y1), (x1,y2), (x2,y1), (x2,y2),根据距离权重进行加权平均:text
f(x,y) = (1-dx)*(1-dy)*f(x1,y1) + dx*(1-dy)*f(x2,y1) + (1-dx)*dy*f(x1,y2) + dx*dy*f(x2,y2)其中
dx = x - x1,dy = y - y1。整个过程可微,因此梯度可以正常反向传播。
-
-
问3:Mask R-CNN中,掩码分支为什么用卷积层而不是全连接层?
- 答 :全连接层会破坏空间结构 ,将特征展平为一维向量,丢失了像素间的相对位置信息。而卷积层保持空间结构,能更好地学习局部特征,生成精细的掩码。这是分割任务与分类任务在设计上的核心差异------分类需要全局抽象特征,分割需要局部精细特征。
-
问4:分割掩码的损失函数为什么只在正样本上计算?
- 答:因为只有正样本(包含物体的RoI)才有真实的掩码标注。背景样本(负样本)没有对应的物体掩码,无法计算分割损失。而且,如果对负样本也强制预测掩码,会让模型学习无意义的背景模式,反而干扰训练。
-
问5:Mask R-CNN是否可以做关键点检测?
- 答 :可以。Mask R-CNN的框架是可扩展的,作者在论文中也展示了Keypoint R-CNN ------在分割分支的基础上增加一个关键点分支(输出
K×m×m的热力图,K为关键点数量),用同样的RoI Align和独立预测逻辑。这展示了该框架的通用性:可以同时输出框、掩码、关键点等多种信息。
- 答 :可以。Mask R-CNN的框架是可扩展的,作者在论文中也展示了Keypoint R-CNN ------在分割分支的基础上增加一个关键点分支(输出