6、手写数字识别实验
About 3 min
例程代码
import sensor, image, time, lcd
from maix import KPU
import gc
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
sensor.skip_frames(time = 100)
clock = time.clock()
kpu = KPU()
kpu.load_kmodel("/sd/KPU/mnist/uint8_mnist_cnn_model.kmodel")
while True:
gc.collect()
img = sensor.snapshot()
img_mnist1=img.to_grayscale(1)
img_mnist2=img_mnist1.resize(112,112)
img_mnist2.invert()
img_mnist2.strech_char(1)
img_mnist2.pix_to_ai()
out = kpu.run_with_output(img_mnist2, getlist=True)
max_mnist = max(out)
index_mnist = out.index(max_mnist)
score = KPU.sigmoid(max_mnist)
if index_mnist == 1:
if score > 0.999:
display_str = "num: %d" % index_mnist
print(display_str, score)
img.draw_string(4,3,display_str,color=(0,0,0),scale=2)
elif index_mnist == 5:
if score > 0.999:
display_str = "num: %d" % index_mnist
print(display_str, score)
img.draw_string(4,3,display_str,color=(0,0,0),scale=2)
else:
display_str = "num: %d" % index_mnist
print(display_str, score)
img.draw_string(4,3,display_str,color=(0,0,0),scale=2)
lcd.display(img)
kpu.deinit()
实验准备
- 请先将模型文件导入TF卡上,再将TF卡插入到K210模块的TF卡插槽上。具体操作步骤请参考:传输模型文件到TF卡。
- 通过usb线将K210与电脑连接。
- 打开CanMV IDE,执行上面的例程代码。
实验结果
- 等待系统初始化完成后,LCD显示摄像头画面,将摄像头拍摄自己手写的数字或打印的数字,屏幕左上角会显示当前识别到的数字。
![](/assets/img/intelligence/K210/K210_6_25.png)
- IDE中的串行终端会打印识别到数字信息。
![](/assets/img/intelligence/K210/K210_6_26.png)
- K210模块可以识别手写的数字和打印的数字,由于模型训练采用的是白底黑字,所以请使用白底黑字素材,如果背景太乱,或者数字太小,可能会出现误识别的情况。
例程代码讲解
- 导入相关库,并初始化摄像头和LCD显示屏,加载模型文件:/sdKPU/mnist/uint8_mnist_cnn_model.kmodel。
kpu = KPU()
kpu.load_kmodel("/sd/KPU/mnist/uint8_mnist_cnn_model.kmodel")
- 新建while循环读取摄像头画面,然后复制一个112*112大小的画面,对像素进行取反等处理,再将图像传入KPU里进行计算,与模型文件做运算,最终得到最优识别结果和识别分数。
while True:
gc.collect()
img = sensor.snapshot()
img_mnist1=img.to_grayscale(1)
img_mnist2=img_mnist1.resize(112,112)
img_mnist2.invert()
img_mnist2.strech_char(1)
img_mnist2.pix_to_ai()
out = kpu.run_with_output(img_mnist2, getlist=True)
max_mnist = max(out)
index_mnist = out.index(max_mnist)
score = KPU.sigmoid(max_mnist)
- 由于识别的数字有可能会出现误识别的问题,请尽量在白色背景下识别。接下来进行过滤,根据实际测试出来的结果,背景全白的情况下,会误识别成数字1,背景全黑的情况下,会误识别成数字5。所以单独对识别到数字1和数字5进行额外分析,如果识别分数大于0.999才认为是对应的数字,反正就认为没有识别到数字。其中0.999可以根据实际识别效果做调整。最终将识别到的数字显示
在屏幕上。
- 由于识别的数字有可能会出现误识别的问题,请尽量在白色背景下识别。接下来进行过滤,根据实际测试出来的结果,背景全白的情况下,会误识别成数字1,背景全黑的情况下,会误识别成数字5。所以单独对识别到数字1和数字5进行额外分析,如果识别分数大于0.999才认为是对应的数字,反正就认为没有识别到数字。其中0.999可以根据实际识别效果做调整。最终将识别到的数字显示
if index_mnist == 1:
if score > 0.999:
display_str = "num: %d" % index_mnist
print(display_str, score)
img.draw_string(4,3,display_str,color=(0,0,0),scale=2)
elif index_mnist == 5:
if score > 0.999:
display_str = "num: %d" % index_mnist
print(display_str, score)
img.draw_string(4,3,display_str,color=(0,0,0),scale=2)
else:
display_str = "num: %d" % index_mnist
print(display_str, score)
img.draw_string(4,3,display_str,color=(0,0,0),scale=2)
lcd.display(img)