SPPNet特征图与region proposal对应
感受野的尺寸计算
从当前特征图经过卷积,得到下一层特征图。得到的这层特征图尺寸计算公式为:
Output = (input - K + 2P)/s + 1 公式(1)
所以,从输出层推输入层的尺寸公式为:
input = (output - 1) * s + K -2P 公式(2)
这个公式只是输出层与输入层图像尺寸进行对应,但并不是感受野的对应。
一般直接说感受野,指的是卷积网络最后一层输出的特征图中的一个像素到原始输入图片的一个区域之间的对应。
还有一种是局部感受野,指的是下一层中的一个像素点,对应上一层中的某个区域。这个局部感受野在计算的时候,直接可以用公式(2),但是要将公式最后的-2P去掉,因为感受野和Padding无关。这样就得到了如下公式(3)
input = (output - 1) * s + K 公式(3)
举个例子,假设在输入图片上,周围padding了无数个0,但是感受野的定义,是输出feature map中的像素点,对应原始输入图片,这样看的话,输出的特征图中的像素,没有和padding的0相对应的。因此在计算感受野的过程中,并不用考虑padding。
注意,上面说的这个,仅仅是输出图片中的一个像素对应输入图片中的某个区域的区域的尺寸。
坐标对应(下一层像素对应上一层特征图感受野区域的中心坐标)
公式:
p
i
p_i
pi =
s
i
s_i
si *
p
j
p_j
pj + (
k
i
k_i
ki-1)/2 - padding 这里必须要有padding,因为添加padding会影响后续特征图中坐标的位置。
其中
p
i
p_i
pi表示当前层的坐标,
p
j
p_j
pj表示下一层的坐标。
s
i
s_i
si表示从当前层到下一层的卷积核步长,
k
i
k_i
ki表示从当前层到下一层卷积核尺寸。
其中
p
i
p_i
pi和
p
j
p_j
pj表示的是坐标值,可以是w轴,也可以是h轴,并且索引是从0开始的。
以上图为例:
首先求一下绿色特征图到蓝色特征图的感受野尺寸大小,用上面的那个公式(3),这个像素点恰好是(1-1) * 1+3 = 3。这里output取1,表示绿色特征图中1个像素点,对应蓝色特征图中的3个像素点。
上面这个绿色的坐标是
p
j
p_j
pj,下面这个蓝色的坐标是
p
i
p_i
pi。
其中,取绿色特征图的左上角那个像素,这个像素点在w轴和h轴的坐标都是0。
这个像素点对应蓝图中的像素点是
p
i
p_i
pi = 1 * 0+(3-1)/2+0=1,可以看到,对应蓝色图中的坐标为(1,1)的那个像素点。这样就将绿色特征图中的一个像素点,对应到了蓝色特征图中的感受野的中心坐标。
上面举例子,卷积核尺寸是奇数,求出来结果是整数,但是如果 卷积核尺寸是偶数的时候,该如何计算呢?
何凯明在SPPNet中这样来处理的:令每一层的padding都[
k
i
k_i
ki/2] 中括号表示取整 ,这样就可以化简公式为:
当
k
i
k_i
ki为奇数时:
p
i
p_i
pi =
s
i
s_i
si *
p
j
p_j
pj
当
k
i
k_i
ki为偶数时:
p
i
p_i
pi =
s
i
s_i
si *
p
j
p_j
pj - 0.5
由于坐标值不能为小数,因此直接将公式化简为
p
i
p_i
pi =
s
i
s_i
si *
p
j
p_j
pj。这样就将公式化简到了极简形式。
将上面的公式进行级联得到
p
i
p_i
pi = S *
p
j
p_j
pj,其中,S =
∏
0
i
\prod_{0}^i
∏0i*
s
i
s_i
si。
对于feature map上的坐标(X,Y),在原图上对应的坐标为(x,y) = (S * X,S * Y)。论文中附录中的具体做法是,选取region proposal的左上角坐标和右下角坐标去和feature map中的坐标做映射。
论文中具体给出的公式为,左上角为:X = [x/S] + 1,右下角为:X = [x/S] - 1。加一和减一可能是因为这样映射后,导致映射到原图,会比真实的region proposal要大一些?通过 +1和-1的一个操作进行一定的配平