OpenCV Python - 使用 KNN 进行数字识别
KNN 代表K 最近邻 是一种基于监督学习的机器学习算法。 它尝试将新数据点放入与可用类别最相似的类别中。 所有可用数据都被分为不同的类别,并根据相似性将新数据点放入其中一个类别中。
KNN 算法的工作原理如下 −
- 最好选择一个奇数作为要检查的邻居的数量 K。
- 计算他们的欧几里德距离。
- 根据计算出的欧几里得距离取 K 个最近的邻居。
- 计算每个类别中数据点的数量。
- 具有最大数据点的类别是新数据点所属的类别。
作为使用 OpenCV 实现 KNN 算法的示例,我们将使用下面的图像 digits.png,它由 5000 个手写数字图像组成,每个图像为 20X20 像素。
第一个任务是将此图像拆分为 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)