直到RPN生成Roi的时候,MaskRcnn和FasterRcnn的结构都是一样的。
然后RPN会过滤掉一部分,剩下的Roi分成前景和背景(2分类),同时RPN会对Roi做一个初步的box回归。
接下来我们会把图上的anchor投影到feature map上,这里MaskRcnn用的是比Roi pooling更精细的Roi Align,得到每个Roi对应在feature map上的feature,
最后,对这些Roi进行分类(N类别分类)、BB位置回归和Mask生成(在每一个Roi里面进行FCN操作)。
所以新的东西其实就是
- Roi Align 在之前的文章里面讲过
- FCN
主要说一下 FCN
FCN最先被提出是在《Fully Convolutional Networks for Semantic Segmentation》
作者首先使用FCN通过一些列卷积将图像下采样到小尺度的Feature Map,这组卷积通常被称为Encoder,然后通过双线性插值或者Deconv对Feature Map进行上采样,这个部分通常被称为Decoder,这种架构是有效的,但是也有缺点:
- Deconv操作输出的不均匀重叠,存在棋盘伪像 Checkerboard Artifacts。
- Encode过程中信息丢失导致在边界处的分辨率较差
作,即进行插值操作,不断的增大其feature map,最后对每一个像素值进行分类
用FCN替代全连接层的好处
Deconv理解
为了输出与原图一样大小的图像语义分割图,我们对最后一个卷积层进行上采样,使用的方法是Deconv,在Pytorch等框架中被称为转置卷积,有些人称为反卷积只是概念上的,因为它和卷积层对称,但是这样容易和数字信号处理中的反卷积混淆,所以我们还是称之为转置卷积更好。
我们一般在需要上采样的时候使用到转置卷积,转置卷积不会使用预定义的插值方法,它具有可学习的参数,
在需要上采样的地方经常会用到它,比如实例分割对feature map恢复到原图尺寸,关键点检测提高feature map的分辨率,GAN的生成器用随机值生成一个full size的图片…
我们先看一个简单的卷积操作,然后再看它对应的deconv操作,下面是4x4的feature与3x3的kernel进行卷积得到2x2的feature的过程。其中步长为1,没有padding。
我们用另一种形式展示这个卷积的过程,
如下图1中所示,首先将4x4的 feature map变换成一个16x1的向量,
然后再下图2和下图3中,将3x3的kernel变换成4x16的矩阵
我们对这个4x16的矩阵和16x1的矩阵做矩阵乘法,得到4x1的矩阵,
然后再将它按照行优先resize到2x2,这样就和我们之前卷积的结果一模一样。
总体来说就是通过重新排列 卷积核 和 feature map,用矩阵的形式表达了卷积操作。
那我们可以思考,4x16矩阵和16x1矩阵可以得到4x1矩阵
那我们有了4x1矩阵和4x16矩阵的转置,是不是也可以回到16x1的原来feature map呢?
现在反过来操作
我们需要注意的是,不仅仅要保证16x4 * 4x1 得到16x1,
还要保证一个卷积结果对应原始feature map上的九个点。
如下图所示先得到16x1矩阵。再得到4x4矩阵
需要注意的是:这里的转置卷积矩阵的参数,不一定从原始的卷积矩阵中简单转置得到的,
转置这个操作只是提供了转置卷积矩阵的形状而已。
参考