手写数字识别(KNN算法)

一、预备知识

图像灰度化

1.图像灰度化简单来说就是让图像像素点矩阵中的每一个像素点都满足下面的关系R=G=B(这3个值相等),此时的这个值叫作灰度值。这样每个像素点的颜色不需要用3个值来表示、只需用一个灰度值表示就可以了,这不仅能大大减少计算量,而且能保留相息。PI库提供了图像切片、旋转、差值、滤波和写文字等许多功能。PIL库在Python3.x中已是标准库,可以通过以下命令安装。

复制代码
pip3 install pillow

2.以数字8为例,将图片8进行图像灰度化

python 复制代码
from PIL import Image
img=Image.open(r'c:/workcode/data3/8.jpeg')
#img=img.resize((80,80),Image.ANTIALIAS)
img=img.resize((80,80),Image.LANCZOS)
img=img.convert('L')
img.show()
img.save(r'c:/workcode/data3/8.png')

二、将数字图像信息转化为TXT文件

1.导入相关的库

2.定义转换函数 imgtotext

本函数首先将含有数字的图像进行缩放和灰度化处理,然后对图像逐行扫描,按每个像素点的像素灰度值大小将其转换成0或者1,转换规则如下。

(1)大于等于128:转换成0(表示白色)。

(2)小于128:转换成1(表示黑色)。

最后将转换后的字符串数据写人 TXT 文件,完成函数的转换操作。源代码如下

3.调用函数生成TXT文件

python 复制代码
#导入相关的库
import os
from PIL import Image
#定义转换函数
def imgtotext(imgfile,txtfile,size=(32,32)):
#imgfile 待识别图像,txtfile 将图像转换为txt 文件输出,size 图像大小,默认 32*32
    image_file = Image.open(imgfile)
    image_file =image_file.resize(size,Image.LANCZOS)
    image_file=image_file.convert('L')
    width,height=image_file.size
    f =open(txtfile,'w')
    ascii_char='10'
    for i in range (height):
        pix_char='';
        for j in range(width):
            pixel=image_file.getpixel((j,i))
            pix_char+=ascii_char[int(pixel/128)]
        pix_char+='\n'
        f.write(pix_char)
    f.close()
#调用函数生成TXT文件,将图片转换成文本信息
imgtotext(r'c:/workcode/data3/8.png',r'c:/workcode/data3/8_0.txt')

三、批量生成样本数据,构建训练KNN模型并评估模型效果

总代码

python 复制代码
import numpy as np
import os
import matplotlib.pyplot as plt
from sklearn.neighbors import  KNeighborsClassifier
import pandas as pd
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
#定义函数,将文本数据转换成数字形式的数组
def txt2array(filename):
    X=np.zeros((1,1024))
    f = open(filename)#
    for i in range(32):
        lineStr =f.readline()
        for j in range(32):
            X[0,32*i+j]= int(lineStr[j])
    return X
#将文件夹下所的文件转换成数组和对应的标签
def convert2dataset(file_path):
    list_file=os.listdir(file_path)
    m=len(list_file)
    datas=np.zeros((m,1024))
    labels=[]
    for i in range (m):
        num=int(list_file[i][0])
        labels.append(num)
        datas[i,:]=txt2array(file_path+'\\'+list_file[i])
        print(datas)
    return datas,labels
                            
x_train,y_train=convert2dataset(r'c:/workcode/data3/trainingDigits')
x_test,y_test=convert2dataset(r'c:/workcode/data3/testDigits')


knn= KNeighborsClassifier(n_neighbors=3,weights='distance' ,p=2)

knn.fit(x_train,y_train)
knn.score(x_train,y_train)


y_pred=knn.predict(x_test)
print(classification_report(y_test,y_pred))

i=y_test.index(8)
for j in range(1):
     if(y_test[j+i]!=y_pred[j+i]):
          print('{}[{}]->{}'.format(y_test[j+i],j,y_pred[j+i]))


y_test=np.array(y_test)
confusion_matrix(y_test,y_pred)
pd.crosstab(y_test,y_pred,rownames=['真实值'],colnames=['预测值'],margins=True)

1.定义一个样本的数据转换函数

定义函数 txt2array,将一个 TXT 文件数据转换成数值类型的数组

ini 复制代码
def txt2array(filename):
    X=np.zeros((1,1024))
    f = open(filename)#
    for i in range(32):
        lineStr =f.readline()
        for j in range(32):
            X[0,32*i+j]= int(lineStr[j])
    return X

2.生成所有样本的特征值和标签值

ini 复制代码
def convert2dataset(file_path):
    list_file=os.listdir(file_path)
    m=len(list_file)
    datas=np.zeros((m,1024))
    labels=[]
    for i in range (m):
        num=int(list_file[i][0])
        labels.append(num)
        datas[i,:]=txt2array(file_path+'\\'+list_file[i])
        print(datas)
    return datas,labels

所有的训练样本数据和测试样本数据分别保存在tainingDigits、testDigits 文件夹下因此需要定义一个函数convert2dataset,将文件夹下所有的TXT 文件转换成样本的特征值及对应的标签值。

3.生成训练样本数据和测试样本数据

python 复制代码
x_train,y_train=convert2dataset(r'c:/workcode/data3/trainingDigits')
x_test,y_test=convert2dataset(r'c:/workcode/data3/testDigits')

4.构建KNN模型

(1)导入KNN类

javascript 复制代码
from sklearn.neighbors import  KNeighborsClassifier

(2)构建分类模型

ini 复制代码
knn= KNeighborsClassifier(n_neighbors=3,weights='distance' ,p=2)

5.训练KNN模型

(1)用训练集x_train、y_train来训练模型

scss 复制代码
knn.fit(x_train,y_train)

(2)对训练后的模型进行评估

scss 复制代码
knn.score(x_train,y_train)

6.评估模型效果 (1)测试模型性能

scss 复制代码
from sklearn.metrics import classification_report
y_pred=knn.predict(x_test)
print(classification_report(y_test,y_pred))

i=y_test.index(8)
for j in range(1):
     if(y_test[j+i]!=y_pred[j+i]):
          print('{}[{}]->{}'.format(y_test[j+i],j,y_pred[j+i]))

(2)通过交叉表了解模型的错分情况

ini 复制代码
from sklearn.metrics import confusion_matrix

y_test=np.array(y_test)
confusion_matrix(y_test,y_pred)
pd.crosstab(y_test,y_pred,rownames=['真实值'],colnames=['预测值'],margins=True)
相关推荐
2601_958320575 分钟前
【小白易懂版】OpenClaw 飞书机器人绑定配置详细教程(含安装包)
人工智能·机器人·飞书·open claw·小龙虾·open claw安装
AI创界者10 分钟前
《2026 视觉革命:深度测评 GPT-Image-2,基于 DMXAPI 实现 4K 超分与批量生图实战》
人工智能
云上码厂13 分钟前
2023年之前物理信息神经网络PINN papers
人工智能·深度学习·神经网络
aini_lovee16 分钟前
多目标粒子群优化(MOPSO)双适应度函数MATLAB实现
人工智能·算法·matlab
Cosolar17 分钟前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
灵机一物21 分钟前
灵机一物AI原生电商小程序、PC端(已上线)-【无标Anthropic 研究深度解析:AI 对就业市场的实际冲击与高危职业排行题】
人工智能·ai·程序员·职业发展·anthropic·就业市场
电子科技圈23 分钟前
芯科科技在蓝牙亚洲大会展示汽车与边缘AI前沿蓝牙创新技术, 解锁车用、家居、健康及工商业等应用场景
人工智能·科技·嵌入式硬件·mcu·物联网·网络安全·汽车
redreamSo30 分钟前
让AI Agent自动接Issue、写代码、上线:我用200行代码搭了一个全自动开发流水线
人工智能·开源·github
Cosolar38 分钟前
告别无脑循环:深入解析 ReWOO 与 Plan-and-Execute Agent 架构
人工智能·面试·全栈
Hector_zh41 分钟前
AI多租户平台的物理隔离方案实践与权衡
人工智能