HOG (Histogram of oriented gradient)特征是法国研究人员Dalal在2005年CVPR上提出的一种实现人体目标检测的图像描述方法,该特征通过计算和统计图像局部区域的梯度方向直方图来构成特征。其优点是可以对几何和光学的形变保持很好的不变形,换句话说,对环境的变化具有很强的鲁棒性。
该特征的主要思想是:图像中局部目标的表象和性状能够被梯度或边缘的方向密度很好的描述本(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。在实际操作中,将图像分为小的细胞单元(cells),每个细胞单元计算一个梯度方向(或边缘方向)直方图。为了对光照和阴影有更好的不变性,需要对直方图进行对比度归一化,可以通过将细胞单元组成更大的块(blocks)并归一化块内的所有细胞单元来实现。我们将归一化的块描述符叫做HOG描述子。将检测窗口中的所有块的HOG描述子组合起来就形成了最终的特征向量
下面我们来介绍HOG特征的提取过程:
1、灰度化,因为Hog特征提取的是纹理特征,颜色信息不起作用,所以现将彩色图转为灰度图;
2、归一化,为了提高检测器对光照等干扰因素的鲁棒性,需要对图像进行Gamma校正,以完成对整个图像的归一化,目的是调节图像的对比度,降低局部光照和阴影所造成的影响,同时也可以降低噪音的干扰;(当r取1/2时,像素的取值范围就从0~255变换到0~15.97)
Gamma校正的映射公式,一般r取1/23、计算图像像素的梯度:根据下面的公式计算每个像素的水平方向和竖直方向的梯度,并计算每个像素位置的梯度大小和方向。图像在像素点(x,y)处的水平方向和垂直方向的梯度为:
Gx(x,y) 和Gy(x,y) 分别表示当前像素点(x,y)处的水平方向和垂直方向梯度值接下来我们计算像素点(x,y)处的梯度幅值和梯度方向:
梯度幅值和梯度方向4、统计细胞单元(Cell)的梯度方向直方图:将图像划分成小的Cell,将梯度方向映射到180度的范围内,将像素的梯度幅值作为权值进行投影,用梯度方向决定向哪一维进行投影,假如该像素的梯度方向为20度,梯度幅值为10,那么直方图的第二维就加10。下图是一个细胞单元内的方向梯度直方图,角度分辨率是在180度的范围内,以20度等分,即一个细胞单元的HOG特征是一个9维的向量。
一个细胞单元的梯度方向直方图5、统计块(Block)的梯度方向直方图:统计每个细胞单元内的梯度直方图,形成每个细胞单元的描述子,由cell组成更大的描述子,称为块,将一个块内四个cell的特征向量串联起来就构成了该块的梯度方向直方图,按照一个细胞单元是9维的Hog特征,则一个块的Hog特征为4x9=36维。由于局部光照的变化,以及前景背景对比度的变化,使得梯度强度的变化范围非常大,这就需要对梯度做局部对比度归一化。这里的策略是针对每个块进行对比度归一化,一般使用L2-norm。
一般采用的归一化函数6、统计窗口(Window)的梯度方向直方图:只需要将窗口内所有块的Hog特征向量串联起来就得到了Window的Hog特征;
6、统计整幅图像的梯度方向直方图:一幅图像可以无重叠的划分为多个Window,这时将所有Window的特征向量串联起来就是整幅图像的Hog特征了,如果Window的大小和图像的大小相同,那么Window的Hog特征就是整幅图像的Hog特征,这也是最终分类使用的特征向量。大功告成!
下面就作为过来人,将自己当初对Hog的疑惑(但是真的感觉想不通 )和理解写一下:
1、Cell、Block、stride、细胞单元、块、步长、窗口、图像、Hog特证有什么联系?
其实Cell就是细胞单元,Block指的就是块,Stride是步长,为了方便理解,下面给出了窗口、块、细胞单元、步长的相互关系图。
图像、窗口、块、细胞单元、步长的关系可以看到4个相邻Cell就组成了一个Block(左上角所示),接下来Block在图像上按照一定stride(黄色箭头),按照从左至右、从上至下的顺序进行滑动对图像进行遍历,通过第4步的计算我们就可以得到一个Cell的方向梯度直方图了,那么将四个Cell的方向梯度直方图进行串联,就组成了一个Block的梯度方向直方图,接下来该Block对Window进行遍历,是不是就有许多新的Block了(不断地会有4个相邻的Cell组成新的Block),最后我们将所有Block的方向梯度直方图串联起来就是Window的Hog特征啦,一幅图像可以当作一个窗口,也可以无重叠的划分为多个不重叠的窗口,如果是这种情况,将所有Window的特征串联起来就是图像的Hog 特征了。记住我们最后得到的是一个行向量(列向量)。
2、Hog特征的维数计算、Block的数目?(为了方便说明,我们的图像尺寸等于Window尺寸)
特征参数关系图上图一张64X64大小的图像,因此Window尺寸就是64X64,Cell的大小是8X8,那么Block的尺寸就是16X16了,在这里Stride是8X8,也就是一个Cell。
Hog参数设置下面给出一个Window中Block的计算公式:
块的计算公式因此水平方向块的数目为(64-16)/8+1=7,因此经过一次水平方向扫描会得到7个Block,竖直方向同理,因此我们可以得到7X7=49个Block,因此Window(图像)的特征为49X36=1764。(大家先理解这个过程就好了,不要把理解和编程实现一次性思考)!
3、为什么要先将图像划分成Cell,再将Cell组成更大的块?
这里的Cell相当于局部特征提取,Block块是几个Cell的组合,是比Cell更大的局部特征,事实上,块之间是有重叠的,也就是说,每个细胞单元的直方图都会被多次用于最终的描述子的计算。相互重叠是为了区分更细的局部特征,最后由于局部光照和背景的变化,再对块内的特征进行归一化。此方法看起来有冗余,但可以显著的提升性能。实验表明:小尺度梯度,精细的方向采样,相对粗糙的空间采样,和重叠描述子块中高质量的局部对比度归一化都对好的检测效果至关重要。
下面是几篇对于Hog理解写的很好的博文。
网友评论