Faster R-CNN复现记录
Posted call me ZJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Faster R-CNN复现记录相关的知识,希望对你有一定的参考价值。
实现细节
总共3个模型,第一个是以resnet50为backbone,并加上FPN结构的Faster R-CNN,一个是同样是使用resnet50为backbone,但没用fpn,最后一个是用mobilenetv3作为backbone,用fpn
# total param num 41,449,656/19,624,872/70,566,260 # Resnet50-fpn / mobilev3-fpn / Resnet50-no_fpn # optimizer = torch.optim.SGD(params, lr=0.01, momentum=0.9, weight_decay=1e-4)/lr=0.02 # 损失函数= 类别损失cross_entropy() + 边界框损失smooth_l1_loss() # batch = 8 / 多GPU:不同步bn,每个GPU,batch=2, # 加载完整预训练权重 / 只加载了backbone的权重 / 只加载backbone权重 # epoch = 30/20 # 每epoch,train:14/7分钟,test:10分钟,total:12h/8.5h |多GPU,train:6分钟,test:2分钟,total:2h.40m # 训练集集:PASCALVOC-2012 train
10 # 测试集: PASCALVOC-2012 val
将上述细节总结到表中
预训练权重
Resnet50-fpn:在coco数据集上训练,另外两个backbone预训练权重则是在Imagenet1k数据集上训练
resnet50-fpn
inference+NMS time: 0.04609847068786621
loss和lr随epoch变化图
IOU为0.5的map,大概在15轮就就已经饱和了,大概在79%左右
加载训练后的权重,在测试集上对模型进行验证,这里测试集=训练中的验证集
mobilev3-fpn
IOU为0.5的map,大概在15轮就就已经饱和了,大概在56%左右
加载训练后的权重,在测试集上对模型进行验证
resnet50_no_fpn
这里初始lr=0.02,切每7个epcoh更新lr,用的多GPU
IOU为0.5的map,大概在15轮就就已经饱和了,大概在60%左右
对比
利用wandb来记录
Resnet50_no_fpn与Resnet50_fpn对比能够看出利用FPN结构后模型有很大的提升
Resnet50_fpn与MobileV3-fpn对比,可以看出以resnet50作为backbone比以mobilev3效果要好很多
Faster R-CNN简介及其发展
一、简介
- 发展的过程大体可以概括为R-CNN——Fast R-CNN——Faster R-CNN——Mask R-CNN,都是将神经网络应用于目标检测的典型代表,首先是R-CNN将CNN应用于目标检测中取得了较大的成效,后面几个网络都是在前面的基础上进行了改进,在速度和准确率方面都有了很大的提升。
- 个人的见解就是所有的改进的原则都是尽可能将任务都交给神经网络来完成,这样的话不仅在检测速度上会有很大的提升,而且由于神经网络处理数据的能力也比其他方法优秀很多,准确率上也会有提升。
二、参考文献
- CVPR2014: Rich feature hierarchies for accurate object detection and semantic segmentation
论文下载: http://export.arxiv.org/pdf/1311.2524
参考博客: https://blog.csdn.net/liumingpei/article/details/80386685 - 2015 ICCV:Fast R-CNN
论文:https://arxiv.org/abs/1504.08083
博客:https://blog.csdn.net/CSDNbaiduyun/article/details/81239454 - 2015 NIPS:Faster R-CNN--Towards Real-Time Object Detection with Region Proposal Networks
论文:http://arxiv.org/abs/1506.01497v3
博客:https://blog.csdn.net/u011718701/article/details/53758927
三、R-CNN
四步:
1、提取region proposals。论文采用的是SS(选择性搜索方法),提取的的proposals数目为2000个。
2、将2000个proposals变形为227*227大小输入AlexNet中得到4096维的特征,形成一个2000*4096维特征矩阵。
3、将提取的特征输入SVM(二分类)进行分类,假设有20类物体,则得到2000*20的得分矩阵,其中行表示2000个候选框,列表示20类目标,值为得分。
4、对每一列进行非极大值抑制(NMS),最终得到的proposals就是最后得到该类别的目标候选框,即从2000个中选择得分高的且不重叠的proposal,最后再进行边界回归优化检测框。
四、Fast R-CNN
1、采取SS方法提取2000个region proposals,然后将整张图片输入网络得到一个特征图(conv feature map)
2、将2000个region proposal从原图映射到特征图上,映射方法是按比例映射,再利用ROI Pooling得到2000个相同大小的feature map(对应于2000个region proposals在conv feature map上的映射)
3、将最终得到的feature map输入到两个全连接层提取特征向量,再分别用于分类和边界回归。
改进:
1、引入特征图,大大简化了对region proposals提取特征的运算
2、引入roi pooling,较之前的直接变形更完整地保留了原图的信息
3、除了region proposals提取,其它步骤都实现了end-to-end的联合训练
五、Faster R-CNN
1、将proposals的提取整合到了网络中,即引入了RPN网络,其它的和Fast R-CNN基本一致。
RPN网络:
1、RPN网络的作用就是将region proposals的提取整合到了网络中,而且RPN网络和Fast R-CNN网络共用了卷积网络,几乎没有增加计算量。
2、RPN提取候选框的方法是对conv feature map上的每个点为中心取9种不同比例大小的anchors,再按照比例映射到原图中即为提取的region proposals。具体的实现方法如上图,先用一个256维的3*3卷积核以步长为1进行特征提取,这样就可以得到一个256*1的特征向量,将这个256长度的特征向量分别输入两个全连接层,其中一个输出长度为2*9=18表示9个anchors是物体和不是物体的概率(不太懂为什么两个概率都要预测),另一个输出长度为4*9=36表示每个proposals的四个坐标。
3、在得到了概率和bbox的坐标之后映射到原图中得到region proposals,再进行一次NMS得到最终输入Fast R-CNN网络的proposals。
六、一些解释
1、为何要在softmax前后都接一个reshape layer?
其实只是为了便于softmax分类,至于具体原因这就要从caffe的实现形式说起了。在caffe基本数据结构blob中以如下形式保存数据:blob=[batch_size, channel,height,width] 对应至上面的保存bg/fg anchors的矩阵,其在caffe blob中的存储形式为[1, 2x9, H, W]。 而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9xH, W]大小, 即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。贴一段caffe softmax_loss_layer.cpp的reshape函数的解释,非常精辟: "Number of labels must match number of predictions; " "e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), " "label count (number of labels) must be N*H*W, " "with integer values in {0, 1, ..., C-1}."; 综上所述,RPN网络中利用anchors和softmax初步提取出foreground anchors作为候选区域。
2、 NMS算法
其实特别简单,就是从一堆proposals中先选出一个得分最高的proposal,然后计算剩余的proposals与这个得分最高proposal的IOU,高于一定的阈值的就直接舍去,这样就剩下了与被选中的proposal重叠区域不多的proposals,再重复这个操作就行。
3、ROI pooling与RoIAlign Pooling
roi pooling:每次都向下取整,然后采用max pooling
roialign pooling:不进行取整操作,保留浮点数,最后进行对每个小区域进行采样操作(一般为2*2效果最好),采样点的值由双线性差值计算得到,最后再进行max pooling操作。对小目标的检测效果影响较大。
以上是关于Faster R-CNN复现记录的主要内容,如果未能解决你的问题,请参考以下文章