4

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

我也将使用 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分类结果得到了很多。

有没有办法解决这个问题?

4

2 回答 2

3

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

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

在第二步之后,您应该为整组图像拥有固定数量的点(考虑到它们是同一对象的图像)。点的数量将明显小于每张图像中的点数(有时点数少 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)
于 2015-02-20T15:21:58.293 回答
2

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

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

于 2015-02-21T02:27:24.550 回答