cnn

173 阅读9分钟

lenet五层网络 包括三个卷积层 两个全局池化层 两个全连接层

lenet主要分为五个部分来实现,卷积模块 Tanh激活函数 softmax激活函数 平均池化层 全连接层

验证思路,在网络层设计阶段,通过对网络层输入输出大小进行验证和jupyter notebook 进行验证。 最终通过python实现与模块功能相同的函数,通过硬件模块和软件函数单间testbench,验证输出结果。

block diagram 将复杂模块分为子模块,lenet输入32x32,第一层卷积5x5x6,得到28x28x6feature map 经过2x2得到14x14x6 。 第二次卷积5x5x16,得到10x10x16,经过2x2平均池化,得到5x5x16。 第三次卷积5x5x120,得到1x1x120,经过全连接层第一层有84个输出节点,第二个全连接层有10个输出节点,再经过softmax归一化。

卷积模块由多个单层卷积核组成,单个卷积核通过 卷积运算单元。卷积运算单元,每个卷积核的图像窗口与输入图像进行卷积。卷积运算单元由处理模块组成,处理模块完成卷积需要的点乘和加法。此处设计了半精度浮点数的加法器和乘法器。半精度加法器完成对阶,尾数相加减,规格化并舍入,溢出判断。完成 加法器设计。阶码相加减,尾数相乘,规格化并舍入,判断溢出。完成乘法器设计。FP16最高位为符号位,然后指数位5位,小数位10位。符号位为1表示为负数。循环使用处理模块实现卷积窗口运算。

tanh反曲正切函数,e^x的泰勒展开来计算。四个乘法器和一个加法器。展开四项。首先获取x的增量,再乘以系数,再与之前的进行相加。

平均池化模块和全连接层,平均池化部分执行多通道的image平均池化,循环复用平均池化完成所有通道的平均池化。平均池化,取平均值,全并行化同时对所有窗口进行计算。插入寄存器形成流水线。 全连接层 一个乘法器,一个加法器,累乘之后累加。

softmax模块,对输入进行归一化,求出各类的概率。 1 指数运算 2 计算指数和 3 求出指数和倒数 4 求出每个元素的softmax值。 10个分类有10个指数模块,计算指数通过泰勒展开式实现。

卷积:

滑窗内并行。

多通道并行

多卷积核并行。

池化:多通道并行

全连接层:累乘后累加 采用的是乘加树。

模型解析模块:定义了一种用来存储预训练模型结构和数据的json文件。从json文件中解析除模型结构于数据。 数据量化模块将浮点数转为定点数数据,加速硬件计算。

遇到的问题:

权重的量化不是本文完成的。

对于训练完成的权重在定点和浮点数之间进行合理的量化。

上板验证, 采取的方法,对于采集到的RGB565进行灰度化后,进行等间隔采样法裁剪为32x32.

DDR3缓存三帧图像,该技术可以有效地保护图像数据流的稳定

实验环境:

本文再prcharm开发环境下训练,使用keras框架。模型训练和测试都使用的mnist数据集。

硬件实现基于Xilinx artix7 ZYNQ 7020

模型精确度测试。 读取mnist数据集数据,将数据的像素值存入数组中,10进制像素值转为16进制字符存入txt文件中,将数据真实标签存放在txt文件最后。当加速器进行预测,通过数据真实值判断预测结果正确与否。

时间大概为80微妙,准确度95%。

验证: FPGA验证xilinx vivado

1 获取模型结构和数据的。存储数据的txt文件。

2 使用modelsim进行功能仿真和时序仿真,生成bit流文件。

3 将bit流文件下载到fpga中,构建真正的硬件电路,并进行板级验证。

输入为图片的数据txt文件。

数码管输出结果3.在数码管显示类别。

片外权重。 将权重初始化到DDR中。 将模型参数转化为COE格式,使用matlab将权重转为COE格式文件,并初始化到片上DDR中。

modelsim仿真:

仿真阶段通过modelsim直接读取数据。

输入直接读取txt。

上版验证:

SCCB的方式,上位机通过SCCB将OV5640图像处理完成的数据发送给PS端存放在DDR中,从DDR中将图像数据发送到IP进行预测并输出预测结果。

性能:

时间大概为80微妙,准确度95%。

时钟频率

100MHZ

OV5640,输入时钟频率为100MHZ,分频后输出时钟频率scl为200khz。满足sccb时序要求。

输入分辨率640x320,RGB565-RGB88格式的转化。 预处理灰度化并裁剪后存入DDR中

写入DDR3内存中。 通过PS端的VDMA完成PL端与PS端DDR3内存的高速数据交互。

DDR3 150MHZ频率. FIFO缓存后写入DDR3.

ZYNQ工作频率为100MHZ.

ZYNQ的HP接口通过VDMA读取DDR3内存中的数据,从DDR3读取。

测试:

SD卡存储着CNN网络训练得到的权重值和偏置值,CNN加速器初始化时,一次将权重和偏置写入外部存储器DDR3中。输入特征可以存储在SD卡作为测试数据。PS端通过DDR3将权重和偏置和特征加载给PL,PL端进行各层的硬件加速,计算完毕,将各层运算结果输出到DDR3中,直到最后一层计算完毕,输出最终运算结果。

上板:

摄像头输入640x320 预处理模块图像缩放到32x32.

ZYNQ从CMOS摄像头采集图像数据,并写入DDR3内存,DDR3数据写入模块再内存建立三帧图像数据缓冲,获取正在写入DDR3的帧数标志,读取上一帧的图像数据,经预处理后图像缩放为32x32. 经过CNN硬件加速器得到分类后的结果,与原有数据进行叠加显示。

图像缩放采用插值,插值运算速度快,双线性插值从原图像每4个点取一个点。 等间隔采样法

缩放后将数据传递给CNN加速器。

OV5640采集图像数据为90fps,每帧采集时间约为11.11ms。 ZYNQ写入一帧数据至少需要11.11ms。 640x320

数据存储 和搬运

arm端挂载SD卡,通过DDR控制器把读取到的参数缓存到ARM端DDR3中。使用VDMA把输入特征数据从DDR3搬运到PL端开始加速运算,最终再将运算结果再将运算结果缓存到DDR3中,上一层运算结果完成的结果和下一层的参数送给PL进行卷积核运算。 直到完成全部运算。

本文中,参数传递和运算结果缓存数据量大且传输数据分散,使用AXI-strea协议。FPGA和arm的控制信号传递只占用很少位宽,所以使用AXI4-Lite协议。

PS端负责网络整体控制,数据传输和缓存,SD卡数据加载。 VDMA通过先参数后特征数据的方式,将参数和特征数据传送给FPGA进行运算。运算完的特征数再次缓存到DDR3,然后将下一层的参数和一层运算完成的特征数据再次传输到FPGA端。

VDMA传输大批量参数和特征数据。 GPIO用于传输控制信号。GPIO IP core,ARM端可以直接调用GPIO的函数即可往PL端传输控制寄存器,用于初始化同步,数据传输握手,运算起始Flag信号。

VDMA传输位宽64bit,导致PE模块并行度最大为4。

实验对比

计算时间80微妙

OV5640采集图像数据为90fps 640 480(双线性插值做预处理PL端),每帧采集时间约为11.11ms。

OV5640,输入时钟频率为100MHZ,分频后输出时钟频率scl为200khz。满足sccb时序要求。

PL端有两个时钟域,DDR的访问时钟域150MHZ.

控制模块和运算模块时钟域 100MHZ.

两个时钟之间控制信号跨越通过同步模块实现,数据信号的跨越通过异步fifo。

ddr的数据访问,通过VDMA实现DDR和PL之间的高速数据搬运。通过ZYNQ的AXI HP接口与DDR进行通信,并将数据转换为AXI-stream类型供外设使用。

PL端控制模块解析从PS侧发送来的控制信息特征图数量大小等。生成控制字给数据模块。

输入数据缓存分三类,一类存储bias,一类存储权重。第三类存储特征图数据。 缓存输入64位位AXI-HP总线的位宽,16位数每个像素的宽度。

卷积网络的定点化

定点数精度的选取是算法性能与资源消耗之间的折衷。使用16-bit的定点数。

定点数的Q值,Q值表示定点数的位置。S5.10。 小数部分五位。采用Q10满足精度。

输出32位数据裁剪成,为了节省资源,将输出32bit数据裁剪成21bit有符号数,将定点化转化为S8.12。 将16bit有符号定点数扩展为21bit有符号定点数S8.12。 存入缓冲区进行累加运算。完成累加后,转换为16bit定点数。