2013-07-20 63 views
0

我希望有人能解釋我,如果我在正確的方式。我試圖瞭解一些關於圖像檢索和SVM的內容,但這只是有點令人困惑。我會通過發佈源代碼來問我的問題。SVM,測試,學習,篩選和k-means /病房分類

首先我有一個貓的數據集。對於每個「貓」圖片,我使用篩選算法(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×128尺寸的描述,看起來像這樣的* .sparse文件:

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

與貓的圖片此過程後,我重複這與「無 - 貓圖片」,並獲得* .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會是另一個?!

謝謝

回答

2

基本上你做了正確的事情,有一些小錯誤: 首先,對於任何機器學習方法, 你應該在你做任何事情之前將數據分割爲訓練和測試。 這是瞭解您是否成功構建貓分類器的唯一方法。 您在訓練集上測試了您的方法並獲得了完美的結果 - 它不會告訴您任何內容。

其次,對於包含字的方法,您不使用聚類中心作爲圖像的描述符。對於每幅圖像,查看每個聚類出現的頻率(將predict應用於一幅圖像中的所有描述符),然後構建該圖像的直方圖(即np.bincount +除以和)。 這給你一個長度n_clusters(在你的情況下是三個)的描述符爲每個圖像。 這些您可以提供給分類器。

一些不太重要的評論: 順便說一句,取決於你的圖片有多變,以及底片是什麼樣子,你可能有很多例子。嘗試至少50-100。 另外,您的中心數量也很少。使用三個,你會得到描述這個圖像的三維矢量。這還不太可能包含足夠的信息來區分貓和非貓。嘗試100-500。

我真的應該寫一篇關於如何做到這一點的博客文章...希望很快.... 順便說一句,如果你的貓圖片只包含一個集中的貓,沒有其他的東西,你可能想嘗試豬,而不是篩。

乾杯, 安迪

+1

安德烈亞斯說:「你測試你的方法對培訓設置了完美的結果 - 告訴你什麼。」 這告訴你一件事:該模型有足夠的表現力來避免不合適(偏差太大)。但它沒有告訴你關於模型對新數據的預測能力(泛化),這是預測建模的主要目標。 – ogrisel

+0

你是對的。但是用那麼少的訓練數據,說你可以完美分類並不多說;) –