时间:2024-05-18
冯超
摘 要 手写体数字识别系统具有广泛的应用场景。文章描述了一种把稀疏自编码器无监督学习得到的权值矩阵应用于卷积神经网络,利用提取的特征训练分类器,并将权值系数矩阵写入ARM Cortex-M4,实现了手写体数字实时识别系统的教学实验案例。
关键词 手写体数字识别 卷积神经网络 稀疏自编码器 Cortex-M4
中图分类号:TP389.1 文献标识码:A DOI:10.16400/j.cnki.kjdk.2021.12.010
Abstract Handwritten numeral recognition system has a wide range of application scenarios. This paper describes a method of applying the weight matrix obtained from unsupervised learning of sparse self encoder to convolutional neural network, and using the extracted features to train the classifier,And the weight coefficient matrix is written into arm cortex-m4 to realize the teaching experiment case of handwritten numeral real-time recognition system.
Keywords handwritten numeral recognition; convolutional neural network; sparse autoencoder; Cortex-M4
0 引言
深度学习在计算机视觉、自然语言处理等领域广泛应用。在应用过程中,通常需要复杂的数据预处理,包括人工提取特征。对于图像处理,提取的特征具有明显的含义。本文采用不直接训练卷积神经网络,而是通过稀疏自编码器无监督学习得到的权值矩阵作为稀疏自编码器的卷积滤波器得方法,从而间接确定卷积神经网络的参数。本文介绍的小型嵌入式系统由两个部分组成,一个部分是开发板模块,另一部分是摄像头模块。开发板模块使用的是德州仪器Tiva C系列TM4C1294的开发板。其中,MCU的内核是ARM Cortex-M4 CPU,具有1MB闪存、256KB SRAM,频率可达120MHz。
1 识别系统的构成及其工作原理
1.1 CCD摄像头
摄像头模块包含三个部分、摄像头、电池、信号采集和二值化电路。摄像头采用SONY CCD,感光面积4.8mm?.6mm,信号制式为PAL制,水平清晰度420线,工作电压为12V。采集和二值化电路用于把摄像头输出的信号转化为二值化的信号,方便使用GPIO口采集。
摄像头的输出经过二值化处理,通过单片机的GPIO口可直接读取。
图像的传输通过行信号和场信号进行。场信号代表一副图像传输的开始, 行信号代表每一行像素传输的开始。行信号和场信号到达时,模块会输出一个脉冲,可用上升沿或下降沿的外部中断来捕捉,并进行图像的采集。
1.2 Tiva采集摄像头数据工作原理
图像采集时当每一个场信号到达之后,会有一小段时间摄像头的输出不包含图像信息(全为高电平或全为低电平),即场消隐区。每一个行信号到达之后,会有一小段时间摄像头的输出不包含图像信息,即行消隐区。图像采集通常有两种方法:a、使用for循环延时采集;b、使用场中断和行中断的DMA传输。
具体实现步骤:等待场中断信号到达;场中断信号到达后,把当前行数置为0,开启行中断;每一次行中断信号到达,利用for循环,通过GPIO口采集,当前行数增加;图像采集完成后,关闭行中断,等待场中断信号等。
本实验案例采用的LCD触摸屏型号是EB-LM4F120-L35,包含3.5英寸QVGA TFT液晶屏。显示驱动芯片SSD2119。该模块通过2个20 pin接插件同开发板连接。Tiva MCU支持Grlib图形库,通过这套完整得图形显示方案,可以快捷开发常见的、基于消息的控件(Widget)来实现图形、文字绘制。该图形库主要分为三部分,分别是:a、控件层(Widget),用于绘制显示屏上的用户界面元素,响应用户与元素的交互;b、基本图形层(Graphics Primitives Layer),用于绘制如线条、圆形、文字等;c、显示驱动层(Display Driver Layer),该层主要跟硬件相關,提供了同物理硬件通信的基本功能。
应用程序可以在这三个层中的任何一层调用API,可以使用widgets,也可以直接使用基本图形。显示驱动层实现了Grlib与LCD屏传输数据,比如背光控制和对比度控制等。显示驱动程序由tDisplay结构体来描述。在存储单元中开辟一个缓冲区,然后将该结构体原型复制到该缓冲区中,当所有绘图操作完成后,将结果显示在屏幕上。其中显示缓冲区的每个字节有两个像素,写单个像素需要读写该缓冲区内存各一次。而Flush()函数用于将本地显示缓冲区数据复制到LCD屏上显示。
Widget用于LCD屏上的图形元素的渲染以及响应用户的输入。每个Widget对应一个消息处理程序,响应一组通用消息。例如,WIDGET_MSG_PAINT消息被发送,以请求Widget在屏幕上开启绘图。Widget以树形结构组织。树结构允许以受控的方式进行消息传递。每条消息都会根据消息的语义,以自上而下或自下而上的顺序创建。Widget可以在运行时通过调用函数来创建,也可以在编译时通过使用全局结构来创建。
在实验代码工程中添加Tivaware驱动库和图形库,分别在driverlib和grlib下。tDisplay结构体重命名为 “SSD2119”并添加Kentec320x240x16_ssd2119_8bit.c到工程中,将Kentec320x240x16_SSD2119Init函数放在系统时钟配置后,用于初始化显示驱动。
GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119)完成初始化。sRect.i16XMin、sRect.i16YMin、sRect.i16XMax和sRect.i16YMax分别定义数字显示范围。GrContextForegroundSet函数设置在指定的绘图上下文中用于绘图的颜色。实现准备好数字0到9的图片文件,以头文件形式包含在工程中,当摄像头识别出是哪个数字,就在LCD屏上显示该数字对应的图片,主要用到的函数有:GrContextForegroundSet;GrRectFill;GrStringDrawCentered。
2 识别系统关键算法
2.1 自编码器
自动编码器是前馈神经网络的一种特殊类型,其中输入与输出相同。将输入压缩成一个较低维度的代码,然后从这个代码中重建输出。该代码是对输入的压缩。一个自编码器通常由三个部分组成:编码器、编码和解码器。编码器对输入进行压缩并产生编码,解码器通过编码对输入进行重建。构造自编码器时需要定义编码方法,解码方法,以及将输出与目标进行比较的损失函数。自编码器主要是一种降维(或压缩)算法。自编码器只能够有效地压缩与它们所训练数据相似的数据。由于自编码器学习的是给定训练数据的特定的特征,因此它们与其他标准数据压缩算法不同。同时,算法有损的压缩。自编码器的输出不会和输入的完全一样,得到的是一个接近的,但性能会有劣化的数据表示。最后,自编码器是无监督的。训练一个自编码器,将原始输入数据输入即可。所以自编码器是一种无监督的学习技术,因为它们不需要确定的标签来进行训练。自编码器从训练数据中生成所需要的标签,从这个角度讲,是自监督的学习方式。
2.2 卷积神经网络
卷积神经网络(Convolutional Neural Network 简称 CNN)是一种广泛应用于语音识别、 图像识别、自然语言处理等领域的神经网络结构。CNN和传统神经网络相比有权值数量少、网络结构对平移和比例缩放等变形有高度不变形等特点。CNN网络结构输入数据经卷积滤波得到C1层,再通过降采样得到S1层,依此类推,这一过程起到特征提取的作用。网络的最后一层是把提取到的特征作为另一个神经网络的输入,用于分类、回归等任务。
卷积操作的目的是提取特征。卷积滤波器在原始图像上按照特定步长遍历进行卷积操作,得到的结果称为特征图(Feature Map)。
降采样又称为池化(Pooling),目的是降维,本质上是使用特殊的卷积滤波器对图像进行卷积操作,卷积的步长和卷积滤波器的边长相等,即保证卷积过程中不出现重叠(同一个像素点只被卷积一次)。通过使用不同的卷积滤波器,可以进行不同类型的降采样,比如取均值、取最大值等。降采样通过降低特征图的分辨率来增加特征提取过程中对特征的平移、缩放等变化的容忍能力。
传统神经网络中,各层间的节点是全连接的,对于大型图像来说,由于权值过多导致网络难以训练。而卷积神经网络通过局部连接和权值共享,大大降低了整个网络的权值个数。
卷积神经网络在进行卷积时,输入层和隐层部分连接,每个节点对应图像的一个小区域,称为局部感受域,而权值共享的含义是,对同一个卷积滤波器,所有局部感受域的权值是相同的。若图像大小为200?00,隐层神经元个数为400个,那么全连接的传统神经网络将会得到1600万个连接权值。对于卷积神经网络,假设每个神经元对应原始图像上10乘10的小区域,即每个神经元和输入层的连接权值有100个。每个神经元和局部感受域连接的神经元权值是共享的,所以总权值个数为100。
2.3 手写体数字图像识别
实验案例使用的数据是常用的MNIST数据集,训练集数据包含了60000张20?0的手写体数字图片及对应的标签,测试集数据包含了10000个20?0的手写体数字图片和对应的标签。读取图片数据后,把原始图像进行扩展,得到20?0的新图像,原始图像在新图像中的位置随机选取。
实验案例步骤如下:
a.选取卷积滤波器对输入图像进行卷积操作,得到FeatureMap1,共使用25个卷积滤波器,所以FeatureMap1包含了25个特征图
b. 对FeatureMap1 进行降采樣,即FeatureMap2
c. 把Feature Map2展开为神经网络输入
d. 正向传导,作出预测
选取良好的特征提取能力的卷积滤波器对于卷积神经网络的特征提取至关重要,稀疏自编码器对小块图像进行无监督学习得到的特征是图像的边缘,所以认为把稀疏自编码器训练结果作为卷积滤波器,对图像的边缘特征有提取的作用。
分类器中需要训练的参数是神经网络的输入和输出之间的连接权值,采用Softmax分类,对数字0到4进行分类,数字5到9用于稀疏自编码器的训练。
2.3.1 稀疏自编码器的训练
首先对参数进行了初始化,指定了学习率和batch大小为32。下载数据集并对图像数据进行变换。get_device() 函数可以在自编码器神经网络模型的训练过程中选择使用CUDA GPU设备或CPU进行计算。将图像调整尺寸为28x28x1并保存。训练包含稀疏度惩罚的自编码器神经网络,首先,自编码器网络的编码器部分包含五个编码器层,每个MNIST图像784个像素,32个in_features和16个out_features。不断增加神经元的数量。最终达到784个out_features。使用forward()函数实现自编码器神经网络的真正编码和解码功能。当编码和解码发生时,所有的编码器和解码器神经网络层都会经过ReLU激活函数。接下来,初始化SparseAutoencoder()模块并将其加载到计算设备上。对于损失函数,案例使用MSELoss,优化器是Adam,学习率设置为0.001。在模型参数通过ReLU激活函数后,稀疏度才会被计算出来。通过定义一个sparse_loss()函数,将自动编码器模型和图像作为输入参数。然后计算图像通过模型参数和ReLU激活函数后的稀疏度损失。接下去分别调用fit()和validate()。fit()函数需要三个参数,即自编码器模型、数据加载器和当前的epoch数。running_loss则计算每个batch的loss。通过调用sparse_loss函数,计算最终的稀疏度约束。每5个epochs保存训练好的重建图像。最后返回epoch_loss值。训练的模型以头文件形式包含在Tiva单片机的工程中实现部署,最终部署实验结果如图1。
3 结论
文章介绍了用低成本MCU开发神经网络的实验案例。以往神经网络在终端边缘侧运行,对硬件通常有一定性能要求,但是随着传统单片机的硬件性能的逐步提升,乘累加单元即相关指令一定程度上可以用于神经元计算,因此单片机的专用乘加指令跟神经元具有一定契合性。利用低成本MCU进行AI教学,阐述神经网络的基本原理是有一定意义的。该实验案例对传统的MCU教学是一个有益补充,PC完成模型训练,MCU实现模型部署,软硬结合的方式,从而实现从训练到部署完整的AI流程,对教学有着借鉴意义。
基金项目:教育部高等教育司2019年第一批产学合作协同育人项目(项目编号: 201901115005));2019年福建省本科高校一般教育教学改革研究项目(项目编号:FBJG20190191)
參考文献
[1] 杨迪,黄盼盼,夏志勇,沈森.基于ARM手写数字识别系统[J].山西电子技术,2018(5):22-24.
[2] 刘文杰,吴刚.基于ARM9的手写体数字识别技术设计与实现[J].计算机与数字工程,2013,41(9):1498-1450.
[3] Luca B.Saldanha,Christophe Bobda.An embedded system for handwritten digit recognition[J].Journal of Systems Architecture,v61,n10,p693-699,November 1,2015.
[4] 涂朴,黄晨.基于Tensorflow深度学习框架的手写体数字识别模型优化及应用[J].自动化技术与应用,2020,39(12).
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!