4步交替RPN /更快的R-CNN培训? - 张量流对象检测模型

时间:2017-10-04 09:24:44

标签: tensorflow object-detection

经历了最近发布的tensorflow / models /../ object_detection模型,特别是更快的r-cnn。

该论文提到了4步交替训练,你可以

  1. 训练RPN,然后冻结RPN图层,
  2. 训练RCNN,然后冻结RCNN图层,
  3. 训练RPN,然后冻结RPN图层
  4. 训练RCNN。
  5. 从我收集到的,在第2阶段= RCNN,RPN确实冻结了:

      <Fragment>
        <Property Id="INSTALLPATH">
          <IniFileSearch Id="MyAppInstalationPath" Type="directory" Name="MyAppInstallationPath.ini" Section="State" Key="Data" />
        </Property>
      </Fragment>
    
      <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
          <Directory Id="INTALLPATH" Name="MyApp">
            <Directory Id="INSTALLFOLDER" Name="MySetup" />
          </Directory>
        </Directory>
      </Fragment>
    
      <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
          <Component Id="ProductComponent" Guid="F49934B4-6DE4-4EF1-8CDF-A4C758378FD5">
            <File Id="Calc" DiskId="1" Source="C:\WINDOWS\system32\calc.exe" />
          </Component>
        </ComponentGroup>
      </Fragment>
    

    所以训练RPN +冻结RPN图层,然后进行RCNN训练,但其他3个步骤在哪里执行?

    我错过了什么吗?

4 个答案:

答案 0 :(得分:5)

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

你提到的stop_gradient实际上并没有冻结RPN ---它的作用是忽略渐变在提议坐标中的贡献,但是继续允许渐变通过RPN特征。

希望这有帮助!

答案 1 :(得分:0)

由于StackOverflow的荒谬规则,我无法添加评论。我必须在这里写一个“答案”。但这实际上是关注@Jonathan Huang的回答中的问题。

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

虽然RPN损失由箱损和物体损失组成,但是禁用位置梯度可能导致层中的参数从256D张量估计4K坐标,例如变得恒定。然后如何改进RPN盒位置?

有人可以提供一些解释吗?谢谢

答案 2 :(得分:0)

我也正在研究执行本文提到的4步替代训练。 我对正确实施的理解应该是: 1.训练共享的转换层+ RPN,检索区域提议 2.以区域提案作为输入来训练快速RCNN(注意:不是快速RCNN) 3.在步骤2中使用来自快速RCNN的权重初始化快速RCNN,仅训练RPN零件 4.修复共享的转换层和PRN,仅训练底层网络。

第2步需要对tf-faster rcnn实现进行一些修改。 对于其他步骤,您应该能够通过在network.py模块

中将可训练标记设置为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')

答案 3 :(得分:0)

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

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

区域投标网络:

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

检测器:

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

因此,您可以做的是连续进行几轮训练,同时冻结您不想更新的图层。另外请注意,如果您不希望第一阶段和第二阶段的分类和本地化损失权重对更新有所贡献,则可以将它们设置为零。

希望这会有所帮助!