RCNN目标检测的开山篇(尽可能的详细)
现在开始学习有关深度学习的东西,同学推荐我看计算机视觉目标检测方面,看完论文后还有很多细节不是很懂,网上找也有
很多模棱两可的,经过几天的查阅资料,总结出一篇较详细的关于RCNN的细节的实现,以此来证明我学习过。
计算机视觉(目标检测的兴起)
自从12年某大神用CNN(卷积神经网络)在imageNet的比赛上取得较好的成绩后,将CNN重新带到大家的视野下,计算机视觉便在这几年发展的如火如荼。
计算机视觉领域有三大顶会和N多核心期刊:
计算机视觉领域的三大顶会:ICCV,ECCV,CPVR.
还有很多的核心期刊: TIP, CVIU, TPAMI, IJCV
目标检测与识别的研究方法主要分两类:
1.基于传统图像处理和机器学习算法的目标检测与识别方法
1).目标特征提取
2).目标识别
3).目标定位
与深度学习提取特征不同的是,这个特征都是人为设计的。
2.基于深度学习的目标检测与识别方法
1).基于图像的深度特征提取
2).基于深度神经网络的目标识别与定位
主要用到的是深度神经网络模型CNN做特征提取
基于深度学习的目标识别与定位算法分为三类:
1).基于区域建议的目标检测与识别算法,如R-CNN, Fast-R-CNN, Faster-R-CNN;
2).基于回归的目标检测与识别算法,如YOLO, SSD;
3).基于搜索的目标检测与识别算法,如基于视觉注意的AttentionNet,基于强化学习的算法
RCNN论文所使用的数据库:
一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。
一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。
本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。
本文重点RCNN的理解和RCNN实现的具体过程
重要概念:
region proposal:此方法的重点(基于区域的卷积神经网络做目标检测),是从一张图片中提取多个候选框
mAP(mean average precision):用来评估object detection 的准确性,在PASCAL VOC的数据集中有20类,对每个类的分类的准确性的综合评价。
RCNN:将检测问题转换成为基于region proposal的分类问题
(好处:1是网络参数数量较少,2是网络的生成特征维度较少 4096vs360k)
selective search:生成region proposal 的方法。(具体下面会说)
Warp:region proposal resize (由于CNN)中只接受227*227大小的图片,需要对其进行resize
Supervised pre-training:监督预训练,在训练CNN网络时,由于需要大量的数据,可以采用已经做好的数据集ILSVRC2012先对神经网络CNN进行预训练,也可以直接采用别人训练的AlexNet,就是需要把最后一层的输出改为我们数据集中的类别数+1(背景)
fine-tuning:利用我们的小的训练集对CNN进行微调(SGD(0.001) 正负样本判别判别)
IOU交并比:计算两个矩形框的重叠度
NMS(非极大值抑制):从算法找出的几个矩形框判断哪些是没用的
canny边缘检测:用来从几个有用的矩形框中生成bounding-box
svm分类器:(正负样本判别)为什么需要
bb-regression:refine bounding 线性回归模型对目标框进行精修
主要流程:
1. 从一张图片生成1k~2k的候选框(region proposal)
2.对每个候选区域,使用深度卷积神经网络提取特征(生成特征向量)
3.将特征送入每一类的SVM的分类器,判断是否属于该类(会输出一个打分矩阵2000*N+1)
4.用这些判断类别并生成bounding-box
5.利用回归器对bounding-box进行精修
生成候选框
使用了Selective Search1方法从一张图像生成约2000-3000个候选区域。基本思路如下:
- 使用一种过分割手段,将图像分割成小区域
- 查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置
- 输出所有曾经存在过的区域,所谓候选区域
合并规则:
1.颜色(颜色直方图)相近的
2.纹理(梯度直方图)相近的
3.合并后总面积小的
4.合并后,总面积在其BBOX中所占比例大的
其中第三条:保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。
Warp对region proposal进行resize:
(1)各向异性缩放
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;
(2)各向同性缩放
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法
A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图(C)所示;
对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高
训练CNN(用来提取region proposal的特征)
这里的训练分为两部分一是预训练,二是调优训练
预训练:
要提出一个概念就是迁移学习(Supervised pre-training) :网络结构就是借鉴某大神在2012的Image Net的分类网络Alex Net ,进行简化,这样直接避免从随机初始化参数进行训练。在Alexnet中p5层神经元个数为9216, f6、f7的神经元个数都是4096,提取的特征为4096维,然后送到一个4096->1000的fc进行分类。(softmax)
使用ILSVRC2012的全部数据进行训练,输入一张图片,输出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,那么我们就把这个候选框标注成positive,否则我们就把它当做negative。训练的每一次迭代中都使用32个正样本(包括所有类别)和96个背景样本组成的128张图片的batch进行训练(这么做的主要原因还是正样本图片太少了)>这样训练样本的答案就标出来了,构成训练数据,直接用于训练,反复迭代几次,CNN就训练好了) 这里的0.5是给出的阈值,作者经过多次训练选出来的值
IOU 计算公式:
使用cnn提取每个region的特征:
经过上面的region proposal的提取,生成约2000张region proposal,经过训练好的CNN提取对应的特征网络架构我们有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。
SVM 分类器的训练:
训练一个SVM分类器需要正负样本,正样本就是原图中真正标定bounding box的样本,而负样本是通过考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本,其余的丢弃。由于负样本远远大于正样本的数量,所以采用hard negative mining的方法。
SVM类别判断:
测试阶段,使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制去除相交的多余的框。非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到一类的结果。
获取bounding-box 是依据候选框和标准检测框的iou大小,取最大值,且阈值要大于0.6,太小训练验证没有意义。
回归器进行位置精修:
对上面得到的bounding-box进行位置精修(refine)利用已经训练好的线性回归模型(linear regression model)对已有的bounding-box 进行精修,以期得到更接近ground-truth。
黑科技(NMS):
非极大值抑制:先假设有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是我们保留下来的第二个矩形框。
问题:
1.CNN网络中存在softmax层用来分类,作者为什么还要训练出svm?
因为svm训练(0.3)和cnn训练(0.5)过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。加上svm分类器使得分类精度变高了。