铁甲小宝 发表于 2020-8-18 15:04:21

LattePanda&AI-手写数字识别

# LattePanda&AI-手写数字识别
## 概述
数字识别(Digit Recognition),是计算机从纸质文档,照片,或其他来源接收和理解并识别可读的数字的能力,具有很大的实际应用价值,例如手写数字识别可以应用在银行汇款单号识别中,以极大的减少人工成本。

本项目中我们将在LattePanda上,使用JupyterLab编写手写数字识别程序,实现在触摸屏上手写数字0~9,就能被程序准确识别出来的效果。

https://www.bilibili.com/video/BV1Ui4y1M7kb/

## 项目基础
识别手写字
### 硬件准备:
AI主控:LattePanda
输入输出设备:5英寸显示屏、键盘、鼠标
### 程序编写:
1、双击桌面上的“startpage.sh”,打开JupyterLab,切换到“home/lattepanda/桌面/LattePanda&AI项目实战/”目录下,如下图,检查一下项目必需的3个文件;

2、双击“LattePanda&AI-手写数字识别”,进入该文件夹:

- 可编辑执行程序——扩展名为“.ipynb”,JupyterNotebook下的python程序文件,运行该程序可实现项目效果
- 模型文件——扩展名为“.h5”,由训练程序得来,提取不同手写数字图片的特征来建立对应的模型。当运行项目程序对未知手写数字进行识别时,程序会提取未知手写数字的特征,再与模型进行匹配,最终实现识别效果
- 程序调用文件——python程序,可编辑执行程序的一些底层逻辑封装,项目程序需要调用它才能正常运行

3、双击打开“手写数字识别.ipynb”;

##### 样例代码:



#导入同目录下的手写数字识别文件
from handwriteDigitRecognition import *

#调用同目录下已经训练好的模型文件
model, _ = Model.load("手写数字识别")

#初始化识别状态为假
predictOnce = False

#窗口的标题栏名称
screen = Screen("手写数字识别")

#定义“清除”函数,该函数通过for循环遍历每一个黑色块
def buttonClearCallback():
    for canvas in canvases:
      canvas.clear()

#设置“清除”按键的位置和大小,背景色为白色,字体颜色为黑色,按下该按键能调用“清除”函数
buttonClear = screen.createButton(700, 0, 100, 50, "清除" , buttonClearCallback, bg = (255,255,255), color = (0,0,0))

#设置设别结果的位置和大小,背景色为白色,字体颜色为黑色
buttonResult = screen.createButton(0, 0, 300, 50, "手写数字:" , None, bg = (255,255,255), color = (0,0,0))

#6个用于手写数字的黑色块,设置位置和大小
canvases = *6
canvases = screen.createCanvas(60, 50, 200, 200)
canvases = screen.createCanvas(280, 50, 200, 200)
canvases = screen.createCanvas(500, 50, 200, 200)
canvases = screen.createCanvas(60, 270, 200, 200)
canvases = screen.createCanvas(280, 270, 200, 200)
canvases = screen.createCanvas(500, 270, 200, 200)

#定义“识别”函数,该函数设置识别状态为真
def buttonRecogCallback():
    global predictOnce
    predictOnce = True

#设置“识别”按键的位置和大小,背景色为白色,字体颜色为黑色,按下该按键能调用“识别”函数
buttonClear = screen.createButton(600, 0, 100, 50, "识别" , buttonRecogCallback,
                                  bg = (255,255,255), color = (0,0,0))

#打开手写数字交互窗口,按下“Q”键退出窗口
if_run = 1
while (if_run == 1):
   
    #如果“识别”按键被按下,通过for循环对每个黑色块内手写字进行识别处理,将识别结果依次显示出来
    if predictOnce:
      predictOnce = False
      buttonResult.txt = "识别结果:"
      for cavas in canvases:
            buttonResult.txt += str(Model.predict(model, cavas.get()))
   
    #打开与显示交互窗口,如果按下Q键,将无法进入下一次while循环
    if screen.show():
      if_run = 0
      screen.quit()

4、运行程序,当执行到最后一个单元格时,会弹出如下交互窗口;

5、在黑色块中触摸写入数字,
*手写时应保证鼠标不被移动。

写完后触摸“识别”,会在窗口左上角显示识别结果,

6、触摸“清除”会擦除黑色块中的手写数字;

7、按键盘上的“Q”键可退出交互窗口。
## 项目进阶
https://www.bilibili.com/video/BV1c64y1F7hr/

### 交互窗口
如图,我们通过代码中的参数控制交互窗口的显示界面,因此,你可以根据需要调整这些参数以更改或添加交互窗口的背景颜色、文字内容、文字位置大小、手写区域位置大小及数量......

样例代码:


#导入同目录下的手写数字识别文件
from handwriteDigitRecognition import *

#调用同目录下已经训练好的模型文件
model, _ = Model.load("手写数字识别")

#初始化识别状态为假
predictOnce = False

#窗口的标题栏名称
screen = Screen("手写密码录入系统")

#定义“清除”函数,该函数通过for循环遍历每一个黑色块
def buttonClearCallback():
    for canvas in canvases:
      canvas.clear()

#设置“清除”按键的位置和大小,背景色为白色,字体颜色为黑色,按下该按键能调用“清除”函数
buttonClear = screen.createButton(700, 0, 100, 50, "清除" , buttonClearCallback, bg = (255,255,255), color = (0,0,0))

#设置设别结果的位置和大小,背景色为白色,字体颜色为黑色
buttonResult = screen.createButton(0, 0, 300, 50, "请写入密码:" , None, bg = (255,255,255), color = (0,0,0))

#6个用于手写数字的黑色块,设置位置和大小
canvases = *8
canvases = screen.createCanvas(40, 50, 150, 150)
canvases = screen.createCanvas(230, 50, 150, 150)
canvases = screen.createCanvas(420, 50, 150, 150)
canvases = screen.createCanvas(610, 50, 150, 150)
canvases = screen.createCanvas(40, 270, 150, 150)
canvases = screen.createCanvas(230, 270, 150, 150)
canvases = screen.createCanvas(420, 270, 150, 150)
canvases = screen.createCanvas(610, 270, 150, 150)

#定义“识别”函数,该函数设置识别状态为真
def buttonRecogCallback():
    global predictOnce
    predictOnce = True

#设置“识别”按键的位置和大小,背景色为白色,字体颜色为黑色,按下该按键能调用“识别”函数
buttonClear = screen.createButton(600, 0, 100, 50, "完成" , buttonRecogCallback,
                                  bg = (255,255,255), color = (0,0,0))

#打开手写数字交互窗口,按下“Q”键退出窗口
if_run = 1
while (if_run == 1):
   
    #如果“识别”按键被按下,通过for循环对每个黑色块内手写字进行识别处理,将识别结果依次显示出来
    if predictOnce:
      predictOnce = False
      buttonResult.txt = "计算机密码录入:"
      for cavas in canvases:
            buttonResult.txt += str(Model.predict(model, cavas.get()))
   
    #打开与显示交互窗口,如果按下Q键,将无法进入下一次while循环
    if screen.show():
      if_run = 0
      screen.quit()

运行效果:






三春牛-创客 发表于 2023-8-23 21:47:58

厉害厉害

三春牛-创客 发表于 2023-8-23 21:49:00

赞赞赞赞赞!

花生编程 发表于 2023-8-24 14:18:20

厉害厉害

花生编程 发表于 2023-8-24 14:19:24

不错不错
页: [1]
查看完整版本: LattePanda&AI-手写数字识别