maskrcnn论文 maskrcnn map_bc


一、对于Faster-RCNN的改进

  1. Mask-RCNN加入了Mask branch(FCN)用于生成物体的掩模(object mask),
  2. 同时把RoI pooling 修改成为了RoI Align 用于处理mask与原图中物体不对齐的问题。[1]


maskrcnn论文 maskrcnn map_双线性插值_02

MaskRCNN网络架构


附:

论文地址cn.arxiv.org

二、算法知识点相关释义

  1. FPN的提出:为语义分割做铺垫,同时利用了低层特征的高分辨率高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果,并且预测是在每个融合后的特征层上单独进行的,与常规的特征融合方式不同。[2]


maskrcnn论文 maskrcnn map_bc_03

为了提高检测精度,一个自底向上的线路,一个自顶向下的线路以及对应层的链接。其中 1*1 的卷积核用于减少了 feature map 的个数;2up 为图片上采样,生成和上层 stage 相同大小的 feature map;最后相加对应元素,生成新的特征图。计算速度没有FasterRCNN的快,但准确率要比它高很多。

这里的backbone(特征提取网络)采用的是ResNet,先进行降采样,再进行上采样


maskrcnn论文 maskrcnn map_maskrcnn论文_04


在目标检测里面,低层的特征图信息量比较少,但是特征图比较大,所以目标位置准确,所以容易识别一些小物体;高层特征图信息量比较丰富,但是目标位置比较粗略,特别是 stride 比较大(比如 32),图像中的小物体甚至会小于 stride 的大小,造成小物体的检测性能急剧下降。

2. ROI Align(解决了ROI与pooling后的特征图谱之间不对齐的问题)


maskrcnn论文 maskrcnn map_bc_05

经过整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响准确度

maskrcnn论文 maskrcnn map_mask rcnn算法原理图_06


ROI Align方法取消整数化操作,保留了小数,使用上图双线性插值的方法获得坐标为浮点数的像素点上的图像数值。[1]

mmdetection代码中roi_align里面的featuremap是个参照, 实际上align的是那512个proposal,proposal的大小是相对原图的,要把它先映射到featuremap大小里面,然后在对proposal做双线性插值。


maskrcnn论文 maskrcnn map_Mask_07


[3]坐标值服从(x1,y1,x2,y2),这里有一点需要注意的是(0,0,0,0)代表图像由一个像素点组成。
整个图的bbox是(0,0,3,2),RoI的bbox是(0.5,0,2.5,2)。
如上图对于(0.75, 0.25)这个采样点的特征值由(0,0),(0,1),(1,0),(1,1)四个点做双线性插值得到:
F(0.75, 0.25)=0.25*0.75*F(0,0)+0.25*0.25*F(0,1)+0.75*0.75*F(1,0)+0.75*0.25*F(1,1)
每个bin的采样点集做avg或者max得到每个bin的特征值。


for n in range(3): # 对channel循环
        for dst_y in range(dst_h): # 对height循环
            for dst_x in range(dst_w): # 对width循环
                # 目标在源上的坐标
                src_x = (dst_x + 0.5) * scale_x - 0.5
                src_y = (dst_y + 0.5) * scale_y - 0.5
                # 计算在源图上四个近邻点的位置
                src_x_0 = int(np.floor(src_x))
                src_y_0 = int(np.floor(src_y))
                src_x_1 = min(src_x_0 + 1, src_w - 1)
                src_y_1 = min(src_y_0 + 1, src_h - 1)

                # 双线性插值
                value0 = (src_x_1 - src_x) * src[src_y_0, src_x_0, n] + (src_x - src_x_0) * src[src_y_0, src_x_1, n]
                value1 = (src_x_1 - src_x) * src[src_y_1, src_x_0, n] + (src_x - src_x_0) * src[src_y_1, src_x_1, n]
                dst[dst_y, dst_x, n] = int((src_y_1 - src_y) * value0 + (src_y - src_y_0) * value1)
    return dst


参考

  1. ^abMaskRCNN算法详解 
  2. ^如何使用Mask RCNN模型进行图像实体分割? https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247489971&idx=2&sn=df95a68a706abc5b87bb17a2c067edee&chksm=fbe9a07ccc9e296a68c807a757ca498b54c9c352480a53e2739931bacf30ebc1f90637a59500&mpshare=1&scene=1&srcid=1209JF3DckE4dVj41XmMhdgp#rd
  3. ^ROI Align https://zhuanlan.zhihu.com/p/66151355