RPN整体逻辑
RPN网络是在faster-rcnn中提出来的,主要是为了替代Selective Search算法。在mask-rcnn中,RPN根据Backbone CNN计算得到的图像feature map,来负责找到2000个可能含有物体的bbox坐标(为了方便,主要以e2e_mask_rcnR_50_FPN_1x.yaml的训练过程为主进行记录和说明)
maskrcnn-benchmark代码中,用RPNModule模块,封装整个RPN的计算过程。RPNModule的几个重要对象为
- head (RPNHead): rpn的cnn网络,对feature map每个点计算对应的bbox和cls_logits
- anchor_generator(AnchorGenerator): 根据原图大小和feature map的大小,算出所有anchor在原图上的坐标。
- box_selector_train(RPNPostProcessor): 根据head计算的分值,选取最高2000个box,送入后续的roi_head的网络中。这部分功能对RPN网络本身的训练没有帮助。如果只是训练RPN网络,这步可以省略。
- loss_evaluator(RPNLossComputation): 用target的box,在anchor中按一定比例选择正负样本,然后根据前面head计算的结果,计算RPN网络的Loss
1 | class RPNModule(torch.nn.Module): |
RPN具体计算过程
1,RPNHead.forward
rpn_head通过一个简单的cnn网络计算objectness,rpn_box_regression。这是一个普通的CNN,比较简单
2, AnchorGenerator.forward
计算边框坐标,这个是固定的,只要知道图片宽高,featureMap的宽高就可以做了,会得到20w+个anchor的坐标
1 | class AnchorGenerator(nn.Module): |
3,RPNPostProcessor.forward
RPNPostProcessor.forward是从前面计算的anchor中,找到rpn_head得分最高的box,在训练时,是为了给后面roi_head准备的,对于RPN自身用处不大
1 | class RPNPostProcessor(torch.nn.Module): |
4,RPNLossComputation
rpn的loss计算是对rpn_head的结果计算loss,这样通过训练,可以找到更好的proposal。这里计算loss的问题是,他不像分类那样target label都是很直接的。每张图片上也就几个框框作为target,而rpn_head能够计算出20多万个anchor,每个anchor都会产生出cls分值和bbox的回归系数。想到好的方法,优化这样的nn还是挺厉害的。
1 | class RPNLossComputation(object): |