faster RCNN实现细节

http://blog.csdn.net/hunterlew/article/details/71075925 部分说的很好。

RPN训练设置:

根据ANCHOR_SCALES和ANCHOR_RATIOS得到

(1)width/RPN_FEAT_STRIDE*height/RPN_FEAT_STRIDE*len(ANCHOR_SCALES)*len(ANCHOR_RATIOS)个anchors,如果一个anchor是ground-truth box的最大的IOU的anchor或者IOU大于0.7,那么这个anchor是正样本,label赋1,如果IOU小于0.3,那么这个anchor是负样本,label赋0,其余anchor忽略,label为-1。

(2)在训练RPN时,一个mini-batch是由一幅图像中任意选取的256个rois组成,其中正负样本比例为1:1,正样本128个,负样本128个。实际上筛选出来的正负样本肯定不止256个,随机从筛选出来的正负样本中选出128个正样本和128个负样本。

(3)如果正样本不足128个,则多用一些负样本以满足有256个rois可以用于训练,反之亦然。

(4)训练RPN时,与VGG或者Resnet共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数,剩下的没有的层参数用标准差=0.01的高斯分布初始化。

roipooling层:将rois从原图区域映射到conv5区域,最后pooling到固定大小的功能

fast RCNN回归部分:

正负样本比例为1:3,当IOU大于0.5时为正样本,IOU小于0.5时为负样本,总共128个。


RPN部分的分类层,输出只有两类,前景和背景,RCNN部分分类层输出K+1(K classes+背景)类。回归层也是rpn部分输出2*4,RCNN部分输出(k+1)*4


最后测试输出的是RCNN部分batch_images=1,batch=128个框非极大抑制后的框,输出的score为输出的K+1类中最大的score。

最后可视化时,一般只显示score>0.7的框框。

“Alternating training”的训练策略,分为四步:

(1)训练RPN;

(2)利用RPN产生的候选窗口来训练RCNN;

(3)在(2)的基础上再次训练RPN,不过保持共享层不训练;

(4)在(3)的基础上训练RCNN分支,同时保持其他层不训练。

不过现在一般一步训练完,把RPN和RCNN的损失函数加到一起训练。


RPN中,刚开始的3X3卷积层后接了激活层,两个1X1卷积层后没有接激活层,fast rcnn部分,分类和回归层是全连接层。


RPN网络最先得到的大约2万个anchor不是都直接给fast-RCNN,因为有很多重叠的框。文章通过非极大抑制的方法,设定IOU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如前300个)给fast rcnn。fast rcnn将输出300个判定类别及其box,然后对类别分数采用阈值为0.3的非极大抑制(精筛),并仅取分数大于某个分数的目标结果(?????是从128个中进行非极大抑制还是从300个中进行非极大抑制?,测试中输出到底是哪些??)这一部分还需要仔细看代码。


RPN部分和RCNN部分中回归的损失函数的计算方式是一样的,具体计算方式稍后补充。



你可能感兴趣的:(faster,rcnn)