4步交替式RPN / Faster R-CNN训练?- Tensorflow物体检测模型

3

我正在研究最近发布的tensorflow/models/../object_detection模型,特别是更快的r-cnn。

论文提到了4步交替训练,其中您需要:

  1. 训练RPN,然后冻结RPN层,
  2. 训练RCNN,然后冻结RCNN层,
  3. 训练RPN,然后冻结RPN层,
  4. 训练RCNN。

据我所知,在第2步= RCNN中,确实使用以下代码冻结RPN:

if self._is_training:
    proposal_boxes = tf.stop_gradient(proposal_boxes) 

我应该翻译RPN加冻结RPN层的训练,接着是RCNN的训练,但还有其他三个步骤在哪里进行呢?

我是否漏掉了什么东西?

4个回答

7
我们在TF Object Detection API中实现Faster R-CNN,与论文相比有一些不同之处。其中一个区别是我们采用端到端的训练方式,而不是论文中使用的交替训练方式。
你提到的stop_gradient实际上并没有冻结RPN,它忽略了通过proposal坐标的梯度贡献,但仍允许梯度通过RPN特征传递。
希望这可以帮助到你!

感谢Jonathan!最终与其他代码库进行了比较。很少有人实现4步交替算法...我们是否阻止梯度通过,因为我们正在使用近似联合训练? 基本上这个:“解决方案忽略了关于提议框坐标的导数,这些坐标也是网络响应。”如果我们要实现非近似,则必须使用RoI Warping层进行交换... - macguy
1
我们在那里停止梯度并不是因为我们必须这样做(crop_and_resize是完全可微分的,并且基本上与您可能在某些论文中看到的ROIAlign操作相同)--- 我们停止它是因为我们发现它在训练早期是不稳定的。 - Jonathan Huang
我有很多问题!我只能拼凑出其中的一部分!在Fast/Faster/X R-CNN的第1阶段,我们使用NMS将RPN提议限制为300个。在Faster R-CNN的第2阶段,我们使用这300个提议框,并对每个图像采样256个锚点,最多128个是+,其余是-。那么这个操作是否等同于_unpad_proposals_and_sample_box_classifier_batch? - macguy
1
我们从RPN创建了300个提案,然后从中抽样64个传递给第二阶段分类器。在第一阶段结束时,我们采样256个锚点以计算第一阶段的损失。这听起来有道理吗? - Jonathan Huang
是的,绝对没错!谢谢你的回答! - macguy
@JonathanHuang,这种方法与4步交替训练相比是否存在已知的mAP性能下降?似乎pytorch torchvision也在做类似的事情,将rpn头输出和roi头输出的损失分配到骨干网络和相应的卷积层/mlp层的可训练层中。 - IntegrateThis

0

多阶段训练仍然是可能的 - 目标检测 API 配置文件提供了冻结网络某些层进行训练的功能。(train_config 中的 freeze_variables 参数)

如果您仔细检查来自 TF 目标检测 API 生成的模型的检查点,这些都是 Faster RCNN 论文中对应于网络架构的外部变量名作用域 -

区域提议网络:

  • 'FirstStageFeatureExtractor/InceptionResnetV2' (共享)
  • 'Conv/biases', 'Conv/weights'
  • 'FirstStageBoxPredictor

探测器:

  • 'FirstStageFeatureExtractor/InceptionResnetV2' (共享)
  • 'SecondStageFeatureExtractor/InceptionResnetV2'
  • 'SecondStageBoxPredictor

所以您可以在冻结不想更新的层的同时执行连续多轮训练。此外,请注意,如果您不希望它们对更新产生贡献,则可以在配置文件中将第一和第二阶段的分类和定位损失权重设置为零。

希望这能帮到你!


0

因为StackOverflow的荒谬规定,我无法添加评论。我不得不在这里写成“答案”。但实际上,这是在回应@Jonathan Huang的问题。

我仍然对停止梯度感到困惑。如果我们停止盒子的梯度,如何提高RPN盒子的准确性?在这种情况下,似乎只有检测和RPN对象准确性得到了改善,但RPN盒子准确性永远无法得到改善。

尽管RPN损失由框损失和对象准确性损失组成,但禁用位置的梯度可能会导致该层中的参数估计256D张量的4K坐标,例如变为常数。那么RPN盒子位置如何得到改善呢?

能否有人提供一些解释?谢谢


0

我也在研究文中提到的四步交替训练。我的理解正确的实现应该是:

  1. 训练共享卷积层 + RPN,获取区域建议
  2. 使用区域建议作为输入训练 Fast RCNN(注意:不是 Faster RCNN)
  3. 使用步骤2中 Fast RCNN 的权重初始化 Faster RCNN,仅训练 RPN 部分
  4. 固定共享卷积层和 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')

1
将is_training标志设置为false不起作用,因为它会固定所有层。 - david lam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接