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,20×20),如下所示−
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)
版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com