2016-02-28 135 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