Closed hj0921 closed 3 years ago
Faster RCNN可以看作这三个部分的堆叠:Backbone + RPN + 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方式训练肯定是可以的!因为只有两个模块的监督信号不完全正负号相抵消,我们可以相信经过一定轮次的训练后,两个监督信号是往差不多的梯度方向来更新参数的。
以上~ 如有不足,欢迎指出。
十分感谢您给的详尽解答!所以大多数的复现都应该是端对端的,这也是我一直以来的困惑:在端对端的训练中,所有的损失都最终放在一个损失函数里进行计算,并没有分开,所以我没法找到alternative training的步骤。
再次感谢您的解答:)
博主你好,
最近在研究FasterRCNN的资料时,我发现除了作者开源的caffe代码中有用到论文中提到的4步交替训练法 其他代码分享者在实际训练中并没有用到。在你的代码中,我也没有找到交替训练的步骤。能请教下具体原因吗?
感谢!