RPN候选区域网络
Region Proposal Networks。 RPN网络用于生成region proposals。 该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals
rpn = RegionProposalNetwork(
512, 512,
ratios=ratios,
anchor_scales=anchor_scales,
feat_stride=self.feat_stride,
)
1. base anchors生成
生成基础的九个anchor,共三种候选面积(128,256,512) x 三种尺度(1:1,1:2,2:1)
设置:
- base_size=16
由特征提取网络可知,原图经过特征网络,会缩小为原来的1/16,也就是下采样率为16。
也就是输出的特征图每个像素在原图上的对应大小应该为16x16个像素的区域。
特种图中的anchor的尺寸,乘与base_size得到的就是原图中的尺寸
- anchor_scales=[8, 16, 32]
特征图中得到的anchor的尺寸,
最终生成的原图中的anchor,需要乘与16,因为下采样率是16倍嘛
8x8 ---(16x8)x(16x8)
16x16 ---(16x16)x(16x16)
32x32 ---(16x32)x(16x32)
- ratios=[0.5,1,2]
对于三个候选面积共三种候选面积(128,256,512),每个面积会生成三个不同的宽高尺度;
也即是,对于最总面积为128的anchor,会生成三个不同宽高的anchor,但是三个anchor面积还是相同
有已知给定的三个初始尺寸,计算9个anchors的计算公式如下
计算公式推导如下:
#已知条件:
base_size = 16 ,anchor_scales, ratios
#每个特征图anchor scale后的尺寸大小为(也就是对应原图的尺寸)
scl_h = base_size*anchor_scales[i]
scl_w = base_size*anchor_scales[i]
求radio比例的任意一个dst_h, dst_w
# 已知:radio前后,anchor的面积相同 ,只是宽高比不同
scl_h * scl_w = dst_h * dst_w
#且dst_h 和 dst_w的比例符合raidio :
dst_h /dst_w = ratios[j]
==> dst_h = ratios[j]*dst_w
带入:scl_h * scl_w = dst_h * dst_w
得到:
scl_h * scl_w = ratios[j]*dst_w * dst_w
==> dst_w = sqrt(scl_h * scl_w/ ratios[j]), 其中scl_h和scl_w相同
==> dst_w = base_size*anchor_scales[i] * sqrt(1/ ratios[j])
以上公式对应的python实现为:
#bbox_tools.py
def generate_anchor_base(base_size=16, ratios=[0.5, 1, 2],
anchor_scales=[8, 16, 32]):
py = base_size / 2.
px = base_size / 2.
anchor_base = np.zeros((len(ratios) * len(anchor_scales), 4),
dtype=np.float32)
for i in six.moves.range(len(ratios)):
for j in six.moves.range(len(