『计算机视觉』Mask-RCNN

1、Mask-RCNN流程

Mask R-CNN是一个实例分割(Instance segmentation)算法,经过增长不一样的分支,能够完成目标分类、目标检测、语义分割、实例分割、人体姿式识别等多种任务,灵活而强大。html

Mask R-CNN进行目标检测与实例分割git

Mask R-CNN进行人体姿态识别github

其抽象架构以下:面试

首先,输入一幅你想处理的图片,而后进行对应的预处理操做,或者预处理后的图片;算法

而后,将其输入到一个预训练好的神经网络中(ResNeXt等)得到对应的feature map;网络

接着,对这个feature map中的每一点设定预约个的ROI,从而得到多个候选ROI;架构

接着,将这些候选的ROI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI(截止到目前,Mask和Faster彻底相同,其实R-FCN之类的在这以前也没有什么不一样);app

接着,对这些剩下的ROI进行ROIAlign操做(即先将原图和feature map的pixel对应起来,而后将feature map和固定的feature对应起来)(ROIAlign为本文创新点1,比ROIPooling有长足进步);函数

最后,对这些ROI进行分类(N类别分类)、BB回归和MASK生成(在每个ROI里面进行FCN操做)(引入FCN生成Mask为本文创新点2,使得本文结构能够进行分割型任务)。post

【注】有关MASK部分,还有一处容易忽视的创新点3:损失函数的计算,做者放弃了更普遍的softmax,转而使用了sigmoid,避免了同类竞争,更多的经历放在优化mask像素上,这一点咱们下一小节会提到。

2、Mask-RCNN结构

ROIPooling的问题

RoiPool过程

假定咱们输入的是一张800x800的图像,在图像中有两个目标(猫和狗),狗的BB大小为665x665,通过VGG16网络后,得到的feature map 会比原图缩小必定的比例,这和Pooling层的个数和大小有关:

在该VGG16中,咱们使用了5个池化操做,每一个池化操做都是2Pooling,所以咱们最终得到feature map的大小为800/32 x 800/32 = 25x25(是整数),可是将狗的BB对应到feature map上面,咱们获得的结果是665/32 x 665/32 = 20.78 x 20.78,结果是浮点数,含有小数,取整变为20 x 20,在这里引入了第一次的量化偏差;

而后咱们须要将20 x 20的ROI映射成7 x 7的ROI feature,其结果是 20 /7 x 20/7 = 2.86 x 2.86,一样是浮点数,含有小数点,一样的取整,在这里引入了第二次量化偏差。

这里引入的偏差会致使图像中的像素和特征中的像素的误差,即将feature空间的ROI对应到原图上面会出现很大的误差。缘由以下:好比用咱们第二次引入的偏差来分析,原本是2,86,咱们将其量化为2,这期间引入了0.86的feature空间偏差,咱们的feature空间和图像空间是有比例关系的,在这里是1:32,那么对应到原图上面的差距就是0.86 x 32 = 27.52(这仅仅考虑了第二次的量化偏差)。

ROIAlign

ROIAlign过程

为了获得为了获得固定大小(7X7)的feature map,ROIAlign技术并无使用量化操做取而代之的使用了双线性插值它充分的利用了原图中虚拟点(好比20.56这个浮点数,像素位置都是整数值,没有浮点值)四周的四个真实存在的像素值来共同决定目标图中的一个像素值,便可以将20.56这个虚拟的位置点对应的像素值估计出来。

 

 

蓝色的虚线框表示卷积后得到的feature map,黑色实线框表示ROI feature,最后须要输出的大小是2x2,那么咱们就利用双线性插值来估计这些蓝点(虚拟坐标点,又称双线性插值的网格点)处所对应的像素值,最后获得相应的输出。

而后在每个橘红色的区域里面进行max pooling或者average pooling操做,得到最终2x2的输出结果。咱们的整个过程当中没有用到量化操做,没有引入偏差,即原图中的像素和feature map中的像素是彻底对齐的,没有误差,这不只会提升检测的精度,同时也会有利于实例分割。

ROI处理架构

为了证实咱们方法的通用性,咱们构造了多种不一样结构的Mask R-CNN。详细的说,咱们使用不一样的:

  (i)用于整个图像上的特征提取的卷积主干架构;

  (ii)用于边框识别(分类和回归)和掩模预测的上层网络,分别应用于每一个RoI。

咱们使用术语“网络深层特征”来命名下层架构。咱们评估了深度为50或101层的ResNet [14]和ResNeXt [34] 网络。使用ResNet [14]的Faster R-CNN从第四级的最终卷积层提取特征,咱们称之为C4。例如,使用ResNet-50的主干架构由ResNet-50-C4表示。这是[14,7,16,30]中经常使用的选择。

咱们也探索了由Li[21]等人最近提出的另外一种更有效主干架构,称为特征金字塔网络(FPN)。FPN使用具备横向链接(lateral connections )的自顶向下架构,从单一规模的输入构建网络功能金字塔。使用FPN的Faster R-CNN根据其尺度提取不一样级别的金字塔的RoI特征,不过其余部分和日常的ResNet相似。使用ResNet-FPN主干架构的Mask R-CNN进行特征提取,能够在精度和速度方面得到极大的提高。有关FPN的更多细节,读者能够参考[21]。

对于上层网络,咱们基本遵循了之前论文中提出的架构,咱们添加了一个全卷积的掩模预测分支。具体来讲,咱们扩展了ResNet [14]和FPN[21]中提出的Faster R-CNN的上层网络。详情见下图(图3)所示:(上层架构:咱们扩展了两种现有的Faster R-CNN上层架构[14,21],并分别添加了一个掩模分支。左/右面板分别显示了ResNet C4和FPN主干的上层架构。图中数字表示通道数和分辨率,箭头表示卷积、反卷积和全链接层(能够经过上下文推断,卷积减少维度,反卷积增长维度。)全部的卷积都是3×3的,除了输出层是1×1。反卷积是2×2,其步进为2,咱们在隐藏层中使用ReLU[24]。在左图中,“res5”表示ResNet的第五级,简单起见,咱们修改了第一个卷积操做,使用7×7,步长为1的RoI代替14×14,步长为2的RoI[14]。右图中的“×4 ”表示堆叠的4个连续的卷积。)ResNet-C4主干的上层网络包括ResNet的第5阶段(即9层的’res5’[14]),这是计算密集型的。但对于FPN,其主干已经包含了res5,所以可使上层网络包含更少的卷积核而变的更加高效。

重点在于:做者把各类网络做为backbone进行对比,发现使用ResNet-FPN做为特征提取的backbone具备更高的精度和更快的运行速度,因此实际工做时大都采用右图的彻底并行的mask/分类回归

mask分支针对每一个RoI产生一个K*m*m的输出,即K个分辨率为m*m的二值的掩膜,K为分类物体的种类数目。依据预测类别分支预测的输出,咱们仅将第i个类别的输出登记,用于计算L_{mask}

Mask R-CNN采用了和Faster R-CNN相同的两步走策略,即先使用RPN提取候选区域,关于RPN的详细介绍,能够参考Faster R-CNN一文。不一样于Faster R-CNN中使用分类和回归的多任务回归,Mask R-CNN在其基础上并行添加了一个用于语义分割的Mask损失函数,因此Mask R-CNN的损失函数能够表示为下式。

L= L_{cls} + L_{box} + L_{mask}\tag{1}

上式中, L_{cls} 表示bounding box的分类损失值, L_{box} 表示bounding box的回归损失值, L_{mask} 表示mask部分的损失值。

对于预测的二值掩膜输出,咱们对每一个像素点应用sigmoid函数,总体损失定义为平均二值交叉损失熵。引入预测K个输出的机制,容许每一个类都生成独立的掩膜,避免类间竞争。这样作解耦了掩膜和种类预测。不像FCN的作法,在每一个像素点上应用softmax函数,总体采用的多任务交叉熵,这样会致使类间竞争,最终致使分割效果差。

训练参数

 

面试考点

这一部分是临时看到面经,感受仍是有很多RCNN系列发展的要点,记录下来,之后再看RCNN时能够带着问题回忆。

RPN 做用和原理

  RPN提出于Faster,因此参考以前的文章:『计算机视觉』经典RCNN_其一:从RCNN到Faster-RCNN

ROI align 和 ROI pooling 的不一样

各部分损失函数选用的什么函数

  参考后续文章:『计算机视觉』Mask-RCNN_训练网络其二:train网络结构&损失函数

3、参考资料

Mask R-CNN

Mask R-CNN详解

TensorFlow实战:Chapter-8上(Mask R-CNN介绍与实现)

开源代码:

Tensorflow版本代码连接

Keras and TensorFlow版本代码连接

MxNet版本代码连接

相关文章
相关标签/搜索