夜雨聆风学习资料网

ARTICLE · 1286446

Mask R-CNN 源码精读:给 Faster R-CNN 加个分割头,ICCV 2017 最佳论文怎么把实例分割做快

Mask R-CNN 源码精读:给 Faster R-CNN 加个分割头,ICCV 2017 最佳论文怎么把实例分割做快
2017 年 ICCV 最佳论文(Marr Prize)给了 Mask R-CNN。它在 Faster R-CNN 的检测框架上只加了一个小改动——每个候选框额外预测一个像素级掩码——就把实例分割这个任务做到了又快又准。何恺明团队(Kaiming He、Georgia Gkioxari、Piotr Dollár、Ross Girshick)的作品,官方实现在 Facebook 的 Detectron 仓库里。

实例分割卡在哪

实例分割要求:把图里每个物体框出来(检测),同时把每个物体的像素轮廓描出来(分割),还要区分「同类的不同个体」(实例)。这比语义分割难——语义分割只要区分类别,不用区分个体。
2017 年之前的方案要么慢(先分割再聚类成实例,秒级),要么不准(检测完再用独立的分割模型 refine)。Mask R-CNN 的答案是把分割变成检测框架的一个并行头:检测头出框和类别,掩码头出像素 mask,两者共享骨干网络,一次前向全出。

RoIAlign:论文真正的贡献

很多人以为 Mask R-CNN 的贡献是「加了掩码头」,其实真正的关键是 RoIAlign。
Faster R-CNN 的池化操作(RoIPool)把任意大小的候选框映射到固定网格时,会对像素坐标取整。检测对这个量化误差不敏感——框偏一个像素无所谓。但掩码是像素级的,取整带来的错位会让掩码边缘和物体边缘错开,分割精度直接受损。
RoIAlign 用双线性插值替代取整:网格点的特征用周围四个像素加权算出,全程无量化。论文的消融显示,光这一个改动就把掩码精度(AP mask)提升了约 10 个点。这个模块后来成了所有像素级 RoI 操作的标准组件——包括 transformer 时代的检测分割头,用的是同一个思想。

仓库与复现

官方代码在 facebookresearch/Detectron,README 明确标注「Mask R-CNN — Marr Prize at ICCV 2017」。仓库 2023 年 11 月归档为只读,约 2.63 万星,但代码完整可跑:Caffe2 实现,配置文件里锁了论文的超参,COCO 数据集上各模型的复现指标在 MODEL_ZOO 里列全。
对多数今天的用户,更实用的入口是 Detectron2——Facebook 后来的框架级重写,Mask R-CNN 是它的默认示例模型之一,PyTorch 原生,文档齐全,一条命令加载预训练权重跑推理。想读「论文当年」的代码去 Detectron,想用「今天最好跑」的版本去 Detectron2。
容易看错的一点:Mask R-CNN 的掩码预测是按类别做的——每个 RoI 输出 K 个类的掩码(K 是类别数),推理时只取检测出的那个类对应的掩码通道。代码里这个 per-class mask head 的张量形状经常让初学者困惑,对照论文的消融看就清楚:按类预测比类别无关的预测高约 2 个点。

它留下的东西

Mask R-CNN 之后,实例分割基本定型:检测加分割的双头结构成了标配。今天的实例分割模型(从 YOLACT 到 Mask2Former)在架构上各有创新,但「共享骨干、并行头、像素对齐」的骨架都是它定的。
对入门者,这个仓库还有一个额外价值:它是理解「在成熟框架上加一个头解决新任务」的范例。检测框架的 RoI 抽取、训练采样、正负样本分配这些基础设施,Mask R-CNN 全部复用,新增的只有掩码分支——读代码能清楚看到「新任务的增量」和「旧框架的存量」的边界。这个读法对做研究的人尤其有用:大部分论文的创新,就是把增量做到最小而效果最大。

从 Detectron 到 Detectron2 的读码路线

官方 Detectron 仓库是 Caffe2 实现,对今天的读者门槛偏高。建议的路径:先用 Detectron2 跑通 Mask R-CNN 的推理和微调(detectron2/model_zoo 里有 COCO 预训练权重,model_zoo.get 点一下就加载),建立对输出的直觉;再回到论文逐节对照。
Detectron2 里对应的关键代码在 roi_heads/mask_head.py 和 roi_heads/roi_align.py。RoIAlign 的实现只有几十行,但值得逐行读:align_corners 参数的语义、采样点的网格构造、双线性插值的边界处理——这些细节在后来的所有分割头里反复出现。读懂这一段,等于读懂了像素级 RoI 操作的通用范式。
训练侧还有一个容易被忽略的点:Mask R-CNN 的掩码损失只在正样本 RoI 上计算,且与检测的分类解耦。代码里 mask_rcnn_loss 函数的做法是按 RoI 的预测类别选取对应的掩码通道再算 BCE——这个「按类选通道」的操作,是初读代码时最常见的困惑点,也是论文里 per-class mask 设计在工程上的直接对应。
最后是公平提醒:COCO 上的 box AP 约 40+、mask AP 约 37 是 ResNet-101 骨干的数字,换 ResNet-50 或轻量骨干会低一些。论文表格里不同配置的数字要在同一骨架下比较,跨表比数字是复现翻车的常见原因。

判断

Mask R-CNN 值得精读的理由可以归成一句话:它是「最小增量创新」的典范。相对 Faster R-CNN,它的改动是 RoIAlign 加一个掩码头——两个组件,不到两年时间,拿下 Marr Prize、成为实例分割的标准起点。对比同期越叠越深的网络,这份克制本身就是工程品味。
它对今天的实践者仍有直接价值:工业质检里的缺陷实例分割、遥感影像的目标提取、医疗影像的病灶勾画,大量生产系统跑的仍是 Mask R-CNN 或其直系变体——够准、够稳、生态全。学习成本一周以内,收益是整个实例分割领域的通用语言。经典之所以是经典,不是它最新,是它定义了后来者讨论问题的方式。
读码的最后建议:把 Mask R-CNN 和 BEVFormer 放在一起对照读会有额外收获——一个是 CNN 时代的两阶段范式,一个是 transformer 时代的 query 范式,相隔五年,处理「从图像中提取空间结构」这个问题的方式完全不同,但 RoI 对齐和 BEV query 的设计动机是同源的:都要解决「规则网格和连续空间对不上」的问题。看到不同时代方案背后的同一类问题,读码才算读出了纵深。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料