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)