除了前面讲过的rpn与fast rcnn交替训练外,faster rcnn还提供了一种近乎联合的训练,姑且称为end2end训练。
根据论文所讲,end2end的训练一气呵成,对于前向传播,rpn可以作为预设的网络提供proposal.而在后向传播中,rpn,与fast rcnn分别传导,而汇聚到shared layer.,但是没有考虑掉roi pooling层对于predicted bounding box的导数。如下图:
我们这里截取Ross'Girshick 在ICCV15上的ppt<Training'R-CNNs' of 'various 'velocities Slow, fast, and faster>
对于roi pooling层,显然依赖于图像本身,和roi区域。对于fast rcnn来讲,roi是固定的,而对于faster rcnn来说,roi是通过rpn产生的,rpn不定,所以roi的生成依赖于
图像。
但是由于最大池化的作用,所以没有办法对roi的四个位置求导。
所以忽略掉对于roi的导数,当然了如果改变max pooling的方式,比如如下所说采取双线性插值,这样输出既有roi的坐标也有图像像素值,则可以关于roi求导。
根据github上py-faster-rcnn描述
- For training smaller networks (ZF, VGG_CNN_M_1024) a good GPU (e.g., Titan, K20, K40, ...) with at least 3G of memory suffices
- For training Fast R-CNN with VGG16, you'll need a K40 (~11G of memory)
- For training the end-to-end version of Faster R-CNN with VGG16, 3G of GPU memory is sufficient (using CUDNN)
使用end2end的训练方式,显存也减少了,从原先的11g减少到3g.我觉得主要的原因是在原先的交替训练中,rpn训练结束后,会有一个rpn生成的过程,这时会生成所有训练图片的proposals,而这是个巨大的负担。而使用end2end的方式训练,一次训练一张图片,rpn阶段产生一张图片的proposal,然后送入fast rcnn训练。显然这种方法很省时也很省内存。
对于end2end的测试,从网络配置上基本与交替训练的相同。在一些小的细节,比如end2end测试时仍然保留了drop层,而对于交替训练的方式,在训练阶段有,测试时去掉了。
下面给出了个人画的end2end的训练网络图。
请访问:链接