SVM,测试,学习,使用筛选和k-means / ward进行分类

时间:2013-07-20 12:53:42

标签: python svm scikit-learn sift

我希望有人可以解释我,如果我是在正确的方式。我正在尝试学习有关图像检索和SVM的知识,但这只是有点令人困惑。我会通过发布源代码来提出我的问题。

首先我有一个猫的数据集。对于每个“cat”图片,我使用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...
....

使用cat图片执行此过程后,我使用“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均值k的好方法吗?因为500之间的100可能是猫的正确k但是如果我想学习我的分类器识别狗怎么办? k将是另一个?!

谢谢

1 个答案:

答案 0 :(得分:2)

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

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

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

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

干杯, 安迪

相关问题