ocr 光学字符识别(Optical Character Recognition)识别数字

文中数据下载
识别分析: 图片是二维的数组
图片原始数据

plt.imread('./digits/0/0_1.bmp')

array([[255, 255,
        255, 255],
        [255, 255,
        255, 255]], dtype=uint8)  

可以看出是一个二维数据, 但根据实际情况每行样本的列并不是样本的多个特征

根据实际情况,每个图片是一个样本,样本中的所有数据都是样本的特征

所以我们将每张图片做一下处理,将shape为28x28的改变为 1x784 的 数据 这样就可以进行K-邻近算法分类预测

图片预处理后的数据

data = data.flatten()  #将图片数据转为一维的
data

array([255, 255, 255, 255, 255], dtype=uint8)

一、数据预处理

1)创建训练数据集与测试数据集

# 训练数据集
X_train = []
y_train = []
# 测试数据集
X_test = []
y_test = []

2)导入数据

已知图片数据为 0-9的图片数字,分别在名字为0-9的文件夹中分别有500个,我们将前490个作为训练集,490之后为训练集

for i in range(10):
    for j in range(1,501):
        # print('./digits/%d/%d_%d.bmp'%(i,i,j))
        # 根据路径 读取数据 然后 把28*28的形状 变成1行的形状
        data = plt.imread('./digits/%d/%d_%d.bmp'%(i,i,j)).flatten()
        # 目标值就是 文件夹的名字 也就在i
        target = i
        # 前490个都用来训练 后10个用来测试
        if j<=490:   # 将前490个作为训练集
            X_train.append(data)
            y_train.append(target)
        else:     # 将490个之后的作为测试集
            X_test.append(data)
            y_test.append(target)

这样我们就取到了训练集与测试集

二、创建数据模型

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()

三、模型训练

knn.fit(X_train,y_train)

四、模型预测

y_ = knn.predict(X_test)

五、预测结果展示

1)预测准确率

knn.score(X_test,y_test)

0.94

2)预测结果绘图

plt.figure(figsize=(15,15))  #设置画布大小
index = 1
for i in range(10):
    for j in range(10):
        axes = plt.subplot(10,10,index)  #建立子画布
        # 传入测试数据 按照索引从X_test中获取数据 然后变回28*28的形状
        plt.imshow(X_test[index-1].reshape(28,28)) #将测试图片的数据恢复到图片显示的形状
        axes.axis('off')  # 隐藏坐标轴
        # 把真实数据作为坐标系的标题
        axes.set_title(y_[index-1])  # 将子画布的标题设置为测试结果值
        index += 1

这里写图片描述

可以看出识别率是非常不错的

六、知识点总结

  • 图片分类的处理
  • flatten()将数据扁平化

  • K近邻算法 处理分类问题

  • from sklearn.neighbors import KNeighborsClassifier
    ·knn = KNeighborsClassifier()
    ·

猜你喜欢

转载自blog.csdn.net/PyRookie/article/details/81736554