RPN网络的锚是如何生成的

作者:刘缘
链接:https://www.zhihu.com/question/42205480/answer/128259995
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

anchor这个问题,我最初也没弄懂。刚刚看完RBG大神的源码,终于明白了,来回答一发,如果有不对的地方请大家指出。
以VGG-16改造的faster r-cnn为例。py-faster r-cnn的/model/pascal-voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt的RPN部分。这部分是在原来的VGG16的conv5_3之后添加的。
1、conv5_3->rpn_conv/3*3->rpn_relu对应于文中进行n*n的卷积。这里输出的维数(output)为512,高H和宽W为输入的图像原始大小的1/16。(1,512,H,W)
2、rpn_relu->rpn_cls_score->rpn_cls_score_reshape->rpn_cls_prob->rpn_cls_prob_reshape
这里是预测每个点的前景背景概率。rpn_cls_score实际上就是一个1*1的卷积层而已。
如果有A个anchor,每个anchor都有一个前景概率一个背景概率(2*A),输出的大小为(1,2*A,H,W)。
这里的reshape只是为了利用softmax层进行概率的计算而已。
3、rpn_relu->rpn_bbox_pred
这里就是预测每个点的boundingbox。同样的,rpn_bbox_pred也是一个1*1的卷积层而已。输出大小为(1,4*A,H,W) 。
关键在此, 这里输出的并不是一个boundingbox的左上右下坐标,而是一个修改量(boundingbox regression)。在r-cnn的supplementary material中,给出了下面几个公式
<img src="https://pic3.zhimg.com/50/v2-e63f33b16aff3345d984a08eec143322_hd.png" data-rawwidth="240" data-rawheight="170" class="content_image" width="240">这里面的 RPN网络的锚是如何生成的_第1张图片这里面的 就是的anchor(高、宽、中心),而里面的 是rpn_bbox层输出的四个值, 就是修改之后的高、宽、中心。
4、(rpn_bbox_pred+rpn_cls_prob_reshape)->proposal_layer
这里的proposal_layer就完成了上述修正,并且进行NMS(非极大抑制)以及概率排序等获得最终的boundingbox。这样就完成了在同一个点上获得不同尺度不同比例的包围盒。
输出大小为:(N,4),这里的 N与NMS以及概率排序阈值有关,得到的就是boundingbox的四个坐标。

你可能感兴趣的:(RPN网络的锚是如何生成的)