基于Python手写拼音识别

目录
  • 一、算法构造
    • 1.简单介绍一下knn算法
    • 2.Python实现KNN
  • 二、准备数据
    • 1、将图片转换成数组矩阵
  • 三、处理数据:训练集与测试集
    • 1、区分训练集和测试集
    • 2、加载数据
    • 3、建立训练数据
  • 四、测试数据

一、算法构造

1.简单介绍一下knn算法

KNN算法,也叫K最近邻算法。功能是分类。算法逻辑非常简单,说直白点就是:先找到跟你最近的k个邻居(假设k=5),再看你的邻居给哪个类别投票(即邻居的标签),少数服从多数,得票最多的结果就是你的类别。

在这个算法中最关键的三点:

k值 :选择距离最近的k个邻居。
距离计算:计算距离的方法有欧式距离和曼哈顿距离,本文采用欧式距离,即先求差值的平方和,再开根号。
分类标签:本文的分类标签即a,b,c,d等字母

2.Python实现KNN

'''
k:k值
testdata:测试数据集
traindata:训练数据集
labels:分类标签
'''

def knn(k, testdata, traindata, labels):
    '''定义算法'''
    traindatasize = traindata.shape[0] #计算训练集的长度
    dif = tile(testdata,(traindatasize,1)) - traindata #将测试集扩展至训练集的长度,再求差值
    sqrdif = dif**2 #求差值的平方
    sumsqrdif = sqrdif.sum(axis=1) #求平方和
    distance = sumsqrdif**0.5 #再开根号,即所有的距离
    sorted_distance = distance.argsort() #对距离进行排序,返回排序后的索引
    count = {} #准备一个空字典,存放投票结果
    for i in range(0,k):  
        vote = labels[sorted_distance[i]] #提取索引多对应的标签值作为字典的key
        count[vote] = count.get(vote,0)+1  #票数作为字典的value
    sorted_count = sorted(count.items(),key=lambda x:x[1],reverse=True) #对最后的投票结果进行排序
    return sorted_count[0][0] #返回得票最多的标签

二、准备数据

用最笨的方法,手写了一批png格式的数字图片:

图片的尺寸都是统一的:32*32像素
图片的命名也是统一的:数字标签+"_"+第n张图+“.png"

1、将图片转换成数组矩阵

训练数据集与测试数据集都是标准化后的数组矩阵,而我们的试验对象是手写体数字图片,首先需要将图片进行一下数据化处理。

def img2Model(originDataPath, modelpath):
    list = os.listdir(originDataPath)
    for child in list:
        s_list = os.listdir(originDataPath + child)
        for i in s_list:

            filepath=originDataPath + child + '/' + i
            # print(filepath)
            img = cv2.imdecode(np.fromfile(filepath, dtype=np.uint8),0)
            img = cv2.resize(img, (32, 32))
            img = np.asarray(img)
            img[img > 127] = 255
            img[img <= 127] = 1
            img[img == 255] = 0
            dstFileName = modelPath + i.split('.')[0] + '.txt'
            np.savetxt(dstFileName, img, fmt='%d', delimiter=' ')

三、处理数据:训练集与测试集

1、区分训练集和测试集

# 随机分拣出测试集,其他文件为训练集
def shutildata(modelpath, trainpath, testpath):
    txtlist = os.listdir(modelpath)
    index = [random.randint(0, len(txtlist)) for i in range(10)]
    # print(index)
    arr = [txtlist[i].split('.')[0].split("_")[1] for i in index]
    for i in txtlist:
        try:
            if i.split(".")[0].split("_")[1] in arr:
                shutil.copy(modelpath + "/" + i, testpath)
            else:
                shutil.copy(modelpath + "/" + i, trainpath)
        except:
            pass

2、加载数据

# 加载数据

def load_data(dataFilePath):
    arr = np.loadtxt(dataFilePath, dtype=np.int)
    arr = arr.flatten()
    return arr

3、建立训练数据

# 建立训练数据集
def makeTrainData(trainpath):
    labels = []
    trainfile = os.listdir(trainpath)

    trainarr = np.zeros((len(trainfile), 1024))
    for i in range(0, len(trainfile)):
        # print(trainfile[i])
        thislabel = trainfile[i].split(".")[0].split("_")[0]

        if len(thislabel) != 0:
            labels.append(int(thislabel))
        trainarr[i, :] = load_data(trainpath + trainfile[i])
    return trainarr, labels

四、测试数据

# 验证
def validate(testpath, trainpath, k):
    trainarr, labels = makeTrainData(trainpath)
    testfiles = os.listdir(testpath)
    count = 0

    # 读取字典表
    with open('num_char.json', 'r') as f:
        dict = json.loads(f.read())
        # print(dict)

    for i in range(0, len(testfiles)):
        testpicname = testfiles[i].split("_")[0]
        testarr = load_data(testpath + testfiles[i])
        result = knn(k, testarr, trainarr, labels)

        testpicname = dict[str(testpicname)]
        result = dict[str(result)]

        print("真正字母:"+testfiles[i] +"  " + testpicname + "  " + "测试结果为:{}".format(result))
        if str(testpicname) == str(result):
            count += 1
    print("-----------------------------")
    print("测试集为:{}个,其中正确了{}个".format(len(testfiles),count))
    print("正确率为{}".format(count / len(testfiles)))
    print()

到此这篇关于基于Python手写拼音识别的文章就介绍到这了,更多相关Python手写拼音识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于Python手写拼音识别

    目录 一.算法构造 1.简单介绍一下knn算法 2.Python实现KNN 二.准备数据 1.将图片转换成数组矩阵 三.处理数据:训练集与测试集 1.区分训练集和测试集 2.加载数据 3.建立训练数据 四.测试数据 一.算法构造 1.简单介绍一下knn算法 KNN算法,也叫K最近邻算法.功能是分类.算法逻辑非常简单,说直白点就是:先找到跟你最近的k个邻居(假设k=5),再看你的邻居给哪个类别投票(即邻居的标签),少数服从多数,得票最多的结果就是你的类别. 在这个算法中最关键的三点: k值 :选择

  • python实现基于SVM手写数字识别功能

    本文实例为大家分享了SVM手写数字识别功能的具体代码,供大家参考,具体内容如下 1.SVM手写数字识别 识别步骤: (1)样本图像的准备. (2)图像尺寸标准化:将图像大小都标准化为8*8大小. (3)读取未知样本图像,提取图像特征,生成图像特征组. (4)将未知测试样本图像特征组送入SVM进行测试,将测试的结果输出. 识别代码: #!/usr/bin/env python import numpy as np import mlpy import cv2 print 'loading ...'

  • python神经网络编程之手写数字识别

    写在之前 首先是写在之前的一些建议: 首先是关于这本书,我真的认为他是将神经网络里非常棒的一本书,但你也需要注意,如果你真的想自己动手去实现,那么你一定需要有一定的python基础,并且还需要有一些python数据科学处理能力 然后希望大家在看这边博客的时候对于神经网络已经有一些了解了,知道什么是输入层,什么是输出层,并且明白他们的一些理论,在这篇博客中我们仅仅是展开一下代码: 然后介绍一下本篇博客的环境等: 语言:Python3.8.5 环境:jupyter 库文件: numpy | matp

  • Python实现带GUI界面的手写数字识别

    目录 1.效果图 2.数据集 3.关于模型 4.关于GUI设计 5.缺点 6.遗留问题 1.效果图 有点low,轻喷 点击选择图片会优先从当前目录查找 2.数据集 这部分我是对MNIST数据集进行处理保存 对应代码: import tensorflow as tf import matplotlib.pyplot as plt import cv2 from PIL import Image import numpy as np from scipy import misc (x_train_a

  • caffe的python接口之手写数字识别mnist实例

    目录 引言 一.数据准备 二.导入caffe库,并设定文件路径 二.生成配置文件 三.生成参数文件solver 四.开始训练模型 五.完成的python文件 引言 深度学习的第一个实例一般都是mnist,只要这个例子完全弄懂了,其它的就是举一反三的事了.由于篇幅原因,本文不具体介绍配置文件里面每个参数的具体函义,如果想弄明白的,请参看我以前的博文: 数据层及参数 视觉层及参数 solver配置文件及参数 一.数据准备 官网提供的mnist数据并不是图片,但我们以后做的实际项目可能是图片.因此有些

  • Python(TensorFlow框架)实现手写数字识别系统的方法

    手写数字识别算法的设计与实现 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.这是本人的本科毕业论文课题,当然,这个也是机器学习的基本问题.本博文不会以论文的形式展现,而是以编程实战完成机器学习项目的角度去描述. 项目要求:本文主要解决的问题是手写数字识别,最终要完成一个识别系统. 设计识别率高的算法,实现快速识别的系统. 1 LeNet-5模型的介绍 本文实现手写数字识别,使用的是卷积神经网络,建模思想来自LeNet-5,如下图所示

  • Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例

    本文实例讲述了Python使用gluon/mxnet模块实现的mnist手写数字识别功能.分享给大家供大家参考,具体如下: import gluonbook as gb from mxnet import autograd,nd,init,gluon from mxnet.gluon import loss as gloss,data as gdata,nn,utils as gutils import mxnet as mx net = nn.Sequential() with net.nam

  • Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】

    本文实例讲述了Python tensorflow实现mnist手写数字识别.分享给大家供大家参考,具体如下: 非卷积实现 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data data_path = 'F:\CNN\data\mnist' mnist_data = input_data.read_data_sets(data_path,one_hot=True) #offline da

  • Python利用逻辑回归模型解决MNIST手写数字识别问题详解

    本文实例讲述了Python利用逻辑回归模型解决MNIST手写数字识别问题.分享给大家供大家参考,具体如下: 1.MNIST手写识别问题 MNIST手写数字识别问题:输入黑白的手写阿拉伯数字,通过机器学习判断输入的是几.可以通过TensorFLow下载MNIST手写数据集,通过import引入MNIST数据集并进行读取,会自动从网上下载所需文件. %matplotlib inline import tensorflow as tf import tensorflow.examples.tutori

  • 基于TensorFlow的CNN实现Mnist手写数字识别

    本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下 一.CNN模型结构 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积:感受视野5*5,步长为1,卷积核:64个 第二层池化:池化视野2*2,步长为2 全连接层:设置1024个神经元 输出层:0~9十个数字类别 二.代码实现 import tensorflow as tf #Tensorfl

随机推荐