FPGA实现mnist手写数字识别(软件部分)

article/2025/7/19 8:06:53

文章目录

  • FPGA实现mnist手写数字识别
    • ① 环境配置
    • ② 数据集及代码下载
    • ③ 代码操作
      • (1)训练模型
      • (2)权重输出
      • (3)关于灰度转换

FPGA实现mnist手写数字识别

① 环境配置

使用的环境:tf1.12,具体配置见here:

在这里插入图片描述
首先打开环境tf1.12,,再安装以下的包:

  • opencv
    在这里下载“linux-64/opencv3-3.1.0-py36_0.tar.bz2”,通过共享文件夹copy到download文件夹中,在文件夹下打开终端,输入以下命令进行安装:
conda install opencv3-3.1.0-py36_0.tar.bz2
  • matplotlib(时刻注意是py36)
conda install matplotlib

在这里插入图片描述

在这里插入图片描述

  • Pillow(貌似不用了,上面已经安装过了)
conda install Pillow
  • Pandas
conda install pandas

在这里插入图片描述

② 数据集及代码下载

在download文件夹下打开终端,用下列命令下载原代码:

git clone https://github.com/suisuisi/FPGAandCNN.git

在这里插入图片描述

包括以下python脚本:

  • 常用图像处理函数定义以及工程所需要的基本函数:a00_common_functions.py,a02_generate_random_non_number.py
  • 网络模型构建:a01_model_low_weights_digit_detector.py
  • 网络训练与测试:r01_train_neural_net_and_prepare_initial_weights.py
  • 权重浮点转定点缩放系数计算,并压缩权重:r02_rescale_weights_to_use_fixed_point_representation.py
  • 定点权重位宽选择:r03_find_optimal_bit_for_weights.py
  • 生成对输入图像进行灰度转换的verilog代码:r04_verilog_generator_grayscale_file.py
  • 生成定点权重数据:r05_generator_database.py

③ 代码操作

下载的是一个完整的工程文件夹,包括已经训练好的模型和已经转换过的权重信息,下面是尝试自己用脚本运行,得到结果。

(1)训练模型

在documents文件夹中,新建一个keras_mnist文件夹,将dataset和7个脚本复制到该空文件夹中,再建立一个空文件夹weights。

在这里插入图片描述

修改python3 r01_train_neural_net_and_prepare_initial_weights.py代码,将训练次数设置为50次(201行),每次训练200个batch_size(193行),学习率为0.001(182行):

在这里插入图片描述

输入以下命令运行该脚本(在tf1.12环境下):

python3 r01_train_neural_net_and_prepare_initial_weights.py

这个脚本的逻辑是,首先会展示一下model:

在这里插入图片描述

然后会判断数据集是否存在:

在这里插入图片描述

然后判断模型是否存在,不存在则重新开始训练:

在这里插入图片描述

然后就开始训练了…

在这里插入图片描述

训练结束后,使用mnist测试集进行测试,精确度达97.66;使用用户测试集对已训练好的网络进行测试,精确度可以达到80.39%;

这里先节约时间看看流程,所以设置epoch为5,可以看到精确度只达到了0.81,但是看到验证集的测试出错了:

在这里插入图片描述

根据报错,应该是函数调用的错误,在文件中找到该函数的定义与调用:
在这里插入图片描述

在这里插入图片描述

可见是函数调用时参数给多了一个,去掉最后一个参数’valid’即可。

在这里插入图片描述

修改该错误后重新运行脚本,就不报错了。可见在mnist测试集的精确度达到了0.94。

在这里插入图片描述
使用用户自己的测试集mnist_keras/dataset/test进行测试,精确度只有0.64:

在这里插入图片描述

在keras_mnist/weights文件夹下可以看到存储的权重信息,以及可视化训练精确度曲线图,橙色为训练曲线,蓝色为测试曲线:

在这里插入图片描述

在这里插入图片描述

这个精确度是不太好的,并且如果模型训练不好,之后权重分布很奇怪,导致权重位宽确定的时候会需要更多的bit数,需要的时间也很长,所以这里还是跑50个epoch吧!(耗时约40min)

可见,此时mnist测试集准确率达到0.97,用户测试集准确率达到0.87。

在这里插入图片描述

在这里插入图片描述

(2)权重输出

权重输出,即得到一个database.v文件,包含这么几个步骤:权重转换、权重位宽确定、写verilog文件。

首先,要运行r02_rescale_weights_to_use_fixed_point_representation.py脚本,进行权重转换。

什么是权重转换(转载):

  在网络训练完成后,需要对网络训练后所得参数进行处理,浮点转定点与数据量化。在此,我们通过寻找合适的缩放系数进行定点转换,具体原理如下。
  以神经网络的第一个卷积层为例子,在第一个卷积层输入处,输入是二维矩阵(原始图片)28*28,像素值的范围为[0:1]。

  对于3 * 3卷积,第二层中某个像素(i,j)的值可以如下计算:

在这里插入图片描述

  由于使用软件已经训练出网络结构中的浮点型权重w (i,j),因此可以计算第二层输入的潜在最小mn和最大mx。设M = max(|mn|,|mx|),这样,我们将w(i,j)除以M的值,我们可以保证对于任意输入数据,第二层的输入都不会不超过1。我们称M为该层的缩放系数。对于第二层,我们使用相同的原理,即该层输出的值(第三层的输入)属于区间[-1;1] 。
  对于所有权重使用上述方法减小,最后一个神经元输出的最大位置是不会发生改变的,也就是说,转换后的权重信息等效于从浮点型权重所提供的信息。在经过缩减系数缩减后,可以确切的知道每个计算阶段输出值的大小范围,使用浮点定点转换算法,可以进一步实现浮点定点转换: x b = [ x ∗ 2 N ] xb= [x * 2N] xb=[x2N],表示浮点数, x b xb xb表示定点数。

  也就是说:我们必须将转定点后的结果除以2N或者是将其移位N个位置才能得到实数值。
  如果我们对所有可能的输入图像进行排序并关注潜在的最小值和最大值,我们可以获得非常大的缩减系数,这样会在层与层之间降低计算精度。这样将需要很大的位宽和中间结果来表示定点结果。为了避免这种情况,我们只使用训练集的全部(或部分)来查找每层中最可能的最大值和最小值,然后进一步进行浮点定点转换。

因此,输入以下命令运行转换的脚本:

python3 r02_rescale_weights_to_use_fixed_point_representation.py

可见,他会首先搜索每层的最大值和最小值:

在这里插入图片描述

然后会根据找到的整体的最大最小值进行浮点转换,最后在keras_mnist/weights文件夹下将生成对应的权重文件keras_model_low_weights_digit_detector_rescaled.h5文件。

在这里插入图片描述

在这里插入图片描述

然后运行脚本r02_rescale_weights_to_use_fixed_point_representation.py:

在运行前排除一个坑,将1600行左右的创建文件夹的代码移动到main函数的最前面,然后修改os.mkdir()为os.makedirs()【因为创建的是多级目录】,如下图所示。(以免都跑了半天了才发现文件夹创建不成功…血的教训)

在这里插入图片描述

然后输入以下命令运行最后一个脚本:

python3 r05_verilog_generator_neural_net_structure.py

观察一下这个文件,首先会确定最佳的bit_size,这一步是调用的r03_find_optimal_bit_for_weights.py文件的函数,然后会找到之前保存的权重转换过的模型,然后使用大量的file.write()进行写verilog文件。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

关于权重位宽的确定(转载)

  对于具有有限宽度的权重和中间结果的定点计算,不可避免地会出现舍入误差,从一层到另一层累积,并且可能导致“不准确”的预测。为了验证预测的“准确性”,我们通过使用浮点型权重的神经网络对测试图像进行预测,以及使用定点型权重的神经网络对测试图像进行预测,将预测结果进行比较。
  衡量的标准为:不匹配次数 / 总测试次数 * 100%。
  因此,我们为找出合适的定点权重位宽,在脚本中将会从8bit量化位宽开始进行测试。测 试会计算该宽度的定点权重预测精度与浮点权重预测精度的误差。如果误差不为0,则增加位宽宽度,并继续执行测试,直到误差为0。

可以看到,会先按照8bit进行测试,error为7.84%,继续按照9bit测试:

在这里插入图片描述

9bit时,结果error为0,因此确定了我们权重位宽为9+1bit:

在这里插入图片描述

最后读取模型,生成以下files:

在这里插入图片描述
在这里插入图片描述

(3)关于灰度转换

运行r04_verilog_generator_grayscale_file.py这个文件生成一个能加下“灰度转换”的verilog文件(其中会调用确定最佳位宽的函数,即在模型训练好后,要根据最终的模型确定灰度转换的代码)。

首先同样排掉这个坑,在文件main函数中添加创建文件夹的代码,或者自己先创建也行…

在这里插入图片描述

运行下列命令,可以生成灰度转换的verilog文件:

python3 r04_verilog_generator_grayscale_file.py

生成成功:
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/oh3wFjap.shtml

相关文章

pyqt5手写板+pytorch卷积神经网络,实现手写数字识别软件

卷积神经网络的结构 #定义网络结构 #不是le-net5的结构 class Net(nn.Module):def __init__(self):super(Net, self).__init__()# Sequential表示在搭建网络模型中要执行的一系列的步骤# Dropout中,p0.5表示50%的神经元不工作# layer3:输出层 一般输出层中不需要加Dropout# Co…

使用Dl4j训练的一个手写数字识别软件

DL4J使用之手写数字识别 最近一直在学习深度学习,由于我是Java程序员出身,就选择了一个面向Java的深度学习库—DL4J。为了更加熟练的掌握这个库的使用,我使用该库,以MNIST(http://yann.lecun.com/exdb/mnist/)手写数字数据集作为…

识别数字的软件有哪些?这几款识别数字工具安利给你

嘿,朋友们,你们有没有遇到过需要处理大量数字的情况,要是一个一个手动输入感觉十分麻烦,还会耗费大量时间和精力?别着急,现在数字识别的软件已经非常发达了,只需要一款好用的数字识别软件&#…

这款数字识别软件你知道吗

识别数字技术是指通过计算机自动识别数字的能力,通常采用数字图像处理和模式识别等技术进行实现。你别看这个技术好像很高大上,实际上现在已经有很多软件可以做到识别数字了,你知道识别数字的软件有哪些吗?今天我就为大家科普这项…

基于TensorFlow深度学习框架,运用python搭建LeNet-5卷积神经网络模型和mnist手写数字识别数据集,设计一个手写数字识别软件。

本软件是基于TensorFlow深度学习框架,运用LeNet-5卷积神经网络模型和mnist手写数字识别数据集所设计的手写数字识别软件。 具体实现如下: 1.读入数据:运用TensorFlow深度学习框架,下载并读入mnist手写数字识别数据集。 2.构建模型…

OCR手写数字识别什么软件好用?介绍一种

OCR是指用电子设备检查文本上的资料,然后对图像文件进行分析处理,从而获取文字及版面信息的过程。那OCR手写数字识别有好用的软件吗?当我们需要整理大量手写资料需要整理时,下面这两款软件就派上用场了。 软件一、我们可以使用识别…

识别数字的软件有哪些?自动识别数字的方法并不难

每个月月初时,作为销售助理的同事经常要整理一大堆数据,密密麻麻的数字看得他头晕眼花,特别是有些图片里的数字,一不小心就容易出错,酿成严重的数据错误。像平时我也会处理到一些数据图片,为了准确及时的整…

Unity 渲染YUV数据 ---- 以Unity渲染Android Camera数据为例子

1 背景 一般Unity都是RGB直接渲染的,但是总有特殊情况下,需要渲染YUV数据。比如,Unity读取Android的Camera YUV数据,并渲染。本文就基于这种情况,来展开讨论。 Unity读取Android的byte数组,本身就耗时&am…

图形学之Unity渲染管线流程分析

文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 表格制作excel教程http://www.tpyjn.cn/ 学习通http://www.tsgmyy.cn/ 下图是《Unity Shader 入门精要》一书中的渲染流程图; ApplicationS…

Unity渲染(二):Shader着色器基础入门之渲染Image图片

Unity渲染(二):图片渲染 通过这里,你会学习到怎么将一张图片渲染到UI的Image组件或者SpriteRenderer上,以及透明物体的渲染。 上一章:Unity渲染(一):着色器基础入门之纯色Shader 开发环境:Unity5.0或者更高 透明与不透明的最终效果 概述 1…

unity 渲染性能分析工具

目标 既然要优化,肯定要有个目标: pc上一般要求:一秒渲染60帧 移动端:一秒渲染30帧 这应该是最低的要求,如果游戏运行时,游戏帧率有变化,人眼能够明显的感觉到帧率下降。 优化的首要规则是找到…

unity 渲染环境设置

环境光分为两种,一种是环境光漫反射SH(球谐光照),另一种是环境光的镜面反射IBL(基于图像的渲染)。 光照的配置位置可以在 窗口 -> 渲染 -> 光照 打开。 环境照明对应的就是环境漫反射,环…

【流程向】模型复原与Unity渲染

项目简述 简单记录下学校里的一个项目,涉及到对/何家村遗宝/的模型复原,记录一下模型制作的全流程,同时涉及到Unity中一些优化画面的技术点。项目中渲染效果优先,没有怎么考虑性能。 流程:Blender高低模与展UV ->…

Unity中的物体渲染顺序

big seven 文章目录 前言 一、摄像机渲染 二、划分渲染队列 三、不透明物体的渲染 四、透明物体的渲染 五、UGUI元素的渲染 总结 前言 Unity中物体的渲染顺序 提示:以下是本篇文章正文内容,下面案例可供参考 一、摄像机渲染 Unity中的渲染顺序首先是…

Unity渲染流程概述

本篇的任务是回答:在Untiy的渲染流程中CPU和GPU分别做了什么。 渲染到设备屏幕显示的每一帧的画面,都经历几个阶段的加工过程: 应用程序阶段(CPU):识别出潜在可视的网格实例,并把他们及其材质…

Unity_渲染_灯光_前向渲染

前向渲染路径 前向渲染的作用和意义场景内有多个灯光,如何渲染每个灯光对物体的影响 前向渲染的作用和意义 前向渲染的作用:处理多光源的渲染,多光源渲染在unity 有2中渲染方式 前向渲染和延时渲染 .延时渲染主要用于主机,PC平台,不在本次讨论范围.主要来研究前向渲染前向渲染…

【Unity渲染】前向渲染和延迟渲染的区别及切换

前向渲染和延迟渲染通道的区别,主要在对于光源的处理上。 Unity默认是前向渲染通道,如果光源特别多,可以使用延迟渲染。 前向渲染 使用前向渲染路径时,被照亮的对象将在单独的通道中进行渲染。根据场景中的光源数量以及它们是否…

从FrameDebugger看Unity渲染

从FrameDebugger看Unity渲染(一) Unity如何渲染一个3D2D的游戏画面,今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略, 后续再出一些URP渲染管线相关的文章。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c…

UnityShader入门精要——Unity中的渲染优化技术(二)

减少DrawCall数目 最常见的优化技术——批处理。实现原理为减少渲染每一帧所需的drawcall数目。使用同一个材质的物体可以一起处理。 优点缺点动态批处理切处理都是Unity 自动完成的,不需要我们自己做任何操作,而且物体是可以移动的限制很多&#xff0c…

Unity渲染顺序(2)

Camera 除了Screen Space - Overlay(屏幕空间覆盖模式)下的Canvas,场景中的其他物体需要渲染到屏幕中,都需要在指定的相机的绘制下。场景中可以创建多个相机,每个相机所拍摄的内容可能并不相同,在场景中有多相机的情况,不同的相机…