参考文献:
第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)
推荐的一个pdf学习文件是:HOG特征描述算子-行人检测
1 HOG特征描述子的简介
Histogram of Oriented Gridients(HOG) 方向梯度直方图。 HOG特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子,是与SIFT、SURF、ORB属于同一类型的描述符。
HOG不是基于颜色值而是基于梯度来计算直方图的,它通过计算和统计图像局部区域的梯度方向直方图来构建特征。HOG特征结合SVM分类器已经被广泛应用到图像识别中,尤其在行人检测中获得了极大的成功。
目标检测和目标识别的概念区别,目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象是什么。识别通常只处理已经检测到对象的区域,例如,人们总是会在已有的人脸图像的区域去识别人脸。
1.1 主要思想
此方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。(本质:梯度的统计信息,梯度主要存在于边缘的地方)
1.2 实施方法
首先,将图像分成很多小的连通区域,称为细胞单元;
然后,采集细胞单元中各像素点的梯度和边缘方向;
然后,在每个细胞单元中累加出一个一维的梯度方向直方图;
再者,通过把这些直方图在图像的更大的范围内(我们把它叫做区间或者block)进行对比度归一化;而经过归一化的块描述叫作HOG描述子
2 算法的具体实现
预先假设场景:64×128的图像,划分为8×16个 8×8 的cell单元.
需要解释为什么需要分为多个cell
- 这是因为如果对一整张梯度图逐像素计算,其中的有效特征是非常稀疏的,不但运算量大,而且会受到一些噪声干扰。于是我们就使用局部特征描述符来表示一个更紧凑的特征,计算这种局部cell上的梯度直方图更具鲁棒性。
2.1 图像预处理
1 灰度化处理(可选)
彩色图片也可以直接处理。不过是分别对三通道的颜色值进行梯度计算,最后选择梯度最大的那个。
2 Gamma校正法(可选)
为了减少光照因素的影响,降低图像局部的阴影和光照变化所造成的影响,我们首先采用Gamma校正法对输入图像的颜色空间进行标准化(或者说是归一化)
所谓的Gamma校正可以理解为提高图像中偏暗或者偏亮部分的图像对比效果,能够有效地降低图像局部的阴影和光照变化。
Gamma校正公式为:
γ<1在低灰度值区域内,动态范围变大,图像对比度增加强;在高灰度值区域,动态范围变小,图像对比度降低,同时,图像的整体灰度值变大;
γ>1在低灰度值区域内,动态范围变小,图像对比度降低;在高灰度值区域,动态范围变大,图像对比度提高,同时,图像的整体灰度值变小;
相关论文里有提到,对于涉及大量的类内颜色变化,如猫,狗和马等动物,没标准化的RGB图效果更好,而牛,羊的图做gamma颜色校正后效果更好。
3 图像平滑(可选)
对于灰度图像,一般为了去除噪点,所以会先利用高斯函数进行平滑:高斯函数在不同的平滑尺度下对灰度图像进行平滑操作。
但是在实验中发现,不做高斯平滑人体检测效果最佳,使得漏检率缩小了约一倍,而这种现象可能的原因是:HOG特征是基于边缘的,平滑会降低边缘信息的对比度,从而减少图像中的有用信息。
2.2 梯度计算
梯度计算(以每个像素点为基本单位)。
计算图像每个像素点的梯度、包括方向和大小:
上式中分别表示输入图像在像素点(x,y)处的水平方向梯度和垂直方向梯度,像素点在(x,y)的梯度幅值和梯度方向分别为:
至此,计算得到8×16×8×8×2个梯度值.而其中的2代表每个梯度包含大小和方向两个值。
2.3 直方图
直方图计算(以每个cell为基本单位)
统计一个细胞单元的梯度直方图时,我们一般考虑采用9个bin的直方图来统计这8×8个像素的梯度信息,即将cell的梯度方向0-180°(或0~360°,即考虑了正负)分成9个方向块,如果分成18个方向块,就是考虑到0-360,即考虑了正负。
除此之外,还有其他的创建直方图的方式:
方式1
从生成直方图的最简单方法开始。我们将取每个像素值,找到像素的方向并更新频率表。
假设场景是高亮像素(85)的处理过程。由于该像素的角度为36°,我们将对角度值36添加一个数字,表示频率:
对所有像素值重复相同的过程,最后得到一个频率表,表示角度以及这些角度在图像中的出现情况。这个频率表可用于生成在x轴上有角度值的直方图和在y轴上有频率值的直方图。
注意,这里直方图的bin值(角度的间隔)为1。因此我们得到大约180个不同的桶,每个桶代表一个角度值。另一种方法是为更大的角度值间隔创建直方图特征。
方式2
这个方法与前面的方法类似,不同之处在于我们的bin值为20。因此,我们在这里得到的桶数是9。
同样,对于每个像素,我们将检查角度,并以9 x 1矩阵的形式存储角度值的频率。绘制这个将给我们直方图:
方式3
上述两种方法仅使用角度值来生成直方图,并且不考虑梯度值。这是我们可以生成直方图的另一种方式 - 我们可以使用梯度幅值(magnitude)来填充矩阵中的值,而不是使用频率。以下是示例:
方式4
让我们对上面的方法做一个小修改。在这里,我们将像素梯度的贡献添加到像素梯度两侧的区间。请记住,更接近角度的bin值有更高的贡献。
这正是在HOG特征描述子中创建直方图的方式。
至此,对于每个cell都会产生一个9维的HOG特征向量,产生了8×16个cell的梯度直方图或者说是HOG特征向量。
2.4 block归一化
HOG特征将8×8的一个局部区域作为一个cell,再以2×2个cell作为一组,称为一个block,也就是说一个block表示16x16的区域。
但是为什么又需要分block呢?
-
这是因为,虽然我们已经为图像的8×8单元创建了HOG特征,但是图像的梯度对整体光照很敏感。这意味着对于特定的图像,图像的某些部分与其他部分相比会非常明亮。
-
我们不能从图像中完全消除这个。但是我们可以通过使用16×16个块来对梯度进行归一化来减少这种光照变化。
-
由于每个cell有9个值,一个block(2×2个cell)则有36个值,HOG是通过滑动窗口的方式来得到block的,如下图所示:
归一化的目的是为了降低光照的影响,因为梯度对整体光照非常敏感,比如通过将所有像素值除以2来使图像变暗,那么梯度幅值将减小一半,因此直方图中的值也将减小一半,我们就需要将直方图“归一化”。
归一化的方法有很多:L1-norm、L2-norm、max/min等等,一般选择L2-norm。
例如对于一个[128,64,32]的三维向量来说,模长是,这叫做向量的L2范数。将这个向量的每个元素除以146.64就得到了归一化向量 [0.87, 0.43, 0.22]。
采用同样的方法,一个cell有一个梯度方向直方图,包含9个数值,一个block有4个cell,那么一个block就有4个梯度方向直方图,将这4个直方图拼接成长度为36的向量,然后对这个向量进行归一化。
而每一个block将按照上图滑动的方式进行重复计算,直到整个图像的block都计算完成。
2.5 获得HOG描述子
每一个16 * 16大小的block将会得到一个长度为36的特征向量,并进行归一化。 那会得到多少个特征向量呢?
-
例如,对于上图被划分8 * 16个cell ,每个block有2x2个cell的话,那么cell的个数为:(16-1)x(8-1)=105。即有7个水平block和15个竖直block。
-
每个block有36个值,整合所有block的特征值,最终获得由36 * 105=3780个特征值组成的特征描述符,而这个特征描述符是一个一维的向量,长度为3780。
其中,需要指出的是,
这里的block由2×2个cell构成,它在图像上覆盖计算的方式是overlap的图像分割策略。 overlap指的是分割出的区块(patch)互相交叠,有重合的区域。
HOG的图像分割策略,一般来说有overlap和non-overlap两种。
-
overlap,这种分割方式可以防止对一些物体的切割,还是以眼睛为例,如果分割的时候正好把眼睛从中间切割并且分到了两个patch中,提取完HOG特征之后,这会影响接下来的分类效果,但是如果两个patch之间overlap,那么至少在一个patch会有完整的眼睛。overlap的缺点是计算量大,因为重叠区域的像素需要重复计算。
-
non-overlap,缺点就是上面提到的,有时会将一个连续的物体切割开,得到不太“好”的HOG特征,优点是计算量小,尤其是与Pyramid(金字塔)结合时,这个优点更为明显。
所以,因为是overlap的图像分割策略,最后的block数目其实是105个。
至此,得到7×15个2×2×9维的HOG特征向量,经过串联,就得到了一共有15∗7∗2∗2∗9=3780个维度的特征向量。