閱讀對象:熟悉knn、了解opencv和python。
1.knn理論介紹:算法學習筆記:knn理論介紹
2. opencv中knn函數
路徑:opencv\sources\modules\ml\include\opencv2\ml\ml.hpp
3.案例
3.1數據集介紹
我們的目的是創建一個可以對手寫數字進行識別的程序。為了達到這個目的我們需要訓練數據和測試數據。OpenCV 安裝包中有一副圖片(/samples/python2/data/digits.png), 其中有5000 個手寫數字(每個數字重復 500遍)。每個數字是一個20x20 的小圖。 所以第一步就是將這個圖像分割成 5000個不同的數字。我們在將拆分后的每一個數字的圖像重排成一行含有 400 個像素點的新圖像。這個就是我們的特征集,所有像素的灰度值。這是我們能創建的最簡單的特征集。我們使用每個數字的前 250 個樣本做訓練數據,剩余的250 個做測試數據。
3.2代碼
示例中得到的準確率為91.72%,和官網結果一樣,可以結合統計中的抽樣重新分配訓練集和測試集,也可以嘗試用不同的距離度量方法(或者相似度度量方法),取不同的K,重新進行數據實驗,時間有限,我并沒有去找哪個參數代表的是距離度量方法。[備注,方便查閱]
import numpy as np import cv2 from matplotlib import pyplot as pltdir='C:/Users/Thinkpad/Desktop/picture/' img = cv2.imread(dir+'5.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# Now we split the image to 5000 cells, each 20x20 size cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]# Make it into a Numpy array. It size will be (50,100,20,20) x = np.array(cells)# Now we prepare train_data and test_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)# Create labels for train and test data k = np.arange(10) train_labels = np.repeat(k,250)[:,np.newaxis] test_labels = train_labels.copy()# Initiate kNN, train the data, then test it with test data for k=1 knn = cv2.KNearest() knn.train(train,train_labels) ret,result,neighbours,dist = knn.find_nearest(test,k=5)# Now we check the accuracy of classification # For that, compare the result with test_labels and check which are wrong matches = result==test_labels correct = np.count_nonzero(matches) accuracy = correct*100.0/result.size print accuracy
4.3中的圖片
參考資料:[1]http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_ml/py_knn/py_knn_opencv/py_knn_opencv.html
end!!
?