OpenCV Python - 基於KNN的數字識別



KNN,代表**K近鄰**,是一種基於監督學習的機器學習演算法。它試圖將一個新的資料點歸類到與現有類別最相似的類別中。所有現有的資料都被分類到不同的類別中,一個新的資料點根據相似性被歸類到其中一個類別中。

KNN演算法基於以下原則:

  • 選擇一個奇數作為K,表示要檢查的鄰居數量。
  • 計算它們的歐氏距離。
  • 根據計算出的歐氏距離,獲取K個最近鄰。
  • 統計每個類別中資料點的數量。
  • 資料點數量最多的類別就是新的資料點被歸類的類別。

作為使用OpenCV實現KNN演算法的示例,我們將使用以下影像digits.png,它包含5000張手寫數字的影像,每張影像大小為20X20畫素。

KNN

第一個任務是將此影像分割成5000個數字。這是我們的特徵集。將其轉換為NumPy陣列。程式如下:

import numpy as np
import cv2

image = cv2.imread('digits.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

fset=[]
for i in np.vsplit(gray,50):
   x=np.hsplit(i,100)
   fset.append(x)

NP_array = np.array(fset)

現在我們將這些資料分成訓練集和測試集,每個大小為(2500,20x20),如下所示:

trainset = NP_array[:,:50].reshape(-1,400).astype(np.float32)
testset = NP_array[:,50:100].reshape(-1,400).astype(np.float32)

接下來,我們必須為每個數字建立10個不同的標籤,如下所示:

k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = np.repeat(k,250)[:,np.newaxis]

現在我們可以開始KNN分類了。建立分類器物件並訓練資料。

knn = cv2.ml.KNearest_create()
knn.train(trainset, cv2.ml.ROW_SAMPLE, train_labels)

選擇k值為3,獲取分類器的輸出。

ret, output, neighbours, distance = knn.findNearest(testset, k = 3)

將輸出與測試標籤進行比較,以檢查分類器的效能和準確性。

該程式顯示在準確檢測手寫數字方面,準確率為91.64%。

result = output==test_labels
correct = np.count_nonzero(result)
accuracy = (correct*100.0)/(output.size)
print(accuracy)
廣告