目标检测是一项重要的计算机视觉任务,涉及检测数字图像中特定类别的视觉对象 (例如人,动物或汽车) 的实例。目标检测的目标是开发计算模型和技术,以提供计算机视觉应用程序所需的最基本的信息之一: 哪些对象在哪里?

物体检测的困难和挑战是什么?

由于不同的检测任务具有完全不同的目标和约束,因此它们的困难可能彼此不同。除了其他计算机视觉任务中的一些常见挑战,例如不同视点、照度和类内变化下的物体,物体检测中的挑战还包括但不限于以下方面: 物体旋转和比例变化 (例如,小物体) 、精确的物体定位、密集和遮挡的物体检测,加快检测速度等。

目标检测发展史

普遍认为,在过去的二十年,目标检测经历了两个阶段:一是2014年以前的传统目标检测;二是2014年后的基于深度学习目标检测时期。

车辆目标检测数据集 车辆目标检测的意义_级联

大多数早期的目标检测算法都是基于手工制作的特征构建的。由于当时缺乏有效的图像表示,人们别无选择,只能设计复杂的特征表示,以及各种加速技能来耗尽有限计算资源的使用。

首先我们需要了解目标检测所做的工作,(以人脸检测为例)主要分为三部分:

1.选择图像上的某个(矩形)区域作为一个观察窗口;
2.在选定的窗口中提取一些特征对其包含的图像区域进行描述;
3.根据特征描述来判断这个窗口是不是正好框住了一张人脸。

Viola-Jones (VJ) detector


VJ检测器遵循最直接的检测方法,即滑动窗口: 遍历图像中的所有可能位置和比例,以查看是否有任何窗口包含人脸。尽管这似乎是一个非常简单的过程,但其背后的计算远远超出了计算机当时的能力。VJ检测器通过结合三种重要技术: “特征快速提取——积分图像”,“有效分类器学习方法——AdaBoost” 和 “高效分类策略——检测级联结构”,大大提高了其检测速度。

积分图像: 积分图像是一种加速盒滤波或卷积过程的计算方法。与当时的其他目标检测算法一样,Haar小波在VJ检测器中用作图像的特征表示。积分图像使VJ检测器中每个窗口的计算复杂度与其窗口大小无关。

Haar特征
所谓Haar特征,其实就是在窗口的某个位置取一个矩形的小块,然后将这个矩形小块划分为黑色和白色两部分,并分别对两部分所覆盖的像素点(图像上的每个点称为一个像素)的灰度值求和,最后用白色部分像素点灰度值的和减去黑色部分像素点灰度值的和,得到一个Haar特征的值。

车辆目标检测数据集 车辆目标检测的意义_直方图_02

Haar特征反映了局部区域之间的相对明暗关系,能够为人脸和非人脸的区分提供有效的信息,例如眼睛区域比周围的皮肤区域要暗,通过Haar特征就可以将这一特点表示出来。但是由于提取Haar特征时每次都需要计算局部区域内多个像素点灰度值之和,因此在速度上其并不快,为此VJ人脸检测器引入了积分图来加速Haar特征的提取。

** 积分图**

积分图是一张和输入图像一样大的图,但其每个点上不再是存放这个点的灰度值,而是存放从图像左上角到该点所确定的矩形区域内全部点的灰度值之和。

车辆目标检测数据集 车辆目标检测的意义_目标检测_03


这样每次计算Haar特征时,只需要计算3次加减法,另一方面它避免了在相同像素点上重复求和,只在最开始计算一次——相邻的窗口有很大的重叠部分。极大地加速了Haar特征的提取,向快速的检测器迈出了第一步。

** AdaBoost方法和级联结构**
分类的速度取决于分类器的复杂程度,也即从特征向量变换到类别标签的计算过程的复杂程度。复杂的分类器往往具有更强的分类能力,能够获得更好的分类准确度,但是分类时的计算代价比较高,而简单的分类器虽然计算代价小,但是分类准确度也较低。那么有没有兼顾计算代价和分类准确度两方面的办法呢?当然有,这就是AdaBoost方法。希望计算代价小,所以只用简单的分类器,但是又希望分类准确度高,于是把多个简单的分类器组合起来——聚弱为强,将多个弱分类器组合成一个强分类器,这就是AdaBoost方法的核心理念。通过AdaBoost方法来学习分类器,达到了以更小的计算代价换取同样的分类准确度的目的。

车辆目标检测数据集 车辆目标检测的意义_级联_04


特征提取方法上的改进:

Haar特征进行拓展:
1、环形的黑白区域划分模式,而不仅仅是上下或者左右型;
2、旋转的Haar的特征,即将原来提取Haar特征的局部小块顺时针或逆时针旋转45度;
3、带权多通道Haar特征,即一个Haar特征不再只包含黑白两种块,而允许有多种不同形状和不同颜色的块,其中不同的颜色对应着不同的权值。
……

除了直接对Haar特征进行改进,人们也同时在设计和尝试其它特征。

LBP特征是一种二值编码特征,其直接基于像素灰度值进行计算,特点是在编码时考虑的是两个值的相对大小,并且按照一定的空间结构来进行编码,局部组合二值特征就是在LBP特征的启发下设计的;从计算上来看,提取LBP特征比提取Haar特征要快,但是Haar特征对于人脸和非人脸窗口的区分能力更胜一筹。简化的SURF特征是一种和Haar特征相类似的特征,但是其计算的是局部区域中像素点的梯度和,并在求和的过程中考虑了梯度方向(所谓梯度,最简单的一种情形就是指同一行上两个不同位置像素值的差比上它们水平坐标的差);SURF特征比Haar特征更为复杂,因此计算代价更高,但是由于其表达能力更强,因此能够以更少数目的特征来达到相同的区分度,在一定程度上弥补了其在速度上的不足HOG特征也是一种基于梯度的特征,其对一个局部区域内不同方向的梯度进行统计,计算梯度直方图来表示这个区域。积分通道特征和多通道的Haar特征有些类似,但是其使用的通道更加多样化,将通道的概念推广为由原图像变换而来并且空间结构和原图像对应的任何图像。聚合通道特征则在积分通道特征的基础上进一步加入了对每个通道进行下采样的操作,实现局部区域信息的聚合。

分类器上的改进:

VJ人脸检测器中,相级联的多个分类器在学习的过程中并不会产生直接的联系,其关联仅体现在训练样例上:后一级分类器的训练样例一定要先通过前一级分类器。不同分类器在学习时的独立性会带来两方面的坏处:一是在每个分类器都是从头开始学习,不能借鉴之前已经学习好的分类器的经验;二是每个分类器在分类时都只能依靠自己,不能利用其它分类器已经获得的信息。为此,出现了两种改进的方案:链式Boosting方法嵌套式Boosting方法。两种方案都在学习新一级的分类器时,都考虑之前已经学好的分类器,区别在于链式Boosting方法直接将前面各级分类器的输出进行累加,作为基础得分,新分类器的输出则作为附加得分,换言之,前面各级分类器实际上是新分类器的一个“前缀”,所有的分类器通过这种方式链在了一起;嵌套式Boosting方法则直接将前一级分类器的输出作为新分类器第一个弱分类器的特征,形成一种嵌套的关系,其特点是只有相邻的分类器才会互相影响。还有一种和嵌套式Boosting方法相类似的方案:特征继承,即从特征而不是分类器的角度来关联不同的分类器,具体而言,新的分类器在学习时会先继承前一级分类器的所有特征,基于这些特征学习弱分类器,再此基础上再考虑增加新的弱分类器,这一方案的特点在于其只引入了分类器学习时的相互影响,而在分类时分类器之间仍然是相互独立的。

级联结构的演化 :

多姿态问题带来的人脸差异,给设计级联结构带来挑战。

最简单的多姿态人脸检测器就是将针对不同姿态人脸的分类器采用并列式的结构进行组织,其中并列的每一个分类器仍然采用原来的级联结构(我们称这种分类器为级联分类器);在检测人脸的过程中,一个窗口如果被其中一个级联分类器分为人脸窗口,则认为其确实是一个人脸窗口,而只有当每一个级联分类器都将其判别为非人脸窗口时,才将其排除掉。这种并列式的组织架构存在两方面的缺陷:一是造成了检测时间的成倍增长,因为绝大部分窗口是非人脸窗口,这些窗口需要经过每一个级联分类器的排除;二是容易造成整体分类准确度的降低,因为整个检测器分错的窗口包含的是所有级联分类器分错的窗口。

金字塔式的级联结构,金字塔的每一层对应于对人脸姿态(旋转角度)的一个划分,从顶层到底层划分越来越细,级联的每个分类器只负责区分非人脸和某个角度范围内的人脸。对于一个待分类的窗口,从最顶层的分类器开始对其进行分类,如果其被分为人脸窗口,则送入到下一层的第一个分类器继续进行分类,如果其被分为非人脸窗口,则送入到同一层的下一个分类器继续进行分类,当在某一层上所有的分类器都将其分为非人脸窗口时,就确认其为非人脸窗口,将其排除。

车辆目标检测数据集 车辆目标检测的意义_机器学习_05

树形的级联结构,从形状上来看其和金字塔式的级联结构是一样的,也是从上往下分类器的数目逐层增多,区别就在于树形的级联结构中没有同一层分类器之间的横向连接,只有相邻层分类器之间的纵向连接,即一个窗口在同一层上不会由多个分类器进行分类,而会直接被送往下一层或者被排除。树形级联结构通过引入分支跳转机制,进一步减少了对一个窗口进行分类所需要的计算量,不过同时也带来了新的问题,分支跳转通常根据姿态估计(估计旋转角度的范围)的结果来进行,而如果姿态估计出现错误,就会出现某个姿态的人脸窗口被送给另一个姿态人脸对应的分类器进行分类的情况,容易导致错误的分类。为了缓解这一问题,出现了允许多个分支同时跳转的设计,从而降低了由于跳转错误而引起分类错误的风险。

HOG检测器

图像预处理: 缩放成固定大小;灰度处理(可选)+伽马校正

车辆目标检测数据集 车辆目标检测的意义_目标检测_06


伽马越大,图像越暗;为1时,表示没有变化。

计算梯度图:

梯度方向会取绝对值,因此得到的角度范围是 [0,180°]

车辆目标检测数据集 车辆目标检测的意义_机器学习_07


在每个像素处,梯度有一个大小和一个方向。x方向梯度图会强化垂直边缘特征,y方向梯度图会强化水平边缘特征。这就使得有用的特征(轮廓)得到保留,无关不重要的信息被去除。计算梯度直方图:

原图划分为816小格,每小格划分88个cell,每个cell上计算梯度,会储存tan角度和赋值两个参数。

车辆目标检测数据集 车辆目标检测的意义_级联_08


现在我们来计算cell中像素的梯度直方图,先将角度范围分成9份,也就是9 bins,每20°为一个单元,也就是这些像素可以根据角度分为9组。将每一份中所有像素对应的梯度值(幅值)进行累加,可以得到9个数值。直方图就是由这9个数值组成的数组,对应于角度对应于角度0-20、20-40、40-60、… 160-180。

车辆目标检测数据集 车辆目标检测的意义_机器学习_09


block归一化:

HOG将8×8的一个区域作为一个cell,再以2×2个cell作为一组,称为block。

图像的梯度对整体光照非常敏感,比如通过将所有像素值除以2来使图像变暗,那么梯度幅值将减小一半,因此直方图中的值也将减小一半。 理想情况下,我们希望我们的特征描述符不会受到光照变化的影响,那么我们就需要将直方图“归一化”。
block有4个直方图,将这4个直方图拼接成长度为36的向量,然后对这个向量除以二范数进行归一化。

得到特征向量:
每个 block得到一个长度为36的特征向量。整幅图像划分为816的小格,就有(16-1)(8-1)=105个特征向量。

基于可变形零件的模型 (DPM)

DPM(Deformable Part Model)是传统物体检测方法的高峰,最初由P.Felzenzzwalb 于2008年作为HOG探测器的扩展提出,然后R. Girshick进行了多种改进。

DPM可以看做是HOG的扩展,HOG算法只关注整个物体的特征表示,但是在现实生活中,物体是有很多变化的,包括人的各种动作/车的各种形状/不同的视角和光照等等。所以DPM除了关注检测物体整体的特征表示,还关注物体的各个部位(如人的手,脚,头)的特征表示

支持向量机 (SVM)

原理:解决二分类问题,设计最优超平面,将两个不同样本分离开来,

车辆目标检测数据集 车辆目标检测的意义_直方图_10


有时候并不能完全将两类样本分离开,我们可以将二维数据利用某种方法映射到三维空间中,这样就可以找到一个超平面将其两类样本分隔开。为了找到合适的超平面,这个特征空间的维度可能很高,甚至无穷维,这个给求取超平面带来了一定的难度,为解决这个问题,核函数横空出世,它避免了求解高维甚至无穷维特征空间中的内积。

常用核函数:

线性核
多项式核
高斯核(又称为RBF核)
拉普拉斯核
Sigmoid核

有时候样本根本不线性可分,或者说,即使找到一个核函数,能够将训练集样本在线性空间中可分,这也很难保证这个线性可分的结果不是由于过拟合造成的。

这时候需要引入软间隔,在容错率与间隔距离中找到一个平衡。

常用损失函数:

0/1损失函数
hinge损失函数(铰链损失)
指数损失函数
对率损失函数

引入损失函数之后的支持向量机的求解问题就转化为:

车辆目标检测数据集 车辆目标检测的意义_级联_11


车辆目标检测数据集 车辆目标检测的意义_机器学习_12

里程碑: 基于CNN的双阶段检测器

由于深度卷积网络能够学习图像的健壮和高级特征表示,因此一个自然的问题是我们是否可以将其用于对象检测?R. Girshick等人于2014年率先打破僵局,提出了具有CNN特征 (RCNN) 的区域用于物体检测。在深度学习时代,目标检测可以分为两种类型: “两阶段检测” 和 “一阶段检测”,其中前者将检测框为 “粗精细” 过程,而后者将其 “一步完成”。

RCNN

开始于一系列目标候选框,然后,这些候选框会被缩放为固定大小,以适应CNN卷积网络模型训练网络(如,AlexNet)。最后使用线性SVM在每个区域内保留一个目标并识别目标类别。

在VOC07数据集上,RCNN平均精度较DPM(33.7%)提升到58.5%。

AlexNet

输入尺寸固定224x224,5个池化层和3个全连接层,

车辆目标检测数据集 车辆目标检测的意义_目标检测_13

SPPNet

空间金字塔结构网络SPPNet,SPPNet的主要贡献是引入了空间金字塔池 (SPP) 层,该层使CNN能够生成固定长度的表示,而无需重新缩放图像/感兴趣区域的大小。当使用SPPNet进行对象检测时,只能从整个图像中计算一次特征图,然后可以生成任意区域的固定长度表示来训练检测器,从而避免了重复计算卷积特征。
SPPNet比r-cnn快20倍以上,而不牺牲任何检测精度 (VOC07 mAP = 59.2%)。尽管SPPNet有效地提高了检测速度,但仍存在一些弊端: 首先,训练仍然是多阶段的,其次,SPPNet仅对其全连接层进行微调,而简单地忽略了所有先前的层。次年晚些时候,Fast RCNN [18] 被提出并解决了这些问题。

Fast RCNN

2015年,R. Girshick提出Fast RCNN检测器,

Faster RCNN

不久后,还是在2015年,S. Ren等提出Faster RCNN检测器,这是第一个端到端,也是第一个近乎实时的深度学习检测器,COCO数据集上fps=17。Faster-RCNN的主要贡献是引入了区域提案网络 (RPN),该网络可以实现几乎cost-free的区域提案。
从r-cnn到更快的RCNN,目标检测系统的大多数单个块,例如提案检测,特征提取,边界框回归等,已经逐渐集成到一个统一的端到端学习框架中。

但,后续检测阶段仍然存在计算冗余。

FPN(Feature Pyramid Networks)
2017年由T.-Y. Lin等在Faster RCNN基础上提出,尽管CNN更深层的特征有利于类别识别,但不利于定位对象。为此,在FPN中开发了具有横向连接的自上而下体系结构,用于在所有规模上构建高级语义。由于CNN通过其正向传播自然地形成了特征金字塔,因此FPN在检测具有各种尺度的物体方面显示出巨大的进步。

里程碑: 基于CNN的单阶段检测器

YOLO系列

2015年,R. Joseph等提出YOLO v1,这是深度学习领域的第一个单阶段检测器,在VOC07数据集上,fps=155。
该网络将图像划分网格,并同时预测每个区域的边界框和概率。这样虽然很快,但是精度上低于双阶段检测方法,因此其后来系列以及SSD都非常注重这一点。

SSD(Single Shot MultiBox Detector)

2015年,W. Liu等提出SSD,这是深度学习领域的第二个单阶段检测器,SSD的主要贡献是引入了多参考和多分辨率检测技术,从而显着提高单阶段检测器的检测精度,尤其是对于某些小物体。

VOC07 mAP=76.8%, VOC12 mAP=74.9%,
COCO mAP@.5=46.5%,mAP@[.5,.95]=26.8%
a fast version runs at 59fps

SSD与以前的任何检测器之间的主要区别在于,前者在网络的不同层上检测个不同尺度的目标,而后者仅在其顶层运行检测。

RetinaNet

在RetinaNet中引入了一种名为 “焦点损失” 的新损失函数,以便检测器在训练期间将更多的注意力放在hard、错误分类的例子上。焦点损失使一级检测器能够实现与两级检测器相当的精度,同时保持很高的检测速度。

数据集

在对象检测方面,过去10年中已经发布了许多著名的数据集和基准测试,包括PASCAL VOC挑战(例如,VOC2007,VOC2012),ImageNet大规模视觉识别挑战 (例如,ILSVRC2014) 、MS-COCO检测挑战 等。表1给出了这些数据集的统计数据。图4显示了这些数据集的一些图像示例。图3显示了2008年2018年的VOC07、VOC12和ms-coco数据集上检测精度的改进。

一些方法

多尺度检测(multi-scale detection)

在过去的20年中,多尺度检测经历了多个历史时期: “特征金字塔和滑动窗口 (2014前)”,“目标建议检测 (2010-2015)”,“深度回归 (2013-2016)”,“多参考检测 (2015后)”,和 “多分辨率检测 (2016后)”。

车辆目标检测数据集 车辆目标检测的意义_车辆目标检测数据集_14