语义分割为图像中的每个像素分配一个类别标签(如“汽车”、“人物”、“道路”),而实例分割则在此基础上更进一步。它的目标是识别并描绘图像中每个不同的目标实例。因此,它不会将所有属于人的像素标记为“人”,而是为“人1”、“人2”和“人3”输出单独的掩码。这提供了对场景更全面的理解,能够分离同一类别中重叠的对象。实例分割本质上结合了目标检测(用边界框定位单个目标)和语义分割(对像素进行分类)的元素。针对此任务,Mask R-CNN是一种主要且高效的方法之一。Mask R-CNN:扩展目标检测以进行分割Mask R-CNN由Facebook AI研究院(FAIR)的研究人员开发,直接构建在Faster R-CNN目标检测框架之上。回顾一下,Faster R-CNN是一个两阶段检测器:区域提议网络(RPN)提议候选目标边界框(感兴趣区域,即RoIs)。第二阶段使用RoIPool为每个RoI提取特征,然后利用这些特征进行分类(盒子里是什么目标?)和边界框回归(优化框的坐标)。Mask R-CNN扩展了第二阶段,在现有的分类和边界框回归分支之外,增加了第三个并行分支,用于为每个RoI预测分割掩码。digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif"]; subgraph cluster_faster_rcnn { label = "Faster R-CNN 核心"; bgcolor="#f8f9fa"; style=dashed; Backbone [label="CNN 主干网络\n(例如, ResNet)", fillcolor="#a5d8ff"]; RPN [label="区域提议\n网络 (RPN)", fillcolor="#bac8ff"]; RoI_Pool [label="RoIPool / RoIAlign", fillcolor="#91a7ff"]; Class_Head [label="分类\n头部", fillcolor="#748ffc"]; BBox_Head [label="边界框\n回归头部", fillcolor="#748ffc"]; Features [label="特征图", fillcolor="#74c0fc", shape=parallelogram]; Backbone -> Features; Features -> RPN [label=" 提议 RoIs"]; Features -> RoI_Pool; RPN -> RoI_Pool [label=" RoIs"]; RoI_Pool -> Class_Head; RoI_Pool -> BBox_Head; } subgraph cluster_mask_rcnn_addition { label = "Mask R-CNN 新增部分"; bgcolor="#fff9db"; style=dashed; Mask_Head [label="掩码头部\n(FCN)", fillcolor="#ffec99"]; RoI_Pool -> Mask_Head [penwidth=2, color="#f76707", constraint=false]; // Constraint=false 有时有助于布局 Mask_Output [label="分割\n掩码输出", shape=ellipse, fillcolor="#ffe066"]; Mask_Head -> Mask_Output [penwidth=2, color="#f76707"]; } Class_Output [label="类别标签\n+ 置信度", shape=ellipse, fillcolor="#5c7cfa"]; BBox_Output [label="优化后\n边界框", shape=ellipse, fillcolor="#5c7cfa"]; Class_Head -> Class_Output; BBox_Head -> BBox_Output; // 用于对齐的隐形边(如果需要) edge [style=invis]; Class_Head -> Mask_Head; Mask_Head -> BBox_Head; }Mask R-CNN 概述。它在标准Faster R-CNN头部(蓝色)之外,增加了一个并行的掩码预测分支(黄色),用于处理来自RoIAlign的特征。掩码预测头部Mask R-CNN中的核心新增部分是这个掩码头部。它通常被实现为一个应用于每个RoI的小型全卷积网络(FCN)。输入: 它接收为RoI生成的池化特征图(使用RoIAlign,接下来会讨论)。架构: 它通常由多个卷积层组成,然后是一个最终层,该层为每个类别输出一个二进制掩码。对于大小为 $M \times M$ 的输入RoI,掩码头部可能会输出一个 $K \times M' \times M'$ 的张量,其中 $K$ 是类别数,而 $M'$ 是稍大的分辨率(例如,$28 \times 28$),以捕捉比特征图分辨率更精细的细节。输出: 在推理时,如果RoI被分类为属于类别 $c$,则会选中相应的第 $c$ 个输出掩码,将其调整到RoI的尺寸,并进行阈值处理以生成最终的二进制实例掩码。RoIAlign:用于掩码的精确特征提取Mask R-CNN引入了一项重要的创新,即RoIAlign。Faster R-CNN中使用的原始RoIPool操作涉及量化步骤。当将RoI(具有连续坐标)映射到特征图的离散网格上时,RoIPool会对坐标进行四舍五入。然后它将RoI划分为空间区域(bin),并在每个区域内进行最大池化。尽管这对分类和边界框回归来说效果足够好,但空间量化不准确性对预测像素精确的掩码有害。四舍五入造成的小偏差会显著降低分割边界的质量。RoIAlign避免了这种量化。它没有对RoI边界进行四舍五入,而是使用双线性插值来计算每个RoI区域内四个规则采样位置处输入特征的精确值。这些采样值随后被聚合(通常通过最大池化或平均池化)以生成该区域的池化特征图。此过程保留了精确的空间位置信息,使得提取的特征与原始图像区域之间的对齐效果更好,这对于高质量的实例分割来说非常重要。训练 Mask R-CNNMask R-CNN采用多任务损失函数进行端到端训练。每个采样RoI上的总损失 $L$ 是分类损失 $L_{cls}$、边界框回归损失 $L_{box}$ 和掩码分割损失 $L_{mask}$ 的和:$$ L = L_{cls} + L_{box} + L_{mask} $$$L_{cls}$ 和 $L_{box}$ 与Faster R-CNN中使用的相同。$L_{mask}$ 通常定义为平均二元交叉熵损失。对于与真实类别 $k$ 关联的给定RoI,$L_{mask}$ 仅在第 $k$ 个掩码上计算(其他掩码输出被忽略)。它衡量预测掩码像素与该特定实例的真实掩码之间的差异。这种多任务训练使网络能够同时学习对目标进行分类、优化其边界框以及生成详细的分割掩码,所有这些都运用了主干网络的共享卷积特征。推理与输出在推理过程中,Mask R-CNN遵循Faster R-CNN的步骤,通过RPN生成RoIs。对于每个提议的RoI,它预测一个类别标签、一个边界框优化和一个像素级掩码。应用置信度分数阈值来过滤检测结果。基于边界框执行非极大值抑制(NMS)以移除重复检测。对于保留的检测结果,会选中掩码头部预测的相应类别特定掩码,将其调整到最终边界框的尺寸,并通常在0.5处进行阈值处理以得到最终的二进制实例掩码。输出是一组目标,每个目标都有一个类别标签、一个置信度分数、一个边界框,以及一个精确的像素级分割掩码,用于识别该特定实例。Mask R-CNN在发布时在实例分割基准上表现出领先水平,并且仍然是一个强大且广泛使用的基准方法。它的设计巧妙地将目标检测和分割结合到一个单一的、可训练的框架中,为实例级场景理解的许多后续发展开辟了道路。尽管存在其他方法,包括为速度设计的单阶段方法(如YOLACT或SOLO),理解Mask R-CNN为解决实例分割问题提供了坚实根基。