opencv python 基于KNN的手写体识别的实例
OCRofHand-writtenDatausingkNN
OCRofHand-writtenDigits
我们的目标是构建一个可以读取手写数字的应用程序,为此,我们需要一些train_data和test_data.OpenCV附带一个imagesdigits.png(在文件夹opencv\sources\samples\data\中),它有5000个手写数字(每个数字500个,每个数字是20x20图像).所以首先要将图片切割成5000个不同图片,每个数字变成一个单行400像素.前面的250个数字作为训练数据,后250个作为测试数据.
importnumpyasnp importcv2 importmatplotlib.pyplotasplt img=cv2.imread('digits.png') gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #Nowwesplittheimageto5000cells,each20x20size cells=[np.hsplit(row,100)forrowinnp.vsplit(gray,50)] #MakeitintoaNumpyarray.Itsizewillbe(50,100,20,20) x=np.array(cells) #Nowwepreparetrain_dataandtest_data. train=x[:,:50].reshape(-1,400).astype(np.float32)#Size=(2500,400) test=x[:,50:100].reshape(-1,400).astype(np.float32)#Size=(2500,400) #Createlabelsfortrainandtestdata k=np.arange(10) train_labels=np.repeat(k,250)[:,np.newaxis] test_labels=train_labels.copy() #InitiatekNN,trainthedata,thentestitwithtestdatafork=1 knn=cv2.ml.KNearest_create() knn.train(train,cv2.ml.ROW_SAMPLE,train_labels) ret,result,neighbours,dist=knn.findNearest(test,k=5) #Nowwechecktheaccuracyofclassification #Forthat,comparetheresultwithtest_labelsandcheckwhicharewrong matches=result==test_labels correct=np.count_nonzero(matches) accuracy=correct*100.0/result.size print(accuracy)
输出:91.76
进一步提高准确率的方法是增加训练数据,特别是错误的数据.每次训练时最好是保存训练数据,以便下次使用.
#savethedata np.savez('knn_data.npz',train=train,train_labels=train_labels) #Nowloadthedata withnp.load('knn_data.npz')asdata: print(data.files) train=data['train'] train_labels=data['train_labels']
OCRofEnglishAlphabets
在opencv/samples/data/文件夹中附带一个数据文件letter-recognition.data.在每一行中,第一列是一个字母表,它是我们的标签.接下来的16个数字是它的不同特征.
importnumpyasnp importcv2 importmatplotlib.pyplotasplt #Loadthedata,convertersconvertthelettertoanumber data=np.loadtxt('letter-recognition.data',dtype='float32',delimiter=',', converters={0:lambdach:ord(ch)-ord('A')}) #splitthedatatotwo,10000eachfortrainandtest train,test=np.vsplit(data,2) #splittrainDataandtestDatatofeaturesandresponses responses,trainData=np.hsplit(train,[1]) labels,testData=np.hsplit(test,[1]) #InitiatethekNN,classify,measureaccuracy. knn=cv2.ml.KNearest_create() knn.train(trainData,cv2.ml.ROW_SAMPLE,responses) ret,result,neighbours,dist=knn.findNearest(testData,k=5) correct=np.count_nonzero(result==labels) accuracy=correct*100.0/10000 print(accuracy)
输出:93.06
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。