大话目标检测经典模型:Mark R-CNN

在以前的文章中介绍了目标检测经典模型(R-CNN、Fast R-CNN、Faster R-CNN),目标检测通常是为了实现如下效果:
 
在R-CNN、Fast R-CNN、Faster R-CNN中,实现了对目标的识别和定位,以下图所示:
 
为了更加精确地识别目标,实如今像素级场景中识别不一样目标,利用“图像分割”技术定位每一个目标的精确像素,以下图所示(精确分割出人、汽车、红绿灯等):
 
Mask R-CNN即是这种“图像分割”的重要模型。算法

Mask R-CNN的思路很简洁,既然Faster R-CNN目标检测的效果很是好,每一个候选区域能输出种类标签和定位信息,那么就在Faster R-CNN的基础上再添加一个分支从而增长一个输出,即物体掩膜(object mask),也即由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)。以下图所示,Mask R-CNN由两条分支组成:
 
Mask R-CNN的这两个分支是并行的,所以训练简单,仅比Faster R-CNN多了一点计算开销。
分类和定位在Faster R-CNN中有介绍过了(详见文章:大话目标检测经典模型RCNN、Fast RCNN、Faster RCNN),在此就再也不重复介绍,下面重点介绍一下第二条分支,即如何实现像素级的图像分割。网络

以下图所示,Mask R-CNN在Faster R-CNN中添加了一个全卷积网络的分支(图中白色部分),用于输出二进制mask,以说明给定像素是不是目标的一部分。所谓二进制mask,就是当像素属于目标的全部位置上时标识为1,其它位置标识为 0
 
从上图能够看出,二进制mask是基于特征图输出的,而原始图像通过一系列的卷积、池化以后,尺寸大小已发生了屡次变化,若是直接使用特征图输出的二进制mask来分割图像,那确定是不许的。这时就须要进行了修正,也即便用RoIAlign替换RoIPooling
 
如上图所示,原始图像尺寸大小是128x128,通过卷积网络以后的特征图变为尺寸大小变为 25x25。这时,若是想要圈出与原始图像中左上方15x15像素对应的区域,那么如何在特征图中选择相对应的像素呢?
从上面两张图能够看出,原始图像中的每一个像素对应于特征图的25/128像素,所以,要从原始图像中选择15x15像素,则只需在特征图中选择2.93x2.93像素(15x25/128=2.93),在RoIAlign中会使用双线性插值法准确获得2.93像素的内容,这样就能很大程度上,避免了错位问题。
修改后的网络结构以下图所示(黑色部分为原来的Faster R-CNN,红色部分为Mask R-CNN修改的部分)
 
从上图能够看出损失函数变为
 
损失函数为分类偏差+检测偏差+分割偏差,分类偏差和检测(回归)偏差是Faster R-CNN中的,分割偏差为Mask R-CNN中新加的。
对于每一个MxM大小的ROI区域,mask分支有KxMxM维的输出(K是指类别数量)。对于每个像素,都是用sigmod函数求二值交叉熵,也即对每一个像素都进行逻辑回归,获得平均的二值交叉熵偏差Lmask。经过引入预测K个输出的机制,容许每一个类都生成独立的mask,以免类间竞争,这样就能解耦mask和种类预测。
对于每个ROI区域,若是检测获得属于哪个分类,就只使用该类的交叉熵偏差进行计算,也即对于一个ROI区域中KxMxM的输出,真正有用的只是某个类别的MxM的输出。以下图所示:
 
例如目前有3个分类:猫、狗、人,检测获得当前ROI属于“人”这一类,那么所使用的Lmask为“人”这一分支的mask。框架

Mask R-CNN将这些二进制mask与来自Faster R-CNN的分类和边界框组合,便产生了惊人的图像精确分割,以下图所示:
分布式

Mask R-CNN是一个小巧、灵活的通用对象实例分割框架,它不只能够对图像中的目标进行检测,还能够对每个目标输出一个高质量的分割结果。另外,Mask R-CNN还易于泛化到其余任务,好比人物关键点检测,以下图所示:

从R-CNN、Fast R-CNN、Faster R-CNN到Mask R-CNN,每次进步不必定是跨越式的发展,这些进步其实是直观的且渐进的改进之路,可是它们的总和却带来了很是显著的效果。
最后,总结一下目标检测算法模型的发展历程,以下图所示:函数

墙裂建议oop

2017年,Kaiming He 等人发表了关于Mask R-CNN的经典论文《Mask R-CNN》,在论文中详细介绍了Mask R-CNN的思想、原理和测试效果,建议阅读该论文以进一步了解该模型。学习

关注本人公众号“大数据与人工智能Lab”(BigdataAILab),而后回复“论文”关键字可在线阅读经典论文的内容测试

推荐相关阅读大数据