Faster rcnn代码观看

面试的时候面试官很详细的问了rpn网络的最后几层,虽然之前跑过,也看过一些博客写的,但是总是觉得似懂非懂,而且现在觉得很多博客也写的似懂非懂的,所以只能深入了解读一下代码。Faster rcnn代码的体系真的挺庞杂的。

第一步关键训练RPN

train_rpn,进入这个函数,内容如下所以说关键内容就是get_roidb,首先是get_imdb,这个函数可以简单的获得对应数据集的训练测试数据,应该说在其他代码中的复用性还挺强的。再接下来就是get_training_roidb,接下来就是perpare_roidb丰富roidb的数据,通过imdb.roidb,返回一个字典,键包括boxes,gt_overlaps,gt_classes,flipped,原句如下 

 This function precomputes the maximum overlap,taken over ground-truth boxes, between each ROI and each ground-truth box.The class with maximum overlap is also recorded.

这样有imdb,也有roidb,就可以开始训练了,接下来就是train_net对roidb先进行了filter_roidb,把与gt重叠率大于0.5的作为正样本,0.1到0.5的作为负样本。再接下来SolverWrapper函数,再调用add_box_regression_targets,计算出anchors和真值框的四个参数。然后进行训练。详细的有点太多了,先把rpn和faster rcnn的框架放在这里。RPN网络的输出是(4+2)*9,anchors是W*H*(4+2)*9。所以说训练RPN网络的时候,输入是一张图片,然后在这张图片中找出正样本和负样本,总共256个样本,正常时1:1的正负样本比例,但是如果正样本不够了,剩下的就用负样本补齐。训练的时候,对于一个feature map的每一个小点,进行一次预测,得到对应九个尺度的anchor的预测值,并加到损失函数中。这样一张图就相当于一个batch为256的训练集。训练完后,生成proposals,采用NMS算法留下2000个proposals做Fast-rcnn的训练输入。对Pascal-Voc数据集有5000个训练图片,5000个测试图片,20类物体。COCO8万的训练图片,4万的验证图片,2万的测试图片。VGG16能达到73.2%的准确率。

看到了一篇很好的博客,http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/,这个博客的博主复现的Faster-rcnn的pytorch代码

其实总的来说,我的问题就在于ROI-pooling怎么计算的,现在看完,应该是这样的。首先用generate产生anchors,对于每个anchor的基础大小是16,然后针对ratio和scale得到合适的九个anchors。这样得到的anchors是图片的尺寸,而不是特征图的尺寸。



这是Fast rcnn的网络,


这是rpn的网络,可以看出前面提取特征的层是一样的,但是后面的会选择性沉默,训练rpn时,沉默fastrcnn的层,训练

fast rcnn时沉默rpn的后面的层。

训练分为以下几步:第一步训练rpn,init from imagnet model,把产生的proposals保存成pkl文件。

训练fast rcnn 网络,init from imagenet model ,并用ROI-pooling加入特征层信息。

再训练rpn 用的是fast rcnn 的model作为init model,产生proposals。

再训练fastrcnn,所以说总共是四步。

最后的最后,感慨一句,看了这么多博客,还是原文解释的好呀!!!所以呀,要看原文!!


猜你喜欢

转载自blog.csdn.net/wanghuahua_1003/article/details/79603972