基于PYNQ的图像分类识别技术研究与实现
2022-01-09谷文成渠吉庆蒋志鹏孙科学
陈 禹,谷文成,渠吉庆,蒋志鹏,张 瑛,孙科学,2*
(1.南京邮电大学 电子与光学工程学院、微电子学院,江苏 南京 210023;2.射频集成与微组装技术国家地方联合工程实验室,江苏 南京 210023)
0 引 言
人工智能(artificial intelligence,AI)在计算机科学技术高速发展的今天逐渐成为各国的重点研究领域,其发展水平将很大程度决定一个国家的技术战略高度[1]。作为人工智能的一个重要研究领域,图像识别技术起源于20世纪40年代,由于当时基础理论与硬件性能不足未能得到快速发展。到了90年代,支持向量机和人工神经网络的结合促进了图像识别技术的发展,其中卷积神经网络算法的出现使得人脸识别、图像分类、特征提取等领域出现了众多显著的成果[2-5]。
卷积神经网络虽然性能卓越,但由于卷积过程伴随着庞大的计算量,因此对设备的计算能力有很高的要求。现在主流的硬件平台包括CPU、GPU、FPGA和ASIC芯片[6-7],其中CPU拥有很高的灵活性,但由于自身设计架构的局限性,难以支持并行运算从而导致处理效率不足;而GPU价格昂贵,功耗太高,无法应用于嵌入式移动终端[8];专用集成电路(application-specific integrated circuit,ASIC)可以实现计算力和功耗的平衡,但是其定制化的特点导致通用性差、成本高昂且可迁移性低[9];而现场可编程逻辑门阵列(field programmable gate array,FPGA)配置了众多逻辑单元可用于深度学习算法的并行计算,其计算力强、功耗低、开发周期短,在面向嵌入式移动终端的应用场景上可以发挥其独有的尺寸、性能和功耗上的综合优势[10-12],且FPGA由于可重新编程的特点,可以为不同的应用场景提供相应的支持[13-15]。
因此,无论是为了高效地完成人工智能技术的应用,还是为了部署灵活低功耗的嵌入式移动终端设备,基于FPGA平台的系统都可以在保障计算性能的同时控制能耗。文中设计的PYNQ图像分类识别系统一方面可以大幅降低能耗,另一方面可以通过软件操作来实现对不同数据集的分类识别,有效提高系统灵活性,降低部署成本。
1 系统总体设计
首先,对整体系统进行分析,通过软硬件协同设计思路明确功能模块,完成任务划分。在处理系统(process system,PS)部分,通过Jupyter Notebook平台基于Python实现上位机程序二进制特征参数的读取以及对硬件的控制。在可编程逻辑(programmable logic,PL)部分,实现卷积神经网络的模块设计和系统通路搭建。
PYNQ图像分类识别系统能够处理的图像尺寸应在PYNQ有限的片上资源限制下实现灵活处理的设计要求,文中将通过MNIST数据集与CIFAR-10数据集验证系统的通用性,通过Jupyter Notebook开发环境进行系统测试。由于移动端嵌入式平台对系统的可移植性以及整体功耗有较高的要求,因此本系统需要对这两个方面进行针对性设计,其中对于系统功耗的设计要求不高于5 W以满足低功耗设计要求。图像分类识别系统的构成示意图如图1所示。
图1 图像分类识别系统构成示意图
2 卷积神经网络的研究与设计
2.1 卷积神经网络的基本结构
卷积神经网络有前向传播和反向传播两种传播方式,网络结构主要由卷积层(convolutional layer)、池化层(pooling layer)、激活函数层(activation function layer)、Dropout层、批规范化层(batch normalization layer)和全连接层(fully connected)构成[16-17]。其中,卷积层和全连接层主要完成特征提取,而池化层和Dropout的主要目的是防止过拟合现象的出现。
2.2 卷积神经网络的设计流程
图像分类识别系统中需要在电脑端完成卷积神经网络模型的设计与训练,最终处理得到特征参数二进制文件。
(1)针对MNIST数据集的网络设计。
MNIST数据集的输入图片为28*28分辨率的灰度图,网络模型中第一个卷积层应用ReLU激活函数,然后是一个最大池化层。第二个卷积层通过ReLU激活函数和最大池化层对其进行处理,最后使用两个全连接层处理。MNIST卷积神经网络的结构模型如图2所示。
图2 MNIST数据集模型架构
建模过程中,采用自适应估计算法(adaptive moment estimation,Adam)来调节连接权值和偏置,最终测试识别准确率为99.06%。
(2)针对CIFAR-10数据集的网络设计。
CIFAR-10数据集的输入图片为32*32分辨率的彩色图,对模型的第一个卷积层添加ReLU激活函数,然后是最大池化层。第二个卷积层同样通过ReLU激活函数最大池化层进行处理。在两个卷积层和池化层之后是全连接层,最后是输出层。 CIFAR-10卷积神经网络的结构模型如图3所示。
图3 CIFAR-10数据集模型架构
由于CIFAR-10数据集的计算量大幅提高,因此使用深度更高的网络进行学习训练就对硬件性能有较高的要求。由于文中所用电脑的硬件性能有限并且CIFAR-10数据集主要用于验证系统的通用性特点,因此所设计的网络为轻量级结构。最终CIFAR-10数据集测试准确率为72.93%。
(3)特征参数的提取与格式转换。
在搭建神经网络模型后需要对网络中卷积层与全连接层的权重参数与偏执参数进行提取与格式转换。在神经网络程序中定义参数提取函数,根据维度的不同定义子函数,在提取函数中对参数进行维度确认并通过子函数完成参数提取,其中数据的先后读取顺序必须保持顺序相同,针对不同维度的数据,由维度从高到低存储,以便在PYNQ环境中运行正常。代码顶部先通过sess=tf.InteractiveSession()声明会话,对提取到的特征参数通过tofile函数定义保存路径及格式。完成特征参数的提取及格式转换后,得到二进制格式的特征参数文件。
3 基于PYNQ的图像分类识别系统实现
3.1 IP核模块设计
(1)卷积层IP核模块参数配置。
在卷积运算中卷积核与输入数据进行相乘再累加的操作,卷积核通过给定的步长参数进行位移。因此在HLS的卷积层函数编程中首先需要定义输入输出参数以及卷积核及其步长等参数,输入输出特征参数数据类型为多维矩阵,使用指针地址形式传入数据的首地址。卷积层参数设置如表1所示。
(2)卷积层IP核模块设计。
在卷积层IP核模块设计中,设计流程严格遵循HLS开发工具的相关要求,首先添加头文件和C代码文件。在C代码文件中,需要首先设定函数Conv为IP核的顶层函数,在此函数中的各个特征参数定义在表1中已给出。在定义参数后需要对IP核模块的各个参数接口进行设计配置。
表1 卷积层参数设置
然后选择卷积层C代码程序作为实现目标,设置仿真综合的时钟周期,对工程进行C仿真测试,编译并执行程序,验证无误后进行算法综合与C/RTL协同仿真,综合结束后生成性能报告。最后通过HLS执行Export>RTL将IP核模块以RTL形式生成即可看到IP核模块的BLOCK,如图4所示。
图4 卷积层IP核通用电路
(3)最大池化层IP核模块设计。
与设计卷积层函数相同,最大池化层IP核模块设计需要在HLS中定义输入输出参数以及卷积核及其步长等参数,输入输出特征参数数据类型为多维矩阵,同样使用指针地址形式传入数据的首地址。完成最大池化层IP核模块的设计后,可以将设计好的IP核加载到VIVADO软件中进行下一步的硬件通路设计。
3.2 整体通路配置
(1)ZYNQ芯片参数配置。
在VIVADO中导入卷积层IP核模块以及最大池化层IP核模块后,还需要配置ZYNQ芯片完成通路搭建。操作步骤如下:①对片上资源I/O设备接口进行初始化;②对PS端与PL端的接口进行配置;③设定时钟规范,在时钟配置上,本课题的PS部分时钟频率为650 MHz,PL部分时钟频率配置为100 MHz。
(2)系统I/O口配置。
文中设计的系统需要USB、SD接口、URAT等I/O设备,在VIVADO中对其进行接口配置,在ZYNQ芯片的I/O外设选项,可以直观地看到ZYNQ可以提供的外设接口图形化的配置界面。
3.3 驱动程序与上位机程序设计
(1)卷积层与最大池化层驱动程序设计。
PYNQ开发平台的一个显著特点是其PS部分搭载的操作系统支持开发者直接使用Python编程语言对硬件模块进行控制操作,Xilinx官方提供的函数库文件可以方便开发者通过Python开发硬件。
由于文中设计的卷积层IP核模块是面向片上存储器的物理地址并且需要在操作系统中通过Python脚本程序对硬件进行操控,因此数组的虚拟地址与物理地址就可能会产生差异,所以在新定义数组时必须保证分配的是连续内存物理地址。在Xilinx官方提供的库函数中,Xlnk可以用于分配连续物理地址以及提供物理指针,而Xlnk可以使用Python的Numpy第三方函数库来分配数组,但在对各个特征参数写入物理地址前,需要在驱动中对各个特征参数进行初始化复制。
在完成特征参数的初始化后就需要通过PYNQ的pynq.Overlay模块将数据写入至待写入的物理内存地址中。通过Overlay中的download()方法将VIVADO中生成的比特流文件下载至PL部分,wirte(offset,value)函数将要写入的数据value(int数据类型或字节数据类型)写入offset地址。由于在卷积层IP核模块中,输入输出特征、权值和偏执通过指针传入首地址,因此在驱动程序中需要通过physical_address函数传入分配的物理地址。最大池化层IP核模块的驱动程序设计方法与卷积层IP核模块的设计方法相同,故不再赘述。
(2)上位机程序设计。
为了能够在Liunx操作系统和Jupyter Notebook中控制系统正常工作,需要通过Python语言设计编写上位机控制程序,上位机程序包括主函数和系统的初始化。
主函数中,首先读取灰度图/RGB图,接着调用驱动函数,然后定义参考值max并赋值,最后将输出分类概率值与max对比,将最高概率值赋值为max并作为结果输出。系统初始化的程序结构如图5所示。
图5 初始化程序结构
4 系统测试
图像分类识别系统搭载在PYNQ-Z2开发板上,在进行测试验证前需要对开发板硬件环境以及软件环境正确配置,将OVERLAY烧写至开发板中并利用Python编程语言实现控制操作。采用MNIST及CIFAR-10数据集对系统进行性能测试,验证文中设计并与桌面CPU和GPU性能及功耗进行对比分析。测试结果如表2所示。
表2 平台横向参数对比
由表2可以看出,在MNIST数据集的识别率方面,PYNQ图像分类识别系统与E5-2692和K20平台几乎相同,在CIFAR-10数据集的识别率上则仍有较大差距,但在功耗和成本方面本课题所设计的系统具备较明显的优势。与各平台的实现方式相比,PYNQ图像分类识别系统不需要针对不同的数据集对系统进行重构,通过上位机程序读取不同测试集的特征参数,就可以实现不同测试集的正常分类识别。测试表明系统的分类识别功能与通用性符合设计要求。
5 结束语
设计了一种基于PYNQ开发平台的图像分类识别系统,该系统以软硬件协同设计理论作为指导思想,在基于ZYNQ架构的PYNQ-Z2平台上设计了PS部分的驱动和上位机程序,在PL部分设计了自定义IP核模块并完成系统搭建。最后在Jupyter Notebook平台通过两个数据集进行功能与性能测试,通过测试可知,该系统可以在低功耗的前提下实现对不同数据集的分类识别。
为了进一步提高系统的性能,下一步可以尝试更多的算法实现,例如针对卷积神经网络模型的搭建,可以使用二值化卷积神经网络对数据进行压缩以降低存储消耗,此外还可以尝试YOLO算法作为识别方法。