【问题标题】:4-step Alternating RPN / Faster R-CNN Training? - Tensorflow Object Detection Models4 步交替 RPN / Faster R-CNN 训练? - TensorFlow 对象检测模型
【发布时间】:2018-03-15 15:24:57
【问题描述】:

一直在研究最近发布的 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 训练,但是其他 3 个步骤在哪里执行?

我错过了什么吗?

【问题讨论】:

    标签: tensorflow object-detection


    【解决方案1】:

    我们在 TF 对象检测 API 中的 Faster R-CNN 实现非常接近论文,但在一些方面有所不同。其中一个区别是我们对模型进行端到端训练,而不是论文中使用的交替训练。

    您提到的 stop_gradient 实际上并没有冻结 RPN --- 它所做的是它忽略了梯度通过提案坐标的贡献,但继续允许梯度通过 RPN 特征。

    希望这会有所帮助!

    【讨论】:

    • 谢谢乔纳森!最后与其他代码库进行比较。很少有人真正实现 4 步交替算法……我们是否因为使用近似联合训练而阻止梯度通过?基本上,这是:“解决方案忽略了提案框坐标的导数,这也是网络响应”。如果我们要实现非近似,我们必须使用 RoI Warping Layer 进行交换......
    • 我们停止渐变不是因为我们必须这样做(crop_and_resize 是完全可微的,并且与您可能在某些论文中看到的 ROIAlign 操作基本相同)--- 我们停止它是因为我们发现它在训练的早期是不稳定的。
    • 我有很多问题!我只能拼凑一些!在 Fast/Faster/X R-CNN 的第 1 阶段,我们使用 NMS 将 RPN 提议限制为 300。在 Faster R-CNN 的第 2 阶段,我们使用这 300 个提议框,每个图像采样 256 个锚点,最多 128 个为+,其余为-。该操作是否等同于 _unpad_proposals_and_sample_box_classifier_batch?
    • Correct-ish --- 我们从 RPN 创建 300 个提案,然后从中抽取 64 个样本传递给第二阶段分类器。我们在第一阶段结束时对 256 个锚点进行采样以计算第一阶段损失。这有意义吗?
    • 没错!感谢您的回答!
    【解决方案2】:

    由于 StackOverflow 的荒谬规则,我无法添加评论。我必须把它写在这里作为“答案”。但这实际上是遵循@Jonathan Huang 回复中的问题。

    我仍然对停止渐变感到困惑。如果我们停止 box 的梯度,如何提高 RPN box 的准确率?在这种情况下,似乎只提高了检测和 RPN 对象精度,但 RPN 框的精度永远无法提高。

    虽然 RPN 损失由 box loss 和 objectness loss 组成,但禁用位置梯度可能会导致层中的参数(例如,从 256D 张量估计 4K 坐标)变得恒定。那么如何改进 RPN 框位置呢?

    谁能提供一些解释?谢谢

    【讨论】:

      【解决方案3】:

      我也在考虑执行论文中提到的 4 步交替训练。 我对正确实现的理解应该是: 1. 训练shared conv-layer + RPN,检索region proposal 2.以区域提议作为输入训练Fast RCNN(注意:不是Faster RCNN) 3. 使用步骤 2 中 Fast RCNN 的权重初始化 Faster RCNN,仅训练 RPN 部分 4. 修复shared conv-layer和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')
      

      【讨论】:

      • 将 is_training 标志设置为 false 将不起作用,因为它修复了所有层
      【解决方案4】:

      多阶段训练可能仍然可行 - 对象检测 API 配置文件规定在训练时冻结网络的某些层。 (train_config中的freeze_variables参数)

      如果您仔细检查来自 TF 对象检测 API 的模型生成的检查点,这些是与 Faster RCNN 论文中的网络架构相对应的外部变量名称范围 -

      区域提议网络:

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

      检测器:

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

      所以你可以做的是在冻结你不想更新的层的同时执行连续几轮的训练。另请注意,如果您不希望它们参与更新,则可以在配置文件中将第一阶段和第二阶段的分类和定位损失权重设置为零。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 2018-06-06
        • 2019-01-22
        • 2019-09-02
        • 2021-10-07
        • 2018-05-04
        • 1970-01-01
        相关资源
        最近更新 更多