如何保证SIFT特征的一致性?

How to ensure consistency in SIFT features?

我正在使用一种分类算法,该算法要求训练和测试中所有样本的特征向量的大小相同。

我也要用SIFT特征提取器。这会导致问题,因为每个图像的特征向量都以不同大小的矩阵出现。我知道 SIFT 检测每个图像中的可变关键点,但是有没有办法确保 SIFT 特征的大小一致,这样我就不会得到 dimension mismatch 错误。

我已尝试 rootSIFT 作为解决方法:

[~, features] = vl_sift(single(images{i}));
        double_features = double(features);
        root_it = sqrt( double_features/sum(double_features) ); %root-sift
        feats{i} = root_it;

这为我提供了每个图像的一致 128 x 1 矢量,但它对我不起作用,因为现在每个矢量的大小都非常小,而且我得到了很多 NaN我的分类结果。

有什么办法可以解决吗?

使用 SIFT 通常需要执行 2 个步骤。

  1. 提取 SIFT 特征。这些点(第一个输出参数 函数的大小 NPx2 (x,y))是尺度不变的,应该在 理论存在于同一物体的每个不同图像中。这个 不完全正确。通常每个帧的点都是唯一的 (图片)。这些点分别由 128 个描述符描述(第二个 你函数的参数)。
  2. 匹配点数。每次计算不同图像的特征时,计算的点数都是不同的!其中很多应该与上一张图片中的点相同,但很多不会。您将获得新积分,而旧积分可能不再存在。这就是为什么您应该执行特征匹配步骤,以 link 不同图像中的那些点。通常这是通过 knn 匹配或 RANSAC 进行的。您可以 Google 如何执行此任务,并且会有大量示例。

在第二步之后,整组图像的点数应该是固定的(考虑到它们是同一物体的图像)。点的数量将明显小于每个单个图像中的点数(有时点数少 30 倍)。那就随心所欲吧!

匹配提示:http://www.vlfeat.org/matlab/vl_ubcmatch.html

更新:

您似乎在尝试训练某种 OCR。您可能需要为每个字符独立匹配 SIFT 特征。

如何使用vl_ubcmatch:

[~, features1] = vl_sift(I1);
[~, features2] = vl_sift(I2);

matches=vl_ubcmatch(features1,features2)

您可以对图像应用密集的 SIFT。通过这种方式,您可以更好地控制从何处获取功能描述符。我没有使用过 vlfeat,但是查看文档我发现有一个函数可以提取密集的 SIFT 特征,称为 vl_dsift。使用 vl_sift,我看到有一种方法可以绕过检测器并使用“frames”选项从您选择的点中提取描述符。无论哪种方式,您似乎都可以获得固定数量的描述符。

如果您使用相同大小的图像,密集的 SIFT 或框架选项都可以。您可以采用另一种方法,它称为 bag-of-features model(类似于词袋模型),您可以在其中对从图像中提取的特征进行聚类,以生成代码字并将它们提供给分类器。