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个单元,每个单元的边界也不做量化。
- 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
参考:
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