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