Mask R-CNN

1. 核心思想和实现功能

        Mask R-CNN 实在Faster R-CNN的基础上演进而来,修改了两个部分,其一是将Faster R-CNNRoI pooling部分改为RoIAlign,用以实现目标的校正;其二是添加由FCN层组成的Mask头,用以实现目标物体像素级别的分割。

Mask R-CNN_第1张图片

知识扩展:什么是实例分割?

    实例分割是对检测出的目标,实现像素级别的语义分割,难度在于要先对一张图片的所有目标进行正确的检测和识别,同时还要对每个目标实例进行分割,即实例分割是目标识别和语义分割的结合。语义分割是将一张图片中的每个像素进行类别判定。

Mask R-CNN_第2张图片

2. 实现过程

Mask R-CNN_第3张图片

(1) Conv生成feature map

    通过ResNet-101的前100层提取图像特征,然后在最后一层组合成全局feature map

2RPN产生候选区域

    使用Region Proposal Network(RPN)产生候选区域(bounding box)。

(2) 产生ROI feature map

    将RPN产生的bounding box映射到全局feature map上,得到每一个ROI feature map

(3) ROI 校正

    将每一个ROI feature map传入ROIAlign中,对图像进行像素校正。(ROIAlign是对ROI pooling的改进)。

5)分支网络实现bounding box回归、class分类和mask分割(只介绍mask实现实例分割)

    对每一个经过ROIAlignROI feature map通过使用FCN框架对每个像素进行类别判定,输出的mask为一个二值图,根据位置图实现实例分割。(对于Mask的详细介绍见下文)

3. 技术实现

1)特征提取

    采用ResNet-101+FPN用于特征提取,达到state-of-the-art的效果。

2ROIAlign

    采用ROIAlign替代原来的ROI pooling,实现对ROI feature map 像素校正。

    ROI pooling实现从原图区域(ROI)映射到全局特征图(feature map),得到ROI feature map,然后经过ROI pooling层实现pooling到固定的大小。其具体的实现过程需要三步来完成:第一步,将一个floating numberROI量化(即对每个像素取整,[x/strides])为离散粒度(discrete granularity)的特征图;第二步,量化后的ROI将被分成空间bin(一般为7×7,划分bin的时候也需要量化);第三步,将每个bin聚合(max pooling)成特征值。但是,这些量化操作在ROI和全局feature map的映射过程中,引入了misalignments,对预测pixel-accuratemask带来极大的误差。(相信描述见下文)

Mask R-CNN_第4张图片

    例如,输入图片的大小为280×480,假设某点坐标为(x,y),x = y = 20,进过一系列的卷积操作(步长 = 16)后,在全局feature map上该点的映射坐标为[20/16]=[1.25]=1,即在feature map上的坐标为(1,1)(这是一种近似的操作,会导致ROI区域和提取的特征没有对齐);当ROI feature map进行bin划分时,也用到了量化,假设得到的feature map大小为18×30,将其划分为6×6bin,每块大小为3×5,选取最大值为每块bin的值,这个过程依旧用到了取整操作。

Mask R-CNN_第5张图片

    那么两次的取整量化对目标位置的精确性有极大的影响,这种影响对于目标分类来说,不需要考虑位置可变性,是没有问题的,但是目标检测对于物体的位置具有极强的敏感性,对实现目标像素级别的分割是有很大分割误差的。解决该问题就需要ROIAlign。
    ROIAlign的改进在于,其移除了ROI pooling中的量化过程,即避免任何的ROI边界或者划分bin的量化(使用x/16,而不是[x/16])。在对每个ROI的bin的划分过程中,对其4个常规的采样位置使用双线性插值计算输入的特征图的准确值。
总的来说,RoI Align的作用主要就是剔除了RoI Pooling的取整操作,并且使得为每个RoI取得的特征能够更好地对齐原图上的RoI区域。

(3)Loss function

  ,其中为分类损失,为bound box的回归损失,为实例分割损失,这里详细介绍实例分割损失。
    Mask分支网络的输出为K*m^2的mask map,K为类别数量,m为每个ROIAlign 特征图的大小,每个像素均为二值数据(阈值 = 0.5),代表该像素是否属该类。每一个像素应用sigmoid,然后取mask map(即ROIAlign feature map)上每个像素交叉熵的平均值作为mask loss。在反向传播过程中,loss只对ground truth那一层进行计算和反向传播,这种操作可以有效的避免类别竞争,避免了分割和分类的耦合。
    实际上,mask网络输出的K个mask map并未全部应用,只是取K类中第i类的mask作为最终的mask map进行Loss计算。通过faster R-CNN可以得到目标的类别,假设class 分支网络的输出为i,那么取K个mask map中的第i个mask map作为mask分支网络的输出。
    另外,mask分支网络是用FCN网络实现的,见下图。

Mask R-CNN_第6张图片

    上图中,灰色部分是原来的Faster R-CNN部分(原始R-CNN分别与ResNetFPN结合),下面白色部分是新添加的Mask分支网络,这里体现出了Mask R-CNN的泛化适应能力,可以与多种RCNN框架结合。

4. 检测效果

Mask R-CNN_第7张图片

5. 总结

Mask R-CNN_第8张图片

你可能感兴趣的:(Mask R-CNN)