Faster R-CNN中的一些细节

关于Faster R-CNN中的细节

在这里插入图片描述思考一个问题,上图中,为什么在conv feature map中这个特征图中的一个蓝色的像素点可以去代表原图中那9个anchor中的信息?那我想改一下anchor的数量,10个行不行?或者说改anchor的大小,原来是128,256,512的面积,我改成1024行不行?

首先纠正一下问题的说法,不是一个蓝色的像素点可以去代表原图中那9个anchor中的信息,而是这一整个通道的蓝色像素点(论文中采用的backbone是ZF,所以说256-d,我自己的项目中backbone采用的是VGG16,所以应该是512-d)可以代表原图中那9个anchor中的信息。关于这个问题,所有的博客都没有具体说明。论文中也是一笔带过。我一年前刚接触Faster R-CNN的时候,也像别人请教过这个问题。大佬给我的回答是一个像素点就负责预测这9个anchor。具体的思想可以去看YOLO。我简单的看了一下YOLO,其核心思想就是水平划分为若干个表格,那么object的中心点落在了哪个像素点上,这个像素点就负责去预测这个object。其实说了等于没说。今天也算把这个问题弄明白了。特地写一篇博客来记录下为什么这一整个通道的像素点可以代表原图中的那9个anchor的信息。

感受野:

感受野就是特征图中的一个像素点映射至输入中的那块区域就叫做这个点的感受野
那么在Faster R-CNN中通过咱们的backbone(以下所说的backbone都是VGG16)。最终得到的特征图中的一个像素点对应着原始图片中多大的区域呢?我们不妨来计算一下。
先贴代码:

net = slim.repeat(self._image, 2, slim.conv2d, 64, [3, 3], trainable=False, scope='conv1')
        net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool1')

        # Layer 2
        net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], trainable=False, scope='conv2')
        net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool2')

        # Layer 3
        net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], trainable=is_training, scope='conv3')
        net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool3')

        # Layer 4
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], trainable=is_training, scope='conv4')
        net = slim.max_pool2d(net, [2, 2], padding='SAME', scope='pool4')

        # Layer 5
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], trainable=is_training, scope='conv5')

同时在进入RPN层后又经过了一个3*3的conv,就像这样

rpn = slim.conv2d(net, 512, [3, 3], trainable=is_training, weights_initializer=initializer, scope="rpn_conv/3x3")

关于感受野大小的计算公式:
在这里插入图片描述
在这里插入图片描述
这里给出了两种计算方式,第一个图的公式是由l-1层推第l层的,也即正向的推理公式,第二个图的公式是由第l+1层推第l层的,也即反向的推理公式。你用两种计算方法得到的感受野结果也是完全相同的。博主也将两种方式都一一计算过。计算结果完全一致。那么本文就用正向的推理公式推导咱们Faster R-CNN中那一整个蓝色像素点对应着原图中多大的一个感受野区域。这里给出计算过程:
r(input)=1 s(input)=1 (默认input的感受野大小为1,步长的大小为1)
r(conv1_1) = 1+2 =3
r(conv1_2) = 3+2 = 5
r(conv1_pool) = 5+1 = 6
r(conv2_1) = 6+2×2 = 10
r(conv2_2) = 10+2×2 = 14
r(conv2_pool) = 14+1×2 = 16
r(conv3_1) = 16+2×4 = 24
r(conv3_2) = 24+2×4 = 32
r(conv3_3) = 32+2×4 = 40
r(conv3_pool) = 40+1×4 = 44
r(conv4_1)=44+2×8= 60
r(conv4_2) = 60+2×8 = 76
r(conv4_3) = 76+2×8 = 92
r(conv4_pool) = 92+1×8 = 100
r(conv5_1) = 100+2×16 =132
r(conv5_2)= 132+2×16 = 164
r(conv5_3) = 164+2×16 = 196
r(conv_RPN) = 196+2×16 = 228

这个228的含义也就是咱们最开始那一张图中的一整个通道的蓝色点的特征矩阵是包含了原图中228*228大小的区域信息的。看到这里是不是有点感觉了?但是咱们只知道感受野的大小,并不知道感受野的中心坐标。假如咱们知道了感受野的大小以及感受野的中心坐标。那么咱们不就知道了感受野的具体位置了吗?
感受野的中心坐标:
在这里插入图片描述
通过上述式计算可以得出最后一层的feature map中对应原图中的中心点坐标为(6,6)。那么现在我们拿到了中心点坐标以及对应的感受野大小。不就知道了原图中第一个像素点对应着原图的感受野了吗?也就是以(6,6)这个点为中心点的228×228的矩形。同理通过下述式子中也可以计算出特征图中其它的点对应着原图中的感受野大小,比如(0,1)这个特征图上的点就对应着原图(6,6+16)这个点为中心点的228×228的矩形的。那么这就解释了为什么上述问题。但是这里还有一个点的问题就是一个特征图像素点只对应228×228的区域啊。它怎么可以预测出面积大小为256,512的矩形框啊。那么这里可以理解为:假如咱们人去预测一个猫的时候,只看到了猫的身体,但我能不能把这个猫的全身给圈出来?答案是肯定的。所以我们猜想网络也具有这种能力。当然我们的实验证实了我们的猜想的确是正确的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值