0

如果我走对了路,我希望有人能解释我。我正在尝试学习有关图像检索和 SVM 的知识,但这有点令人困惑。我将通过发布源代码来问我的问题。

首先,我有一个猫的数据集。对于每张“猫”图片,我使用 sift 算法 (vlfeat) 获得描述符。我将所有描述符(来自每张图片)放在一个列表中,并通过使用 k-means(我选择)找出集群(所有描述符k=3)尝试并绘制结果。

问题1:是否有“终端方式”来查看我是否选择了一个好的k?因为绘制包含 50 张猫图片的 128 维描述符集需要很长时间。

问题 2:我正在list.append(hstack((loc,des)))处理位置和描述符。这是正确的方法还是我应该只使用描述符?

def get_features(datas):
      list = []
      for data in datas:
        loc,des = vlfeat_module.vlf_create_desc(data,'tmp.sift')
        list.append(hstack((loc,des)))
      desc = numpy.vstack(list)
      center,_ = kmeans(desc, 3)
      return center

获得中心后,我制作了一个 3 x 128 维度描述符的 *.sparse 文件,如下所示:

1  1:333.756498151 2:241.935029943...
1  1:806.715774779 2:1134.68287451...
....

在猫图片的这个过程之后,我用“none-cat-pictures”重复这个过程,并得到一个看起来像这样的 *.sparse 文件:

0  1:101.905620535 2:250.9213760...
0  1:223.619957204 2:509.303625427...
...

我将两个 *.sparse 文件放在一起并开始使用 SVM 进行训练(我想我开始了 ^^)

X_train, y_train = load_svmlight_file("./svm_files/cats_nonecats.sparse")
clf = svm.NuSVC(gamma=0.07,verbose=True)
clf.fit(X_train,y_train)
pred = clf.predict(X_train)
accuracy_score(y_train, pred)

我得到这个结果:

[LibSVM]*
optimization finished, #iter = 4
C = 2.000000
obj = 5.000000, rho = 0.000000
nSV = 10, nBSV = 0
Total nSV = 10
 NuSVC(cache_size=200, coef0=0.0, degree=3, gamma=0.07, kernel=rbf,
   max_iter=-1, nu=0.5, probability=False, shrinking=True, tol=0.001,
   verbose=True)
1.0

我认为这是不对的,所以也许有人可以解释我的错误。下一个问题:这是“训练”吗?还是我重复了某件事,例如 10 次?分类器现在有可能识别猫吗?

谢谢你的一些答案。

问候,

琳达

编辑

好吧,我会尝试解释我现在做了什么。我希望它现在是正确的。

1. split my data into test and training data
2. get all destrictors from training / test data
3. create centers with (k-means) from training data
4. get all histogram-vectors from descriptors of the training data
5. create a sparse file from the histogramm vector
6. feed this sparse file to the svm

一些错误?

编辑第二部分:

我已经更新了图片的数量......但我还有一些问题。“np.bincount + 除以总和”是什么意思?如果我有一个像 [120, 0, 300, 80] 这样的直方图,那么我必须将此值除以一张图片的描述符之和吗?可能是这样?[120/500、0/500、300/500。80/500] ? 有没有一种好方法来计算 k-means 的 k?因为 500 之间的 100 可能是猫的正确 k 但是如果我想学习我的分类器来识别狗怎么办?k会是另一个?!

谢谢

4

1 回答 1

2

基本上你做了正确的事,但有一些小错误:首先,对于任何机器学习方法,你应该在做任何其他事情之前将你的数据分成训练和测试。这是了解您是否成功构建猫分类器的唯一方法。你在训练集上测试了你的方法,得到了完美的结果——这什么也没告诉你。

其次,对于词袋方法,您不使用聚类中心作为图像的描述符。对于每个图像,您可以查看每个簇出现的频率(通过应用predict到一个图像中的所有描述符),然后构建它的直方图(即 np.bincount + 除以总和)。这为每个图像提供了长度为 n_clusters 的描述符(在您的情况下为三个)。这些你提供给分类器。

一些不太重要的评论:顺便说一句,根据你的照片的多样性,以及底片的样子,你可能有很多到很少的例子。尝试至少 50-100。此外,您的中心数量也很少。使用三个,您将获得描述此图像的 3d 矢量。这仍然不太可能包含足够的信息来区分猫和非猫。尝试 100-500。

我真的应该写一篇关于如何做到这一点的博客文章......希望很快......顺便说一句,如果你的猫图片只包含一只居中的猫而没有其他东西,你可能想尝试 hog 而不是 sift。

干杯,安迪

于 2013-07-20T17:21:03.123 回答