前言
深度学习主要的应用场景分为三大类:物体识别、目标检测、自然语言处理.物体识别领域的核心理念就是CNN(Convolutional Nerual Network)(卷积-Relu激活-池化Pooling-全连接Fully connected)技术,以AlexNet、VGG、Inception、LeNet、ResNet到MobileNet等这一系列以卷积技术为基础的模型框架,实现了人工智能物体识别方向的重要突破,模型效果如准确度、识别时间、模型大小等不同也被应用于不同场合。而目标检测是物体识别(Classification)和物体定位(Localization)的结合体,不仅要识别出物体分类,同时也要定位出物体在图片中的具体位置。
目标检测一直是计算机视觉(Computer Vision)的基础问题,在2013年以前目标检测还处于传统手工提取特征的阶段,其主要方法是区域选择、提取特征、分类回归三部曲,带来的主要问题是:一是区域选择的策略效果差、时间复杂度高;二是手工提取的特性鲁棒性较差。2014年rbg等学者提出基于卷积神经网络进行特征提取的理念后,以此开辟了新的篇章。
本篇综述简要介绍目标检测算法的两大派别及由其衍生的代表性算法。
两大派系
基于卷积神经网络的目标检测模型主要分为两大派系,一类是以R-CNN为代表的two-stage,一类是以YOLO为代表的one-stage。顾名思义,two-stage意味将物体识别和物体定位分为两步,分别完成。one-stage则是直接对预测的目标物体进行回归。
Two-stage
方法:
1、 生成可能区域(Region Proposal) & CNN提取特征
2、 放入分类器(Classifier)并修正位置
主流算法有R-CNN, fast R-CNN, faster-RCNN等. 优点是识别错误率低,漏识别率也较低,但速度较慢,不能满足real-detection场景。
One-stage
如前文所讲,其方法是直接对预测的目标物体进行回归。主流算法有Yolo,SSD,YoloV2等,识别速度快,适用于实时检测,而且准确率基本能达到faster R-CNN的水平,但回归解决问题虽简单快速,就是太过粗暴。
Two-stage: R-CNN
2014年R-CNN模型提出后,其后续算法发展顺序如下:
R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
R-CNN/2013
算法结构
流程
1、 利用Selective search算法评估相邻图像之间的相似度,把相似度高的进行合并且对其打分,选出检测物体区域的候选框,被称作子图(约2000个)
2、 将这2k个候选窗口图片都缩放到固定大小(227x227),然后对每一个子图进行卷积神经网络CNN提取特征
3、 提取后的特征输入到SVM分类器,进行物体分类,保留分类准确率高的区块作为最终物体定位区块
4、 以回归的方式精修候选框
突破
- 传统的区域选择使用滑窗,每滑一个窗口检测一次,相邻窗口信息重叠高,检测速度慢。R-CNN使用一个启发式方法(Selective search),先生成候选区域再检测,降低信息冗余程度,从而提高检测速度。
- 传统的手工提取特征鲁棒性差,受限于如颜色、纹理等低层次(Low level的特征。使用CNN提取特征,可以提取更高层面的抽象特征,从而提高特征的鲁棒性。
缺点
- 与传统相比,减少了大量的运算,但相较现在,生成候选框的算法(Selective search)仍旧有大量的算力冗余
- 对于所生成的候选框,不同区域间会有大量重叠,且均需要做卷积网络计算,导致运算浪费且庞大,内存占用量大
总结: 相较传统的目标检测算法,其准确率获得了量级提升。以VGG-16为物体识别模型,在Pascal Voc2007数据集上达到了66%的准确率,也是Two-stage算法的开山之作。
SPP Net/2014
改进:
与传统目标检测算法相比,R-CNN已经有非常大的突破,但是仍旧存在可以改进的地方,2014年以何恺明、任少卿为首的团队提出了SPP Net,主要对R-CNN算法提出了两处改进:
顺序改变:先卷积后生成区域
由上文R-CNN简略介绍中可知,其算法是先生成候选区域、后进行卷积运算。造成的问题是:候选区域会有重叠,卷积运算出现重复浪费,与此同时每个区域进行新的卷积时都需要新的存储空间。
SPP Net在此基础上进行优化,将原先顺序改成先卷积后生成区域。意思是:不需要对2k+的子图逐一进行CNN,而是对整张带检测的图片进行CNN操作,一次性提取特征,得到feature maps。这样不仅减少存储量而且加快了训练速度。引进金字塔池化层
我们先来看一张对比图:
以及两种算法结构图(R-CNN & SPP Net)
首先,我们需要一点预备知识。
卷积神经网络中的卷积层(conv layer)参数与输入图片大小并无关系,仅仅是利用卷积核(conv kernel)在图像上滑动,将不同大小的图片卷积出不同大小的特征图。但全连接层(Fully Connected layer)参数与输入图像大小有关,需要规定输入feature map大小。
那么R-CNN是怎么做的呢?
在第二张图R-CNN算法结构中可见,进行CNN操作前,对生成的候选区域进行裁剪(Crop)和缩放(Wrap)到固定大小,这样就保证了每一张子图大小相同,卷积后生成的特征图也大小一样,从而全连接层输入神经元个数保持一致。但事实上,从图二中的汽车和象牙塔,可以发现,对图片进行裁剪或缩放,都会很大程度上丢失图片原有信息,例如:将汽车裁剪成只有一个门;象牙塔缩放后图片失真,都造成了原生图片的信息缺失,造成训练效果变差。
而SPP Net则保留原有图像,在卷积层后引进空间金字塔池化层(spatial pyramid pooling)。
所谓金字塔池化层就是将不同尺寸图片在卷积后形成的任意维度feature maps通过不同大小的区块提取特征,拼凑组合成固定size维度输出,作为fully connected layer的输入层。
举个例子,假设我们需要全连接层的输入神经元维度是21x256,上图中黑色模块为卷积层后的feature maps,在SPP Net算法中则利用不同尺寸的区块对特征图分割提取特征,如图中蓝色区块有16格每一层提取16个特征,输出向量维度为16x256,绿色区块为4x256,灰色区块为1x256,通过三个大小不同的区块提取叠加,最后得到16x256+4x256+1x256 = 21x256的固定输入维度,这也就保证了全连接层的输入维度仍旧不变。
算法结构
了解SPP Net的核心改进部分,再对整体算法结构和流程做一个简单回顾。
算法流程
1、 利用选择性算法(EdgeBoxes)生成候选区域(约2000个候选窗口)
2、 对全图进行CNN提取特征图,然后在feature maps找到各个候选框的区域采用金字塔池化,提取固定尺寸的特征向量。
3、 将候选区域特征输入到SVM分类器,判别输入类别
4、 以回归的方式精修候选框
总结
SPP Net改变了卷积顺序,保留了原生图片信息的完整性,减少了冗余的计算量,大大提高了对图片处理的速度。同时引进了金字塔空间池化,实现多尺度特征提取出固定大小的特征向量,无需固定卷积层输入图像尺寸,保留了原图像更多特征。
Fast R-CNN/2015
算法结构
改进
同样是R-CNN团队结合了原算法与SPP Net提出了更为优良的改进算法Fast R-CNN, 最大的优势是快,训练时间从84小时减少到9.5小时,测试时间从47s降到0.32s,不过准确度相差无几。
由算法结构图中我们可以发现其是在SPP-Net结构基础上做出两处改进
- 引进ROI(region of interest) Pooling
将原有的金字塔池化层改良成ROI Pooling,这样做的优势既不限制输入图片大小,同时也可以反向传播。(金字塔池化层含有多个不同尺寸的区块,无法进行反向传播)
而ROI Pooling对卷积层后的特征图进行MaxPooling操作,接下来我们举个例子简单介绍一下。
假设我们需要对一个8x8feature maps执行ROI Pooling,要求输出尺寸维度为2x2。
其次候选区域region proposal的大小为7*5,在特征图中的(左上角、右下角)坐标是(0,3),(6,7)。如图:
由于输出维度大小是2*2,所以对候选区域进行2*2分割
最后对分割后的4个网格中取最大值,组成2*2最大值输出特征图
以上即是ROI Pooling对特征图的操作流程。反向传播和 MaxPooling 层的一样,只对网格里的最大值进行传播。
- 多任务同时训练
其一是将R-CNN分类器SVM换成softmax,使用神经网络预测分类,减少跨平台损耗,提高预测速度。其二在预测分类、精修回归这一块改成并行任务,将分类损失和边框定位回归损失结合一起统一训练,最终输出对应分类和边框坐标。