Opencv Python 简明教程

OpenCV Python - Digit Recognition with KNN

KNN 代表 K-Nearest Neighbour ,是一种基于监督学习的机器学习算法。它试图将新数据点放入与可用类别最相似的类别中。所有可用数据都分类为不同的类别,并根据相似性将新数据点放入其中一个类别。

KNN 算法遵循以下原理:

  1. 根据要检查的邻居数量,最好选择一个奇数作为 K。

  2. Calculate their Euclidean distance.

  3. 根据计算的欧氏距离获取 K 个最近邻居。

  4. 计算每个类别中的数据点数量。

  5. 数据点最多的类别是新数据点被分类到的类别。

作为使用 OpenCV 实现 KNN 算法的示例,我们将使用以下包含 5000 幅手写数字图像(每幅图像像素为 20X20)的 digits.png。

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)