今天介绍一种图像特征提取算法:HOG(Histogram of Gradient)方向梯度直方图
HOG+SVM广泛运用与行人检测,在CVPR2005这篇文章中,实施HOG算法一共有4个步骤。
1. 伽马/颜色标准化(Gamma/Colour Normalization)
第一步应对图像进行伽马矫正和颜色空间标准化的预处理,此步的目的是为了减少光照的影响。
颜色空间标准化中,Dalal等人的论文中分别使用了RGB,LAB和灰度等颜色空间对图像进行预处理,但对最终结果影响并不大,灰度图像有微弱优势,所以这里使用灰度图。
伽马矫正中,Dalal等人的论文使用了Square root gamma compression和Log compression,最终结果显示Square root gamma compression对检测有更好的表现。
对于不了解伽马矫正的同学,具体伽马矫正的知识可以参考我的这篇文章:https://blog.csdn.net/dx199771/article/details/111504446
对于一些具有大量颜色变化的图像,没有进行标准化的RGB图像也有不错的表现。
一般对图像进行预处理时为了去除噪点还会用到高斯平滑对图像进行模糊处理,但Dalal等人的论文中表示不做高斯平滑的检测效果最佳,这可能是因为HOG检测是基于边缘梯度的,对图像进行平滑处理会降低边缘信息的对比度,从而损失图像信息。
2. 梯度计算(Gradient Computation)
对于还不知道梯度是什么的同学可以参考这篇文章:(TODO)
HOG的第二部就是对输入图像的每个像素点位置进行水平方向和竖直方向的方向梯度计算,公式如下:
梯度共分为梯度方向和梯度幅值,上述公式中,为梯度方向,为梯度幅值。Deala等人的论文中对比不同微分算子进行梯度计算(包括1-D,3*3Sobel算子和2*2对角矩阵),最终得出[-1,0,1]算子效果最佳。
3.构建梯度直方图(Orientation Histograms Build)
HOG的第三部是构建梯度直方图:
这里首先要将图像分为n*n个cell。(比如150*150的图像分为25*25个cell,每个cell就是6*6像素)
统计每个cell的梯度直方图后就可以构建每个cell的描述子,这里每个8*8的cell里有128个数字(8*8*2这里的2代表梯度幅值和梯度方向)。
这样将每个cell中的数据分不到直方图中就可得到每个cell的描述子。如果不了解具体分布过程不要怕,这里将通俗的介绍一下:
我们一般将180度的区域分为9个子区域(bins),增量为20,如下图:每个区域有与其对应的角度(0-20度,20-40度,160-180度)。之后将每个cell中8*8个梯度按角度和幅值分布在每个子区域中。
例如:有一组梯度角度和幅值分别为:
梯度1 | 梯度2 | |
角度 | 35° | 85° |
幅值 | 80 | 20 |
那么构造出的方向直方图即为:
0° | 20° | 40° | 60° | 80° | 100° | ... | 180° |
- | 20 | 60 | - | 15 | 5 | ... | - |
这里梯度幅值如果在两个角度中间,例如35°,那这个梯度幅值将会根据与每个bin的距离相应的拆分大小。 35°离40°更近,则被分配更高权重。离20°更远则被分配更小权重。
梯度表示可以是横向的也可以是圆形的,如下图红车的梯度直方图可视表示(每一条线代表一个方向,线的长短代表幅值)
如果将每个cell的描述子可视化的表示,就如下图所示:可以看到,车头部分每个cell的梯度直方图很饱满,像一个炸开的烟花,这表明每个方向上的梯度幅值是平均的,而车门处则是类似横线的梯度直方图,这代表仅有几个方向梯度幅值较大。
4. 块归一化
由于光照变化等因素可能会干扰梯度的变化范围(光照比当前暗1/2,那么梯度幅值会减少一半)。作者还提出了一种块归一化方法:
块归一化利用累计空间连通的cells,合成更大的区域blocks(块)。这样将每个cell的特征串联就得到该block的特征(例如2*2的cells合称为一个block)。我们将归一化后的块称为HOG描述子。
HOG描述子在行人识别,人脸识别的领域带来了巨大的进步,opencv和skimage中有build-in的HOG方法,大家可以去试一试。
HOG的优缺点:
优点:
- HOG理解简单
- 有一定程度的平移旋转不变形
- 采用块归一化可以抑制光照颜色等影响
缺点:
- HOG描述子生成速度慢,不能达到实时检测的目的
- 遮挡问题难以解决
- 对噪点敏感