目标检测之网络篇(3)【Faster R-CNN】

前言

1.有关VGG16结构,参见:VGG16图形化描述
2.本周目标是看三篇网络类,读到第三篇Faster R-CNN的时候我发现需要先弄懂R-CNN以及Fast R-CNN。引用@v_JULY_v的文章的总结
R-CNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
2.每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置

Fast R-CNN
1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
2.对整张图片输进CNN,得到feature map
3.找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5.对于属于某一类别的候选框,用回归器进一步调整其位置

Faster R-CNN
1.对整张图片输进CNN,得到feature map
2.卷积特征输入到RPN,得到候选框的特征信息
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置

整理为表格:

项目 R-CNN Fast R-CNN Faster R-CNN
提取候选框 Seletive Search Seletive Search RCN网络
提取特征 CNN CNN+ROI池化 CNN+ROI池化
特征分类 SVM CNN+ROI池化 CNN+ROI池化

R-CNN

step1 训练(或者下载)一个分类模型

step2 对该模型做fine-tuning

• 将分类数从1000改为20,比如20个物体类别 + 1个背景
• 去掉最后一个全连接层
在这里插入图片描述

step3 特征提取

• 提取图像的所有候选框(选择性搜索Selective Search)
• 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
在这里插入图片描述

step4 训练一个SVM分类器(二分类)来判断这个候选框里物体的类别

每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative。
在这里插入图片描述

step5 使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美

在这里插入图片描述
由于每个原始图片都要提取2000个左右的候选框,而且对每个候选框都要进行CNN特征提取和SVM分类,因此计算量非常大,导致时间很长(47s一张图)。

SPP Net

SPP-Net(空间金字塔池化网络)是出自2015年发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。

R-CNN的操作:由于CNN的卷积层不需要固定尺寸的输入图像,而全连接层需要,所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行crop(crop就是从一个大图扣出网络输入大小的patch,比如227×227),或warp(把一个边界框bounding box的内容resize成227×227)等一系列操作以统一图片的尺寸大小,比如224×224(ImageNet)、32×32(LenNet)、96×96等。在这里插入图片描述

SPP则反其道而行之,在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的。下图为R-CNN与SPP的对比:
在这里插入图片描述
上面一行是R-CNN,下面一行是SPP,将空间金字塔池化加在卷积层和全连接层之间。SPP的两大特点:
1.结合空间金字塔方法实现CNNs的多尺度输入:加入ROI池化,即输入可以为任意尺度,输出固定维度的向量。
2.只对原图提取一次卷积特征:只对原图进行一次卷积计算,便得到整张图的卷积特征feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层,完成特征提取工作。
正是因为只作一次卷积运算,SPP-Net相比R-CNN有着百倍左右的提速。
在这里插入图片描述

Fast R-CNN

与R-CNN框架图对比,可以发现主要有两处不同:一是最后一个卷积层后加了一个ROI池化层,二是损失函数使用了多任务损失函数(multi-task loss),将边框回归Bounding Box Regression直接加入到CNN网络中训练。
在这里插入图片描述
(1) ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7x7x512维度的特征向量作为全连接层的输入。
(2) R-CNN训练过程分为了三个阶段,而Fast R-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去Region Proposal提取阶段)。在这里插入图片描述

R-CNN有一些相当大的缺点(把这些缺点都改掉了,就成了Fast R-CNN)。
大缺点:由于每一个候选框都要独自经过CNN,这使得花费的时间非常多。
解决:共享卷积层,现在不是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征。
原来的方法:许多候选框(比如两千个)–>CNN–>得到每个候选框的特征–>分类+回归
现在的方法:一张完整图片–>CNN–>得到每张候选框的特征–>分类+回归
所以容易看见,Fast R-CNN相对于R-CNN的提速原因就在于:不过不像R-CNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。

提速效率肉眼可见:
在这里插入图片描述

Faster R-CNN

Fast R-CNN存在的问题:
存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?
解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
所以,rgbd在Fast R-CNN中引入Region Proposal Network(RPN)替代Selective Search,同时引入anchor box应对目标形状的变化问题(anchor就是位置和大小固定的box,可以理解成事先设置好的固定的proposal)。
具体做法:
  • 将RPN放在最后一个卷积层的后面
  • RPN直接训练得到候选区域
在这里插入图片描述
RPN(Region Proposal Network)简介:
  • 在feature map上滑动窗口
  • 建一个神经网络用于物体分类+框位置的回归
  • 滑动窗口的位置提供了物体的大体位置信息
  • 框的回归提供了框更精确的位置
在这里插入图片描述
三种速度对比:Faster R-CNN又提速十倍
在这里插入图片描述

总结

总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于Region Proposal的R-CNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。

参考文献

1.《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》
2.https://blog.csdn.net/v_JULY_v/article/details/80170182
3.https://blog.csdn.net/tmylzq187/article/details/51441553
4.https://blog.csdn.net/Errors_In_Life/article/details/65950699

猜你喜欢

转载自blog.csdn.net/weixin_38708130/article/details/83625917