Python-OpenCV中如何利用资讯算法识别手写数字

  


手写数字数据集MNIST介绍

为了保证完整性,从算法所用的训练数据讲起,训练数据是由MNIST手写数字组成的,MNIST数据集来自美国国家标准与技术研究所,由来自250个不同人手写的数字构成,其中训练集包含60000张图片,测试集包含10000张图片,每个图片都有其标签,图片大小为28 * 28。许多机器学习库提供了加载MNIST数据集的方法,这里使用keras库进行加载:

#,导入,keras 库   import  keras   #,加载数据   (train_dataset, train_labels), (test_dataset, test_labels),=, keras.datasets.mnist.load_data ()   时间=train_labels  np.array (train_labels, dtype=np.int32)   #,打印数据集形状   打印(train_dataset.shape, test_dataset.shape)   #,图像预览   for 小姐:拷贝范围(40):   ,,,plt.subplot(10 4,,,,我+ 1)   ,,,plt.imshow (train_dataset[我],提出=& # 39;灰色# 39;)   ,,,plt.title (train_labels[我],字形大?10)   ,,,plt.axis(& # 39;从# 39;)   plt.show ()

 Python-OpenCV中如何利用资讯算法识别手写数字

基准模型,利用资讯算法识别手写数字

加载数据集后,我们尝试使用资讯分类器识别数字,在原始方法中,我们首先使用原始像素值作为特征,因此图像描述符的大小为28×28=784。

首先利用keras加载所有数字图像,为了了解数据训练的全部流程,我们将加载的训练数据集划分为训练数据集+测试数据集,每部分占比50%:

#,加载数据集   (train_dataset, train_labels), (test_dataset, test_labels),=, keras.datasets.mnist.load_data ()   时间=train_labels  np.array (train_labels, dtype=np.int32)   #,将原始图像作为描述符   def  raw_pixels (img):   ,,,return  img.flatten ()   #,数据打散   时间=shuffle  np.random.permutation (len (train_dataset))   train_dataset, train_labels =, train_dataset (shuffle), train_labels (shuffle)   #,计算每个图像的描述符,这里特征描述符是原始像素   时间=raw_descriptors  []   for  img  train_dataset拷贝:   ,,,raw_descriptors.append (np.float32 (raw_pixels (img)))   时间=raw_descriptors  np.squeeze (raw_descriptors)   #,将数据拆分为训练和测试数据(各占,50%)   #,因此,使用,30000,个数字来训练分类器,30000,位数字来测试训练后的分类器   partition =, int (0.5, *, len (raw_descriptors))   raw_descriptors_train, raw_descriptors_test =, np.split (raw_descriptors,,(分区))   labels_train, labels_test =, np.split (train_labels,[分区])

现在,我们就可以使用knn.train()方法训练资讯模型并使用get_accuracy()函数对其进行测试:

#,训练,KNN 模型   时间=knn  cv2.ml.KNearest_create ()   knn.train (raw_descriptors_train, cv2.ml.ROW_SAMPLE, labels_train)   #,测试,kNN 模型   时间=k  5   受潮湿腐烂,因此,,邻居,,dist =, knn.findNearest (raw_descriptors_test, k)   #,根据真实值和预测值计算准确率   def  get_accuracy(预测,,标签):   ,,,acc =, (np.squeeze(预测),==,标签).mean ()   ,,,return  acc  *, 100   时间=acc  get_accuracy(因此,labels_test)   print(“准确性:{}“.format (acc)

我们可以看到当K=5时,资讯模型可以获得96.48%的准确率,但我们仍然可以对其进行改进,以获取更高性能。

改进模型1——参数K对识别手写数字精确度的影响

我们已经知道在资讯算法中,一个影响算法性能的重要参数就是K,因此,我们可以首先尝试使用不同的K值,查看其对识别手写数字精确度的影响。

为了比较不同K值时模型的准确率,我们首先需要创建一个字典来存储测试不同K值时的准确率:

得到collections  import  defaultdict   时间=results  defaultdict(列表)

接下来,计算knn.findNearest()方法,改变K参数,并将结果存储在字典中:

#, K 取值范围为,(1,9)   for  k 拷贝范围(1,10):   ,,,受潮湿腐烂,,结果,,邻居,,dist =, knn.findNearest (raw_descriptors_test, k)   ,,,acc =, get_accuracy(因此,labels_test)   ,,,print (“, {}“.format (“% .2f", %, acc))   ,,,结果[& # 39;50 & # 39;].append (acc)

最后,绘制结果:

ax =, plt.subplot (1, 1, 1)   ax.set_xlim (0, 10)   时间=dim  np.arange (1, 10)   for  key 结果:拷贝   ,,,ax.plot(昏暗的,,结果(关键),线型=& # 39;——& # 39;,,标志=& # 39;o # 39;,,标签=?0%”)   ,,,,   plt.legend (loc=& # 39; upper 左# 39;,,title=?, training")   plt.title (& # 39; Accuracy  of 从而K-NN  model  varying  k # 39;)   plt.xlabel (“number  of  k")   plt.ylabel (“accuracy")   plt.show ()

Python-OpenCV中如何利用资讯算法识别手写数字