cmd23333 / Faster-rcnn-tensorflow2.x

An implement of origin faster-rcnn based on tensorflow 2.x and visualize it.使用Tensorflow2.x实现了faster-rcnn并可视化算法运行流程
46 stars 12 forks source link

请教4步交替训练法 #7

Closed hj0921 closed 3 years ago

hj0921 commented 3 years ago

博主你好,

最近在研究FasterRCNN的资料时,我发现除了作者开源的caffe代码中有用到论文中提到的4步交替训练法 其他代码分享者在实际训练中并没有用到。在你的代码中,我也没有找到交替训练的步骤。能请教下具体原因吗?

感谢!

cmd23333 commented 3 years ago

Faster RCNN可以看作这三个部分的堆叠:Backbone + RPN + Fast RCNN 那么四步交替训练法是下面的步骤:

  1. 单独训练RPN网络。 (backbone + rpn + fast rcnn——> backbone1 + rpn1 + fast rcnn, backbone 、rpn参数更新)
  2. 单独训练检测网络Fast Rcnn,训练用的proposals来自第一步的RPN。 (backbone + rpn1 + fast rcnn——> backbone2 + rpn1 + fast rcnn1,backbone 、fast rcnn参数更新)
  3. 用第2步Fast Rcnn的参数来初始化RPN模型,但是训练的时候固定卷积层,只调整属于RPN的参数。 (backbone2 + rpn1 + fast rcnn1——>backbone2 + rpn2 + fast rcnn1, rpn参数更新)
  4. 保持共享的卷积层固定,用第3步调整后的RPN输出的proposals作为输入,微调Fast Rcnn剩下的参数。 (backbone2 + rpn2 + fast rcnn1——>backbone2 + rpn2 + fast rcnn2, fast rcnn参数更新)

上面整理了一些网友的总结,不全是自己写的。 然后回到您的问题,首先end2end方式梯度是可以回传的,所有参数都可以被更新,也就是说可以这么训练 (backbone + rpn + fast rcnn——> backbone1 + rpn1 + fast rcnn1, backbone 、rpn、fast rcnn参数更新)

而交替训练法的目的在于: 因为RPN和Fast RCNN(也就是ROI Pooling和之后的部分)都需要从backbone网络得到图片某个区域的特征图,然后RPN计算这个特征图是不是有物体、大致的形状,Fast RCNN计算这个特征图属于哪一类、形状如何。由于某些区域的特征图会同时传入RPN和Fast RCNN(记得我们选出了256个样本给RPN训练;传了约2000个样本给Fast RCNN,训练时用挑了128个),所以Faster RCNN的这两个模块都会对Backbone进行调整,当然调整的方向不一定一致

这就是最重要的问题了,而交替训练会使backbone每次调整时都只有一个监督信号,就会更稳定一些。

当然end2end方式训练肯定是可以的!因为只有两个模块的监督信号不完全正负号相抵消,我们可以相信经过一定轮次的训练后,两个监督信号是往差不多的梯度方向来更新参数的。

以上~ 如有不足,欢迎指出。

hj0921 commented 3 years ago

十分感谢您给的详尽解答!所以大多数的复现都应该是端对端的,这也是我一直以来的困惑:在端对端的训练中,所有的损失都最终放在一个损失函数里进行计算,并没有分开,所以我没法找到alternative training的步骤。

再次感谢您的解答:)