传统机器学习算法:基于手工特征
一、传统机器学习分类算法流程
1.区域选择:使用不同大小和位置的“滑动窗口”在图像上遍历,产生大量候选区域(这种方法简单但效率低下,因为会产生非常多的冗余窗口)。
2.特征提取:对每个候选窗口,提取手工设计的特征(瓶颈)。
3.分类:将提取的特征送入训练好的分类器,判断该区域是否包含特定目标。
二、代表性的手工特征
1.HOG方向梯度直方图
- HOG 的核心非常直观,物体的外观和形状可以被其局部区域的梯度方向或边缘方向所很好地描述。简单来说,它不关心颜色的绝对值,而是关心图像中像素值变化的方向和强度,也就是边缘。这些边缘信息共同勾勒出了物体的轮廓。通过计算和统计图像局部区域的梯度方向直方图来构成特征。它对光照变化和小量的偏移不敏感,非常适合于描述物体的轮廓形状。
- 处理流程:
- 第1步:图像预处理(可选):灰度化通常先将彩色图像转换为灰度图像。因为我们主要关心梯度(边缘),颜色信息在此并非必需。Gamma校正对图像进行一个非线性变换,用于调节图像的对比度,可以在一定程度上压制噪声和光照变化的影响。
- 第2步:计算每个像素的梯度和方向:对于灰度图像中的每一个像素点 (x, y):水平梯度 G_x,计算它在x方向(水平)上的变化率。通常使用简单的卷积核 [-1, 0, 1] 进行卷积。垂直梯度 G_y,计算它在y方向(垂直)上的变化率。通常使用卷积核 [-1, 0, 1]^T 进行卷积。然后,我们可以计算出该像素点的:梯度幅度(强度):Magnitude = √(G_x² + G_y²)这个值代表了该点边缘的“强弱”。梯度方向:Angle = arctan(G_y / G_x)。这个值代表了该点边缘的“方向”,范围通常在 0°~180°(因为一条线是没有正负之分的,例如 10° 和 190° 代表的是同一条线)。
- 第3步:将图像划分为“细胞单元”并计算细胞的方向梯度直方图(这是HOG最核心的一步)。划分细胞,将整个检测窗口(或图像)划分为若干个互不重叠的、小的连通区域,称为“细胞”。每个细胞通常很小,比如 8x8 像素。计算细胞直方图,对于这个 8x8 的细胞内的 64个像素,我们每个像素都有一个梯度幅度和方向。我们现在要为这个细胞生成一个“方向梯度直方图”。直方图区间,我们将 0°~180° 平均划分为若干个区间,通常是 9个区间,每个区间20°(即0-20°, 20-40°, …, 160-180°)。投票,遍历细胞内的每个像素,根据它的梯度方向,决定它应该贡献到哪个区间。而它的贡献值(投票权重) 就是它自身的梯度幅度。举例:一个像素的梯度方向是30°,梯度幅度是5。那么它就会给 20°~40° 这个区间加上5。这样,每个细胞就从一个 8x8 的像素块,变成了一个 9维的特征向量(因为这个直方图有9个区间)。
- 第4步:将细胞单元组合成“块”,进行块内归一化。仅仅有细胞的直方图还不够,因为局部光照变化和阴影仍然会对梯度强度产生很大影响。为了解决这个问题,HOG引入了“块”和“归一化”。组合成块,将相邻的若干个细胞(例如 2x2个细胞)组合成一个更大的区域,称为“块”。块与块之间是可以重叠的。块内归一化,将一个块内所有细胞的直方图向量连接起来,形成一个更长的向量(例如,2x2个细胞,每个细胞9维,则一个块的向量是 36 维)。然后,对这个长向量进行归一化处理(例如,使用L2范数归一化)。
- 第5步:生成最终的HOG特征向量。将图像中所有块的归一化后的向量全部连接起来,就形成了整个检测窗口的最终HOG特征描述符。这个向量的维度可能很高,但对于描述图像中的物体形状来说,它非常强大。
2.SIFT尺度不变特征变换。
- SIFT 的核心目标是解决早期特征描述符的几个致命弱点,从而实现一种对图像缩放、旋转、亮度变化,甚至视角变化( affine transformation) 都保持高度不变性的局部特征。简单来说,它希望在放大/缩小图片、旋转图片、改变图片亮度,甚至从侧面看物体时,依然能检测到并识别出同一个关键点。
- 处理流程:
- 第1步:尺度空间极值检测——在不同尺度下寻找候选关键点。为什么要尺度空间?一个物体在不同的观测尺度下(比如靠近看和远离看),会呈现出不同的细节。一个优秀的特征应该在多种尺度下都能被稳定地检测到。如何实现?构建高斯金字塔,对原始图像进行不同程度的高斯模糊(模拟不同尺度下的观测),并同时进行降采样(缩小图像尺寸),形成一个图像金字塔。这个金字塔在尺度(由模糊程度控制)和空间(由图像大小控制)两个维度上变化。构建高斯差分金字塔,为了高效地找到对尺度变化稳定的关键点区域,SIFT使用了高斯差分函数,即用相邻尺度的高斯模糊图像相减,得到一组 DOG 图像。寻找极值点,在 DOG 金字塔中,将每一个像素点与其在同一尺度的8个邻域点,以及其上下相邻尺度的各9个邻域点(共 8 + 9 + 9 = 26 个点)进行比较。如果该点的值是这26个点中的最大值或最小值,它就被标记为一个候选关键点。
- 第2步:关键点定位——精炼位置,去除不稳定点。上一步找到的候选关键点很多是位于边缘或对比度低的区域,这些点不稳定,容易受噪声影响。这一步需要对其进行筛选和精炼。精确定位,通过拟合三维二次函数来精确定义关键点的位置和尺度,达到亚像素精度。去除低对比度点,剔除那些对比度低(DOG 响应弱)的点,它们对噪声敏感。去除边缘响应点,位于图像边缘的点,虽然 DOG 响应很强,但沿着边缘方向非常不稳定,很容易发生微小的偏移。SIFT利用Hessian矩阵的主曲率来识别并剔除这些点。
- 第3步:方向分配——实现旋转不变性。为了让描述子对图像旋转具有不变性,我们需要为每个关键点指定一个主导方向。在以关键点为中心的邻域窗口内,计算所有像素的梯度幅值和方向。生成一个梯度方向直方图(36个区间,覆盖360°)。直方图的峰值代表了该关键点邻域内梯度的主方向,即被指定为该关键点的方向。如果存在另一个峰值达到主峰值80%能量的方向,则会为同一个关键点位置创建一个新的关键点(拥有这个辅助方向)。这有助于增强匹配的鲁棒性。
- 第4步:关键点描述子生成——生成“指纹”。这是最后一步,为每个具有位置、尺度和方向的关键点,生成一个独一无二的描述向量。旋转坐标轴,将坐标轴旋转到关键点的方向,以确保旋转不变性。划分区域,取关键点周围 16x16 的像素区域,并将其划分为 4x4 个子区域。计算子区域直方图,在每个 4x4 的子区域内,计算一个8个区间的梯度方向直方图(覆盖360°)。与HOG不同,这里的投票权重是梯度幅值,并乘以一个高斯权重函数(以关键点为中心,让靠近关键中心的像素贡献更大)。形成特征向量,4x4 个子区域,每个区域一个8维直方图,最终形成一个 4 * 4 * 8 = 128 维的特征向量。这就是SIFT描述子。归一化,最后对这个128维向量进行归一化,以进一步减弱光照变化的影响。
