原始图像ROI如何映射到feature
结论
在SPP-net中,假设(x’,y’)表示特征图上坐标点,(x,y)表示该坐标点在原始输入图像上的对应点。则有结论 (x,y)=(S * x’,S * y’) 其中S代表所有卷积层和池化层的stride 乘积
则有: 左上角点 x’= ⌊x/S ⌋+1 右下角点 x’=⌈x/S⌉-1 (为了处理有小数的情况 同时左上角点和右下角点都向图像内侧近似,所以左上角加一 右下角减一 同时为了减小这种近似产生的误差 所以左上角向下取整 右下角向上取整)
关键点
上述结论是如何得到的,下面进行详细的推导,在此之前需要明确如下关键点:
- 在原始图形ROI映射到feature map上的过程中 映射的是左上角点和右下角点 这两个点可以确定ROI的boundingbox
- 之所以存在映射关系 是因为在卷积和池化操作中带来了feature map维度的变化 而维度变化产生的原因是卷积核size以及卷积操作和池化操作中stride造成的。其中stride可以类比为图像降采样,步长越大 采样越粗糙 则经过这一过程的feature map维度变化越大,因此stride在这一过程中起到了缩放因子的作用;同理卷积核的size起到了feature map中像素点位移的作用。
由上图可知经过卷积核操作之后feature map会产生位移,位移大小为(kernelsize-1)/2(kernel size -1 表示将中心点所在的那一行减去 除以2 可得到一侧的像素点个数 而这个就是产生的位移量)
当然如果有padding存在 那么位移量也会有变化 padding可以起到抵消位移量的作用 因此当padding存在时 产生的位移量为
(kernel-1)/2-padding
推导过程
由上图可知
每经过一次卷积就可以当做是一次降采样 那从第i+1层返回到第i层则需要将第i+1层的位置坐标乘上第i层的stride大小,同时由于kernel size的作用使得第i层到第i+1层出现向下平移的处理 因此在反向操作的时候需要加上(kernelsize-1)/2大小 这样就可以获得从第i+1层到第i层的位置映射
在 SPP-net中进行简化操作:
各层之间感受野的大小关系
在此回到这张图
很明显每一层卷积输出的feature num数目 即每一层feature map的长度为
输出长度=(输入长度+2padding-kernel size)/stride +1
对于感受野的大小而言:
在第一个卷积层时
感受野的大小等于卷积核的大小
在之后的卷积层
感受野的大小=上一层感受野的大小+(kernel size-1)x 之间所有stride的乘积
layer1 显然每一个feature像素点的感受野是conv1中kernel大小 即一个像素点可以感知layer0中3个像素点的信息
对于layer2
conv2中kernel size为3 去除掉中心点位置 左右还各包含1个像素 而对于layer1 每增加一个1个像素会增加layer1层及之前的所有stride的乘积那么多个layer0对应的像素点信息(因为每增加一个像素点就会增加stride个前一层的像素信息 比如在layer1中每增加一个像素点 就会增加2个layer0中的像素信息(在layer0上做卷积向右移动2个位置才能生产layer1上一个像素点),同理如果在layer2上增加一个像素点 就会增加2个layer1的像素信息,就会增加22个layer0的像素信息)
所以对于layer2而言 感受野的大小=layer1感受野大小+(conv2 kernel size大小-1) * layer1及之前所有的stride大小=7
(conv2 kernel size-1 是因为要减去中心点的位置 这一位置对应的感受野大小就是layer1的感受野大小) 多出来的位置在layer1中每增加一个feature 值 需要在layer0中多感知stride个像素信息
同理 在conv3中 kernel size中心对应的感受野信息为layer2感受野大小 conv3 stride-1 多出来的位置信息每多处一个feature值需要在layer1中多感知2个像素信息 即需要多感知2*2个layer 0像素信息
推导完毕
参考
https://zhuanlan.zhihu.com/p/24780433
https://blog.****.net/ibunny/article/details/79397399