Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​基于FPGA的数字识别-实时视频处理的定点卷积神经网络实现

​基于FPGA的数字识别-实时视频处理的定点卷积神经网络实现

作者头像
碎碎思
发布于 2021-12-10 00:47:54
发布于 2021-12-10 00:47:54
9370
举报
文章被收录于专栏:OpenFPGAOpenFPGA

基于FPGA的数字识别-实时视频处理的定点卷积神经网络实现

因为之前写的系列文章反应不是特别好,所以还是决定把一些复杂的东西简单化(尽量不写系列文章了),所以本篇文章将会完成所有的内容。

整篇文章主要内容如下所示:

效果:

PS:图像模糊的原因是一个人拍摄相机不好聚焦。

电脑显示数字(手写也可以,要求是浅色背景上检测深色数字(要求是训练集的问题)),通过摄像头采集缓存到SDRAM后在显示屏上显示摄像头数据,然后右下角显示监测到的数字。

下面就简单介绍一下相关知识。

数据集

手写数字识别的MNIST数据集(http://yann.lecun.com/exdb/mnist/)广泛应用于计算机视觉领域。然而,并不适合在我们的应用中训练神经网络,因为它与相机图像有很大的不同。主要区别包括:

  • MNIST图像是深色背景上的浅色数字,与来自摄像头的图像相反(下图中A来自MINIST,B来自普通的相机);
  • 摄像头产生彩色图像,图像大小为320×240像素,而MNIST是灰度的MNIST图像大小为28×28像素;
  • 与MNIST图像中居中放置的数字和相同背景(黑色)不同,数字可以在相机图像中移动和轻微旋转,有时背景中会有噪声;
  • MNIST没有单独的数字图像类别。

鉴于MNIST数据集的识别性能非常高,我们将摄像机图像的大小减少到28×28像素,并将其转换为灰度。这有助于我们解决以下问题:

  • 识别的准确度没有明显损失,因为即使在小图像中,数字仍然很容易被识别;
  • 对于数字识别而言,颜色信息过多,所以转换成灰度图像刚刚好;
  • 通过减少和平均相邻像素,可以清除来自摄像机的噪声图像。

由于图像变换也是在硬件级上执行的,因此必须预先考虑最小的一组算术函数,这些函数可以有效地将图像转换为所需的形式。修改摄像头图像的算法如下所示:

  • 从320×240图像中裁剪出一个中心部分,该部分测量224×224像素,由于224=28×8,因此随后可以轻松过渡到所需的图像大小。
  • 然后,将裁剪的图像部分转换为灰度图像。由于人类视觉感知的特殊性,我们采用加权平均,而不是简单的平均。为了便于在硬件级别进行转换,使用以下公式:

即RGB的权重为5:8:3

为了便于FPGA编程实现,我们可以在FPGA中使用移位实现8的乘法和16的除法。

  • 最后,将224×224图像分割成8×8块。我们计算每个块的平均值,在28×28图像中形成相应的像素。

由此产生的算法简单,适合FPGA实现并且速度非常快。

为了使用MNIST图像训练神经网络,需要把MINIST训练集进行修改:

  • 颜色反转;
  • 在两个方向上随机旋转10度;
  • 图像随机扩展或缩小4像素;
  • 图像强度的随机变化(从0到80);
  • 增加0%至10%的随机噪声。
  • 将来自摄像头的图像混合到训练集中。

上诉操作可以使用MATLAB或者Python批量处理。

CNN设计

CNN的体系一直在发展(也就是为什么ASIC没有批量生产,还用FPGA验证一些CNN最新的算法),但是本质仍然是一样,因为我们使用的FPGA是一个入门型的,所以我们也不用最新的CNN。

CNN的本质:输入大小从一层到另一层减小,而过滤器的数量增加。在网络的末端,形成一组特征,这些特征被馈送到分类层,并且输出层指示图像属于特定类别的可能性。

由于使用FPGA实现所以权重的总数对于设计来说是个瓶颈,所以需要最小化存储权重的总数(这对于移动系统至关重要),并促进向定点计算(FPGA只能进行定点计算)的转移:

  • 尽可能减少完全连接层的数量,这些层消耗大量的权重;
  • 在不降低分类性能的情况下,尽可能减少每个卷积层的滤波器数量;
  • 不使用偏差,当从浮点转换为定点时,添加常数会妨碍值的监控范围,并且每层上的舍入偏差误差会累积;
  • 使用简单类型的激活,如RELU(线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元),因为其他激活,如Sigmoid和Tahn,包含除法、求幂和其他难以在硬件中实现的运算;
  • 尽量减少异构层的数量。

在将神经网络转换为硬件之前,在准备好的数据集上对其进行训练,并保留软件实现的方式以供测试。使用Keras和Tensorflow后端的软件实现。

浮点计算转向定点计算

在神经网络实现的方案中,在GPU(快速)或CPU(慢速)上使用浮点计算方案是最常见的方案,例如,使用float32类型。在使用FPGA实现时,浮点运算对于这个“硬疙瘩”实在是很难实现,所以我们需要将浮点运算转换成定点计算(在牺牲一点识别率的情况)。

考虑一下神经网络的第一卷积层,它是卷积结构的主要构造。

层输入是一个二维矩阵(原始图片)28×28,其值从[0;1]。当a∈[−1,1]和b∈[−1,1]时,a·b∈[−1, 1].

对于3×3卷积,第二层中特定像素(i,j)的值计算公式如下:

当使用卷积块的定点计算时,有几种不同的策略:

  • 对所有可能的输入图像进行排序,并将注意力集中在潜在的最小值和最大值上,可以得到非常大的缩减系数;
  • 对于有限的权重和中间结果的宽度的定点计算,舍入误差不可避免地出现,每次加法和乘法基本运算后进行舍入;
  • 在卷积运算的最后进行精确计算和四舍五入(在内存开销和这种方案测试中,这种方案是最有利的)。

硬件测试

整个硬件架构如下:

整个硬件数据流:摄像头将图像以低频率写入FIFO,然后SDRAM控制器以高频率读取数据。然后FPGA将SDRAM中的数据写入屏幕FIFO。

来自摄像头的图片经过SDRAM后,按原样显示在屏幕上,并将图像转换为灰度并降低分辨率的图像输入到神经网络进行识别。当神经网络操作完成后,结果也直接输出到屏幕上。

逻辑使用率如下所示:

PS:可以通过修改使用的卷积块提高运行速率,但是会占用更多的逻辑。

视频演示

开源代码

代码会开源,不过现在还有一些问题,完善后会第一时间开源出来,请持续关注本公众号(OpenFPGA),谢谢大家支持。

参考文献

[1] Huang, Gao, et al. "Densely connected convolutional networks." CVPR. Vol. 1. No. 2. 2017.

[2] Chen, Liang-Chieh, et al. "Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs." IEEE transactions on pattern analysis and machine intelligence 40.4 (2018): 834-848.

[3] A. Shvets, A. Rakhlin, A. A. Kalinin, and V. Iglovikov, “Automatic instrument segmentation in robot-assisted surgery using deep learning,” arXiv preprint arXiv:1803.01207, 2018.

[4] Sandler M. et al. “Inverted residuals and linear bottlenecks:Mobile networks for classification, detection and segmentation” arXiv preprint arXiv:1801.04381, 2018.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenFPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
优秀的 Verilog/FPGA开源项目介绍(二十一)- 卷积神经网络(CNN)
在深度学习中,卷积神经网络(CNN或ConvNet)是一类人工神经网络(ANN),最常用于分析视觉图像。
碎碎思
2022/06/06
13.9K0
优秀的 Verilog/FPGA开源项目介绍(二十一)- 卷积神经网络(CNN)
Excel实现卷积神经网络
当你入门的时候,可能觉得机器学习很复杂……甚至很可怕。另一方面,电子表格却很简单。电子表格并不酷炫,但却能避免分散你的注意力,同时帮助你以直观的方式可视化代码后面发生的事情。
我被狗咬了
2019/09/23
1.3K0
Excel实现卷积神经网络
​优秀的 Verilog/FPGA开源项目介绍(二十二)- 深度神经网络 (DNN)
深度神经网络 (DNN) 是一种人工神经网络(ANN),在输入层和输出层之间具有多层。有不同类型的神经网络,但它们基本由相同的组件组成:神经元、突触、权重、偏差和函数。这些组件的功能类似于人类大脑,可以像任何其他 ML 算法一样进行训练。
碎碎思
2022/06/06
2.9K0
​优秀的 Verilog/FPGA开源项目介绍(二十二)- 深度神经网络 (DNN)
2025最新卷积神经网络(CNN)详细介绍及其原理详解
本文详细介绍了卷积神经网络(CNN)的基础概念和工作原理,包括输入层、卷积层、池化层、全连接层和输出层的作用。通过举例和图解,阐述了CNN如何处理图像,提取特征,以及如何进行手写数字识别。此外,讨论了池化层的平移不变性和防止过拟合的重要性。 本文是关于卷积神经网络(CNN)技术教程,整体内容从基础概念到实际示例,逐层剖析 CNN 的各个组成部分与作用,并通过手写数字识别案例帮助大家更直观地理解其工作原理。
猫头虎
2025/06/08
1.7K0
2025最新卷积神经网络(CNN)详细介绍及其原理详解
TensorFlow 手写数字识别与一步一步实现卷积神经网络(附代码实战)
手写数字识别 接下来将会以 MNIST 数据集为例,使用卷积层和池化层,实现一个卷积神经网络来进行手写数字识别,并输出卷积和池化效果。 数据准备 MNIST 数据集下载 MNIST 数据集可以从 THE MNIST DATABASE of handwritten digits 的网站直接下载。 网址:http://yann.lecun.com/exdb/mnist/ train-images-idx3-ubyte.gz: 训练集图片 train-labels-idx1-ubyte.gz: 训练集列标 t10
磐创AI
2018/04/24
3K0
TensorFlow 手写数字识别与一步一步实现卷积神经网络(附代码实战)
利用Pytorch编写卷积神经网络的“Hello World”
ChatGPT的横空出世让人工智能成功地吸引了大量的注意力,变成了整个2023年科技圈的最热话题。笔者从事的客户服务管理的工作,日常的工作中也需要处理一些技术相关问题,以此为契机,阅读了一些机器学习和深度学习的文章和书籍,希望可以更好的认识和理解深度学习和人工智能,实践是学习的最好手段,于是尝试学习并自己搭建一个深度学习的神经网络去实现简单的图像分类识别功能。这个过程相当于程序员在学习一门语言时写下的第一行“\underline{Hello World}” ,虽然过程很简单,却是入门的必经之路。
ericqi
2024/02/20
6490
利用Pytorch编写卷积神经网络的“Hello World”
卷积神经网络(CNN)
假设给定一张图(可能是字母X或者字母O),通过CNN即可识别出是X还是O,如下图所示
CristianoC
2020/05/31
9730
卷积神经网络(CNN)
基于 FPGA 的一维卷积神经网络(1D-CNN)算法加速
今天给大侠带来在FPAG技术交流群里平时讨论的问题答疑合集,以后还会多推出本系列,话不多说,上货。
FPGA技术江湖
2024/12/05
3620
基于 FPGA 的一维卷积神经网络(1D-CNN)算法加速
基于FPGA的数字识别的实现
现如今随着机器识别技术的日益成熟,在我们的日常生活中机器识别也随处可见。大家常见的有二维码识别,指纹识别,车牌识别等,这些技术已经相当成熟。还有现如今比较火的无人驾驶系统。无人驾驶系统中存在很多机器识别技术,包括对人或移动物体的识别,路标识别,以及距离估算等。而各种识别系统中,对数字的识别是必不可少的。数字在我们人类世界无处不在。
FPGA开源工作室
2019/10/29
1.6K0
基于FPGA的数字识别的实现
【Pytorch基础】卷积神经网络
  卷积神经网络(Convolutional Neural Network,CNN)是前馈人工神经网络的一种。在图像识别领域有着广泛的应用并且非常有效。当人们谈到计算机视觉时,通常都绕不开卷积神经网络。
yhlin
2023/02/27
9010
【Pytorch基础】卷积神经网络
基于卷积神经网络的手写数字识别系统_python 卷积神经网络
前面讲解了使用纯numpy实现数值微分和误差反向传播法的手写数字识别,这两种网络都是使用全连接层的结构。全连接层存在什么问题呢?那就是数据的形状被“忽视”了。比如,输入数据是图像时,图像通常是高、长、通道方向上的3维形状。但是,向全连接层输入时,需要将3维数据拉平为1维数据。实际上,前面提到的使用了MNIST数据集的例子中,输入图像就是1通道、高28像素、长28像素的(1, 28, 28)形状,但却被排成1列,以784个数据的形式输入到最开始的Affine层。 图像是3维形状,这个形状中应该含有重要的空间信息。比如空间上邻近的像素为相似的值、RBG的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等,3维形状中可能隐藏有值得提取的本质模式。但是,因为全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以(有可能)正确理解图像等具有形状的数据。 在全连接神经网络中,除了权重参数,还存在偏置。CNN中,滤波器的参数就对应之前的权重,并且,CNN中也存在偏置。
全栈程序员站长
2022/10/05
7440
基于卷积神经网络的手写数字识别系统_python 卷积神经网络
卷积神经网络的直观解释
英文原文:https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/
小白学视觉
2022/04/06
6870
卷积神经网络的直观解释
基于卷积神经网络的图像识别
视觉是人类认识世界非常重要的一种知觉。对于人类来说,通过识别手写体数字、识别图片中的物体或者是找出4%图片中人脸的轮廓都是非常简单的任务。然而对于计算机而言,让计算机识别图片中的内容就不是一件容易的事情了。图像识别问题希望借助计算机程序来处理、分析和理解图片中的内容,使得计算机可以从图片中自动识别各种不同模式的目标和对象。图像识别作为人工智能的一个重要领域,在最近几年已经取得了很多突破性的进展,而神经网络就是这些突破性进展背后的主要技术支持。
狼啸风云
2019/03/05
8K0
卷积神经网络(CNN)
在当今数字化时代,图像识别技术已经渗透到我们生活的方方面面,从智能手机上的拍照识别功能到自动驾驶汽车的视觉系统,其背后的核心技术之一就是卷积神经网络(CNN)。CNN 是一种深度学习架构,专为处理具有网格结构的数据(如图像)而设计。它通过模拟人类视觉系统的神经元连接方式,能够自动提取图像的特征,从而实现高效的图像识别。
LucianaiB
2025/01/23
5030
手写数字识别任务第一次训练(结果不好)
数字识别是计算机从纸质文档、照片或其他来源接收、理解并识别可读的数字的能力,目前比较受关注的是手写数字识别。手写数字识别是一个典型的图像分类问题,已经被广泛应用于汇款单号识别、手写邮政编码识别,大大缩短了业务处理时间,提升了工作效率和质量。另一个重要的原因是,对于编程来说入门是打印一个HelloWorld,但是深度学习入门就是实现一个手写数字的识别~
云深无际
2021/02/23
1.2K0
手写数字识别任务第一次训练(结果不好)
CNN卷积神经网络框架_fpga 神经网络
环境:Vivado2019.2。 Part:xcku040-ffva1156-2-i,内嵌DSP个数 1920个,BRAM 600个也就是21.1Mb。
全栈程序员站长
2022/11/09
5700
CNN卷积神经网络框架_fpga 神经网络
使用卷积神经网络进行实时面部表情检测
在社交互动中,面部表情在非语言交流中起着至关重要的作用。 心理学家保罗·埃克曼提出,全世界的人都有七种情绪表达方式:快乐、悲伤、惊讶、恐惧、愤怒、厌恶和蔑视。 建立更好的人机交互,例如通过图像检测人类情绪,可能是一项艰巨的任务。
deephub
2021/12/15
1K0
使用卷积神经网络进行实时面部表情检测
卷积神经网络概念与原理
受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位。近年来卷积神经网络在多个方向持续发力,在语音识别、人脸识别、通用物体识别、运动分析、自然语言处理甚至脑电波分析方面均有突破。
机器人网
2018/07/23
1.2K0
卷积神经网络概念与原理
卷积神经网络和图像识别[通俗易懂]
我们介绍了人工神经网络,以及它的训练和使用。我们用它来识别了手写数字,然而,这种结构的网络对于图像识别任务来说并不是很合适。本文将要介绍一种更适合图像、语音识别任务的神经网络结构——卷积神经网络(Convolutional Neural Network, CNN)。说卷积神经网络是最重要的一种神经网络也不为过,它在最近几年大放异彩,几乎所有图像、语音识别领域的重要突破都是卷积神经网络取得的,比如谷歌的GoogleNet、微软的ResNet等,打败李世石的AlphaGo也用到了这种网络。本文将详细介绍卷积神经网络以及它的训练算法,以及动手实现一个简单的卷积神经网络。
全栈程序员站长
2022/09/05
1.5K0
卷积神经网络和图像识别[通俗易懂]
用Keras通过Python进行卷积神经网络的手写数字识别
图像识别是深度学习技术的一个普遍具有的功能。
青橙.
2018/02/07
6.1K0
用Keras通过Python进行卷积神经网络的手写数字识别
推荐阅读
相关推荐
优秀的 Verilog/FPGA开源项目介绍(二十一)- 卷积神经网络(CNN)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档