1. 论文简介
论文名:Histograms of Oriented Gradients for Human Detection
论文地址 :
HOG
论文作者:Navneet Dalal and Bill Triggs
论文时间:2015年
说明:
HOG (Histogram of oriented gradient)是2005年CVPR上,由法国国家计算机科学及自动控制研究所的Dalal等人提出的一种用于人体检测的方向梯度直方图(特征描述子),通过统计图像局部区域的梯度方向直方图来形成图像特征,再结合SVM分类器来实现人体检测。HOG对几何和光学形变具有较好的鲁棒性。
特征描述子可以说是图像的表示方式,通过抽取图像中的有用信息,丢弃图像中的额外信息从而简化图像的表示。通常情况下,特征描述子可以将一张3通道的彩色图片转化为一个特征向量。
在HOG特征描述子中,梯度方向的分布,也就是梯度方向的直方图被当做特征。通常来说,图像中边缘、拐角的梯度幅值会比较大,也会包含更多的关于目标形状的相关信息。
2.HOG方法基本流程
原论文中给出的完整的流程
使用HOG方式获取特征的流程
2.1 检测窗口
作者在论文中指出,检测窗口大小为:64×128(后续出现的图像主要都是指这个检测,除了图像预处理阶段的图像指的是原图),会包含人体四周大约16个像素点,实验显示,16是一个比较合适的数字,太大或者太小都会影响最终检测结果。
2.2 图像预处理
这一步其实是对图片做一些预处理操作:对图像进行裁剪,缩放到固定大小。
作者在论文中指出,他们使用了不同色彩空间(灰度图、RGB、LAB)的图片,并进行了伽马矫正,但是效果并不明显,因此颜色和伽马校正可做可不做。可能是因为后续也进行了normalization,从而有差不多的效果。
关于伽马校正:可以调节图像对比度,减少光照对图像的影响(包括光照不均和局部阴影),使过曝或者欠曝的图像恢复正常,更接近人眼看到的图像。
2.2 计算梯度
对于灰度图,计算每个像素点的梯度;对于彩色图像,计算每个通道的梯度,取梯度值最大的作为该像素的梯度。
作者在论文总提到,他们设计了不同的filter(论文中也称为derivative mask)加上Gaussian平滑来获取每个像素点的梯度,发现最简单的filter效果最好。
这些不同的filter或者模板有:[-1,1],[-1,0,1],[1,-8,0,8,1],sobel,
其中,[-1,0,1]的最终效果最好。
于是可以使用
和
分别计算每个像素点的水平梯度(x方向)和垂直梯度(y方向)。
然后,再计算每一个像素点梯度的幅值和方向:
对于每一个像素点来说,梯度都有大小和方向。x方向梯度会强化垂直边缘特征,y方向梯度图会强化水平边缘特征。这就使得有用的特征(轮廓)得到保留,无关不重要的信息被去除。
2.3 计算每个cell的梯度方向加权累积得到直方图
首先,把图像划分为多个8×8的cell,并计算每个cell的梯度直方图。(这个cell的尺寸也可以是其他值,根据具体的特征而定。)
一个8 x 8的cell,在计算梯度后,会得到8 x 8 x 2=128个值,其中,64个梯度幅值,64个梯度方向值(角度大小)。值的数量还是比较大的(尤其一张图片有多个cell),现在将它转换为划分了9个bin的梯度直方图这一特征,使得特征的表达会更紧凑,也使得当前特征的鲁棒性更高。(一个像素点的梯度信息可能包含造成,一个cell的梯度信息会更稳定。)
关于cell的大小:HOG用来做人形检测,8×8的cell大小对于从64×128的图片中抽取一些重要特征已经是足够了。如果用来检测其他目标,那cell的大小可以根据需要调整。
接下来,来看一下具体的操作:
以上图片为例,左边为一张包含了人的图像,大小为64×128,已经划分了多个8×8的cell;中间图为其中一个8×8的cell,每个像素点都绘制了梯度,箭头为方向,长度为幅值;右上图为该cell的梯度幅值,右下图为该cell的梯度方向值。
此处注意,梯度角度的取值范围为0°~180°,作者在论文中提到,0°~180°(“无符号”梯度)的效果比0°~360°的效果更好。此时,两个相反的方向被认为是相同的,也就是说,若计算出来的梯度方向是270°,那实际上用90°表示。
然后,将180°分成9个bin,每20°为一个bin,这个可以认为是横轴,我们要做的就是将这8×8大小的cell中的像素梯度值根据角度分到这9个组中并累加起来,这就是纵轴,这里会使用双线性插值的方式将梯度幅值分到相邻两个bin中,最后的直方图则是由这9个值组成。
继续以上图为例,
图中蓝圈所在的像素,梯度方向为80°,梯度幅值为2,在直方图80°所在的bin就累加2;红圈所在的像素,梯度方向为10°,在0°和20°之间,梯度幅值为4,那么这个梯度值就会按比例累加到0°和20°所在的bin,所以直方图中,0°所在的bin和20°所在的bin各累加了2。
还有一点需要注意,如果某个像素的梯度方向在160°和180°之间,那么这个像素的梯度幅值会按比例累加到0°和160°所在的bin中。
将这 8×8 的cell中所有像素的梯度幅值都累加到各自角度所在的bin中后,就形成了如下直方图。
可以看到,直方图中0°和180°所在bin有比较大的权重,说明大多数像素点的梯度向上或者向下,也就是说这个cell大概率是个横向边缘。
那么现在,我们就可以用这个梯度直方图(9个值)来代替原先的8x8x2个值。
2.4 对每个block中的cell的梯度直方图进行归一化
到此,已经对每个cell都创建了一个直方图。
HOG方法中,作者进一步选取2×2大小的窗口将2×2个cell作为一组,称为block。我们已经知道,每个cell会产生9个值,2×2个cell则会产生36个值。然后将这个2×2大小的窗口在图像上滑动得到不同的有重叠(overlapping)的block。
因为图像的梯度对光照比较敏感,例如,可以将图片的像素值除以2,此时图片会变得更暗,梯度幅值也会变成原来的一半,直方图中的值也将变成原来的一半。而我们希望特征描述子不会受到光照的影响,于是就需要将直方图进行“归一化”。也就是,将每个block中的4个cell的值拼接在一起得到36个值,然后再进行归一化。作者验证了不同的归一化方法的效果,发现L2-Hys、L2-Norm、L1-sqrt效果差不多,L1-Norm效果有降低。
以L2-Norm为例:采用
来做归一化,也就是,首先计算这36个值的平方和,然后用36个值分别处以这个结果。
避免分母为0。
经过归一化的这些block就称为HOG特征描述子。
2.5 将检测窗口中所有block的HOG特征拼接得到最终的特征向量
每次滑动,一个block就会得到一个包含36个值的特征向量。在检测窗口大小为64×128的情况下,横向有8个cell,纵向有16个cell,每个block包含2×2=4的cell,每次滑动的stride=1cell,那么横向有7个block,纵向有15个block,一共有7×15=105个block。
最后将这105个block合并,就得到了整个检测窗口的特征描述,长度为36×105=3780。
3.分类
最后,作者使用SVM来做分类。
参考:
Histogram of Oriented Gradients explained using OpenCV (learnopencv.com)