【问题标题】:SVM, testing, learning, classifying with sift and k-means/wardSVM,测试,学习,用 sift 和 k-means/ward 分类
【发布时间】:2013-07-19 16:57:41
【问题描述】:

如果我走对了路,我希望有人能解释一下。我正在尝试学习有关图像检索和 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 会是另一个?!

谢谢

【问题讨论】:

    标签: python svm scikit-learn sift


    【解决方案1】:

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

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

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

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

    干杯, 安迪

    【讨论】:

    • 安德烈亚斯说:“你在训练集上测试了你的方法,得到了完美的结果——它什么也没告诉你。”这告诉你一件事:模型有足够的表达能力来避免欠拟合(太多偏差)。但它没有告诉您模型对新数据(泛化)的预测能力,这是预测建模的主要目标。
    • 你是对的。但是有了这么少的训练数据,说你可以完美分类并不能说明太多;)
    猜你喜欢
    • 2016-03-17
    • 2014-07-15
    • 2016-01-21
    • 2017-05-17
    • 2018-03-12
    • 2015-02-24
    • 2017-12-08
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多