FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持

这篇具有很好参考价值的文章主要介绍了FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持

1、前言

LeNet-5简洁

LeNet-5诞生于上世纪90年代,是CNN的开山之作,最早的卷积神经网络之一,用于手写数字识别(图像分类任务),它的诞生极大地推动了深度学习领域的发展。LeNet在多年的研究和迭代后,Yann LeCun将完成的这项开拓性成果被命名为LeNet5,并发表在论文《Gradient-Based Learning Applied to Document Recognition》上,如今的AlexNet、ResNet等都是在其基础上发展而来的,在当年是一种用于手写体字符识别的非常高效的卷积神经网络。如今的卷积神经网络模型早已沧海桑田,但作为基础入门的学习资料,LeNet-5依然在江湖中占有极其重要的一席之地;

基于Zynq7020 的设计说明

本文使用Xilinx的Kirtex Zynq7000系列的Zynq7020–xc7z020clg400-2型号FPGA 实现LeNet-5 卷积神经网络实现数字识别实验;基于Zynq7020的异构特性,本设计的图像采集、图像缓存、图像处理、图像输出用 PL 端的 FPGA 逻辑实现;LeNet-5 卷积神经网络的识别功能采用 PS 端的 SDK C语言软件实现;PS 端软件将识别结果通过 AXI-Lite 总线输出给 PL 端,实现了 PS 端软件与 PL 端硬件的交互;PL 端根据 PS 端软件的识别结果,将识别到的数字输出到显示器上,实现了人机交互;PL 和 PS 端是同步实时进行的;设计所用版本为vivado2019.1;

PL 端 FPGA 逻辑设计

输入视频源采用廉价的小分辨率的ov7725摄像头;Zynq软核通过EMIO模拟i2c总线配置ov7725摄像头分辨率为640x480;然后将输入视频送入纯verilog代码实现的视频采集模块,将DVP视频转换为RGB888视频;然后将视频送入纯verilog代码实现的图像预处理模块,该模块在640x480图像正中心框出一块122x122大小图像区域,该区域作为输入数字图像的采集区域,是后面的LeNet-5卷积神经网络进行识别的区域;然后调用Xilinx官方的 Video In to AXI4-Stream 将RGB888视频转换为AXI4-Stream视频;然后调用Xilinx官方的 VDMA 将视频缓存进PS侧DDR3再读出,为了低延时,VDMA设置为1帧缓存,需要在SDK中配置才能使用;然后调用Xilinx官方的 Video Timing Controller 和 AXI4-Stream to Video Out 将 AXI4-Stream 视频转换为 RGB888视频;然后调用Xilinx官方的 ps_pl_axi_lite 接收 PS 端软件LeNet-5数字识别结果,送入图像后处理模块,该模块例化了10个 ROM ,存储了 0~9 的9个数字,并根据识别结果输出对应的数字到显示屏的右上角显示;然后将图像送入纯verilog代码实现的RGB转HDMI模块,该模块输出HDMI视频到显示器;

PS 端 SDK 软件设计

PS 端实现LeNet-5 卷积神经网络的识别功能,并将识别结果通过AXI-Lite 总线输出给 PL 端;首先在内存开辟一些列缓存空间,用来存储图像和LeNet-5 卷积神经网络计算的中间结果;软件先从 DDR3 中读取 28x28 大小的图像,然后存入事先开辟好的内存,由于需要识别的图像大小为122x122,所以需要取4次才能完整的取完一张图片;然后将图像送入卷积层计算,计算结果存入事先开辟好的内存;然后进行池化层计算,计算结果存入事先开辟好的内存;然后进行隐藏层计算,计算结果存入事先开辟好的内存;然后进行输出层计算,最后将输出结果通过AXI-Lite 总线输出给 PL 端;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

卷积神经网络解决方案

我的主页有FPGA 卷积神经网络专栏,该专栏有 LeNet、 CNN、 DNN等卷积神经网络FPGA实现方案;以下是专栏地址:
点击直接前往

FPGA图像处理方案

我的主页目前有FPGA图像处理专栏,改专栏收录了我目前手里已有的FPGA图像处理方案,包括图像缩放、图像识别、图像拼接、图像融合、图像去雾、图像叠加、图像旋转、图像增强、图像字符叠加等等;以下是专栏地址:
点击直接前往

3、详细设计方案

本文使用Xilinx的Kirtex Zynq7000系列的Zynq7020–xc7z020clg400-2型号FPGA 实现LeNet-5 卷积神经网络实现数字识别实验;基于Zynq7020的异构特性,本设计的图像采集、图像缓存、图像处理、图像输出用 PL 端的 FPGA 逻辑实现;LeNet-5 卷积神经网络的识别功能采用 PS 端的 SDK C语言软件实现;PS 端软件将识别结果通过 AXI-Lite 总线输出给 PL 端,实现了 PS 端软件与 PL 端硬件的交互;PL 端根据 PS 端软件的识别结果,将识别到的数字输出到显示器上,实现了人机交互;设计框图如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

PL端:ov7725摄像头及图像采集

输入视频源采用廉价的小分辨率的ov7725摄像头;Zynq软核通过EMIO模拟i2c总线配置ov7725摄像头分辨率为640x480;然后将输入视频送入纯verilog代码实现的视频采集模块,将DVP视频转换为RGB888视频;摄像头采集部分代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
这里采用ov7725摄像头的主要原因是他的分辨率很小,只有640x480@60Hz,卷积神经网络对输入图像的大小求小不求大,因为太大的图像耗费的运算时间很长;

PL端:图像预处理

然后将视频送入纯verilog代码实现的图像预处理模块,该模块在640x480图像正中心框出一块122x122大小图像区域,该区域作为输入数字图像的采集区域,是后面的LeNet-5卷积神经网络进行识别的区域;图像预处理模块代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
图像预处理模块首先对输入图像进行RGB转灰度操作,将RGB888视频转为8bit的灰度图,这样有利于图像识别,因为图像识别需要的只是图像边沿和轮廓的像素信息,RGB分量显然数据量太大,灰度图则完美契合;然后图像进行框选处理,即框选出需要进行识别的区域,正如前面所说,卷积神经网络对输入图像的大小求小不求大,对于640x480的采集图像,我们并不是全部都纳入识别范围,而是选择了0图像正中心框出一块122x122大小图像区域,因为数字本身就不会太大,不太可能整个屏幕全是单个数字吧?实现的效果如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

PL端:Xilinx推荐的图像缓存架构

然后调用Xilinx官方的 Video In to AXI4-Stream 将RGB888视频转换为AXI4-Stream视频;然后调用Xilinx官方的 VDMA 将视频缓存进PS侧DDR3再读出,为了低延时,VDMA设置为1帧缓存,需要在SDK中配置才能使用;然后调用Xilinx官方的 Video Timing Controller 和 AXI4-Stream to Video Out 将 AXI4-Stream 视频转换为 RGB888视频;这是一套标准的Xilinx推荐的图像缓存架构;

PL端:识别结果的 PL 与 PS 交互

调用Xilinx官方的 ps_pl_axi_lite 接收 PS 端软件LeNet-5数字识别结果,并根据识别结果,将识别到的数字输出到显示器上;axi_lite是一个轻量级总线,在SDK里直接调用API即可写数据;

PL端:图像后处理

s_pl_axi_lite 接收 PS 端软件LeNet-5数字识别结果,送入图像后处理模块,该模块例化了10个 ROM ,存储了 0~9 的9个数字,并根据识别结果输出对应的数字到显示屏的右上角显示;图像后处理模块代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
图像后处理的核心操作是像素替换,当有识别结果输入时,在显示屏右上角显示对应的数字,否则显示原始的ov7725采集像素;实现的效果如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

PL端:RGB 转 HDMI

然后将图像送入纯verilog代码实现的RGB转HDMI模块,该模块输出HDMI视频到显示器;RGB转HDMI模块代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

PS端:图像获取

软件先从 DDR3 中读取 28x28 大小的图像,然后存入事先开辟好的内存,由于需要识别的图像大小为122x122,所以需要取4次才能完整的取完一张图片;代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

PS端:卷积层计算

然后将图像送入卷积层计算,计算结果存入事先开辟好的内存;代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
卷积模型由Python训练得到,并转换为C语言数组;卷积核详情请看注释,注释还在进一步优化中。。。

PS端:池化层计算

然后进行池化层计算,计算结果存入事先开辟好的内存;代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
池化层详情请看注释,注释还在进一步优化中。。。

PS端:隐藏层计算

然后进行隐藏层计算,计算结果存入事先开辟好的内存;代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
隐藏层详情请看注释,注释还在进一步优化中。。。

PS端:输出层计算

然后进行隐藏层计算,计算结果存入事先开辟好的内存;然后进行输出层计算,最后将输出结果通过AXI-Lite 总线输出给 PL 端;代码如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

4、vivado工程介绍

PL 端 FPGA 逻辑设计工程

开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
开发环境:Vivado2019.1;
输入:OV7725摄像头,分辨率640x480;
输出:HDMI,分辨率640x480;
工程作用:FPGA基于 LeNet-5 卷积神经网络实现数字识别;
工程BD如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
工程代码架构如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
工程的资源消耗和功耗如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

PS 端 SDK 软件设计工程

PS 端 SDK 软件工程代码架构如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

5、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
3:如果你的vivado版本高于本工程vivado版本,解决如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
打开工程后会发现IP都被锁住了,如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
此时需要升级IP,操作如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

6、上板调试验证并演示

准备工作

Zynq7000系列开发板,我用的Zynq7020;
OV7725摄像头;
HDMI显示器;
打印一张0~9的数字的纸张,字体要加粗,可以用我资料包里的文档打印,打印出来如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
将显示器中的采集区域对着数字,移动摄像头对准,如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

输出静态演示

识别结果如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络

输出动态演示

录制了一个小视频,输出动态演示如下:

LeNet-5数字识别

7、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持,FPGA 卷积神经网络,菜鸟FPGA图像处理专题,fpga开发,cnn,人工智能,LeNet-5,数字识别,卷积神经网络文章来源地址https://www.toymoban.com/news/detail-768372.html

到了这里,关于FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习第一周:用卷积神经网络实现Mnist手写数字识别(付基础知识解释)

    MNIST 数据集是一个手写数字识别数据集,包含了 60000 张训练图像和 10000 张测试图像,每张图像都是 28x28 像素的灰度图像。 在这个代码中,我们首先使用了 numpy 库中的 np.random.seed() 方法来设置随机种子,以确保结果可重复。 然后,我们使用了 Keras 中的 mnist.load_data() 方法来

    2024年02月08日
    浏览(30)
  • 手写数字识别-基于卷积神经网络

    🌞欢迎来到机器学习的世界  🌈博客主页:卿云阁  💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🌠本阶段属于练气阶段,希望各位仙友顺利完成突破 📆首发时间:🌹2021年6月5日🌹 ✉️希望可以和大家一起完成进阶之路! 🙏作者水平很有限,如果发

    2024年02月10日
    浏览(34)
  • LeNet卷积神经网络-笔记

    LeNet卷积神经网络-笔记 手写分析LeNet网三卷积运算和两池化加两全连接层计算分析 修正上图中H,W的计算公式为下面格式 基于paddle飞桨框架构建测试代码 #输出结果为: #[validation] accuracy/loss: 0.9530/0.1516 #这里准确率为95.3% #通过运行结果可以看出,LeNet在手写数字识别MNIST验证数

    2024年02月14日
    浏览(27)
  • 经典卷积神经网络-LeNet-5

    LeNet-5是Yann LeCun等人在《Gradient-Based Learning Applied to Document Recogn》论文中提出的一个卷积神经网络,LeNet的基本思想和结构为后来更复杂的神经网络提供了灵感,并为研究者们提供了深入理解卷积神经网络的起点。 如图所示,这是论文中所介绍的LeNet-5网络结构。输入为一个3

    2024年02月03日
    浏览(31)
  • 机器学习&&深度学习——卷积神经网络(LeNet)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——池化层 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 之前的内容中曾经将softmax回归模型和多层感知机应用于Fashion-MNIST数据集中的服装图片。为了能应用他们,我

    2024年02月14日
    浏览(31)
  • 用C语言构建一个数字识别卷积神经网络

     卷积神经网络的具体原理和对应的python例子参见末尾的参考资料2.3. 这里仅叙述卷积神经网络的配置, 其余部分不做赘述,构建和训练神经网络的具体步骤请参见上一篇: 用C语言构建一个手写数字识别神经网路 卷积网络同样采用简单的三层结构,包括输入层conv_layer,中间层

    2024年02月14日
    浏览(32)
  • pytorch集智-5手写数字识别器-卷积神经网络

    简称:CNN,convolutional neural network 应用场景:图像识别与分类(CNN),看图说话(CNN+RNN)等 优越性:和多层感知机相比,cnn可以识别独特的模式,可以自动从数据中提取特征。一般机器学习需要特征工程,cnn可以自动识别,极大代替或取代了特征工程 和多层感知机原理不同

    2024年01月19日
    浏览(33)
  • 真的不能再详细了,2W字保姆级带你一步步用Pytorch搭建卷积神经网络实现MNIST手写数字识别

    目录 一、引言(环境)  二、正文 1. 代码基本情况介绍 2. MNIST数据集介绍         3. 代码输出结果介绍 数据集取样: 训练信息输出: 前三次训练成果以及预测: 八次训练的结果:  4. 代码拆解讲解 基本的参数设定 MNIST数据集下载、保存与加载 神经网络模型 训练前的准

    2023年04月20日
    浏览(28)
  • 【卷积神经网络】经典网络之 LeNet-5, AlexNet 与 VGG-16

    随着计算机硬件的升级与性能的提高,运算量已不再是阻碍深度学习发展的难题。卷积神经网络(Convolution Neural Network,CNN)是深度学习中一项代表性的工作,其雏形是 1998 年 LeCun 提出的 LeNet-5 模型。如今,卷积神经网络已被广泛应用于计算机视觉领域。本文主要介绍卷积神

    2024年02月11日
    浏览(29)
  • 深度学习实战——卷积神经网络/CNN实践(LeNet、Resnet)

          忆如完整项目/代码详见github: https://github.com/yiru1225 (转载标明出处 勿白嫖 star for projects thanks) 本系列博客重点在深度学习相关实践(有问题欢迎在评论区讨论指出,或直接私信联系我)。 第一章  深度学习实战——不同方式的模型部署(CNN、Yolo)_如何部署cnn_

    2023年04月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包