MaskRCNN要点


faster-rcnn网络结构

MaskRCNN的网络框架

  其中黑色部分为原来的 Faster-RCNN,红色部分为在 Faster网络上的修改:

1)将 Roi Pooling 层替换成了 RoiAlign

2)添加并列的 FCN 层(mask 层);

conv:采用卷积网络进行特征提取,最后作者取的是conv5的输出,也就是13*13*256送给RPN网络的。


RPN结构图

1、前面我们指出,这个conv feature map的维度是13*13*256的;

2、作者在文章中指出,sliding window的大小是3*3的,那么如何得到这个256-d的向量呢? 这个很简单了,我们只需要一个3*3*256*256这样的一个4维的卷积核,就可以将每一个3*3的sliding window 卷积成一个256维的向量;

这里读者要注意啊,作者这里画的示意图 仅仅是 针对一个sliding window的;在实际实现中,我们有很多个sliding window,所以得到的并不是一维的256-d向量,实际上还是一个3维的矩阵数据结构(最后得到了一个channel数目是256的特征图,尺寸和公共特征图相同,我们假设是256 x (H x W));

3、然后就是k=9,所以cls layer就是18个输出节点了(2指cls层的分类结果包括前后背景两类),那么在256-d和cls layer之间使用一个1*1*256*18的卷积核,就可以得到cls layer,对于第三个问题,我们可以近似的把这个特征图看作有H x W个向量,每个向量是256维,那么图中的256维指的就是其中一个向量,然后我们要对每个特征向量做两次全连接操作,一个得到2个分数,一个得到4个坐标,由于我们要对每个向量做同样的全连接操作,等同于对整个特征图做两次1 x 1的卷积,得到一个2 x H x W和一个4 x H x W大小的特征图,换句话说,有H x W个结果,每个结果包含2个分数和4个坐标;reg layer的输出是36个,所以对应的卷积核是1*1*256*36,这样就可以得到reg layer的输出了;

4、然后cls layer 和reg layer后面都会接到自己的损失函数上,给出损失函数的值,同时会根据求导的结果,给出反向传播的数据。

RoIAlign

RoIAlign和RolPooling的作用均实现从原图ROI区域映射到卷积区域最后pooling到固定大小的功能,然后通过池化把该区域的尺寸归一化成卷积网络输入的尺寸。由于 RoIPooling 采用的是 INTER_NEAREST(即最近邻插值) ,即在resize时,对于 缩放后坐标不能刚好为整数 的情况,采用了 粗暴的四舍五入,相当于选取离目标点最近的点。Kaiming He 在他的论文Mask RCNN里指出,这样做会在一定程度上损失 空间对称性(Alignment,所以他们把 最近邻插值 换成了 双线性插值 。换完插值法的 RoIPooling 就有了一个更加高大上的名字 —— RoIAlign 

  • 遍历每一个候选区域,保持浮点数边界不做量化。
  • 将候选区域分割成k x k个单元,每个单元的边界也不做量化。
  • 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
这里对上述步骤的第三点作一些说明:这个固定位置是指 在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。
参考:

https://blog.csdn.net/linolzhang/article/details/71774168

http://www.360doc.com/content/17/0809/10/10408243_677742029.shtml

https://www.cnblogs.com/ranjiewen/articles/8869703.html

https://blog.csdn.net/lanyuxuan100/article/details/71124596

猜你喜欢

转载自blog.csdn.net/ziyouyi111/article/details/80890166