2016-02-28 136 views
1

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_ml/py_svm/py_svm_opencv/py_svm_opencv.htmlPython的OpenCV的手寫識別與SVM,改變訓練和測試量

在這個例子中的OpenCV給出,訓練集是250和檢測量也是相同的。但是,當測試和訓練數字發生變化時,準確度將降至0.

# First half is trainData, remaining is testData 
train_cells = [ i[:40] for i in cells ] 
test_cells = [ i[40:] for i in cells] 

train_amt = 200 
responses = np.float32(np.repeat(np.arange(10),train_amt)[:,np.newaxis]) 

我已將上述行中的值從原始代碼中更改。我究竟做錯了什麼? x應該是什麼?

提供OpenCV的訓練和測試數據:http://wormassay.googlecode.com/svn/trunk/ThirdParty/OpenCV/samples/python2/data/digits.png

回答

2

你的數據分割是正確的。它給你的準確性的原因是你測量它的方式。

精度確認被完成:

mask = result==responses 
correct = np.count_nonzero(mask) 
print correct*100.0/result.size 

通過新的分割火車/測試,這是不正確的了。首先,resultresponses的長度不相同,因此mask只是False

所以,現在你要測量精度,你需要根據測試大小reshape,responses,而不是訓練。工作代碼只有300改變200:

responses = np.float32(np.repeat(np.arange(10),300)[:,np.newaxis]) 
mask = result==responses 
correct = np.count_nonzero(mask) 
print correct*100.0/result.size 

精度下降了一點,但不是0.0,現在你在93.1,這是正常的,因爲你減小尺寸訓練和測試遞增的編號。

+1

謝謝,想通了。創建一個單獨的numpy數組來比較結果。 – sope

+0

非常感謝!這正是我編輯代碼之前所做的一切。 – sope