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

news2024/11/15 21:27:51

目录

  • 1、前言
    • LeNet-5简洁
    • 基于Zynq7020 的设计说明
    • PL 端 FPGA 逻辑设计
    • PS 端 SDK 软件设计
    • 免责声明
  • 2、相关方案推荐
    • 卷积神经网络解决方案
    • FPGA图像处理方案
  • 3、详细设计方案
    • PL端:ov7725摄像头及图像采集
    • PL端:图像预处理
    • PL端:Xilinx推荐的图像缓存架构
    • PL端:识别结果的 PL 与 PS 交互
    • PL端:图像后处理
    • PL端:RGB 转 HDMI
    • PS端:图像获取
    • PS端:卷积层计算
    • PS端:池化层计算
    • PS端:隐藏层计算
    • PS端:输出层计算
  • 4、vivado工程介绍
    • PL 端 FPGA 逻辑设计工程
    • PS 端 SDK 软件设计工程
  • 5、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 6、上板调试验证并演示
    • 准备工作
    • 输出静态演示
    • 输出动态演示
  • 7、福利:工程源码获取

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 端软件的识别结果,将识别到的数字输出到显示器上,实现了人机交互;设计框图如下:
在这里插入图片描述

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

输入视频源采用廉价的小分辨率的ov7725摄像头;Zynq软核通过EMIO模拟i2c总线配置ov7725摄像头分辨率为640x480;然后将输入视频送入纯verilog代码实现的视频采集模块,将DVP视频转换为RGB888视频;摄像头采集部分代码如下:
在这里插入图片描述
这里采用ov7725摄像头的主要原因是他的分辨率很小,只有640x480@60Hz,卷积神经网络对输入图像的大小求小不求大,因为太大的图像耗费的运算时间很长;

PL端:图像预处理

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

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个数字,并根据识别结果输出对应的数字到显示屏的右上角显示;图像后处理模块代码如下:
在这里插入图片描述
图像后处理的核心操作是像素替换,当有识别结果输入时,在显示屏右上角显示对应的数字,否则显示原始的ov7725采集像素;实现的效果如下:
在这里插入图片描述

PL端:RGB 转 HDMI

然后将图像送入纯verilog代码实现的RGB转HDMI模块,该模块输出HDMI视频到显示器;RGB转HDMI模块代码如下:
在这里插入图片描述

PS端:图像获取

软件先从 DDR3 中读取 28x28 大小的图像,然后存入事先开辟好的内存,由于需要识别的图像大小为122x122,所以需要取4次才能完整的取完一张图片;代码如下:
在这里插入图片描述

PS端:卷积层计算

然后将图像送入卷积层计算,计算结果存入事先开辟好的内存;代码如下:
在这里插入图片描述
卷积模型由Python训练得到,并转换为C语言数组;卷积核详情请看注释,注释还在进一步优化中。。。

PS端:池化层计算

然后进行池化层计算,计算结果存入事先开辟好的内存;代码如下:
在这里插入图片描述
池化层详情请看注释,注释还在进一步优化中。。。

PS端:隐藏层计算

然后进行隐藏层计算,计算结果存入事先开辟好的内存;代码如下:
在这里插入图片描述
隐藏层详情请看注释,注释还在进一步优化中。。。

PS端:输出层计算

然后进行隐藏层计算,计算结果存入事先开辟好的内存;然后进行输出层计算,最后将输出结果通过AXI-Lite 总线输出给 PL 端;代码如下:
在这里插入图片描述

4、vivado工程介绍

PL 端 FPGA 逻辑设计工程

开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
开发环境:Vivado2019.1;
输入:OV7725摄像头,分辨率640x480;
输出:HDMI,分辨率640x480;
工程作用:FPGA基于 LeNet-5 卷积神经网络实现数字识别;
工程BD如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述
工程的资源消耗和功耗如下:
在这里插入图片描述

PS 端 SDK 软件设计工程

PS 端 SDK 软件工程代码架构如下:
在这里插入图片描述

5、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
在这里插入图片描述
3:如果你的vivado版本高于本工程vivado版本,解决如下:
在这里插入图片描述
打开工程后会发现IP都被锁住了,如下:
在这里插入图片描述
此时需要升级IP,操作如下:
在这里插入图片描述
在这里插入图片描述

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

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

6、上板调试验证并演示

准备工作

Zynq7000系列开发板,我用的Zynq7020;
OV7725摄像头;
HDMI显示器;
打印一张0~9的数字的纸张,字体要加粗,可以用我资料包里的文档打印,打印出来如下:
在这里插入图片描述
将显示器中的采集区域对着数字,移动摄像头对准,如下:
在这里插入图片描述

输出静态演示

识别结果如下:
在这里插入图片描述
在这里插入图片描述

输出动态演示

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

LeNet-5数字识别

7、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1323640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你好!二叉排序树【JAVA】

目录 1.简单介绍 2.创建节点 3.创建二叉排序树 4.二叉树的删除 5.创建节点 6.创建二叉树 1.简单介绍 二叉排序树: BST: (Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点:要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。 特别说明:如…

HTTP协议设备接入

本文主要介绍使用Postman模拟HTTP协议,将设备连接到平台内置HTTP服务。 操作步骤 创建产品 物联网->设备管理->选择产品,填写产品基础信息。 参数 对应设备侧参数 ID 产品唯一标识,若不填写,系统将自动生成唯一ID 设备…

基于ssm校园二手交易平台论文

校园二手交易平台 摘要 随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了校园二手交易平台的开发全过程。通过分析企业对于校园二手交易平台的需求,创建了一个计算机管理校园二手交易平台的方案。文章介绍…

高效实现Java编程:将Excel XLSX转换为PDF的技巧

本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 Java是一种广泛使用的编程语言,它在企业级应用开发中发挥着重要作用。而在实际的开发过程中&#x…

运行hive的beelin2时候going to print operations logs printed operations logs

运行hive的beelin2时候going to print operations logs printed operations logs 检查HiveServer2的配置文件hive-site.xml&#xff0c;确保以下属性被正确设置&#xff1a; <property><name>hive.async.log.enabled</name><value>false</value>…

【服务器】Linux 安装 Jenkins+cpolar实现远程访问

Jenkins是一个开源的持续集成(CI)和持续交付(CD)工具&#xff0c;用于自动化构建、测试和部署软件项目。它提供了一个易于使用的平台&#xff0c;用于构建、测试和交付软件的过程。 下面介绍在Linux CentOS 7中如何实现安装Jenkins和结合cpolar 内网穿透工具实现远程访问Jenkin…

贝蒂详解<string.h>哦~(用法与实现)

目录 引言&#xff1a; &#xff08;一&#xff09;字符函数和字符串函数 1.简介 2.strlen()函数 2.1用法 2.2实例 2.3 实现strlen() &#xff08;1&#xff09;计数法 &#xff08;2&#xff09;递归法 &#xff08;3&#xff09; 指针-指针 2.4sizeof和strlen()的区别 3.s…

Java:语法速通

参考 菜鸟教程 java 继承 class 父类 { }class 子类 extends 父类 { }继承的特性&#xff1a; 子类拥有父类非private的属性和方法子类可以对父类进行扩展子类可以重写父类的方法使用extends只能单继承&#xff0c;使用implements可以变相的多继承&#xff0c;即一个类继承…

P71自监督式学习

命名都以芝麻街的角色命名 x 分为x’ 和 x’’ &#xff0c;自己跟自己学bert 架构跟 transformer Encoder 一样&#xff0c;输入一排向量&#xff0c;输出一排向量&#xff0c;一般用在自然语言处理上 模型大小&#xff1a; x 分为 x’ x’’ 自学习 bert 可以做输入一排向…

未来之笔:AI绘画如何重新定义人物设计艺术

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;艺术创作领域正迎来一场革命性的变革。AI绘画正在重新定义人物设计艺术&#xff0c;为艺术家和设计师带来前所未有的创作可能性。人物设计作为艺术创作中的重要组成部分&#xff0c;正在受到AI技术革新的深刻…

前端-如何自己做一个可视化的人员选择泛用组件

一、展示组件效果 二、组件的功能 1.用户可以在搜索框里输入字符&#xff0c;下方列表实时变动&#xff08;筛选出包含搜索字符的可选项&#xff09;&#xff0c;如果没有字符&#xff0c;就展示所有的选项 2.用户点击可选项&#xff0c;右侧出现标签 3.用户点击标签的XX&am…

【Git】Git基本操作

文章目录 Git 是什么Git 的优点Git 安装Linux UbuntuLinux CentOsWindows Git 基本操作1. 创建 Git 本地仓库2. 配置 Git3. Git工作区、暂存区和版本库4. 添加文件5. 查看 .git 文件6. 修改文件7. 版本回退 Git 是什么 Git是一个免费的、开源的分布式版本控制系统&#xff0c;…

国产Apple Find My认证芯片哪里找,伦茨科技ST17H6x芯片可以帮到您

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

Ubuntu 常用命令之 top 命令用法介绍

top命令是Linux下常用的性能分析工具&#xff0c;可以实时动态地查看系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。它可以显示系统总的和分区的CPU使用率、内存使用率、交换区使用率、系统负载、进程数、最耗CPU的进程等信息。 top命令的参数如下 -b…

数据之门:使用IPIDEA开启网络自由之旅~

本文目录 前言一、网络代理IP简介二、IPIDEA 优势2.1 多种类型IP代理2.2 海量纯净代理池2.3 稳定高效数据收集架构2.4 个人IP管理中心 三、IP代理实操小Tips3.1 查看本地网络IP3.2 使用浏览器IP代理3.3 使用IPIDEA进行爬虫实操 四、总结 前言 各位友友&#xff0c;大家好&…

Win10电脑字体太浅了看不清的解决方法

在Win10电脑操作过程中&#xff0c;用户发现电脑字体太浅了&#xff0c;自己都看不清字体了&#xff0c;这样比较影响自己的操作效率。下面小编给大家带来Win10字体颜色太淡的解决方法&#xff0c;解决后用户可以看到Win10电脑字体颜色就不会太淡&#xff0c;视觉体验感也更好。…

22款奔驰E260L升级原厂360全景影像 效果分享

很多车友们会问个问题 就是升级这些功能会不会有异响&#xff1f;我们星骏汇回答这个问题 有异响是因为师傅经验不够安装的不够仔细 &#xff0c;像卡扣卡不到位 原厂预留位置 安装的不准确 可能就会造成异响&#xff0c;也有很多车友会问 为什么要升级呢&#xff1f;准确的来说…

众和策略:网络安全行业未来增速可期 多股获机构扎堆调研

工业和信息化部、国家网信办、人力资源和社会确保部等十四部分近来联合印发《关于打开网络安全技术运用试点演示作业的告诉》&#xff08;以下简称《告诉》&#xff09;&#xff0c;将以新式信息基础设备安全、数字化运用场景安全、安全基础才干进步为主线&#xff0c;遴选一批…

(1)(1.9) MSP (version 4.2)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议&#xff0c;可通过任何串行端口进行遥测、OSD 和传感器。这样&#xff0c;ArduPilot 就能将遥测数据发送到 MSP 兼容设备&#xff08;如大疆护目镜&#xff09;&#xff0c;用于屏幕显示&#x…

生产问题(十二)GC垃圾回收导致空指针

一、引言 最近线上出现由于线程池任务执行超时导致的空指针&#xff0c;按道理说基本不会很多执行超时的&#xff0c;看了看监控&#xff0c;那个时间点发生了gc&#xff0c;gc时间超过5s。 说明这次是gc垃圾回收导致的问题&#xff0c;实际上需要排查解决的是垃圾回收问题。表…