人工特征之SIFT和HOG


计算机视觉相关的任务都需要先提取特征,然后基于所提取的特征做分类、分割、视觉问答等任务。现在主流的提取特征的方法,都是采用神经网络自动提取对任务起作用的特征,使用人工设计的特征已经成为过去时了。然而,笔者认为,对于每一个算法,找准它的细分领域,还是能够发光发热的,拿人工特征来说,比如当前任务为去除训练集中的相似图片,总不至于去收集一批新的数据,然后人工标注、训练模型等等步骤吧,所以,还是有必要了解一下传统的人工特征的。

1 SIFT(局部特征)

SIFT算法,全称为“Scale Invariant Feature Transform”,它可以用于检测图像中显著的、稳定的特征点,然后基于检测出的像素点所在的局部邻域,生成多维特征,该多维特征代表了对当前特征点的描述。

1.1 特征点检测

二维高斯函数定义如下,其中,σ\sigma表示标准差,
人工特征之SIFT和HOG
由信号处理相关知识可知,将图像函数与高斯函数卷积等同于将图像的频谱与高斯函数的傅里叶变换相乘,因为高斯函数的傅立叶变换仍然是高斯函数,因此这等同于对源图像进行了低通滤波,即平滑效果,而且,σ\sigma 值越大,滤波后的图像越模糊。
人工特征之SIFT和HOG
其中,对octave的解释可以参见如下一段话,

“In SIFT, an octave is the set of images generated by progressively blurring out an image. Scale level 5 means each octave will consist of 5 progressively blurred images.”

在得到DOG图像后,对于每一个octave的一组图像,查找所有的极值点,以下图为例,该极值点像素值大于局部8领域点和上下两个Scale的像素点,也就是说,定义一个极值点时,需要将当前像素点同9*2+8=26个像素值做比较。
人工特征之SIFT和HOG
在对所有的octave都执行上面的操作后,会得到很多的特征点,值得一提的是,这里空间尺寸较小的octave的特征点,需要映射到原图像上的对应坐标。

1.2 特征点描述

对于每一个特征点,选取其16×1616\times16 的局部邻域,将该局部邻域划分成4×4=164\times4=16 个sub-blocks,对于每一个sub-block,绘制其方向直方图(横坐标为梯度方向索引,纵坐标为当前梯度方向的像素点个数),这里选取了8个梯度方向,所以每一个sub-block有8个特征值,当前特征点对应的总的特征值维度为816=1288*16=128,也即,该128维特征向量作为当前特征点的描述。

1.3 特征点匹配

对于两幅图像A和B,为了使用特征点匹配验证是否为相同图,需要经过如下步骤,

(1)分别得到图像A和B对应的特征点集合S1S_{1}S2S_{2}

(2)对于集合S1S_{1}中的每一个特征点,分别找到S2S_{2}中对应的最近邻特征点,可以用欧式距离作为度量标准,若小于阈值,则表明当前特征点匹配成功,否则匹配失败;

(3)若集合S1S_{1}中匹配成功个数大于指定阈值,则表明图像A近似为图像B的一部分,判定为相同图片;
人工特征之SIFT和HOG

2 HOG(全局特征)

HOG特征,全称为“Histogram of oriented gradients”,在深度学习出现之前,它和svm分类器级联使用,用于行人检测任务,在当时取得了较好的效果。

2.1 特征描述子

特征描述子表征了图像块或者整幅图像的重要信息,当先对图像做金字塔分解,然后做滑动窗扫描和分类器时,便可实现简单的目标检测任务,这里要讲的HOG特征便是众多特征描述子之一。

2.2 HOG特征提取步骤

(1)预处理。选定图像区域做resize,比如缩放成 64x128大小;

(2)按照如下步骤,计算每个像素点的梯度;

​ a) 分别计算当前像素点水平和垂直方向的梯度,滤波器算子分别如下,
人工特征之SIFT和HOG
​ b) 分别使用如下公式,计算当前像素点的梯度的幅值和方向,
人工特征之SIFT和HOG
(3)将图像划分成不重叠的小的cells,比如每个cell包含了8x8的像素块,也即cell的步长为8;

(4)对于每一个cell,因为每一个像素的梯度包含两个值(magnitude和direction),所以总计8x8x2=128个特征值,使用这128个特征值绘制梯度方向直方图,具体步骤如下,

​ a) 选定9个角度值,0、20、40、60、、、160;

​ b) 将每个(g,θ)(g, \theta) 对划分到上面的9个角度值上,比如(10, 2),可以把0度和20度的直方图值分别增加2;

(5)经过步骤(4)后,当前cell的特征描述子为一个9维向量;

(6)选定2x2的cells作为一个block,所以该block包含了4个cells,相邻的block有重叠,也即步长为8,将每个cell的特征描述子进行拼接,从而得到一个9x4=36维向量,然后对该36维向量做标准化操作;

(7)图像中总的blocks个数为7x15=105,因此concate之后总的特征向量维度为36*105=3780;

(8)将该3780维的特征向量作为分类器的输入。




参考资料:

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html

https://courses.cs.washington.edu/courses/cse576/11sp/notes/SIFT_white2011.pdf

https://www.learnopencv.com/histogram-of-oriented-gradients/