← 返回 PaperDaily 视觉与图像

CVPR经典Mask R-CNN:FAIR开源实例分割基线

这篇论文把“先找框、再抠图”做得特别顺手:Faster R-CNN 负责定位,Mask 分支负责像素级分割,RoIAlign 负责把坐标对齐。看起来只是加了个小分支,结果却把实例分割这门活干得又快又稳。

CVPR经典Mask R-CNN:FAIR开源实例分割基线
🐉 龙哥读论文知识星球来了!
公众号每日8篇拆解不够看?星球无上限更AI领域论文、资讯、招聘、招博、开源代码,一站式干货,每日2分钟刷完即赚! 👇扫码加入「龙哥读论文」知识星球,前沿干货、实用资源一站式拿捏~ xingqiu_header

龙哥导读:
这篇论文把“先找框、再抠图”做得特别顺手:Faster R-CNN 负责定位,Mask 分支负责像素级分割,RoIAlign 负责把坐标对齐。看起来只是加了个小分支,结果却把实例分割这门活干得又快又稳。


原论文信息如下:
论文标题:
Mask R-CNN
发表日期:
2017年03月
发表单位:
Facebook AI Research (FAIR)
原文链接:
https://arxiv.org/pdf/1703.06870
开源代码链接:
https://github.com/facebookresearch/Detectron
项目链接:
https://github.com/facebookresearch/Detectron

引言

在目标检测已经开始“卷速度”的年代,实例分割又把难度抬高了一档:不仅要知道“这是什么”,还要知道“它到底占了哪些像素”。Mask R-CNN 的思路很朴素,却非常管用——先把候选目标找出来,再分别做分类、框回归和掩码预测。它没有把问题搞成一锅粥,而是把活分配得明明白白。
更有意思的是,这个方法并不是靠“堆料玄学”取胜,而是靠一个很关键的小修补:RoIAlign。它把 RoI 的量化误差尽量抹平,让特征和像素位置对得更准。对分类来说,差一点可能无所谓;对像素级分割来说,差一点就很要命,像拿尺子量门缝,偏一毫米都尴尬。
图1:Mask R-CNN用于实例分割的整体框架。
图1:Mask R-CNN用于实例分割的整体框架。
如果把这篇论文看成一台机器,它最像的不是“复杂大炮”,而是一套结构清晰、扩展方便的标准化流水线。实例分割、目标检测、人体关键点检测都能往里塞,说明它不是只会做一道菜,而是掌握了整套厨房流程。

方法概述

Mask R-CNN 的主干还是熟悉的 Faster R-CNN:第一阶段先用 RPN 提出候选框,第二阶段对每个 RoI 做特征提取和分类、框回归。论文做的事情,看上去就是在第二阶段旁边再开一扇窗,额外预测一个二值掩码。逻辑很简单,但效果很顶。
图4:Mask R-CNN在ResNet-C4和FPN骨干上的头部结构设计。
图4:Mask R-CNN在ResNet-C4和FPN骨干上的头部结构设计。
真正的灵魂人物是RoIAlign。传统 RoIPool 会先把连续坐标“掰”成离散格子,再去做池化;这对分类问题影响不大,但对掩码这种像素级任务就会产生错位。RoIAlign 的做法更温柔:不做粗暴量化,而是用双线性插值在固定采样点上取值,让特征图和原图位置尽量一一对应。说白了,就是别把像素当糊涂账。
图3:RoIAlign的采样与双线性插值示意图。
图3:RoIAlign的采样与双线性插值示意图。
掩码分支本身也很讲究。论文没有把掩码预测做成一个大而全的分类器,而是对每个类别分别预测一个二值掩码,再由分类分支决定最终取哪一个。这种“分类归分类,分割归分割”的设计,避免了类别之间互相抢戏,训练起来也更稳定。
Mask R-CNN实例分割效果示例
演示图:Mask R-CNN实例分割效果示例,展示了模型对图片中多个物体的边界框与像素级分割输出。

主要创新点

这篇论文最核心的创新,其实可以浓缩成三句话。第一,在 Faster R-CNN 上直接加掩码分支,把实例分割做成一个自然扩展,而不是另起炉灶。第二,用 RoIAlign 修正对齐误差,让像素级任务终于不用忍受“坐标偏一格”的折磨。第三,把分割、检测、关键点检测统一到一个框架里,通用性非常强。
图6:FCIS与Mask R-CNN在重叠目标上的对比。
图6:FCIS与Mask R-CNN在重叠目标上的对比。
尤其在重叠目标场景里,Mask R-CNN 的优势更明显。很多方法一遇到“人挤人、车挨车”的画面就开始手忙脚乱,Mask R-CNN 则能较好地区分实例边界,不容易把两个目标粘成一团。这一点对真实场景非常重要,因为现实世界从来不按教科书排队站好。

数据准备及实验设计

论文主要在 COCO 上做验证,并采用常见的 trainval35k/minival/test-dev 评测设置。训练时,正样本 RoI 的 IoU 阈值设为 0.5,掩码损失只对正样本计算。整体训练策略沿用 Faster R-CNN 系列的成熟配置,因此实验设计并不花哨,但足够扎实,属于“老实做实验,结果自己会说话”的类型。
论文还顺手把人体关键点检测也塞进同一框架里。对关键点来说,每个关节点都可以看成一个 one-hot 掩码,模型只需做很小的改动就能输出姿态结果。这种设计很像把同一把瑞士军刀换几个刀头,还是那把刀,但能干的活更多。

实验结果

先看实例分割主战场。Mask R-CNN 在 COCO 上直接把一众前作压了下去,尤其是加上 FPN 和更强骨干以后,结果进一步提升。更重要的是,它不是靠一堆复杂技巧堆出来的,而是在“基础版”上就已经很能打,这种稳定性对科研和工程都很友好。
图1:Mask R-CNN用于实例分割的整体框架。 图5:Mask R-CNN在COCO测试集上的更多实例分割结果。
图5:Mask R-CNN在COCO测试集上的更多实例分割结果。
再看检测任务。虽然 Mask R-CNN 的主业是分割,但它在目标检测上也不含糊,甚至超过了不少专门做检测的模型。这个结果很有意思:本来是来“顺手做分割”的,结果检测也顺便卷赢了,属于一鱼多吃,而且鱼还挺大。
图2:Mask R-CNN在COCO测试集上的检测与分割效果,ResNet-101版本达到35.7 mask AP。
图2:Mask R-CNN在COCO测试集上的检测与分割效果,ResNet-101版本达到35.7 mask AP。
关键点检测也很亮眼。论文把关键点当作一类特殊掩码来处理,结果在 COCO 人体姿态任务上同样拿到了很强的成绩。说明这个框架不是只会抠图,还能顺手把人的关节位置也标出来,通用性确实不赖。
图7:Mask R-CNN在COCO测试集上的关键点检测结果。
图7:Mask R-CNN在COCO测试集上的关键点检测结果。

实验结果分析

从消融实验看,Mask R-CNN 的提升并不是玄学。更深的骨干、更好的特征金字塔、独立的掩码预测、以及最关键的 RoIAlign,几乎每一项都能带来稳定收益。尤其是 RoIAlign,在高 IoU 指标上提升更明显,这说明它改善的是“边界对不对得上”这种细活,而不是只让模型看起来更忙。
另一个值得注意的点是,掩码和分类分开做,反而比把它们绑在一起更好。这个结论很反直觉,但也很合理:分类只需要知道“它是什么”,掩码只需要知道“它长什么样”,两件事硬塞进一个软最大里,容易互相拖后腿。Mask R-CNN 的做法相当于给它们分工,效率自然更高。

总结与未来展望

Mask R-CNN 的厉害之处,不在于它把问题变复杂了,而在于它把问题拆清楚了。检测、分割、关键点这三类任务,本质上都离不开“先定位,再细化”的思路,而这个框架恰好把这条路走通了。后来的很多实例分割方法,多少都得站在它肩膀上继续往前看。

龙迷三问

下面是龙哥对于大家可能的一些问题的解答:

为什么 RoIAlign 这么小的改动,提升却这么明显?因为实例分割和关键点检测都非常吃位置精度。RoIPool 的量化误差对分类不致命,但对像素级输出就是“差之毫厘,谬之千里”。RoIAlign 直接把这个坑填上了。

Mask R-CNN 为什么不把分类和掩码完全绑在一起?因为两件事关注点不同。分类关心类别,掩码关心边界,强行让它们在同一个多类输出里竞争,反而容易让训练变得别扭。分开做,反而更稳。

这篇论文今天还值得学吗?非常值得。它不仅是实例分割的经典基线,还展示了一个很重要的科研思路:别急着堆复杂模块,先把任务结构和对齐问题理顺,往往就能把性能拉上去。

如果你还有哪些想要了解的,欢迎在评论区留言或者讨论~

龙哥点评

论文创新性分数:★★★★☆。不是“凭空造一个新宇宙”,而是在经典检测框架上补齐了实例分割最关键的一块拼图,思路简洁但非常有效。

实验合理度:★★★★★。消融实验做得很完整,RoIAlign、掩码分支、骨干网络这些关键因素都被逐一验证,结论很扎实。

学术研究价值:★★★★★。它不仅推动了实例分割,也影响了后续检测、关键点和多任务视觉框架的设计方式。

稳定性:★★★★☆。方法结构清楚,训练和推理都比较稳定,不靠花里胡哨的技巧吃饭。

适应性以及泛化能力:★★★★★。从实例分割扩展到人体关键点检测,说明这个框架的通用性相当强。

硬件需求及成本:★★★★☆。有额外分支,但开销不算离谱,属于“多干点活,别太费电”的类型。

复现难度:★★★★☆。Detectron 开源降低了门槛,但完整训练和调参仍然需要一定工程经验。

产品化成熟度:★★★★☆。框架清晰、模块化强,很适合做研究基线和工程原型。

可能的问题:对齐问题虽然解决得不错,但整体仍是两阶段方法,推理流程比端到端单阶段模型更重一些。

一个框架统一实例分割与关键点检测

Mask R-CNN 最讨喜的地方,是它没有把实例分割想得神神叨叨。它的基本思路很直白:先找出图里可能存在的目标,再对每个目标分别做分类、框回归和掩码预测。也就是说,它不是上来就对整张图“乱抹一层”,而是先把对象一个个拎出来,再认真给每个对象做像素级标注。这个套路看似朴素,实际上非常符合人类办事逻辑:先分工,再干活,别把厨房和客厅搅成一锅粥。
图1:Mask R-CNN用于实例分割的整体框架。
它和 Faster R-CNN 的关系也很好理解:Mask R-CNN 不是推倒重来,而是在 Faster R-CNN 的第二阶段旁边加了一条掩码分支。原来 Faster R-CNN 负责分类和边界框回归,现在再多干一件事——给每个 RoI 输出一个二值掩码。这里的 RoI 是 Region of Interest,中文叫“感兴趣区域”,可以理解成模型先圈出来的一块“重点审查区”。
封面:Mask R-CNN在COCO测试集上的实例分割效果。
封面:Mask R-CNN在COCO测试集上的实例分割效果。
更妙的是,它并没有把分割、分类、检测搅在一个输出里硬拼。Mask R-CNN 选择让分类分支负责“这是什么”,掩码分支负责“它长什么样”,边界框分支负责“它在哪儿”。这种分工非常像公司里靠谱的项目组:每个人做自己最擅长的事,最后整体反而更稳。

揭秘Mask R-CNN的核心创新:RoIAlign

Mask R-CNN 真正的“灵魂补丁”,是 RoIAlign。RoIAlign 的全称是 Region of Interest Align,中文可以理解为“感兴趣区域对齐”。它的出现,专门是为了修理 RoIPool 带来的坐标错位问题。
RoIPool 的问题不复杂:它会把连续坐标粗暴地量化到离散网格上。对分类任务来说,像素差一点点不算大事,毕竟“这是一只猫”通常不因为框偏了半格就变成“这是一只狗”。但对实例分割来说,情况完全不同。掩码要的是像素级对齐,差一格就可能把帽子分到头里,把腿切成两截,画面立刻变得很离谱。
图3:RoIAlign的采样与双线性插值示意图。
RoIAlign 的做法就很讲道理:不再对 RoI 边界、bin 划分和采样点做量化,而是直接保留浮点坐标,再用双线性插值去取特征值。双线性插值可以理解成“别只看四舍五入后的整数格子,而是按周围四个点的距离做加权平均”。这样一来,特征图和原图的位置关系就不会被硬生生掰歪,像素级预测自然更稳。
这个改动看着小,实际作用很大。论文里的消融实验显示,RoIAlign 对实例分割精度提升非常明显,尤其是在更严格的定位指标下,收益更夸张。说白了,分类可以“差不多就行”,掩码不行;RoIAlign 做的,就是把“差不多”这条退路给堵上。
这里还要顺手提一下论文里另一个相关概念:FCN,即 Fully Convolutional Network,全卷积网络。Mask R-CNN 的掩码分支就是一个小型 FCN,它不把空间结构压成一维向量,而是保留二维布局去预测掩码。这个选择很关键,因为掩码本来就是“哪一块属于目标”的空间问题,硬塞成全连接层,多少有点让厨房去写财务报表,形式上能做,效率上别扭。
图4:Mask R-CNN在ResNet-C4和FPN骨干上的头部结构设计。

解耦分类与掩码如何提升性能?

Mask R-CNN 的另一个关键判断,是把分类和掩码解耦。这里的“解耦”不是玄学词,而是实打实地把两个任务分开处理:分类分支预测类别,掩码分支只负责输出该类别对应的二值掩码。训练时,掩码损失只在正样本 RoI 上计算,而且只对真实类别对应的那一张掩码负责,其他类别的掩码不参与损失。
这背后的英文术语是 sigmoidsoftmax。前者是逐元素独立压缩到 0 到 1 的函数,后者是让多个类别之间互相竞争的归一化方式。Mask R-CNN 选择的是 sigmoid + 二值交叉熵,而不是 softmax + 多类竞争。为什么?因为对于实例分割来说,模型已经先通过分类分支知道“这是啥”,掩码分支就没必要再跟别的类别抢戏了,安安静静把边界抠出来就行。
图6:FCIS与Mask R-CNN在重叠目标上的对比。
论文的消融实验也很直接地证明了这一点:把掩码和分类绑得太死,效果反而会掉。原因其实不难理解。分类任务希望输出一个类别标签,掩码任务希望输出一张空间结构图,两者关注点不同。强行把它们塞进同一个多类像素分类框架里,容易让模型在训练时左右为难。Mask R-CNN 的做法相当于给它们分了工,结果就是训练更顺,性能也更稳。
这套解耦思路还有个很有意思的副作用:即使把掩码做成类别无关的版本,性能也不会掉得太离谱,说明这个框架对“先分类、后细化”的分工方式非常适配。换句话说,Mask R-CNN 的强,不是因为它把所有任务都揉成一个大杂烩,而是因为它知道什么时候该分开,什么时候该共享。

对比实验与辉煌战绩一览

论文的实验很完整,而且不是那种“只挑好看的结果发朋友圈”的实验。作者把实例分割、目标检测、关键点检测都拉到同一个框架下比较,还做了不少消融实验,专门验证每个组件到底是不是在认真干活。
表1:COCO测试集上的实例分割结果对比。
表1:COCO测试集上的实例分割结果对比。
先看实例分割主结果。Mask R-CNN 在 COCO test-dev 上的表现,已经超过了之前一些很强的单模型方法,包括 COCO 2015 和 2016 的挑战赛冠军。更关键的是,它不是靠一堆复杂花活堆出来的,而是“基础版”就已经很能打。对科研来说,这种结果特别舒服:说明方法本身站得住,不是靠运气和玄学撑场面。
表2a:不同骨干网络下的实例分割消融结果。
表2a:不同骨干网络下的实例分割消融结果。
表2b:软最大与独立掩码的对比。
表2b:软最大与独立掩码的对比。
表2c:RoIAlign与RoIPool、RoIWarp的对比。
表2c:RoIAlign与RoIPool、RoIWarp的对比。
再看消融。更深的骨干、更好的特征金字塔网络(FPN,Feature Pyramid Network,中文叫特征金字塔网络)、以及更强的 ResNeXt,都带来了稳定增益。这里最值得盯住的还是 RoIAlign:它在实例分割上的提升非常明显,而且在更严格的定位指标上收益更大。这个现象说明,RoIAlign 解决的不是“模型会不会看”,而是“模型看得准不准”。
FCIS 等方法在重叠目标上容易出现一些系统性伪影,Mask R-CNN 则明显更干净。这个对比特别有说服力,因为真实场景里的目标经常不是孤零零站着,而是挤在一起、遮挡着、交叠着。能在这种场景下把实例边界分开,才算是真本事。
图2:Mask R-CNN在COCO测试集上的检测与分割效果,ResNet-101版本达到35.7 mask AP。 图5:Mask R-CNN在COCO测试集上的更多实例分割结果。
再看目标检测。论文很有意思的一点是:即使把掩码分支关掉,只保留检测部分,Mask R-CNN 也能在目标检测上拿出很强的结果,甚至超过不少专门做检测的模型。也就是说,这个框架不是“为了分割而顺便检测”,而是“检测本身也被顺手做强了”。
表3:COCO测试集上的目标检测结果对比。
表3:COCO测试集上的目标检测结果对比。
这也解释了为什么论文敢说它是一个“通用框架”而不是某个单点技巧。因为它在多个任务上都能稳定工作,而且不是靠不同任务各自为战,而是共享一套骨干和 RoI 机制。对研究者来说,这种统一性非常值钱:以后想加新任务,不必从头重写整套系统,改改头部就能试。

超快速训练与推理:一切为了科研

Mask R-CNN 还有一个很适合科研圈的优点:训练快、推理也不算慢。论文给出的实现里,模型在单卡或多卡 GPU 上都能比较高效地训练和测试。对研究来说,这件事非常现实:如果一个方法动不动就训三天、调一周,很多想法还没来得及验证就先把人熬秃了。
论文里还有一个很重要的工程信息:Mask R-CNN 的开源实现来自 Facebook AI Research 的 Detectron 平台。Detectron 是 FAIR 的目标检测研究平台,基于 Python 和 Caffe2,支持 Mask R-CNN、RetinaNet 等算法。换句话说,这不是纸上谈兵,而是已经能拿来搭实验、做复现、继续改进的成熟代码库。对于想快速上手实例分割的人来说,这种开源基线的价值非常大。
Mask R-CNN实例分割效果示例
从演示效果也能看出,Mask R-CNN 的输出非常直观:框是框,类别是类别,掩码是掩码,三者一眼能看懂。对于很多实际项目来说,这种“结果可解释、调试也方便”的模型,往往比那些只在表格里好看、落地时一团乱麻的方法更受欢迎。

从实例分割到人体姿态:Mask R-CNN的泛化能力

Mask R-CNN 最让人眼前一亮的地方之一,是它不只会做实例分割,还能顺手做人体关键点检测。论文把关键点看成一种特殊的掩码:每个关节点都可以表示成一个 one-hot 二值图。这样一来,原本看起来很不一样的任务,就被统一到同一个框架里了。
图7:Mask R-CNN在COCO测试集上的关键点检测结果。
关键点任务最怕什么?怕位置不准。因为一个关节点偏一点,整个人体姿态看起来就会很别扭,像是“胳膊长在了不该长的位置”。Mask R-CNN 之所以能在这个任务上也做得不错,核心还是那套老本事:RoIAlign 保证位置对齐,掩码分支保留空间结构,分类与回归负责把人先找准。三件事一配合,姿态估计也就顺手做通了。
转发文章 微博 X LinkedIn Facebook
龙哥读论文 · PaperDaily

本文基于龙哥读论文 PaperDaily 数据库整理,结合论文原文与工程视角进行解读。