CNN在ZYNQ上的实现

ZYNQ简介

ZYNQ系列是Xilinx推出的高端嵌入式SoC,其在片上集成了ARM处理器和FPGA。ZYNQ与传统的嵌入式CPU相比,具有强大的并行处理能力。开发人员利用FPGA强大的并行处理能力,不仅可以解决多种不同信号处理应用中的大量数据处理问题,而且还能通过加入更多外设来扩展处理系统的功能。ZYNQ通过引入最新的高速AXI-4总线,可轻松实现外设的扩展与高速互访。

ZYNQ SoC十分适用于硬件加速,最典型的架构就是将需要加速的大运算量逻辑部署到FPGA上,而将流程控制的逻辑部署到arm上。典型的ZYNQ SoC结构如图1。

CNN简介
CNN全称卷积神经网络,包括卷积层(convolutional layer)和池化层(pooling layer)。此处不对CNN算法原理进行赘述,仅对网络结构进行简单描述。

图2是一个卷积神经网络的高层次视图。通常情况下,CNN网络会在卷积层和池化层后加入全连接层。

卷积层和池化层的功能是对输入原始图片进行特征提取,而全连接层的功能则是对提取到的特征进行特征映射。除此之外,在全连接层后还需要加入一个功能函数以实现整个网络的功能(图中未画出)。对于监督学习来说,有分类和回归两大功能。例如,在 VGG和Google Net中,在最后都使用了Softmax实现分类;在R-CNN中,在网络后加入Bounding-box regression实现了预选框微调的回归功能。对于功能函数,行业中一派认为应该属于神经网络的一部分,一派认为独立于神经网络之外。

在图2中,输入图片与第一层卷积层的卷积核做卷积操作,形成一排Feature maps(特征图)。在池化层,对每个map进行下采样,形成一排尺寸更小的Feature maps。在接下来的第二层的卷积层和池化层中,以第一层输出的Feature maps作为输入,再进行一次卷积和池化计算。CNN的卷积和池化操作将输入的图片的特征提取并抽象到更高的层级。之后的全连接层以Feature maps中所有特征值作为输入,将提取到的特征映射到所需要的特征空间。

本文以一个简单的手写体识别网络LeNet5(图3)为例,提出一种在ZYNQ上加速CNN的工程方法。LeNet5在两层CNN后加入了全连接层和softmax分类器,实现了对10种数字手写体的分类。

系统框架

ZYNQ上FPGA可编程逻辑部分成为PL端,以arm为核心的处理器部分成为PS端。本系统中,CNN在PL端的FPGA上实现,通过DMA与PS端的Linux交换数据。Linux将CNN参数和输入数据dma到CNN,CNN计算完成后将计算结果dma回Linux。CNN通过vivado HLS设计,各层以数据流方式实现数据传递,可实现全网络流水。通过HLS优化,可将百万级周期的计算环节优化为万级周期。

Linux中,通过DMA驱动控制DMA的数据读写,通过socket与PC交换数据。

在PC的windows中开发上位机。上位机通过以太网将CNN参数下发给Zynq端的Linux应用程序。将输入的图片下发到Zynq端的Linux应用程序,接收Zynq回传的计算结果。(CNN参数文件也可直接拷贝到SD卡中,由ZYNQ上的Linux应用直接读取。数据的输入输出也可通过以太网之外的其他接口实现,这里笔者开发的上位机不是文章的重点,读者可以通过其他方式控制参数的输入和数据的传输)

开发环境
硬件环境
硬件环境包括一台PC电脑和一块搭载有Zynq SoC的开发板,开发板和PC通过网线和串口连接。

软件环境
本文中用到的软件开发工具有:TensorFlow,Vivado HLS ,Vivado,PetaLinux,Visual Studio。

TensorFlow是Google公司开源的深度学习框架,在本文中用于算法的仿真和参数的训练。

Vivado HLS和Vivado 是Xilinx公司Vivado Design Suite套件中的两个软件。vivado-HLS可以将 C,C++ 以及 System C 等高层次语言综合生成HDL级的IP核。Vivado可以将HDL级的文件综合成RTL网表文件,并根据网表文件布局布线生成.bit文件。.bit文件可以直接下载到FPGA中,实现FPGA功能。

PetaLinux工具提供在 Xilinx 处理系统上定制、构建和调配嵌入式 Linux 解决方案所需的所有组件。PetaLinux与 Xilinx 硬件设计工具协同工作,为 Zynq® UltraScale+™ MPSoC、 Zynq®-7000 SoC、和 MicroBlaze™ 简化了 Linux 系统的开发。

Visual Studio在此不做过多介绍,笔者用的是VS2012,使用C#语言开发上位机。上位机通过网络将CNN参数下发给Zynq端的Linux应用程序。将输入的图片下发到Zynq端的Linux应用程序,接收Zynq回传的计算结果。

开发流程

相关链接
TensorFLow安装
https://blog.csdn.net/weixin_39290638/article/details/80045236

Vivado HLS入门
https://blog.csdn.net/weixin_39290638/article/details/80228806

PetaLinux安装及使用
https://china.xilinx.com/support/documentation-navigation/development-to...

本文转载自: https://blog.csdn.net/weixin_39290638/article/details/81155489

推荐阅读