人们在生产和生活中,要处理大量的文字、报表和文本。为了减轻人们的劳动,提高处理效率,出现了OCR——光学字符识别技术。这项技术能够将页面上的印刷体或手写体文字识别出来,输出能够直接用文字处理软件编辑的文本文档。那么这节课,我们一起来制作一个能够识别手写数字的作品。
【基础我来学】——使用AI摄像头进行手写数字识别
【任务介绍】
利用AI摄像头进行手写数字识别,实现的效果是:将拍摄到的实时图像显示在屏幕左侧,将预处理后的图像显示在屏幕中间上方区域,并在下方显示识别出的数字及其置信度。
【材料清单】
硬件 AI摄像头、掌中宝、USB数据线、4PIN连接线
软件 mPython
一、摄像头的参数配置,在屏幕上显示拍摄图像
1.首先使AI摄像头连接掌中宝,根据所连接的AI摄像头的引脚,在指令里定义掌中宝串口通信引脚功能。
2.接下来先进行摄像头的初始化,然后设置摄像头输出的帧尺寸,即摄像头的分辨率。例如设置成VGA格式,摄像头输出640*480分辨率的图像;设置成QQVGA,摄像头输出160*120分辨率的图像。对于AI摄像头来说,建议设置为QVGA格式。
3. AI摄像头的屏幕是240*135像素,我们需要在屏幕的左侧区域显示实时拍摄到的数字,例如可以在左侧128*128的方形区域内显示数字。而QVGA图像的分辨率是320*240,因此我们可以借助另外一条“设置窗口大小指令”捕捉部分区域。这条指令的作用是将相机的分辨率设置为当前分辨率的子分辨率。例如摄像头分辨率是QVGA,然后将窗口大小设置为128*128,那么“摄像头拍摄图像指令”将捕捉由相机输出的QVGA分辨率的128*128中心像素。
4.下面设置摄像头的帧格式,也就是像素格式。有两种格式,一种是GRAYSCALE,输出的是每个像素占8位的灰度图,另一种是RGB565,输出的是每个像素占16位的彩色图片。由于我们进行的是手写数字识别,而手写数字识别的数据集采用的是灰度图,因此选择GRAYSCALE格式。
5.为了使摄像头捕捉到的画面和我们看到的数字是一致的,没有上下左右颠倒的情况,还需要将摄像头水平镜像和垂直翻转模式打开。
6.我们会在白纸上写上黑色的数字,让摄像头拍摄进行识别。但拍摄中,可能会遇到各种光源,光源不同,色温也不同,有时拍摄的画面会出现偏色,白平衡就是用来解决这一问题的。白平衡,字面上的理解是白色的平衡,其基本概念是“不管在任何光源下,都能将白色物体还原为白色”,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿。这里我们设置白平衡为开启状态。
7.摄像头配置好以后,就可以将拍摄到的画面显示到屏幕上了。为了更好的显示效果,我们先清空LCD屏幕,这里选择用黑色填充整个屏幕,当然也可以设置成其他颜色。
8.然后新建一个变量img1,将img1设定为摄像头拍摄到的图像,然后用LCD显示图像指令将其显示在屏幕上。将图象显示的坐标设定为(0,0)。然后一直重复执行。
参考程序:
二、基于mnist模型要求的数据类型进行图像处理
1. 我们可以先加载要用到的内置模型mnist,即手写数字识别模型。(这一步并不是图像处理所必须的,只是为了让我们知道要使用哪个模型,并根据这个模型的要求处理图像)
2.前面我们设置的摄像头拍摄到的图像是128*128像素的,而mnist模型允许输入的图像尺寸是28*28,因此需要先将原图像的尺寸变为28*28。我们可以再新建一个变量img2,用它来保存更改尺寸之后的图像。
3.训练mnist模型所用的图像是“黑底白字”的,而我们呈现给摄像头的图像是白底黑字的,因此还需要将缩小后的图像反色。
4.像素反转之后,深灰色的背景和浅灰色的数字之间对比并不明显,因此还需要对图像进一步处理,增大对比度。此外,由于镜头的原因,会出现中间亮四周暗的问题,像素反转之后,四周会变亮,给模型识别带来干扰,因此使用暗角消除进行修正。
5.现在图像的预处理部分就完成了。为了看到处理后的图像是怎样的,我们可以将它显示在屏幕上,坐标设置为(140,0),显示在原图像的右上方。
参考程序:
三、使用mnist模型进行手写数字识别
1.在将图像输入模型运算之前,还需要将图像的像素数据转换成神经网络模型可用的数据。
2.前面已经加载了mnist手写数字识别模型,那么现在就可以使用mnist分类器来进行手写数字的识别了。
3.mnist分类器运算结束后,会返回一个元组,里面有10个数据,分别是0至9这10个数字对应的置信度。置信度最大的一个即为模型识别出的数字。我们在屏幕下方分两行显示识别出的数字,及其置信度。
完整程序:
知识库:
MNIST是一个计算机视觉数据集,它包含7万张手写数字图片,均为分辨率为28*28,黑底白字的8bit灰度图。 其中6万张作为训练集,1万张作为测试集。