基于FPGA和CNN的汉字识别系统的设计与实现
2019-09-13潘思园
潘思园,王 永,黄 鲁
(中国科学技术大学 微电子学院,安徽 合肥 230026)
0 引 言
近年来根据研究表明,神经网络能够在许多领域中执行各种任务,包括图像识别、音频和视频处理与分析等。用于计算机视觉的大多数现代神经网络架构都包括卷积层,因此其被称为卷积神经网络(CNN)。CNN具有高计算要求,深度神经网络对计算要求更高。在移动设备和嵌入式系统[1]中同样需要使用深度卷积神经网络,如自动驾驶汽车[2]、医疗设备中的视频处理[3]等。这就需要高精度和实时物体识别的能力。然而CPU通常不够快,FPGA相较CPU有更快的处理速度,是用硬件加速CNN的最佳选择。目前在FPGA上搭建的文字识别的系统有:基于BP神经网络的FPGA实现[4]和基于循环切分法的FPGA实现[5],但前者的参数量过多,速度较慢,后者的准确度不高。
本文基于高性能CNN-VGG16[6]进行较大调整和改进,在TensorFlow框架下训练出成熟汉字识别CNN网络,其准确率高达98.36%。同时,通过卷积核复用、浮点数定点化等硬件化方法,将CNN前向通道搭建到FPGA上。最后,在FPGA上输入待识别的汉字得到判断结果。该网络速度相较于CPU提高了6.76倍,并取得了几乎无损的97.58%的正确率。
1 CNN的搭建和训练
1.1 数据集准备
选取casia中文手写数据库[7]用于文中的训练和测试。如表1所示,casia数据集是由模式识别国家重点实验室分享,来源于300余人书写的用于评估标准特征的机器学习和分类算法的中文手写数据集。其中离线手写数据集为HWDB1.0和HWDB1.1,在线手写数据集为OLHWDB1.0和OLHWDB1.1。选取离线手写数据HWDB1.1中的20个汉字,分别为:一,二,三,四,五,六,七,八,九,十,东,南,西,北,上,下,左,右,万,丈。
表1 casia数据集
为了使该网络对真实的摄像头图片更加友好,这里将ov5640采集的图片也加入到数据集进行该网络训练。每个汉字一共拍摄了50张,并对图片进行颜色反转、旋转、随机添加0%~10%的噪音等方法进行数据增强。把320×240的图片缩放为32×32再放进神经网络一起训练,使得训练出的网络更加适应真实环境。采集图片与数据集图片对比如图1、图2所示。
图1 ov5640采集图片
图2 数据集图片
1.2 模型搭建训练结果
经过反复训练与结构改进,最终确定的CNN模型如图3所示。此CNN结构共有一个输入层、六个卷积层、一个全连接以及一个输出识别结果的softmax分类层。网络全部采用3×3的卷积核。最后一层采用全局池化,其余层均采用2×2最大池化核。由于卷积核可以扩大通道数,池化可以缩小特征图的大小,可以在模型架构搭建得更深的同时,放缓计算量的增加,并且获得更大的感受野。每一层的尺寸和计算参数如表2所示,可以看出90%以上的计算量都集中在卷积层。由于在最后一层的卷积层后面加入全局池化,所以大大降低了全连接层的参数。
图3 CNN网络模型结构
网络层输出尺寸参数数量权重/bias各层计算量/FLOPSinput32×32×1——conv132×32×872/873 728conv232×32×8576/8589 824pool116×16×8——conv316×16×161 152/16294 912conv416×16×162 304/16589 824pool28×8×16——conv58×8×324 608/32294 912conv68×8×329 216/3258 824global_max_pooling1×1×32——dense21672/21672Softmax21——总计—18 600/1332 433 696
通过使用TensorFlow来进行网络训练,设置学习率learning rate为0.001,并且选择SGD优化器算法。经过200次迭代训练后,最终可以实现98.36%测试集准确率,模型的准确率如图4所示。
图4 模型准确率
1.3 定点计算实施
通常,在CPU上搭建的神经网络均采用浮点数进行计算。当在硬件上实现时,由于难以控制浮点数的尾数和各种操作的指数,通常采用定点数进行计算。
考虑到本网络第一层卷积,输入是二维矩阵32×32,其值为[0;1)(对原始图片进行归一化处理后)。对于3×3卷积,第二层中某个特征值(i,j)可以如下计算:
(1)
由于权重ωi,j和偏差b已知,可以得到第二层输入的最小值(mn)和最大值(mx)。设M=max(|mn|,|mx|)。将ωi,j和b除以M,则对于任意输入数据,可保证第二层上的值不超过1,称M为卷积层的缩减系数。对于后面的每一层,都使用相同的方法,即可保证神经网络每一层输入的值始终∈[-1;1],每一层的衰减系数见表3。
表3:每一层最大值和最小值及衰减系数
最后一层加入的是Softmax[8]函数,公式如下:
(2)
虽然在过程中对权值的大小进行了改变,进而改变了最后的输出,但由于最后的分类函数是Softmax,因而最后一层神经元大小的相对位置没有改变,所以不影响最终的输出结果。
在对每一层执行以上缩减方法之后,可以确切地知道每一层值的范围,即可以从浮点运算转移到定点运算,可以用xb=[x×2N],来表示每一位对应的值。设z=x+y,那么加法可以表示为:
(3)
乘法可以被表示为:
(4)
将乘法结果除以2N,可以得到实际的值,硬件实现为将它移动N位(取高N位),对应的硬件电路如图5所示。
图5 定点化硬件电路
N为数据位宽,M为最大卷积核的尺寸,这里为9(3×3)。
使用带卷积块的定点计算时,有两种不同的方法:
(1)在每次加法和乘法的基本运算后舍入;
(2)在每层卷积运算后进行全精度计算和舍入。
实验对比后发现,在每层卷积运算后舍入会取得更高的准确度和更低的功耗。因此,本文最终选择在卷积运算最后进行全精度的计算和舍入。
不同权重位宽[9-10]对应的准确率如图6所示,在充分考虑识别精度和定点位宽资源消耗之后,文中最终确定11 bit的数据。相对于32 bit的浮点数,模型参数的储存量可以下降到原来的0.34。
图6 不同权重精度对应的准确率
即该定点化方法处理后的网络与浮点数的网络等效工作,但定点化后的网络参数量和计算量均大大减少,数据带宽和计算效率显著提高,更利于硬件实现。
2 CNN硬件设计及实现
2.1 系统框图
CNN前向通道在FPGA上搭建的整体流程如图7所示,相机拍摄的照片由图像采集模块采集,并将图像信息存储到DDR3中。从320×240的图像中裁剪出224×224像素的中心部分,进而得到需要的图像尺寸32×32。224×224的图像被分成7×7块,计算这些块中的每一个平均值,并在32×32图像中形成对应的像素。图像降采样算法简单,降采样后精度并无损失,并能将图像裁剪到合适尺寸。
图7 数据流程图
2.2 卷积神经网络加速器硬件实现
卷积神经网络加速器设计如图8所示,主要包括处理单元(CU)、片上缓冲(database)、卷积层、池化层、全连接层、激活函数(ReLU)和控制数据流的状态机(FSM)。CU是加速器的基本单元。图像数据存放在外部DDR中,经过预处理缩放到32×32再送进加速器计算。由于FPGA片上资源有限,卷积计算中间的特征图需要先缓存于片上Buffer中,再送进CU。这里使用双Buffer来实现流水线操作,提高数据计算效率。
由Memorycontrol模块控制卷积计算的输入数据和输出数据的缓存。状态机(FSM)控制不同模块的调用,来保证卷积核的复用。最后通过一个ReLU函数实现该卷积层的输出。
图8 神经网络加速器框图
卷积单元(CU)的硬件实现如图9所示。其中包含9个PE,PE的功能是把输入一个特征值和权重系数相乘同时通过D触发器将该特征值传递给下一个PE单元。在不使用乘法时通过EN_ctrl信号把乘法器关掉从而节约功耗。
在3×3的卷积运算中权重数据解码后输入到CU,特征数据通过FIFO输入到卷积单元中,对应执行9次乘法运算后,将得到的9个值进行加法运算求得这一部分的和,作为输出。
图9 CU模块硬件实现
2.3 硬件优化
(1)权重复用
在执行卷积运算时要用到乘法器和加法器,并不停地读写特征数据,过程中将消耗大量的资源。为了提高整体速度,降低资源消耗,本文提出如图10所示的卷积核复用。由于网络中卷积核大小均为3×3且结构不算复杂,会提升网络整体速度。同时,采用卷积核复用,降低资源消耗。
图10 卷积数据流
(2)移位寄存器
为执行卷积运算,需要从输入图像获得9个相邻像素的值,在下一次获得的9个像素中,有6个像素已经在前一步骤中被接收(参见图11)。为了缩短数据调用的时间,本文开发移位寄存器以将新数据保持在其输入端并同时让旧数据退出。因此,每个步骤只需要3个新值而不是9个。
图11 移位寄存器操作
(3)卷积核权重拼接
当调用计算所需的数据时,每个值在调用时都会占据一个时钟周期。为了提高数据访问的便利性,在放入RAM之前,数据以9个块的形式堆叠,之后可以在一个同地址访问它们。利用这种存储方式,可以在一个时钟周期内执行9个权重数据的读取,从而加速卷积和全连接层的计算(参见图12)。
图12 卷积核权重拼接
Modelsim仿真的波形如图13所示,w11~w19表示权重数据,p11~p19表示图像数据。从图中可以看出,在一段时间内权重数据没有变化而特征数据不断改变。说明网络在执行时采用权重复用,提高了数据带宽,降低了数据频繁读写所带来的额外功耗。
图13 Modelsim仿真图
3 系统测试与分析
3.1 实验环境
本实验使用黑金Sparten6开发板AX545,AX545采用的是Xilinx的Spartan6系列XC6SLX45-2CSG324的FPGA作为核心处理器,具有丰富的硬件资源和外围接口。它使连接外围设备更容易;开发板板载了一片高速DDR3 DRAM,256 MB(128 M×16 bit),可用于存储输入图像信息。电路板本身具有2.09 MB的RAM,可用于存储神经网络的权重。
本文通过摄像头采集实际手写汉字来进行检测,并将实验结果与CPU实现进行对比。汉字识别的最小速度应该超过30 FPS,即神经网络应在33 ms内处理单个图像。硬件开发平台如图14所示。
图14 硬件平台
3.2 实验结果
实验结果展示在图15中,成功识别出的汉字对应的标签显示在LCD右下角。每个汉字选取50个样本,测试结果如表4所示,识别率均在94%以上。
图15 实验结果展示
汉字样本正确识别率/%汉字样本正确识别率/%东504896一5050100南504794二504998西504998三504896北504794四504896上504998五504896下504896六504998左504794七504794右504794八504794万504896九504896丈504896十504998
整个电路工作在100 MHz的时钟频率下,项目的资源消耗见表5。从表中可以看出在满足实时性要求的同时,DSP资源消耗93.1%,RAM使用率为84.5%。在计算中所需的乘法器和特征图存储空间,是二者消耗较大的主因。
表5 FPGA资源使用情况
表6是FPGA实现与CPU实现的速度和功耗对比。功耗由Xilinx Power Estimator(XPE)工具获取。从中可以看出,识别1 000幅图片,FPGA耗时为9.33 s,CPU耗时为72.43 s,速度提高6.76倍;FPGA功耗为 76.32 W,仅为CPU的26.28%。
表6 速度及功耗对比
4 结论
本文提出了基于FPGA的CNN汉字识别系统的设计和实现,其采用定点计算、卷积核分时复用等硬件优化方法,在结构简化、速度相较CPU提升近7倍的同时,达到几乎无损的97.58%的正确率。由于参数数量较少,本文避免了内存带宽的常见问题,在FPGA资源允许的情况下,将在今后的工作中搭建更为复杂的神经网络。