4 步交替 RPN/Faster R-CNN 训练? - Tensorflow 对象检测模型

4-step Alternating RPN / Faster R-CNN Training? - Tensorflow Object Detection Models

一直在研究最近发布的 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 Layers,然后是RCNN的训练已经涵盖了,但是其他3个步骤在哪里执行?

我错过了什么吗?

我们在 TF 对象检测中实现 Faster R-CNN API 非常接近这篇论文,但在一些方面有所不同。这些差异之一是我们端到端地训练模型,而不是论文中使用的交替训练。

你提到的stop_gradient实际上并没有冻结RPN——它所做的是忽略梯度通过proposal坐标的贡献,但继续允许梯度通过RPN 的特点。

希望对您有所帮助!

由于 Whosebug 的荒谬规则,我无法添加评论。我必须在这里把它写成 "answer"。但这实际上是在@Jonathan Huang 的回复中提出的问题。

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

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

谁能解释一下?谢谢

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

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

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

区域提案网络:

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

检测器:

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

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

希望对您有所帮助!