SIFT
SIFT(Scale-Invariant Feature Transform,尺度不变特征变换) 由David Lowe于2004年发表,是尺度与旋转不变局部特征的里程碑式算法。它确立了检测器+描述子的模板,ORB、AKAZE、SuperPoint等算法至今仍沿用这一模板,并且在匹配精度上(例如在COLMAP式离线重建中)仍是黄金标准。
关键点检测:尺度空间中的斑点
SIFT检测的是斑点(blob)而不是角点,并且是跨尺度检测的,这样无论同一个世界结构在图像中显得大还是小,都能被找到。通过用不断增大的尺度 的高斯核对图像进行卷积来构建高斯尺度空间:
相邻尺度之间的**高斯差分(Difference of Gaussians, DoG)**以极低的代价近似尺度归一化的高斯拉普拉斯算子(一种斑点检测器):
尺度空间被组织成若干组(octave)(每组之间图像下采样2倍),每组内又有若干个尺度——这是一个图像金字塔,金字塔的每一层内又有多个模糊级别。
关键点是 在空间和尺度上的局部极值:每个采样点与其在 构成的 立方体内的26个邻居进行比较。候选点随后经过:
- 精细化到亚像素/亚尺度精度,通过在极值点周围拟合一个二次函数(对 做二阶泰勒展开)实现;
- 按对比度过滤—— 值较小的极值不稳定,会被剔除;
- 按边缘响应过滤——DoG在边缘方向上响应很强,而边缘上的定位很差。与Harris检测类似,通过对主曲率之比( 的 Hessian矩阵的特征值之比)设阈值,只保留斑点状、定位良好的点。
描述子:128维梯度直方图
- 方向赋值:在关键点邻域内构建梯度方向直方图(按梯度幅值和高斯窗口加权),主峰方向定义关键点的规范方向。所有描述子的测量都相对于该方向进行——这正是旋转不变性的来源。
- 描述子:关键点周围区域(在其检测到的尺度上)被划分为 的子区域网格;每个子区域累积一个8-bin的梯度方向直方图,得到一个 维的向量。该向量经过归一化(对较大分量做截断并重新归一化)以实现光照不变性。
匹配
SIFT描述子是浮点向量,用L2距离进行比较。用Lowe比率测试过滤模糊匹配:只有当 时才接受最近邻,其中 分别是到最近邻和次近邻的距离。对于大型数据库,近似最近邻结构(kd树、FLANN)替代了暴力搜索——SIFT的128维已接近kd树实用性的极限。
计算代价
SIFT精度很高但速度较慢——在CPU上,处理一张高分辨率图像大约需要一秒量级——这也是实时SLAM历史上转而采用FAST/ORB的原因,也是在线场景下需要SIFT级鲁棒性时会使用GPU实现或二值化替代方案的原因。
对SLAM的意义
- 尺度不变性在相机靠近或远离结构时至关重要——在固定尺度的角点方法失效的大幅深度变化情况下,匹配依然能够保持。
- SIFT的流程(尺度空间检测、方向赋值、梯度直方图描述子、比率测试匹配)是SLAM中所有特征系统的概念蓝图;ORB最好理解为它的一种实时近似。
- 离线建图与运动恢复结构(例如COLMAP)在追求最高匹配质量时依然默认使用SIFT;视觉位置识别历史上也是基于SIFT描述子构建词袋(bag-of-visual-words)词汇表的。