我也在研究文中提到的四步交替训练。我的理解正确的实现应该是:
- 训练共享卷积层 + RPN,获取区域建议
- 使用区域建议作为输入训练 Fast RCNN(注意:不是 Faster RCNN)
- 使用步骤2中 Fast RCNN 的权重初始化 Faster RCNN,仅训练 RPN 部分
- 固定共享卷积层和 PRN,只训练底部网络
第2步需要对 tf-faster rcnn 实现进行一些修改。对于其他步骤,您可以通过在 network.py 模块中将 trainable 标志设置为 false 来修复权重。
def _region_proposal(self, net_conv, is_training, initializer):
rpn = slim.conv2d(net_conv, cfg.RPN_CHANNELS, [3, 3], trainable=*setThisToFalse*, weights_initializer=initializer,
scope="rpn_conv/3x3")
self._act_summaries.append(rpn)
rpn_cls_score = slim.conv2d(rpn, self._num_anchors * 2, [1, 1], trainable=*setThisToFalse*,
weights_initializer=initializer,
padding='VALID', activation_fn=None, scope='rpn_cls_score')