(关于Mask R-CNN的简介)
论文:https://arxiv.org/abs/1703.06870
github:https://github.com/facebookresearch/detectron2
推荐解析:
- 简介:https://blog.csdn.net/u014380165/article/details/81878644
- 详解:https://blog.csdn.net/wangdongwei0/article/details/83110305?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- R-CNN家族简介:https://blog.csdn.net/jiongnima/article/details/79094159
- FPN+FastRCNN+mask:https://zhuanlan.zhihu.com/p/37998710
个人认为Mask R-CNN是一个思想简单但效果拔群的框架,其共有三个设计要点:
- 将Faster R-CNN中的ROI Pooling替换为ROI Align
ROI Pooling是基于检测框在feature map中通过下采样提取关键特征的操作,不过由于其经过了两次量化操作(如下图),这就影响了模型的准确度(作者将其称为“mismatch”),即量化后的ROI已经和原本的ROI产生了一定偏差。
所以,作者提出ROI Align算法,其中不涉及量化操作,而是在计算过程中保留浮点数,并利用“双线性插值”+“MaxPooling”来获取下采样的采样点,从而缓解ROI Pooling中的mismatch问题。
- 为Faster R-CNN并行地增加了mask分支
为了增加实例分割功能,作者基于Faster R-CNN框架(并用ROI Align替换ROI Pooling),并行地增加了mask分支(在ROI后添加卷积层),见下图:
- 损失函数 L = Lcls + Lbox + Lmask.
损失函数由类别损失、检测框损失、分割损失三部分组成,前两者与Faster R-CNN无异,不过作者对Lmask的设计别具匠心(Lbox和Lmask都是对positive ROI才起作用)。mask支路对每个ROI的输出维度是Kmm,其中K表示K个类别,mm表示mask的大小。在计算损失时(cross-entropy),只有ground truth对应的那一个mask(mm)被使用,其他mask对Lmask不产生影响(在测试阶段,通过分支预测的类别来选择对应的mask)。这样的操作,其实是将“mask任务”与“分类任务”进行解耦(decouple)了,从而避免了类内竞争(competition among classes)。或者说,既然bbox分支已经判定该区域为一个实例,进行mask预测时便没必要再关心类别信息了,这可以使得模型的学习更加简单有效。
-
消融实验
作者进行了大量的消融实验来证明其方法的有效性,从下表可以看到ROI Align及Lmask等策略设计的有效性。
-
总结
Mask R-CNN是一个设计巧妙的多功能模型,除了上述的检测、实例分割外,它还可以拓展到关键点检测(人体姿态估计)等任务上,并有不俗的表现。并行分支结构使mask分支专门处理分割任务而不需考虑类别信息,从而简化了模型的学习难度;ROI Align巧妙地去除了ROI Pooling中粗燥的量化过程,从而提高了模型的学习精度;Lmask则是从损失函数进行切入,用sigmoid代替传统的softmax来简化mask任务。相信这些思路能为我们未来的学习研究带来一定的启迪。