RCNN--目标检测

转载自:https://www.cnblogs.com/zyber/p/6672144.html

感觉这篇文章讲的很细致,故而转载以备后面复习研读

原博文:http://www.cnblogs.com/soulmate1023/p/5530600.html

文章简要介绍RCNN的框架,主要包含:

原图--》候选区域生成--》对每个候选区域利用深度学习网络进行特征提取--》特征送入每一类SVM分类器中判别--》回归器修正候选框位置

经典图:

这里写图片描述

下面对每一个步骤详细分析:

1.候选区域生成:

 使用Selective Search(选择性搜索)方法从一张图片中生成许多小图,Selective Search是先用过分割手段将图片完全分割成小图(小图生成途径1),再通过一些合并规则,将小图均匀的合并,这是合并的小图相比原图还是小图(小图生成途径2),这样合并若干次,直到合并成整张原图,至此,将所有生成小图的途径过程中的小图全部输出,就产生了region proposals, 原作者很形象的说道:

例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 
不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

这里的a,b,c,d,e,f,g,h,ab,cd,ef,gh,abcd,efgh都是region proposals。这样的小图生成策略就叫做Selective Search。为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。作者提供了Selective Search的源码

2.图片resize:

因为CNN分类器需要输入的图片大小一致,所以这一步将图片都resize成为227*227大小的,论文中试验了两种不同的resize处理方法:

@各向异性缩放:

这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示

@各项同性缩放:

因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法:

A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;

B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值);如下图(C)所示;

对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高;

3.CNN网络训练:(这一节只解释训练部分,关于CNN的内部结构先当做黑盒使用,下一节再解释CNN的具体结构)

RCNN网络训练包括两部分:预训练 & 调优训练

@预训练:

      

网络结构是基本借鉴Hinton 2012年在Image Net上的分类网络Alexnet,略作简化。这样避免了直接从随机初始化的参数进行训练,使得网络开始之前参数都是经过训练过的参数,该技巧可以大大提高精度,这种方法叫有监督的训练方式(也称为迁移学习)。此网络提取的特征为4096维,之后送入一个4096->1000的全连接(fc)层进行分类。

使用ILVCR 2012的全部数据进行训练,输入一张图片,输出1000维的类别标号,学习率0.01。

这里写图片描述

 

@调优训练:

 网络结构同样使用上述网络,最后一层换成4096->21的全连接网络。因为RBG大神说了,通过他们的实验得出,一般的CNN网络(eg,S1-S5,F6,F7),前5层是用于特征提取的,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。所以这里可以将后面的层修改用于对象检测。 学习率0.001,每一个batch包含32个正样本(属于20类)和96个背景的负样本。

训练数据为使用PASCAL VOC 2007的训练集,输入一张图片,输出21维的类别标号,表示20类+背景。 
考察一个候选框和当前图像上所有标定框(人工标注的候选框)重叠面积最大的一个。如果重叠比例大于0.5,则认为此候选框为此标定的类别;否则认为此候选框为背景。(或者这样说:在前一步的区域提出中产生的2K+的候选框将作为后面的CNN训练数据和SVM的训练数据,将selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。这样训练样本的答案就标出来了,构成训练数据,直接用于训练,反复迭代几次,CNN就训练好了)

???这里当时我看的时候,有一个疑问,就是既然这里CNN已经训练好了,可以用于20类+1个背景的分类的,那为什么还需要再把提取的特征用于训练svm分类器?

这里原作者也给出了解释:

这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。

事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);

然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。

总的来说,就是加上一个SVM分类器,识别精度更高了!

 

4.CNN特征提取:(主要解释CNN内部具体结构)

网络架构我们有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。

5.SVM分类器的训练:

我们都知道SVM分类器是需要正负样本的,但这里由于负样本远远大于正样本的数量,所以采用hard negative mining的方法,其中,正样本就是原图中真正标定bounding box的样本,而负样本是通过考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本。

6.SVM类别判断:

从特征提取步骤中,生成一个4096维特征,将这个向量分别放入每一个SVM分类器中进行二值分类,并输出对每一个region proposal的4096维特征的得分.(这里的详细过程为:当我们用CNN提取2000个候选框,可以得到2000*4096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N矩阵乘,得到2000*N的矩阵,就是每一个类对2000个候选框的打分,N为分类类别数目,就可以得到结果了)

最后将得到所有region proposals的对于每一类的分数,再使用贪心的非极大值抑制方法对每一个SVM分类器类去除相交的多余的框。

@非极大值抑制方法(NMS):(这里直接COPY原作者的博文,因为真心觉得原文已经很棒,没有一个字废话):

SVM分类器的每一类,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框打分:

就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

非极大值抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。 

7.利用回归器进行bounding box的修复

目标检测问题的衡量标准是重叠面积(IoU),许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。 

补充:参考资料 https://www.jianshu.com/p/a732c87aa4e9

RCNN里面会涉及到SVM的训练,CNN的训练以及回归器的训练,

CNN容易过拟合,所以其作为正正本的条件比较宽松,只要重叠比率大于0.5就判为正样本了:

使用深度网络提取特征之前,首先把候选区域归一化成同一尺寸227×227。然后进行预训练,网络结构基本借鉴Hinton 2012年在Image Net上的分类网络,此网络提取的特征为4096维,之后送入一个4096->1000的全连接(fc)层进行分类,学习率0.01。训练数据使用ILVCR 2012的全部数据,对于每一张图片输出1000维的类别标号。之后进行调优训练,网络结构同样使用上述网络,最后一层换成4096->21的全连接网络。学习率0.001,每一个batch包含32个正样本(属于20类)和96个背景。训练数据使用PASCAL VOC 2007的训练集,输入一张图片,输出21维的类别标号,表示20类+背景。考察一个候选框和当前图像上所有标定框重叠面积最大的一个。如果重叠比例大于0.5,则认为此候选框为此标定的类别;否则认为此候选框为背景。

SVM只需要少量的样本就可以训练了,所以其对样本的要求比较苛刻,正样本就是标注的得groundtruth,负样本是重叠率小于0.3的

对每一类目标,使用一个线性SVM二类分类器进行判别。输入为深度网络输出的4096维特征,输出是否属于此类。由于负样本很多,使用hard negative mining方法。考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本。

线性回归器,选定的训练样本巍峨,重叠比率大于0.6的候选框

目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。回归器工作时,对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。判定为本类的候选框中,和真值重叠面积大于0.6的候选框作为训练样本。


作者:半城繁華半城傷_c52c
链接:https://www.jianshu.com/p/a732c87aa4e9
來源:简书

总之,rcnn、ssp都是单独训练的SVM和回归器,只有CNN那部分使用的深度学习的方法训练的,特征提取CNN的训练和SVMs分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,因此即使采用更深的CNN网络进行特征提取,也无法保证SVMs分类器的准确率一定能够提升。

下面是关于目标检测中的正负样本的解释:
参考自:https://blog.csdn.net/clearch/article/details/80224223

在做目标检测任务时对其中的正负样本不太清楚,看了很多资料,发现这篇博客解释的比较清晰,下面图片也出自上述博客。

       以人脸识别为例,如果你的任务是识别教室中的人脸,那么负样本的选取应该是教室中的窗户、椅子、墙、人的身体、衣服颜色等等,而不是天空、月亮这些对本任务没有帮助的场景。当然,如果不确定应用环境,那么应该选取尽可能有不同光照不同环境的自然图像作为负样本。

       个人理解的正样本就是任务所要检测的目标物,比如在人脸识别中不同种族年龄的人脸、不同表情的人脸、戴不同装饰的人脸等等情况下的人脸;而负样本则是目标物所处的不同背景(注意:此背景不包含人脸),比如人脸会出现在不同环境中,街道、室内总之所有能想到的环境中都有可能出现人脸哈哈,负样本就是这些不包含人脸的图片,如果需要很多负样本,则可以把这些不包含人脸的图片裁剪成所需图片大小。

       参考faster以及SSD两种检测框架中对于正负样本的选取准则,首先,检测问题中的正负样本并非人工标注的那些框框,而是程序中(网络)生成出来的ROI,也就是faster rcnn中的anchor boxes以及SSD中在不同分辨率的feature map中的默认框,这些框中的一部分被选为正样本,一部分被选为负样本,另外一部分被当作背景或者不参与运算。不同的框架有不同的策略,大致都是根据IOU的值,选取个阈值范围进行判定,在训练的过程中还需要注意均衡正负样本之间的比例。在fast的框架中,也是需要多SS算法生成的框框与GT框进行IOU的判断,进而选取正负样本,总之,正负样本都是针对于程序生成的框框而言,而非GT数据。

一个小技巧:在训练检测网络时,若已经训练出一个较好的检测器,在用它进行测试时,还会有一些误检,这时可以把误检的图像加入负样本中retrain检测网络,迭代次数越多则训练模型越好




猜你喜欢

转载自blog.csdn.net/dulingtingzi/article/details/80815327