基于KNN的手写数字识别

基于KNN的数字识别

源代码及数据的github地址:
https://github.com/w1449550206/KNN-Handwritten-digit-recognition-based-on-KNN
点此可直达

import numpy as np
# 图片后缀为bmp 
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier
img_path = './data/3/3_10.bmp'
arr_img = plt.imread(img_path)
arr_img.shape  #维度

在这里插入图片描述

plt.imshow(arr_img)

在这里插入图片描述

# 创建数据列表,存放图片数据的特征和目标,特征必须是二维
feature = [] #特征
target = [] #目标数据
# 图片存放位置 例如:/data/3/3_33.bmp
# data文件夹中存放0-9的图片,每个数字500种写法
for i in range(10):
    for j in range(1,501):
        #img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp' 
        #将图片数据读取到了numpy
        img_arr = plt.imread('./data/%d/%d_%d.bmp'%(i,i,j))  #格式化替换
        feature.append(img_arr)
        target.append(i)
#查看特征和目标
feature

在这里插入图片描述

#查看特征和目标
target

在这里插入图片描述

#将列表转numpy
feature = np.array(feature)
feature.shape  #发现feature是三维,必须变形成二维的才可以作为特征数据
#获取了符合要求的特征数据(二维)
feature = feature.reshape((5000,784))
target = target
#将样本集拆分成训练数据和测试数据
np.random.seed(6)
np.random.shuffle(feature)
np.random.seed(6)
np.random.shuffle(target)
#训练数据
x_train = feature[0:4950]
y_train = target[0:4950]
#测试数据
x_test = feature[4950:]
y_test = target[4950:]
x_train.shape  #训练形状
knn = KNeighborsClassifier(n_neighbors=15)
knn.fit(x_train,y_train)  #试数据
knn.score(x_test,y_test)  #评分
print('模型分类结果:',knn.predict(x_test))
print('真实分类:',y_test)

在这里插入图片描述

下面测试一张新的照片

#获取外部的一张数字图片,让模型进行分类
digist_img_arr = plt.imread('./数字.jpg')
digist_img_arr.shape
plt.imshow(digist_img_arr)

在这里插入图片描述

five_img_arr = digist_img_arr[900:1200,700:930]  #图片切割   行/列
plt.imshow(five_img_arr)
#检查切分出图片(即将被模型进行分类的图片)的形状
five_img_arr.shape   #(300, 230, 3)

在这里插入图片描述

#将图片的第三个维度删除(降维)
five_img_arr = five_img_arr.mean(axis=2) #任意的聚合方法都能降维  0-x 1-y 2-z
five_img_arr.shape

在这里插入图片描述

#对不满足像素要求的图片进行等比例压缩
import scipy.ndimage as ndimage
five_img_arr = ndimage.zoom(five_img_arr,zoom=(28/300,28/230))  #图片压缩
five_img_arr.shape #(28, 28)

在这里插入图片描述

five_img_arr = five_img_arr.reshape((1,784))  #1行784列
five_img_arr.shape  #(1,784)

在这里插入图片描述

knn.predict(five_img_arr)[0]  #X  未知分类的数据

在这里插入图片描述

模型保存和运用

#保存模型
from sklearn.externals import joblib
joblib.dump(knn,'./knn.m')  #写入模型 value, filename, compress=0, protocol=None, cache_size=None
kknn = joblib.load('./knn.m')  #读取模型   kknn对象
print(kknn) 

在这里插入图片描述

#KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           #metric_params=None, n_jobs=1, n_neighbors=15, p=2,
           #weights='uniform')
kknn.predict(five_img_arr)[0] #测试模型 结果5

在这里插入图片描述

发布了508 篇原创文章 · 获赞 619 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_35456045/article/details/104460766