《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN

学习内容来自:https://www.bilibili.com/video/BV1m5411A7FD?p=2
类似的博文:https://blog.csdn.net/v_JULY_v/article/details/80170182

一:目标检测的含义
对输入的一张图片,不仅仅需要得到图片中的物体类别,还需要得到图片中物体的位置信息,再细节分的话,还有单物体检测和多物体检测。
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第1张图片

这个任务本质上就是这两个问题:一:图像识别,二:定位。
图像识别(classification):
输入:图片
输出:物体的类别
评估方法:准确率
训练误差:使用交叉熵损失,因为分类类别概率。
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第2张图片

定位(localization):
输入:图片
输出:方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union(IOU)
训练误差:使用MSE(L2)损失,因为是具体位置数值信息
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第3张图片

这个框框有个专有名词叫做bbox(bounding box),真正人为标记的bbox叫做groundtruth bbox,后面我们会讲到的模型预测出来的叫做predicted bbox。
一般有如下格式:
1:x,y,w,h:xy是目标物体中心点的位置,wh是中心点距离边框的长宽
2:xmin,ymin,xmax,ymax:分别是指的是框的左上角、右下角的位置。

二:目标检测的分类
1:分为两步骤的方法,先找到大概的区域,该区域可能存在目标,再对目标进行检测。
代表模型是R-CNN,SPP-NET,Fast R-CNN,Faster R-CNN。
2:端到端的一步到位的检测,采用一个网络直接输入图像一步到位。
代表YOLO和SSD。

三:目标检测的简单实现思路,简单模型。
在分类中,我们直接得到各个物体的概率,我们可以在分类的基础上,增加一个全连接层,然后对接上使用regression来预测框的位置。
FC1是用于分类类别的输出,FC2是用于预测bbox的数值位置。

《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第4张图片

看似很简答?啊不,其实这个模型的问题很多,后面会慢慢说来。
就比如当一个图片中存在多个物体时候怎么办?这个简单的模型就很难办了,毕竟刚刚说的简单的方式是用来是检测单个物体目标的,也就是没有考虑存在多个(不确定数量)的情况。

四:目标检测方法之R-CNN
这个方法就是开始考虑多目标检测的问题,对于多个物体不清楚数量,该模型不能固定输出值。那怎么做呢?这里介绍一个简单粗暴的形式,我们试图找到一个只包含单物体的区域,让这个区域输入到上述的简单模型中去,不就可以了么,相当于把多物体检测任务退化成了大量的单物体检测任务。
怎么找到这个区域呢?有两种方法,滑动窗口(sliding window)和选择性搜索(selective search)。
1:滑动窗口
简单粗暴,从左到右,从上到下,选择不同的长宽比的,不同大小的框,暴力求解,每滑动一个窗口都送入我们的模型,输出类别,和微调位置信息。

这种虽然也是解决问题的思路,不过过于暴力枚举求解,会造成耗费大量的计算量,并且窗口的大小尺寸往往不是很好匹配(窗口匹配不特别准确)。

2:选择性搜索
到了这里,才是R-CNN的开始,不采用暴力求解,而是使用候选区域的方法(region proposal method),提供了重要的思路,后续的SPP-NET,Fast R-CNN和Faster R-CNN都是在这个基础上发展起来的。思路是预先找出图中目标可能出现的位置,即候选区域(Region Proposal)。利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口(几千甚至几百,默认2000个)的情况下保持较高的召回率(Recall),这样避免了暴力枚举。这个选择出来区域叫做ROI(region of interest)

2014年,RBG(Ross B. Girshick)使用Region Proposal + CNN代替传统目标检测使用的滑动窗口+手工设计特征,设计了R-CNN框架,使得目标检测取得巨大突破,并开启了基于深度学习目标检测的热潮。

《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第5张图片

R-CNN的简要步骤如下
(1) 输入测试图像

(2)利用选择性搜索Selective Search算法在图像中从下到上提取2000个左右的可能包含物体的候选区域Region Proposal

(3)因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的227x227的大小并输入到CNN,将CNN的fc7层的输出作为特征,每个特征是4096维的向量。

(4)将每个Region Proposal提取到的CNN特征输入到SVM进行分类(2012年以前用SVM挺多的,现在图像识别等任务,谁还用SVM啊)

(5) 使用非极大抑制(NMS,non-max ),去掉其中的重复的框。
对于2000个框,设置一个可信阈值,去除预测概率小于某个阈值的框,这样能去掉大部分没有用的框。
过滤一遍后对于剩下的框,而且一个物体可能有多个比较重合的框都是预测到了同一个的某物体,选择其中预测概率最高的框,跟这个框有重合度高于某个阈值的都预测该物体的框就删除掉,就是去掉不好的且重叠度高的候选区域。目标是一个物体只保留一个最好的区域。这个重合度就选择用IOU计算。
请注意这里有俩不同的阈值哦。

(6) 上述步骤完了后,得到框框是真的是最好的么?能不能效果更好点?框的位置更准确点呢?就其实把SS算法的框和ground trunth的框做个微调,能让框位置信息更准确些。同时把Region Proposal提取到的CNN特征输入到Box regressor中进行精细修正候选框位置,对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。

R-CNN的缺点:
1:R-CNN是使用了SVM作为分类器,仔细一想哈,SVM是二元分类器,因此你对多分类来讲,得额外训练很多个SVM才行,哎,麻烦。
2:而且哈,R-CNN虽然不再像传统方法那样穷举,但R-CNN流程的第一步中对原始图片通过Selective Search提取的候选框region proposal多达2000个左右,而这2000个候选框每个框都需要进行CNN提特征+SVM分类,计算量很大,导致R-CNN检测速度很慢。
3:分阶段训练,(选取候选区域,训练CNN,训练SVM,训练回归器),训练步骤多,繁琐分散,训练SVM也很耗时间。
4:候选区域需要crop/wrap的操作调整尺寸大小,缺点很明显。这样会使得区域图片形变,影响分类效果。

有什么提速的训练方法么?且看SPP-NET。

五:目标检测之SPP-NET
针对R-CNN的缺点,SPP-NET做出了如下的改进。
1:解决卷积的耗时长的问题。减少卷积运算。
2:通过ROI映射,且增加SPP层,避免了候选区域的crop/wrap的操作产生形变。
R-CNN是将2000个候选区域进行卷积运算,而SPP-NET先将图片做卷积,你看只卷积一次。
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第6张图片
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第7张图片

将原来候选区域的的位置映射到特征图向量中的对应的位置,然后映射后的特征向量经过SPP层,得到固定大小的特征向量输入到FC层。

这一子解决了卷积次数多耗时的问题,也不用对候选区域做调整尺寸大小的操作。

我们先看看映射:
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第8张图片
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第9张图片
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第10张图片

再看看SPP-NET
SPP Net的第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。
换句话说,在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
简言之,CNN原本只能固定输入、固定输出,CNN加上SSP之后,便能任意输入、固定输出。

请注意SPP-NET处理输入的是一个个映射后的在特征图上的候选区域,用不同的子图划分,使用max pooling后将其连接起来组成固定维度的输出。
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第11张图片
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第12张图片

SPP-NET虽然加速了使用的速度,但是SPP-NET依然很慢
1:训练很慢,因为SVM的存在。
2:分阶段训练网络:选取候选区域,训练CNN,训练SVM,训练回归器。

六:物体检测之Fast R-CNN
R-CNN的进阶版Fast R-CNN就是在R-CNN的基础上采纳了SPP Net方法,对R-CNN作了改进,使得性能进一步提高。
1:提出了新的ROI pololing
2:建立了多任务损失,废弃了SVM。

(1)ROI pooling layer实际上是SPP-NET的一个精简版,SPP-NET对每个proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个77512维度的特征向量作为全连接层的输入。这一步就是只使用一种子图划分,单尺度的,就是为了减少计算量的一种方式啦,作用和SPP-net的SPP层是一样的。
(2)端到端的模型(除了区域选择ss):除了选择性搜索,将CNN、ROI pooling、类别分类器、bbox回归器融合在了一起训练。

多任务损失:
1:分类部分:加上背景这个类,简历一个N+1的softmax输出,使用交叉熵损失。
2:回归部分:微调框的位置信息,使用L2 的MSE损失。
这俩能放在一起,一起更新整个网络。

完了后速度就快了很多。

缺点还是:
没有完整的端到端的模型,候选区域(proposal region)的还是使用选择性搜索得到的,这个ss操作也很是耗时了。

七:物体检测之Faster R-CNN

Fast R-CNN存在的问题:存在瓶颈,选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?

解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第13张图片

增加的区域生成网络RPN(region proposal network)替换了SS算法。
具体做法:
  • 将RPN放在最后一个卷积层的后面,放在ROI Pooling的前面,
  • RPN直接训练得到候选区域,之前都是SS生成/映射得到。

《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第14张图片
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第15张图片
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第16张图片

RPN原理
用3x3的框框在特征图上滑动,特征图的每一个中心点,会有K个分类(2个值)和K个bbox的回归(一个bbox有4个数值)。这里的分类是为了预测有没有物体(前景表示有物体,背景表示没有物体),默认设置了K=9个不同大小和长宽比的anchor。最后输出N=300个的概率最高的候选区域给到ROI pooling层。
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第17张图片

anchor就是位置和大小固定好了的box,可以理解成事先设置好的固定的proposal,proposal就是任意尺寸大小的了。

因此Faster R-CNN是包含有四个损失函数
  • RPN calssification(anchor has object or not?)
  • RPN regression(anchor->propoasal)
  • Fast R-CNN classification(final predicted classes)
  • Fast R-CNN regression(proposal -> predicted bbox)
《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN_第18张图片

八:二阶段的方法的最后总结

最后总结一下各大算法的步骤:
RCNN
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,SPP-NET,Fast,R-CNN,Faster,R-CNN)