深度学习目标检测经典模型比较(RCNN、Fast RCNN、Faster RCNN)

深度学习目标检测经典模型比较(RCNN、Fast RCNN、Faster RCNN)

Faster rcnn是用来解决计算机视觉(CV)领域中目标检测(Object Detection)的问题的。

区别目标分类、定位、检测

一、传统的目标检测方法

其实目标检测对于人类来说并不困难,通过对图片中不同颜色模块的感知很容易定位并分类出其中目标物体,但对于计算机来说,面对的是RGB像素矩阵,很难从图像中直接得到狗和猫这样的抽象概念并定位其位置,再加上有时候多个物体和杂乱的背景混杂在一起,目标检测更加困难。但这难不倒科学家们,在传统视觉领域,目标检测就是一个非常热门的研究方向,一些特定目标的检测,比如人脸检测和行人检测已经有非常成熟的技术了。普通的目标检测也有过很多的尝试,但是效果总是差强人意。

传统的目标检测一般使用滑动窗口的框架,主要包括三个步骤:

  • 利用不同尺寸的滑动窗口框住图中的某一部分作为候选区域;
  • 提取候选区域相关的视觉特征。比如人脸检测常用的Harr特征;行人检测和普通目标检测常用的HOG特征;
  • 利用分类器进行识别,比如常用的SVM模型。

传统的目标检测中,多尺度形变部件模型DPM(Deformable Part Model)是出类拔萃的,感兴趣的同学可以去了解以下DPM的相关知识(本质是HOG+SVM的扩展)。

二、基于深度学习的RCNN目标检测算法的出现

正当传统的目标检测方法遇到瓶颈时,基于深度学习的目标检测发展了起来,但真正起到变革作用的是RCNN算法的出现。R-CNN是Region-based Convolutional Neural Networks的缩写,中文翻译是基于区域的卷积神经网络,是一种结合区域提名(Region Proposal)和卷积神经网络(CNN)的目标检测方法。

RCNN算法的基本步骤

三、从RCNN到Fast RCNN再到Faster RCNN

(1)RCNN 解决的是 ,“为什么不用CNN做classification呢?” 用SS去选框,CNN提特征,SVM分类。BB盒回归。

(2)Fast-RCNN 解决的是,“为什么不一起输出bounding box和label呢?”

(3)Faster-RCNN 解决的是,“为什么还要用selective search呢?为什么不用CNN做特征提取呢?” 鉴于神经网络的强大的feature extraction能力,可以将目标检测的任务放到NN上面来做,于是出现了RPN(region proposal network)

原文 https://blog.csdn.net/qq_23225317/article/details/73745722

  https://blog.csdn.net/rogerchen1983/article/details/79769235

目标检测是深度学习的一个重要应用,就是在图片中要将里面的物体识别出来,并标出物体的位置,一般需要经过两个步骤:
1、分类,识别物体是什么
 
2、定位,找出物体在哪里
 
除了对单个物体进行检测,还要能支持对多个物体进行检测,如下图所示:
 
这个问题并不是那么容易解决,由于物体的尺寸变化范围很大、摆放角度多变、姿态不定,而且物体有很多种类别,可以在图片中出现多种物体、出现在任意位置。因此,目标检测是一个比较复杂的问题。
最直接的方法便是构建一个深度神经网络,将图像和标注位置作为样本输入,然后经过CNN网络,再通过一个分类头(Classification head)的全连接层识别是什么物体,通过一个回归头(Regression head)的全连接层回归计算位置,如下图所示:
 
但“回归”不好做,计算量太大、收敛时间太长,应该想办法转为“分类”,这时容易想到套框的思路,即取不同大小的“框”,让框出现在不同的位置,计算出这个框的得分,然后取得分最高的那个框作为预测结果,如下图所示:
 
根据上面比较出来的得分高低,选择了右下角的黑框作为目标位置的预测。

但问题是:框要取多大才合适?太小,物体识别不完整;太大,识别结果多了很多其它信息。那怎么办?那就各种大小的框都取来计算吧。

如下图所示(要识别一只熊),用各种大小的框在图片中进行反复截取,输入到CNN中识别计算得分,最终确定出目标类别和位置。
 
这种方法效率很低,实在太耗时了。那有没有高效的目标检测方法呢?

一、R-CNN 横空出世
R-CNN(Region CNN,区域卷积神经网络)可以说是利用深度学习进行目标检测的开山之作,作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更是带领团队获得了终身成就奖,如今就职于Facebook的人工智能实验室(FAIR)。

R-CNN算法的流程如下
 
1、输入图像
2、每张图像生成1K~2K个候选区域
3、对每个候选区域,使用深度网络提取特征(AlextNet、VGG等CNN都可以)
4、将特征送入每一类的SVM 分类器,判别是否属于该类
5、使用回归器精细修正候选框位置

下面展开进行介绍
1、生成候选区域
使用Selective Search(选择性搜索)方法对一张图像生成约2000-3000个候选区域,基本思路如下:
(1)使用一种过分割手段,将图像分割成小区域
(2)查看现有小区域,合并可能性最高的两个区域,重复直到整张图像合并成一个区域位置。优先合并以下区域:
- 颜色(颜色直方图)相近的
- 纹理(梯度直方图)相近的
- 合并后总面积小的
- 合并后,总面积在其BBOX中所占比例大的
在合并时须保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其它小区域,保证合并后形状规则。
(3)输出所有曾经存在过的区域,即所谓候选区域
2、特征提取
使用深度网络提取特征之前,首先把候选区域归一化成同一尺寸227×227。
使用CNN模型进行训练,例如AlexNet,一般会略作简化,如下图:
 
3、类别判断
对每一类目标,使用一个线性SVM二类分类器进行判别。输入为深度网络(如上图的AlexNet)输出的4096维特征,输出是否属于此类。
4、位置精修
目标检测的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小,故需要一个位置精修步骤,对于每一个类,训练一个线性回归模型去判定这个框是否框得完美,如下图:
 
R-CNN将深度学习引入检测领域后,一举将PASCAL VOC上的检测率从35.1%提升到53.7%。

二、Fast R-CNN大幅提速
继2014年的R-CNN推出之后,Ross Girshick在2015年推出Fast R-CNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。
Fast R-CNN和R-CNN相比,训练时间从84小时减少到9.5小时,测试时间从47秒减少到0.32秒,并且在PASCAL VOC 2007上测试的准确率相差无几,约在66%-67%之间。
 
Fast R-CNN主要解决R-CNN的以下问题:
1、训练、测试时速度慢
R-CNN的一张图像内候选框之间存在大量重叠,提取特征操作冗余。而Fast R-CNN将整张图像归一化后直接送入深度网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。
2、训练所需空间大
R-CNN中独立的分类器和回归器需要大量特征作为训练样本。Fast R-CNN把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

下面进行详细介绍
1、在特征提取阶段,通过CNN(如AlexNet)中的conv、pooling、relu等操作都不需要固定大小尺寸的输入,因此,在原始图片上执行这些操作后,输入图片尺寸不同将会导致得到的feature map(特征图)尺寸也不同,这样就不能直接接到一个全连接层进行分类。
在Fast R-CNN中,作者提出了一个叫做ROI Pooling的网络层,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量。ROI Pooling层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。这样虽然输入的图片尺寸不同,得到的feature map(特征图)尺寸也不同,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,就可再通过正常的softmax进行类型识别。

2、在分类回归阶段,在R-CNN中,先生成候选框,然后再通过CNN提取特征,之后再用SVM分类,最后再做回归得到具体位置(bbox regression)。而在Fast R-CNN中,作者巧妙的把最后的bbox regression也放进了神经网络内部,与区域分类合并成为了一个multi-task模型,如下图所示:
 
实验表明,这两个任务能够共享卷积特征,并且相互促进。

Fast R-CNN很重要的一个贡献是成功地让人们看到了Region Proposal+CNN(候选区域+卷积神经网络)这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度。

三、Faster R-CNN更快更强
继2014年推出R-CNN,2015年推出Fast R-CNN之后,目标检测界的领军人物Ross Girshick团队在2015年又推出一力作:Faster R-CNN,使简单网络目标检测速度达到17fps,在PASCAL VOC上准确率为59.9%,复杂网络达到5fps,准确率78.8%。
在Fast R-CNN还存在着瓶颈问题:Selective Search(选择性搜索)。要找出所有的候选框,这个也非常耗时。那我们有没有一个更加高效的方法来求出这些候选框呢?
在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。如下图所示:
 
Faster R-CNN可以简单地看成是“区域生成网络+Fast R-CNN”的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的Selective Search(选择性搜索)方法。
如下图
 
RPN如下图:
 
RPN的工作步骤如下:
- 在feature map(特征图)上滑动窗口
- 建一个神经网络用于物体分类+框位置的回归
- 滑动窗口的位置提供了物体的大体位置信息
- 框的回归提供了框更精确的位置

Faster R-CNN设计了提取候选区域的网络RPN,代替了费时的Selective Search(选择性搜索),使得检测速度大幅提升,下表对比了R-CNN、Fast R-CNN、Faster R-CNN的检测速度:

总结
R-CNN、Fast R-CNN、Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简、精度越来越高、速度也越来越快。基于region proposal(候选区域)的R-CNN系列目标检测方法是目标检测技术领域中的最主要分支之一。

建议

2014至2016年,Ross Girshick 等人发表了关于R-CNN、Fast R-CNN、Faster R-CNN的经典论文《Rich feature hierarchies for accurate object detection and semantic segmentation》、《Fast R-CNN》、《Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks》,在这些论文中对目标检测的思想、原理、测试情况进行了详细介绍,建议阅读些篇论文以全面了解目标检测模型。

简述RCNN系列:

RCNN通过SS算法挑选候选框,然后将这些候选框统一尺寸放入预训练的CNN中,最后通过全连接层提取固定维度的特征向量,将特征向量送入多个SVM分类器,用SVM进行分类(之所以不用softmax是因为微调时需要大量的负样本,如果使用softmax Map会变低,而SVM使用hard negative mining挑选负样本,更具代表性,可以通过负样本更好的修正位置),对分类结果中的每一类使用非极大值抑制的算法,去除重叠建议框,最后通过bounding box回归。

Fast RCNN 任意尺寸输入放进CNN网络中进行特征提取,在特征图上用SS搜索获取候选框(特征图映射原图),选取候选框后,将这些特征图输入ROI池化层(简单的SSP-Net,意思就是把特征图划分为规定的块数,每一个块输出一个值,最后输出固定大小的特征图)
然后输入进全连接层(SVD分解,提取的候选框数量有2k,每个候选框都要进入全连接层进行计算),输入进softmax(不用SVM是因为现在获得的特征向量不需要暂存磁盘)并进行bounding box 回归,通过NMS得到最终的回归框。回归函数smooth L1损失函数,对离群、异常点更鲁棒。

Faster RCNN 基本思想是Fast RCNN+RPN
任意尺寸输入共享卷积层进行特征提取,将此时的特征图分别输入RPG网络和之后的卷积层;输入RPN确定候选区域,而输入之后卷积层的特征图用于产生更高维度的特征图,将RPN网络的输出和高维度特征图相结合输入ROI池化层,处理后输入全连接层,使用softmax分类,bounding box回归。
RPN网络:RPN网络对于共享卷积层输出的特征图,首先在每个单元产生9个anchor,每个单元可以映射回原图像,对比ground truth,最后做分类损失和回归损失
(实际上是用3*3的滑动窗口,padding =2 stride=1,然后经过一个卷积层将每个窗口的9个anchor都编码成256维的向量,然后再经过一个卷积层输出2x9个分类得分(前景或背景),4x9个回归得分(平移缩放系数),对得分区域做NMS,获得前N(300)的得分窗口作为候选区域。
RPN的优势:多维度更低、尺度多长宽比


RCNN

http://blog.csdn.net/wopawn/article/details/52133338
https://www.cnblogs.com/gongxijun/p/7071509.html


SSP-Net

http://blog.csdn.net/u011534057/article/details/51219959


Fast RCNN

http://blog.csdn.net/wopawn/article/details/52463853


Faster RCNN

http://blog.csdn.net/shenxiaolu1984/article/details/51152614

RPN的理解

损失函数

为了训练RPN,我们给每个anchor分配一个二进制的标签(是不是目标)。我们分配正标签给两类anchor:(i)与某个ground truth(GT)包围盒有最高的IoU(Intersection-over-Union,交集并集之比)重叠的anchor(也许不到0.7)(ii)与任意GT包围盒有大于0.7的IoU交叠的anchor。注意到一个GT包围盒可能分配正标签给多个anchor。我们分配负标签给与所有GT包围盒的IoU比率都低于0.3的anchor。非正非负的anchor对训练目标没有任何作用。
有了这些定义,我们遵循Fast R-CNN[5]中的多任务损失,最小化目标函数。我们对一个图像的损失函数定义为
这里写图片描述

这里,i是一个mini-batch中anchor的索引,Pi是anchor i是目标的预测概率。如果anchor为正,GT标签Pi* 就是1,如果anchor为负,Pi* 就是0。ti是一个向量,表示预测的包围盒的4个参数化坐标,ti* 是与正anchor对应的GT包围盒的坐标向量。分类损失Lcls是两个类别(目标vs.非目标)的对数损失这里写图片描述。对于回归损失,我们用这里写图片描述 来计算,其中R是[5]中定义的鲁棒的损失函数(smooth L1)。
这里写图片描述

Pi* Lreg这一项意味着只有正anchor(Pi* =1)才有回归损失,其他情况就没有(Pi* =0)。cls层和reg层的输出分别由{pi}和{ti}组成,这两项分别由Ncls和Nreg以及一个平衡权重λ归一化(早期实现及公开的代码中,λ=10,cls项的归一化值为mini-batch的大小,即Ncls=256,reg项的归一化值为anchor位置的数量,即Nreg~2,400,这样cls和reg项差不多是等权重的。
对于回归,我们学习[6]采用4个坐标:

这里写图片描述
x,y,w,h指的是包围盒中心的(x, y)坐标、宽、高。变量x,xa,x*分别指预测的包围盒、anchor的包围盒、GT的包围盒(对y,w,h也是一样)的x坐标。可以理解为从anchor包围盒到附近的GT包围盒的包围盒回归。

--------------------- 本文来自 水果先生 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_23225317/article/details/79570466?utm_source=copy

猜你喜欢

转载自blog.csdn.net/qq_41895190/article/details/82877318