项目实战—人脸检测之HOG理论(三)
之前我们讲述了使用级联分类器来进行人脸检测,现在我们将使用第二种方法来实现。
第二种常用的人脸检测工具由 Dlib 提供,它使用了方向梯度直方图(HOG)的概念。论文《Histograms of Oriented Gradients for Human Detection》实现这一方案。
Histogram of Oritentd Gradients,缩写为HOG,是目前计算机视觉、模式识别领域很常用的一种描述图像局部纹理的特征。它通过计算和统计图像的局部区域(Cell和Block)的方向梯度直方图来构成特征,按照我的理解就是,先将一整幅图像像划分为大小相等的Cell小区域,比如说,先将图像划分为20pixel*20pixel的小区域,然后,分别计算这些小区域的梯度方向直方图;然后,再由一定数量的小区域组成稍微大一点的区域Block,比如说由2*2个Cell小区域组成1个Block区域,然后,再由Block区域的方向梯度直方图特征向量组成整幅图像的方向梯度直方图HOG的特征向量;现在,这个特征向量就可以唯一的描述这幅图像,就像一个人的身份证编号(特征向量)一样,可以代表描述一个人。求出一幅图像的HOG特征向量之后,这个特征向量就可以结合SVM,实现目标检测,以图搜图;HOG+SVM刚开始的时候,是被广泛用于行人检测的,当然也可以用于其它方向的检测或者以图搜图等领域。
方向梯度直方图HOG算法的大致步骤如下所示:
1)归一化处理
归一化处理操作的目的是:为了提高图像特征描述符对光照以及环境变化的鲁棒性,降低图像局部的阴影、局部曝光过多及纹理失真,尽可能的抑制图像的干扰噪声。归一化处理操作是先将图像转化为灰度图像,再利用Gamma校正实现。
因为方向梯度直方图HOG是一个描述图像局部纹理信息的局部特征描述符,因此,如果直接对一大幅图像及逆行特征提取的话,将会得不到好的效果。因此,我们需要先将图像划分为较小的方格单元,比如我们在程序中先将图像划分为20*20大小的放格单元Cell,然后2*2个Cell组成一个Block,最后,所有的Block组成图像。
HOG图像的划分一般有两种策略,重叠和不重叠,即overlap和non-overlap两种。这两种划分策略应该很好理解。就不多说了,直接看一下non-overlap的划分策略示意图,如下图所示:
对于图像I(x,y),计算图像在水平方向和垂直方向上的梯度,这一步我们可以利用OpenCv中的一阶微分算子Sobel计算得到。
3)计算每个Cell的方向梯度直方图
将图像划分为小的Cell之后,接下来就是计算每一个Cell的方向梯度直方图,我们可以利用OpenCv中的一阶微分算子函数Sobel对每一个小区域求解X方向和Y方向上的梯度图像。然后,再根据下面的公式(1)和公式(2)计算每一个小区域中每一个像素点的梯度方向和梯度幅值。
通过上面公式计算出来的梯度方向的角度是一个范围在0~360度的弧度值,为了计算简单,我们将梯度向的范围约束为0~180度,并且分割为9个方向,每个方向20度,再将约束后的角度除以20,则现在的梯度方向角度值就变为范围在[0,9),我们现在将每个小Cell里面的梯度幅值按照这9个方向进行统计,计算完之后,将会产生一个横坐标X为梯度方向,纵坐标Y为梯度幅值的方向梯度直方图。
4)特征向量归一化
为了克服光照不均匀的变化以及前景和背景测对比差异,需要对每个小区域计算出来的特征向量进行归一化处理。在程序中,我们直接使用OpenCV中的normalize函数中的CV_L2范数进行归一化处理。
5)HOG特征向量的生成
首先,我们将图像中的小Cell的HOG特征向量组成比较大的Block的HOG特征向量,具体组合方式就是利用2*2个Cell组成一个Block。然互再将所有的Block的HOG特征向量组成全图像的HOG特征向量。特征向量的具体组合方式是将小的特征向量按照首尾相接的方式组成一个维数比较大的特征向量。比如,一幅图像被分为m*n个Block,每一个Block的特征向量的维数为9维(每一个梯度方向就是一维)。那么,这个图像最终的特征向量维数就是m*n*9。
以上就是HOG的所有步骤,但是它仍旧有一个缺陷,那就是计算量过大,我们将在下个教程中讨论相关的解决办法。