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

目录

  • 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.rhkb.cn/news/221291.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Webpack安装及使用

win系统 全局安装Webpack及使用 前提:使用Webpack必须安装node环境,建议使用nvm管理node版本。 1:查看自己电脑是否安装了node 2:npm install webpack版本号 -g 3:npm install webpack-cli -g -g:表示全局安装 4&…

ROS学习笔记(七)---参数服务器

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序(简例) 03. ROS学习笔记(三)—好用的终端Terminator 04. ROS学习笔记(四)—使用 VScode 启动launch文件运行多个节点 05. ROS学习笔…

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用 燃气轮机发电机组作为一种高效可靠的常备应急电源,在保障发电品质稳定性和可靠性方面发挥着关键作用。其中,励磁控制系统是保证供电质量的重要环节,对发电机组的稳定运行至关重要。为了有…

面向 NLP 任务的大模型 Prompt 设计

很久之前,我们介绍到,prompt是影响下游任务的关键所在,当我们在应用chatgpt进行nlp任务落地时,如何选择合适的prompt,对于SFT以及推理环节尤为重要。 不过,硬想不是办法,我们可以充分参考开源的…

gitlab ci pages

参考文章 gitlab pages是什么 一个可以利用gitlab的域名和项目部署自己静态网站的机制 开启 到gitlab的如下页面 通过gitlab.ci部署项目的静态网站 # build ruby 1/3: # stage: build # script: # - echo "ruby1"# build ruby 2/3: # stage: build …

linux 驱动——杂项设备驱动

杂项设备驱动 在 linux 中,将无法归类的设备定义为杂项设备。 相对于字符设备来说,杂项设备的主设备号固定为 10,而字符设备不管是动态分配还是静态分配设备号,都会消耗一个主设备号,比较浪费主设备号。 杂项设备会自…

大数据分析22、23真题回忆

2022 学长描述 1. 一个很简单的据估计 2. 算一个决策树 3. Cypher图 4.Hadoop和Spark的区别 2023 真题回忆 1. 大数据分析的定义 说出大数据分析三个层次 2.大数据分析流程 预处理部分包含哪几个步骤 3.Spark核心部件和应用库有哪些 并简要说明功能 4. 主成分分析和因…

MyBatis的配置文件(.properties,typeAliases,Mappers)

目录 一,.properties标签 二,typeAliases标签 三,Mappers标签 一,.properties标签 我们一般会把数据库配置信息定义在一个独立的配置文件里面,比如db.properties: jdbc.drivercom.mysql.jdbc.Driver jd…

2023中国品牌节金谱奖荣誉发布 酷开科技获颁OTT行业科技创新奖

11月17日—19日,以“复苏与腾飞”为主题的2023第十七届中国品牌节,在杭州市云栖小镇国际会展中心成功举行。在18日晚间的荣耀盛典上,“TopBrand 2023中国品牌节金谱奖”荣誉发布,酷开科技斩获OTT行业科技创新奖。 酷开科技作为OTT…

类和对象(中篇)

类的六个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数: 用户没有显式实现,编译器会…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

Java发起SOAP请求代码参考

目录 Java发起SOAP请求代码参考 代码1.组装参数2.加密参数3.发起连接4.解析返回数据 参考 文章所属专区 超链接 代码 1.组装参数 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&qu…

HarmonyOS引导页登陆页以及tabbar的代码说明1

效果 以下代码是东拼西凑出来的。只是为了个人熟悉一下相关模块的使用&#xff1a; 用的知识点&#xff1a; Resouces 此部分分内容可以在项目中找到&#xff1a; resources/base/element/color.json 为项目着色配置&#xff0c;当然也可以正接在代码里写 float.json 为相关…

linux之Samba服务器

环境&#xff1a;虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享&#xff08;匿名访问&#xff09; 1.在虚拟机CENTOS 7安装smb服务&#xff0c;并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件&#xff0c;实现光盘匿名共享 4. 启动smb服务 5.在…

快速解决msvcr100.dll丢失的方法分享,亲测有效的5个方法

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是某些程序无法正常运行&#xff0c;提示“msvcr100.dll丢失”的错误信息。msvcr100.dll是Microsoft Visual C 2010运行库的一部分&#xff0c;它提供了许多常用的函数和类&#xff0c;这些函数和类…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

Nginx快速入门:访问日志access.log参数详解 |访问日志记录自定义请求头(三)

0. 引言 在企业的生产环境中&#xff0c;我们时常需要通过nginx的访问日志来统计流量、排查调用问题等&#xff0c;而nginx默认的日志格式所包含的信息远无法满足我们使用&#xff0c;因此常常需要对日志进行自定义&#xff0c;所以今天我们就来看如何自定义nginx的访问日志格…

buuctf-Misc 题目解答分解91-93

91.[SUCTF2018]followme 下载完就是一个流量包 &#xff0c;用wireshark 打开 直接导出 http对象 这里面 有很多的这样的文件 里面都是参数 直接搜索 关键字 suctf grep -r "SUCTF" 得到flag SUCTF{password_is_not_weak} 92.[MRCTF2020]CyberPunk 用notepad 打开…

hive企业级调优策略之分组聚合优化

测试用表准备 hive企业级调优策略测试数据 (阿里网盘下载链接)&#xff1a;https://www.alipan.com/s/xsqK6971Mrs 订单表(2000w条数据) 表结构 建表语句 drop table if exists order_detail; create table order_detail(id string comment 订单id,user_id …

【网络安全】—Shell编程入门(1)

文章目录 基础变量概念介绍特殊变量进阶数值计算实践条件测试比较条件判断语句流程控制语句循环语句应用 Shell 是 Unix/Linux 操作系统下的一种命令行解释器&#xff0c;它接收用户输入的命令然后调用相应的程序。我们可以通过 Shell 脚本来自动执行一系列的命令。接下来&…