基于深度学习的目标检测
基于深度学习的目标检测
普通的深度学习监督算法主要用来做分类,分类的目标是要识别出图中所示是一只猫。而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛以及实际的应用中,还包括目标定位和目标检测等任务。其中目标定位不仅仅要识别出来是什么物体(即分类),而且还要预测物体的位置,位置一般用边框(bounding box)标记。而目标检测实质是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位。
简单来说,分类,定位和检测的区别如下:
1.分类:是什么?
2.定位:在哪里?是什么?(单个目标)
3.检测:在哪里?分别是什么?(多个目标)
目标检测对于人类来说并不困难,通过对图片中不同颜色模块的感知很容易定位并分类出其中的目标物体,但对于计算机来说,面对的是RGB像素矩阵,很难从图像中直接得到“狗”和“猫”这样的抽象概念并定位其位置,再加上有时候多个物体和杂乱的背景混杂在一起,使得目标检测更加困难。在传统视觉领域,目标检测就是一个非常热门的研究方向,一些特定目标的检测,比如人脸检测和行人检测已经有非常成熟的技术了。普通的目标检测也有过很多的尝试,但是效果总是差强人意。
传统的目标检测一般使用滑动窗口的框架,主要包括三个步骤:
1.利用不同尺寸的滑动窗口框住图中的某一部分作为候选区域;
2.提取候选区域相关的视觉特征。比如人脸检测常用的Harr特征;行人检测和普通目标检测常用的HOG特征等;
3.利用分类器进行识别,比如常用的SVM模型
传统的目标检测中,多尺度形变部件模型DPM(Deformable Part Model)是出类拔萃的,连续获得VOC(Visual Object Class)2007到2009的检测冠军,DPM把物体看成多个组成部分(比如人脸的鼻子、嘴巴等),用部件间的关系来描述物体,这个特性非常符合自然界很多物体的非刚体特征。DPM可以看做是HOG+SVM的扩展,很好的继承了两者的优势。在人脸检测、行人检测等任务上取得了不错的效果,但是DPM相对复杂,检测速度也很慢,从而也出现了很多改进的方法。正当大家热火朝天的改进DPM性能的时候,基于深度学习的目标检测横空出世,迅速盖过了DPM的风头,很多之前研究传统目标检测算法的研究者也开始转向深度学习。
基于深度学习的目标检测发展起来以后,其效果也一直难以突破。2013年R-CNN诞生了,VOC2007测试集的mAP被提升至48%,2014年通过修改网络结构又飙升至66%,同时ILSVRC2013测试集的mAP也被提升至31.4%
R-CNN是Region-based Convolutional Neural Networks的缩写,中文翻译是基于区域的卷积神经网络,是一种结合区域提名(Region Proposal)和卷积神经网络(CNN)的目标检测方法。R-CNN是第一个真正可以工业级应用的解决方案,这也和深度学习本身的发展类似,神经网络、卷积网络都不是什么新概念,但在本世纪突然真正变得可行,而一旦可行之后再迅猛发展也不足为奇了。
R-CNN这个领域目前研究非常活跃,先后出现了R-CNN,SPP-Net,Fast R-CNN,Faster R-CNN,R-FCN,YOLO,SSD等研究。这些创新工作其实很多时候是把一些传统视觉领域的方法和深度学习结合起来了,比如选择性搜索(Selective Search)和图像金字塔(Pyramid)等
深度学习相关的目标检测方法大致可以分为两派:
1.基于区域提名的:如R-CNN,SPP-Net,Fast R-CNN,Faster R-CNN,R-FCN;
2.端到端(End-to-End):无需区域提名的,如YOLO,SSD
目前来说,基于区域提名的方法依然占据上风,但端到端的方法速度上优势明显,后续的发展拭目以待。
1.1基于区域提名的方法
本小节主要介绍区域提名的方法,包括R-CNN,SPP-Net,Fast R-CNN,Faster R-CNN,R-FCN
1.1.1 R-CNN
如前面所述,早期的目标检测,大都使用滑动窗口的方式进行窗口提名,这种方式本质是穷举法,R-CNN采用的是Selective Search
以下是R-CNN的主要步骤:
1.区域提名:通过Selective Search从原始图片提取2000个左右区域候选框;
2.区域大小归一化:把所有候选框缩放成固定大小(原文采用227×227);
3.特征提取:通过CNN网络,提取特征;
4.分类与回归:在特征层的基础上添加两个全连接层,再用SVM分类来做识别,用线性回归来微调边框位置和大小,其中每个类别单独训练一个边框回归器。
事实上,R-CNN有许多缺点:
1.重复计算:R-CNN虽然不再是穷举,但依然有两千个左右的候选框,这些候选框都需要进行CNN操作,计算量依然很大,其中有不少其实是重复计算;
2.SVM模型:而且是线性模型,在标注数据不缺的时候显然不是最好的选择;
3.训练测试分为多步:区域提名,特征提取,分类,回归都是断开的训练过程,中间数据还需要单独保存;
4.训练的空间和时间代价很高:卷积出来的特征需要先存在硬盘上,这些特征需要几百G的存储空间;
5.慢:前面的缺点导致R-CNN出奇的慢,GPU处理一张图片需要13秒,CPU上则需要53秒。
1.1.2 SPP-Net
SPP-Net,其主要思想是去掉原始图像上的crop/warp等操作,换成了在卷积特征上的空间金字塔池化层(Spatial Pyramid Pooling,SPP),为何要引入SPP层,主要原因是CNN的全连接要求输入图片是大小一致的,而实际的输入图片往往大小不一,如果直接缩放到统一尺寸,很有可能有的物体会充满整个图片,而有的物体可能只能再到图片的一角。传统的解决方案是进行不同位置的裁剪,但这些裁剪技术都可能会导致一些问题的出现,比如crop会导致物体不全,warp导致物体被拉伸后变形严重,SPP就是为了解决这个问题的。SPP对整图提取固定维度的特征,再把图片均分成4份,每份提取相同的维度特征,再把图片均匀分成16份,以此类推,可以看出,无论图片大小如何,提取出来的维度数据都是一致的,这样就可以统一送至全连接层了。SPP的思想在后来的R-CNN模型中也被广泛用到。
SPP-Net网络,其实实质是在最后一层卷积层后加了一个SPP层,将维度不一的卷积特征转换为维度一致的全连接输入。
SPP-Net做目标检测的主要步骤为:
1.区域提名:用Selective Search从原图中生成2000个左右的候选窗口;
2.区域大小缩放:SPP-Net不再做区域大小归一化,而是缩放到min(w,h)=s,即统一长宽的最短边长度,s选自{480,576,688,864,1200}中的一个,选择的标准是使得缩放后的候选框大小与224×224最接近;
3.特征提取:利用SPP-Net网络结构提取特征
4.分类与回归:类似R-CNN,利用SVM基于上面的特征训练分类器模型,用边框回归来微调候选框的位置。
SPP-Net解决了R-CNN区域提名时crop/warp带来的偏差问题,提出了SPP层,使得输入的候选框可大可小,但其他方面依然和R-CNN一样,因而依然存在不少问题,这就有了后面的Fast R-CNN
1.1.3 Fast R-CNN
Fast R-CNN是要解决R-CNN和SPP-Net两千个左右候选框带来的重复计算问题,其主要思想为:
1.使用一个简化的SPP层——RoI(Region of Interesting)Pooling层,操作与SPP类似
2.训练和测试是不再分多步:不在需要额外的硬盘来存储中间层的特征,梯度能够通过RoI Pooling层直接传播;此外,分类和回归用Multi-task的方式一起进行;
3.SVD:使用SVD分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层
Fast R-CNN的主要步骤如下:
1.特征提取:以整张图片为输入利用CNN得到图片的特征层;
2.区域提名:通过Selective Search等方法从原始图片提取区域候选框,并把这些候选框一一投影到最后的特征层;
3.区域归一化:针对特征曾上的每个区域候选框进行RoI Pooling操作,得到固定大小的特征表示;
4.分类和回归:然后通过两个全连接层,分别用softmax多分类做目标识别,用回归模型进行边框位置与大小的精确定位和微调。
Fast R-CNN比R-CNN的训练速度(大模型)快8,8倍,测试时间快213倍,比SPP-Net训练速度快2.6倍,测试速度快10倍左右。
1.1.4 Faster R-CNN
Fast R-CNN使用Selective Serach来进行区域提名,速度依然不够快。Faster R-CNN则直接利用RPN(Region Proposal Networks)网络来计算候选框。RPN以一张任意大小的图片为输入,输出一批矩形区域提名,每个区域对应一个目标分数和位置信息。
Faster R-CNN的主要步骤如下:
1.特征提取:同Fast R-CNN,以整张图片为输入,利用CNN得到图片的特征层;
2.区域提名:在最终的卷积特征层上利用k个不同的矩形框(Anchor Box)进行提名,k一般取9;
3.分类和回归:对每个Anchor Box对应的区域进行object/non-object二分类,并用k个回归模型(各自对应不同的Anchor Box)微调候选框位置与大小,最后进行目标分类。
总之,Faster R-CNN抛弃了Selective Search,引入了RPN网络,使得区域提名,分类,回归一起共用卷积特征,从而得到了进一步的加速。但是Faster R-CNN需要对两万个Anchor Box先判断是否是目标(目标判定),然后再进行目标识别,分成两步。
1.1.5 R-FCN
前面的目标检测方法都可以细分为两个子网络:
1.共享的全卷积网络;
2.不共享计算的RoI相关的子网络(比如全连接网络)
R-FCN则是将最后的全连接层之类换为了一个位置敏感的卷积网络,从而让所有的计算都可以共享。具体来说,先把每个区域提名划分为K×K个网格,比如R-FCN原文中k的取值为3,则对应的九个网格分别表示:左上top-left,上中top-center,右上top-right,…,右下bottom-right,对应的九宫格,每个Grid都有对应的编码,但预测时候会有C+1个输出,C表示类别数目,+1是因为有背景类别,全部的输出通道数量为K^2 * (C+1).需要注意的是九宫格,但是Pooling时候只有一个起作用,比如bottom-right层只有右下角的小块起作用,那么问题来了,这一层的其他8个框有什么作用呢?答案是她们可以作为其他RoI(偏左或者偏上的RoI)的右下角。
R-FCN的步骤:
1.区域提名:使用RPN(Region Proposal Network,区域提名网络),RPN本身是全卷积网络结构;
2.分类和回归:利用和RPN共享的特征进行分类。当做bbox回归时,则将c设置为4
1.2 端到端的方法
本节介绍端到端(End-to-End)的目标检测方法,这些方法无需区域提名,包括YOLO和SSD
1.2.1 YOLO
YOLO的全拼是You Only Look Once,顾名思义就是只看一次,进一步把目标判定和目标识别合二为一,所以识别的性能有了很大的提升,达到每秒45帧,而在快速版的YOLO(Fast YOLO,卷积层更少)中,可以达到每秒155帧。
针对一张图片,YOLO的处理步骤为:
1.把输入图片缩放到448*448大小
2.运行卷积网络;
3.对模型置信度卡阈值,得到目标位置和类别
YOLO将448448大小的图切成SS的网格,目标中心点所在的搁置负责该目标的相关检测,每个网络预测B个边框及其置信度,以及C种类别的概率。YOLO中S = 7 ,B = 2,C取决于数据集中物体类别数量,比如VOC数据集就是C = 20,对于VOC数据集来说,YOLO就是把图片统一缩放到448448,然后每张图片平均划分为77=49个小格子,每个格子预测2个矩形框及其置信度,以及20中类别的概率。
YOLO简化了真个目标检测的流程,速度提升也很大,但是YOLO还是有不少可以改进的地方,比如S*S的网格就是一个比较启发式的策略,如果两个小目标同时落入一个格子中,模型也只能预测一个;另一个问题是Loss函数对不同大小的bbox未做区分。
1.2.2 SSD
SSD的全拼是Single Shot MultiBox Detector,冲着YOLO的缺点来的。SSD的网络分为两部分,前面是用于图像分类的标准网络,后面的网络是用于检测的多尺度特征映射层,从而达到检测不同大小的目标,SSD在保持YOLO高速的同时效果也提升了很多,主要是借鉴了Faster R-CNN中的Anchor机制,同时使用了多尺度。但是从原理依然可以看出,Default Box的新装以及网格大小是事先固定的,那么对特定图片小目标的提取会不够好。
1.3 总结
基于深度学习的目标检测总体上分为两派:
1.基于区域提名的R-CNN系列;
2.无需区域提名的YOLO,SSD系列