我正在使用分类算法,该算法要求训练和测试中所有样本的特征向量的大小相同。
我也使用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
结果
有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
使用SIFT通常需要执行两个步骤。
1- 提取SIFT功能。这些点(函数的大小为NPx2(x,y)的第一个输出参数)是尺度不变的,理论上应该存在于同一个对象的每个不同图像中。这不完全正确。通常,每个帧(图像)的点都是唯一的。这些点由每个128个描述符(函数的第二个参数)描述。
2- 马赫点。每次计算不同图像的特征时,计算的点数都是不同的!其中很多应该与上一张图片中的点相同,但很多都是WON' T。您将获得新积分,旧点可能不再存在。这就是您应该执行功能匹配步骤,以链接不同图像中的这些点的原因。通常这是由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)
答案 1 :(得分:2)
您可以对图像应用密集的SIFT。这样您就可以更好地控制从哪里获得特征描述符。我还没有使用过vlfeat,但是看一下我看到的文档,它提取了一个功能来提取称为 vl_dsift 的密集SIFT功能。使用vl_sift,我发现有一种绕过检测器并使用&#39; 帧&#39;从您选择的点中提取描述符的方法。选项。无论哪种方式,您似乎都可以获得固定数量的描述符。
如果您使用的是相同尺寸的图像,则可以使用密集的SIFT或帧选项。您可以采用另一种方法,它称为bag-of-features model(类似于词袋模型),您可以在其中对从图像中提取的要素进行聚类,以生成代码字并将其提供给它们进入分类器。