但这就意味着loss中的mini-batch size是以3x3的slide window为单位的,因为只有slide window和anchor的个数才有这种1:9的关系,而挑选训练样本讲的mini-batch size却是以anchor为单位的,所以我猜实际操作是这样的:
先选256个anchor,
然后找它们对应的256个slide window,
然后再算这256个slide window对应的256×9个anchor的loss,每个slide window对应一个256特征,有一个Lcls,同时对应9个anchor,有9个Lreg
论文这里讲得超级混乱:
Proposal layer其实这也可以算是RPN的一部分,不过这部分不需要训练,所以单独拉出来讲
接下来我们会进入一个proposal layer,根据前面得到的这些信息,挑选region给后面的fast rcnn训练
图片输入RPN后,我们手头的信息:anchor,anchor score,anchor location to fix
用全连接层的位置修正结果修正anchor位置
将修正后的anchor按照前景概率从高到底排序,取前6000个
边缘的anchor可能超出原图的范围,将严重超出边缘的anchor过滤掉
对anchor做非极大抑制,跟RCNN一样的操作
再次将剩下的anchor按照anchor score从高到低排序(仍然可能有背景anchor的),取前300个作为proposals输出,如果不足300个就…也没啥关系,比如只有100个就100个来用,其实不足300个的情况很少的,你想Selective Search都有2000个。
Fast RCNN接下来就是按照Fast RCNN的模式来训练了,我们可以为每张图前向传播从proposal_layer出来得到300个proposals,然后
取一张图的128个proposal作为样本,一张图可以取多次,直到proposal用完
喂给Fast RCNN做分类和bounding box回归,这里跟RPN很像,但又有所不同,
BB regressor:拟合proposal和bounding box,而非拟合anchor和bounding box
Classifier:Object多分类,而非前景背景二分类
迭代训练RPN和Fast RCNN其实是很像的,因此可以一定程度上共享初始权重,实际训练顺序如下(MATLAB版):
先用ImageNet pretrain ZF或VGG
训练RPN
用RPN得到的proposal去训练Fast RCNN
用Fast RCNN训练得到的网络去初始化RPN
冻结RPN与Fast RCNN共享的卷积层,Fine tune RPN
冻结RPN与Fast RCNN共享的卷积层,Fine tune Fast RCNN
论文中还简单讲了一下另外两种方法:
将整个网络合起来一块训练,而不分步,但由于一开始训练时RPN还不稳定,所以训练Fast RCNN用的proposal是固定的anchor,最后效果差不多,训练速度也快。
整个网络合起来一起训练,不分步,训练Fast RCNN用的proposals是RPN修正后的anchor,但这种动态的proposal数量不好处理,用的是一种RoI warping layer来解决,这又是另一篇论文的东西了。
SUMMARY网络结构和训练过程都介绍完了,实验效果也是依样画葫芦,就不再介绍了,整体来说,Faster RCNN这篇论文写得很乱,很多重要的细节都要去看代码才能知道是怎么回事,得亏是效果好才能中NIPS。。