HOG(Histogram of Oriented Gradient)方向梯度直方图是 Dalal 和 Triggs 在 2005 的 CVPR 上提出的一种解决人体目标检测的图像描述子,用于表征图像局部梯度方向和梯度强度分布特性。其具体思想是:在一副图像中,局部目标的形状能够被梯度或边缘的方向密度分布很好地描述。该方法通过统计局部区域的梯度方向直方图来构成特征,能够很好地描述人体的边缘,提取人体的外形信息和运动信息,形成丰富的特征集。Dalal 等提出的 HOG+SVM 算法当时在行人检测上取得了巨大的成功,而此后涌现的许多算法,大多是以该算法为基础框架。
梯度方向直方图顾名思义就是计算图像中各像素的梯度方向,统计成为直方图作为特征表示目标。其大致有以下4步:
因为图像的采集环境、装置等因素,采集到的图像效果可能不是很好,所以需要对采集到的图像进行预处理。其中包括:将图像灰度化和 Gamma 校正。使用 Gamma 校正法对输入图像进行颜色空间的标准化的目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰。
在HOG特征提取的过程中,梯度计算采用简单的水平边缘算子 [-1,0,1] 和垂直边缘算子 [-1,0,1]^T。通过与图像进行卷积操作来获得梯度信息。图像中某像素点 (x,y) 的梯度可以用如下公式计算:
G x ( x , y ) = H ( x + 1 , y ) − H ( x − 1 , y ) G y ( x , y ) = H ( x , y + 1 ) − H ( x , y − 1 ) G_x(x,y) = H(x+1,y)-H(x-1,y) \\ G_y(x,y) = H(x,y+1)-H(x,y-1) Gx(x,y)=H(x+1,y)−H(x−1,y)Gy(x,y)=H(x,y+1)−H(x,y−1)
G ( x , y ) = G x ( x , y ) 2 + G y ( x , y ) 2 G(x,y) = \sqrt{G_x(x,y)^2+G_y(x,y)^2} G(x,y)=Gx(x,y)2+Gy(x,y)2
θ ( x , y ) = a r c t a n G y ( x , y ) G x ( x , y ) \theta (x,y) = arctan\frac{G_y(x,y)}{G_x(x,y)} θ(x,y)=arctanGx(x,y)Gy(x,y)
公式中 x 表示水平方向,y 表示竖直方向,G 表示梯度的大小, θ \theta θ 表示梯度的方向。
这一步的目的是为局部图像区域提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性。将图像分成若干个大小相同的单元(cell),作者原文文将每个单元设置成 8x8 像素。原文将梯度方向每 20 度作为一个区间,平均分为 9 个区间(bin)(因为 tan 的周期为 π \pi π,所以分成 9 份),如下图所示:
在每个单元格中,以每个像素点处的梯度大小作为权值统计梯度方向区间的直方图。每个区间分别对应一定的角度范围,9 个区间即为直方图的横轴,而这些角度范围内所对应的梯度的累加值即为直方图的纵轴。
像素点、单元和区块之间的关系如下图所示。
将小的单元(cell)合并成大的区块(block),每个块内归一化梯度直方图即可得到该块的 HOG 特征。这么做是因为局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。一个块内所有单元的纵轴值串联起来归一化后得到的向量被称作该块 HOG 描述子。图像中所有块的 HOG 描述子串联起来即得到该图像的 HOG 特征向量。原文一个区块设置成 2x2 单元。
比如 INRIA 数据集中图像剪裁后的大小为 64x128,故每张图像共有 8x16 的单元(cell),每个单元(cell)有一个 9 维的特征向量,把一个块内的特征向量串联起来,所以每个区块(block)是 (2x2)x9=36 维,用块对样本图像进行扫描,扫描步长为一个单元(区块可以重叠),最后将所有块的特征串联起来,所以每张图像的HOG特征维度为:36x7x15=3780 。
在数据集 INRIA 中选择一个图像,将其剪裁为大小 64x128,按照上述 HOG 参数进行 HOG 可视化,效果如下:
可视化时将整个图像作为一个 Block 来使用,即 HOG 可视化图像展示的是图像中每个 cell 的梯度直方图,其中每条线的方向代表着这个单元内每个像素点的梯度方向。在图中可以发现,直方图的主要方向捕获了这个人的外形,尤其在躯干和腿。