深度学习之路(二):R-CNN

叮咚,前文已经简单的介绍了一些,下面进入第一个算法——R-CNN。

在计算机视觉领域有一个神一样存在的竞赛——ImageNet大赛,各种各样的优秀算法差不多都首先初现在大赛上。讲深度学习应用于计算机视觉最早可以追溯到2012年,在此次大赛上,卷积神经网络CNN一炮走红,成功击败了DMP(可变组建模型,被称为传统目标检测算法最后的辉煌!)。基于此,Ross大神趁火打劫,率先提出了区域卷积网络目标检测框架(R-CNN)。由此,目标检测鸟枪换大炮,正式拉开了基于深度学习的目标检测研究大幕,目标检测算法结束了传统,“GPU暴力美学”时代到来。

首先我们先来看一下论文《Rich feature hierarchies for accurate oject detection and semantic segmentation》(百度云链接:https://pan.baidu.com/s/12pESnsHbFi8ktfIxu729_A,提取码:e84a),这便是Ross Girshick大神于2014年发表的论文,由此提出R-CNN。

一、原文解读

(并非逐字逐句翻译)

过去几年,在PASCAL数据集上目标检测的效果已经达到了一个稳定的效果,并且总结出了一个发展方向:融合多种低维度的特征图和高纬度的上下文语义可以提升检测效果。Ross大神基于此,提出了一种算法,可以将数据集VOC2012的最高检测精度提升30%(也怪当时检测效果质量较差,才一下提升如此之高),达到了53.3%(很快就会被碾压)!Ross大神并且总结出了两个关键因素(为R-CNN系列算法打下了坚实的基础):

1.在候选区域自上而下的使用卷积神经网络用来定位和分割;

2.采用预训练再微调的方式(以后都是这样干的,迁移学习老铁了解一下)。

1.1 Introduction

特征是贼啦重要的(还用你说)。过去的目标检测算法基本上都是基于SIFT和HOG特征进行检测的(关于这两个以后有机会再详述,你知道他们是两种特征提取算法就ok了),但是近些年来(2010-2012年)进展非常缓慢(这也就表明了单纯的依靠传统的特征提取已经很难再取得进步了,大神们已经把这种算法研究的明明白白了),于是乎,我们决定采用CNN来搞一下。

接下来,论文中讲述了目前最新发展的传统目标检测算法以及基于CNN的目标检测算法,为接下来提出我的NB算法打一下前调。这里就省略了,如果您喜欢,请详细研究。

我们针对前人们的研究成果,通过研究他们的缺点,总结出了我们的要点,就是:通过操作“recognition using regions”解决了CNN的定位问题,并且对于每一张图像(注意啊,是针对每一张图像),我们获取2K个于类别无关的region proposal(这个单词经常会出现,翻译成什么样的中文都感觉差点意思),通过神操作将这2K个region proposal转化成固定大小的,将其每一个(注意啊,是每一个,即这2000多个都要)输入到卷积神经网络,然后经过卷积操作之后,利用SVM进行分类。由于这个算法结合了region proposal和CNN,因此我们就给他命名为R-CNN,下面上图。


不放上这个图,我自己都觉得我再胡扯。

如果你说我的数据集不够咋办,这可就不好办了。深度神经网络的训练就是从大量,或者说海量的数据中心获得特征的描述,但是有标签的数据集是非常难找到的,即使自己制作数据集,需要耗费的人力物力还是很大的。因此,数据集数量不够怎么办不仅仅困惑着你,同样困惑着Ross大神。R-CNN提出的另一个大的贡献则是“微调”,即在辅助数据集(ILSVRC)上进行训练(据说数据量是千万级的,我没有考证过,道听途说),然后再在小数据集上进行调优,这为我们利用现有模型(VGG16、ZF都有训练好的预训练模型)来进行训练自己的数据集提供了可能(当然了,这里的小数据集也不能太少,过拟合还是很恐怖的,如果你就三五张,三五十张数据集,请出门左拐,再制作一些数据集去,起码每个类别也要有几百上千张的,为了获得相对较好的训练效果,每个不同类别的数据集数量最好相差不是很大)。

R-CNN目标检测模型有三个模块构成:

1.生成类别独立的region proposal

2.从各个region proposal中获取固定维度的特征向量,可以用ZF,也可以用VGG16

3.利用SVM算法将这些特征向量分类

1.2 Object detection with R-CNN

region proposal

获得region proposal是成功的第一步,那么如何获得region proposal呢?这是一个非常重要的话题,在这里R-CNN采用的是选择性搜索算法(selective search,SS算法,这里就不做过多的解释了,请大佬们自行百度吧,很简单的)。这就产生了1K-2K个region proposal,具体是不是这个数,咱也没数过,咱也不敢说。

获取了region proposal后,首先要要做的就是给这些region proposal整理大小,为了方便计算,均归一化成227*227大小的(其实这个数字可以通过神经网络的结构算出来)。下面就是将大小一样的region proposal排排队送入卷积神经网络中,静等结果便可。

论文的下面一些部门便是介绍了训练过程已经各种各样的对比试验从而验证了R-CNN算法多么多么优秀。就不在一一介绍了,下面结合我的训练过程,为大家介绍R-CNN的训练过程。

二、R-CNN模型训练

在得到region proposal后,便可以开始卷积操作提取特征了。

好了,现在我要站队了,目前基于深度学习的深度神经网络框架主要有两大阵营,其一是Caffe,其二是TF(tensorflow,于口红无关,于TFBOYS更没有一毛钱关系),其实这来两个框架各自有各自的特点与不足,由于一开始接触的是基于Caffe的模型,因此后面包括以后的算法基本上均是基于Caffe框架进行开发的。

现在常用的基于Caffe的卷积神经网络主要有ZF和VGG系列,其中VGG系列中VGG16又比较流行。R-CNN的训练流程如下图。


自己画的,好与不好请多担待。

其训练过程并不复杂,这里还有几点再给大家强调一下。

R-CNN中,这2K多个region proposal经过卷积神经网络得到特征向量之后,是采用SVM进行分类的,来确定类别,采用Bounding-Box(Bbox)进行回归的,来获得其位置坐标,关于这两个算法,虽说不影响R-CNN的理解,但还是学习了解一下为好。

通过以上的描述其实不难发现R-CNN的缺陷,并且是非常致命的缺陷(再NB的算法也是有缺陷的),总结出来主要是两大点吧(个人认为):

1.将每一张待检测图像首先分成2000多个,并且每一个都要经过卷积计算,这是非常耗费时间的,这就造成了起检测速度非常之慢。

2.由于对于region proposal有一个归一化操作,过度拉伸会导致特征变形。

基于以上问题,便有了接下来的精彩。

未完待续。。。

你可能感兴趣的:(深度学习之路(二):R-CNN)