前言
本文对计算机视觉传统方法中的一些特征提取方法进行了总结,主要包括有:SIFT(尺度不变特征变换)、HOG(方向梯度直方图)、SURF、ORB、LBP、HAAR
来源:机器学习AI算法工程
目录
[1] SIFT(尺度不变特征变换)
[2] HOG(方向梯度直方图)
[3] SIFT和HOG的比较
[4] SIFT/HOG与神经网络特征提取的比较
[5] 其他传统特征提取的方法(SURF、ORB、LBP、HAAR)
先对几个概念和问题做一个解释:
-
识别物体,最关键的因素是梯度(SIFT/HOG),梯度意味着边缘,这是最本质的部分,而计算梯度,自然就用到灰度图像了,可以把灰度理解为图像的强度。
-
颜色,易受光照影响,难以提供关键信息,故将图像进行灰度化,同时也可以加快特征提取的速度。
平面上任意两条线,经过仿射变换后,仍保持原来的状态(比如平行的线还是平行,相交的线夹角不变等)
局部特征从总体上说是图像或在视觉领域中一些有别于其周围的地方;局部特征通常是描述一块区域,使其能具有高可区分度;局部特征的好坏直接会决定着后面分类、识别是否会得到一个好的结果。
局部特征应该具有的特点:
可重复性、可区分性、准确性、有效性(特征的数量、特征提取的效率)、鲁棒性(稳定性、不变性)。
1、SIFT(尺度不变特征变换)
1.1 SIFT特征提取的实质
在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出、不会因光照、仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
1.2 SIFT特征提取的方法
1. 构建DOG尺度空间:
模拟图像数据的多尺度特征,大尺度抓住概貌特征,小尺度注重细节特征。通过构建高斯金字塔(每一层用不同的参数σ做高斯模糊(加权)),保证图像在任何尺度都能有对应的特征点,即保证
尺度不变性
。
2. 关键点搜索和定位:
确定是否为关键点,需要将该点与同尺度空间不同σ值的图像中的相邻点比较,如果该点为max或min,则为一个特征点。找到所有特征点后,要去除低对比度和不稳定的边缘效应的点,留下具有代表性的关键点(比如,正方形旋转后变为菱形,如果用边缘做识别,4条边就完全不一样,就会错误;如果用角点识别,则稳定一些)。去除这些点的好处是
增强匹配的抗噪能力和稳定性
。最后,对离散的点做曲线拟合,得到精确的关键点的位置和尺度信息。
3. 方向赋值:
为了实现
旋转不变性
,需要根据检测到的关键点的局部图像结构为特征点赋值。具体做法是用梯度方向直方图。在计算直方图时,每个加入直方图的采样点都使用圆形高斯函数进行加权处理,也就是进行高斯平滑。这主要是因为SIFT算法只考虑了尺度和旋转不变形,没有考虑
仿射不变性
。通过高斯平滑,可以使关键点附近的梯度幅值有较大权重,从而部分弥补没考虑仿射不变形产生的特征点不稳定。注意,一个关键点可能具有多个关键方向,这
有利于增强图像匹配的鲁棒性
。
4. 关键点描述子的生成:
关键点描述子不但包括关键点,还包括关键点周围对其有贡献的像素点。这样可使关键点
有更多的不变特性,提高目标匹配效率
。在描述子采样区域时,需要考虑旋转后进行双线性插值,防止因旋转图像出现白点。同时,为了保证
旋转不变性
,要以特征点为中心,在附近领域内旋转θ角,然后计算采样区域的梯度直方图,形成n维SIFT特征矢量(如128-SIFT)。最后,为了
去除光照变化的影响
,需要对特征矢量进行归一化处理。
1.3 SIFT特征提取的优点
-
SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
-
独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
-
多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
-
高速性,
经优化的
SIFT匹配算法甚至可以达到实时的要求;
-
可扩展性,可以很方便的与其他形式的特征向量进行联合;
-
需要较少的经验主义知识,易于开发。
1.4 SIFT特征提取的缺点
-
实时性不高,因为要不断地要进行下采样和插值等操作;
-
有时特征点较少(比如模糊图像);
-
对边缘光滑的目标无法准确提取特征(比如边缘平滑的图像,检测出的特征点过少,对圆更是无能为力)。
1.5 SIFT特征提取可以解决的问题:
目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:
-
目标的旋转、缩放、平移(RST)
-
图像仿射/投影变换(视点viewpoint)
-
光照影响(illumination)
-
目标遮挡(occlusion)
-
杂物场景(clutter)
-
噪声
近来不断有人改进,其中最著名的有 SURF(计算量小,运算速度快,提取的特征点几乎与SIFT相同)和 CSIFT(彩色尺度特征不变变换,顾名思义,可以解决基于彩色图像的SIFT问题)。
2、HOG(方向梯度直方图)
2.1 HOG特征提取的实质
通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。
2.2 HOG特征提取的方法
-
灰度化;
-
采用Gamma校正法对输入图像进行颜色空间的标准化(归一化),目的是
调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰
;
-
计算图像每个像素的梯度(包括大小和方向),主要是为了捕获轮廓信息,同时
进一步弱化光照的干扰
;
-
将图像划分成小cells(例如6*6像素/cell);
-
统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;
-
将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。
-
将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。
2.3 HOG特征提取特点
-
由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。
-
在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。
3、SIFT和HOG的比较
共同点:
都是基于图像中梯度方向直方图的特征提取方法
不同点:
SIFT 特征通常与使用SIFT检测器得到的兴趣点一起使用。这些兴趣点与一个特定的方向和尺度相关联。通常是在对一个图像中的方形区域通过相应的方向和尺度变换后,再计算该区域的SIFT特征。
HOG特征的单元大小较小,故可以保留一定的空间分辨率,同时归一化操作使该特征对局部对比度变化不敏感。
结合SIFT和HOG方法,可以发现SIFT对于复杂环境下物体的特征提取具有良好的特性;而HOG对于刚性物体的特征提取具有良好的特性。
笔者曾做过一个自然场景分类的实验,发现SIFT的准确率比HOG高,而如果检测像人这种刚性的object,HOG的表现要比SIFT好。
4、SIFT/HOG与神经网络特征提取的比较
众所周知,随着深度学习的发展,通过神经网络提取特征得到了广泛的应用,那么,神经网络提取的特征与传统的SIFT/HOG等特征提取方法有什么不同呢?
4.1 神经网络提取到的特征
我们知道,对于一副图像,像素级的特征没有任何价值,而如果特征是一个具有结构性(或者说有含义)的时候,比如摩托车是否具有车把手,是否具有车轮,就很容易把摩托车和非摩托车区分,学习算法才能发挥作用。
早期,两个科学家Bruno Olshausen和 David Field通过实验研究了这个问题,发现一个复杂图像往往由一些基本结构组成。比如下图:一个图可通过用64种正交的edges(可以理解成正交的基本结构)来线性表示。比如样例的x可以用1-64个edges中的三个按照0.8,0.3,0.5的权重调和而成。而其他基本edges没有贡献,均为0 。
这就是神经网络每层提取到的特征。由于是通过神经网络自动学习到了,因此也是无监督的特征学习过程(Unsupervised Feature Learning) 。直观上说,就是找到make sense的小patch再将其进行combine,就得到了上一层的feature,递归地向上learning feature。在不同object上做training是,所得的edge basis 是非常相似的,但object parts和models 就会completely different了。
4.2 传统特征提取方法与神经网络特征提取的比较
观点1:
传统特征提取方法的研究过程和思路是非常有用的,因为这些方法具有较强的可解释性,它们对设计机器学习方法解决此类问题提供启发和类比。有部分人认为(也有部分人反对)现有的卷积神经网络与这些特征提取方法有一定类似性,因为每个滤波权重实际上是一个线性的识别模式,与这些特征提取过程的边界与梯度检测类似。同时,池化(Pooling)的作用是统筹一个区域的信息,这与这些特征提取后进行的特征整合(如直方图等)类似。通过实验发现卷积网络开始几层实际上确实是在做边缘和梯度检测。不过事实上卷积网络发明的时候,还没有这些特征提取方法。
观点2:
深度学习的数据需求量大对于视觉来说是个伪命题。许多研究成果已经表明深度学习训练得到的模型具有很强的迁移能力,因此在大数据集上训练完成的模型只要拿过来在小数据集上用就可以,不需要完全重新训练。这种方式在小数据集上的结果往往也比传统方法好。
观点3:
还是需要重新训练的,只能说大数据集训练好的模型提供了一个比较好的参数初始化。而且卷积前几层提取特征仅仅是对分类问题是对的,但是对于一些dense prediction还是不一样,毕竟提取特征不一定有用,还是task dependent。
观点4:
深度学习是一种自学习的特征表达方法,比SIFT/HOG这些依靠先验知识设计的feature的表达效果高。早在13年大家都发现神经网络的最后一层的local特征和SIFT性质差不多,但是表达能力强太多。SIFT能做的事情CNN都能做,表达效果也强,那深度学习取代SIFT是迟早的事情(或者说已经发生的事情)。深度神经网络识别率的提高不需要建立在需求大量训练样本的基础上,拿pre-train好的模型直接用就可以了。在一些没有训练样本的应用(图像分割(image stithing)/ 立体匹配(stereo mathing)) ,可以把卷积层的activation提取出来做stitching的local feature(感觉是一个可以探索的方向)。未来还有SIFT/SURF这种固定特征提取算法的生存空间吗?除非是嵌入式这种计算资源极端受限的情况,但是现在大家都在试着implement CNN FPGA甚至ASIC了。
观点5:
2016年ECCV上举办的一个local feature的工作会,发现在核心匹配问题上,CNN并没有什么突破性的进展。在Oxford大学的VGG组提供的Hpatch数据集上,发现rootsiftpca效果最好,如图:
那么提出两个问题:(1)现在流行的特征学习方法siamese或triplet等结构是否缺失了什么?(2)虽然CNN可以挖掘patch里面包含的信息并建立对于复杂几何和光照变化的不变性,但是这种学习到的不变性是否过度依赖于数据而无法有效泛化到真实匹配场景中所遇到的影像之间的复杂变化呢?
5、其他传统特征提取的方法(SURF、ORB、LBP、HAAR)
SURF、ORB、LBP可以参考文章:
图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现
https://link.jianshu.co
m/?t=http://lib.csdn.net/article/opencv/41913
5.1 SURF