算法步骤
- 使用深度神经网络来提取特征,得到特征图
- 使用RPN网络生成候选框,将RPN网络生成的候选框投影到特征图上获得相应的特征矩阵
- 使用ROI池化缩放到7×7大小的特征图,展平之后通过一系列全连接层得到预测结果(和FastRCNN一样)
FasterRCNN可以说是Region Proposal Network(RPN)和FastRCNN和结合。
RPN结构
使用3×3的滑动窗口来生成anchor(在特征图上,滑动窗口的中心就是anchor的中心),实现使用的是3×3的卷积,其中padding=1,stride=1,也就是不改变维度,同时卷积的中心能够遍历特征图的所有位置。卷积核的个数为256,也就是256-d。然后再通过两个1×1的卷积来得到2k个score(包含不包含物体的概率,实现中可以只使用其中一个,也就是k个score)和4k个coordinate(每一个anchor包含x,y,w,h4个值)。
将特征图映射回原图时,计算两个的宽高比作为步距,那么用步距乘以特征图的坐标即可得到原图的坐标。
锚框
锚框使用三种尺度:128、256和512,比例有1:1、1:2和2:1三种,于是总共可以得到9个锚框。
对于一张输入图片,使用上面的方法得到很多anchor之后,首先忽略掉超出边界的anchor,然后基于候选框的类别概率,使用非极大值抑制,IoU设置为0.7。
训练
训练RPN网络时,从众多anchor中随机采样256个,包含了一半的正样本和一半的负样本(1:1)。如果正或者负样本少于一半,用另一种填充。
如果判断是否为正样本?当使用下面第二个条件找不到anchor的时候,采用第一个条件:
(1) 和ground-truth有最大的IoU
(2) 和ground-truth的IoU高于0.7
如何判断是否为负样本?和任何ground-truth的IoU都小于0.3。
IoU处于0.3到0.7之间的直接舍弃。
RPN损失函数
其中,
p
i
p_i
pi为anchor包含物体的概率,
p
i
∗
p_i^*
pi∗为1或者0(正样本为1),
t
i
t_i
ti表示预测为第i个anchor的边界框回归参数,
t
i
∗
t_i^*
ti∗为第i个anchor的ground truth,
N
c
l
s
N_cls
Ncls为一个小批量的样本数量256,
N
r
e
g
N_reg
Nreg表示anchor位置的个数。
两个损失函数的形式和fast RCNN一致。
整个Faster RCNN训练时,可以直接采用RPN loss和Fast-RCNN loss联合训练,两个加起来作为损失然后反向传播。