Python3实现简单可学习的手写体识别(实例讲解)

时间:2021-05-23

1.前言

版本:Python3.6.1 + PyQt5 + SQL Server 2012

以前一直觉得,机器学习、手写体识别这种程序都是很高大上很难的,直到偶然看到了这个视频,听了老师讲的思路后,瞬间觉得原来这个并不是那么的难,原来我还是有可能做到的。

于是我开始顺着思路打算用Python、PyQt、SQLServer做一个出来,看看能不能行。然而中间遇到了太多的问题,数据库方面的问题有十几个,PyQt方面的问题有接近一百个,还有数十个Python基础语法的问题。但好在,通过不断的Google,终于凑出了这么一个成品来。

最终还是把都凑在一个函数里的代码重构了一下,改写成了4个模块:

main.py、Learning.py、LearningDB.py、LearningUI.py

其中LearningDB实现python与数据库的交互,LearningUI实现界面的交互,Learning继承LearningUI类添加上了与LearningDB数据库类的交互,最后通过main主函数模块运行程序。

其中涉及数据库的知识可参考之前的文章:Python3操作SQL Server数据库(实例讲解)
涉及PyQt的知识可参考:Python3使用PyQt5制作简单的画板/手写板

手写体识别的主要思路是将手写的字,用一个列表记录其所经过的点,划分为一个九宫格,然后数每个格子中点的数目,将数目转化为所占总点数的百分比。然后两两保存的九维数,求他们之间的距离,距离越近代表越接近。

2.通过pymssql与数据库的交互

因为使用程序之前先需要建表,建表我就直接使用SQL语句执行了:

create database PyLearningDBdrop table table0create table table0(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table1create table table1(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table2create table table2(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table3create table table3(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table4create table table4(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table5create table table5(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table6create table table6(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table7create table table7(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table8create table table8(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)drop table table9create table table9(dim0 int not null,dim1 int not null,dim2 int not null,dim3 int not null,dim4 int not null,dim5 int not null,dim6 int not null,dim7 int not null,dim8 int not null)

LearningDB.py程序如下:

''' LearningDB类 功能:定义数据库类,包含一个学习函数learn_data和一个识别函数identify_data 作者:PyLearn 博客: http://bo_table.currentIndex() #弹出确认对话框 qbox = QMessageBox() qbox.setIcon(QMessageBox.Information) qbox.setWindowTitle("请确认") qbox.setText("学习数字 %d ?" % learn_num) qbox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) qbox.setDefaultButton(QMessageBox.No) qbox.button(QMessageBox.Yes).setText("是") qbox.button(QMessageBox.No).setText("否") reply = qbox.exec() #判断对话框结果,执行程序 if reply == QMessageBox.Yes: learn_result = False learn_dim = self.get_pos_xy() if learn_dim: learn_result = self.learn_db.learn_data(learn_num, learn_dim) else: print('get_pos_xy()函数返回空值') return None if learn_result: QMessageBox.about(self, "提示", "学习成功!") else: QMessageBox.about(self, "提示", "学习失败!") else: return None def btn_recognize_on_clicked(self): #如果没有进行绘画,警告后退出 if not self.pos_xy: QMessageBox.critical(self, "注意", "请先写入您要识别的数字!") return None else: recognize_num = 0 recognize_dim = self.get_pos_xy() if recognize_dim: recognize_num = self.learn_db.identify_data(recognize_dim) else: print('recognize_dim为空') return None self.label_output.setText('%d' % recognize_num)

5.最后的main主函数

''' 主函数main 功能:生成Learning对象,进入主循环 作者:PyLearn 最后修改日期: 2017/10/18'''import sysfrom PyQt5.QtWidgets import QApplicationfrom Learning import Learningif __name__ == '__main__': app = QApplication(sys.argv) py_learning = Learning() py_learning.show() sys.exit(app.exec_())

将以上4个程序放在同一个目录下,直接执行main.py就行了。

运行界面如下:

学习数字4:

第一次运行需要全部学习至少一次才能有一点正确率。

识别3:

以上这篇Python3实现简单可学习的手写体识别(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章