0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

卷积神经网络介绍 基于LeNet5实现的手写字符识别

FPGA技术江湖 来源:疯狂的FPGA 作者:CrazyFPGA 2022-05-16 10:39 次阅读

前文中,我们介绍了一些传统计算机视觉算法,包括降噪滤波、二值化、缩放、锐化等,最终我们在FPGA上实现了实时的运动目标跟踪算法。近些年基于神经网络机器学习已经成熟应用于很多商业、工业领域,包括自动驾驶、自动生产,智能医疗等。

那么,作为一本图像处理的入门教材,除了介绍一些传统入门的计算机视觉算法与对应的硬件实现,我们也希望引入最近很流行的神经网络相关的介绍。本章我们将简单介绍卷积神经网络和基于LeNet5实现的手写字符识别,并且在FPGA上实现实时识别的Demo。

一、神经网络的介绍

1.1人工神经网络

人工神经网络(Artificial Neural Networks,简称ANN),是受生物神经网络所启发而构建的数学模型,去模拟神经元的动作和神经元之间的联结[1]。一个简单的人工神经网络的计算模型如图1所示。通常一个人工神经网络包含一个输入层,不少于一个的隐藏层和一个输出层。输入层是由一系列的神经元来接受不同的输入;隐藏层是介于输入层和输出层之间的由一层或者多层神经元和连接组成的。通常隐藏层的数量决定了人工神经网络的学习和泛化能力。输出层是输入经由整个神经网络学习和分析得到的高层语义结果,比如目标类型等。

图1(a)所示的人工神经网络也称为感知机(Perception),含有多层隐藏层的人工神经网络为多层感知机(Multi-layer perception)。

ec94e2b6-d49f-11ec-bce3-dac502259ad0.png

1 一个简单人工神经网络的图表展示(a)展示了一个有8个输入神经元,一个隐藏层和一个输出神经元的人工神经网络,(b)展示了在隐藏层中的一个神经元的数学模型,包含累积和激活函数。

如图1(b)所示,隐藏层对所有的输入做加权累积,权重wi反映了不同神经元之间连接的强弱程度,而偏置bi反映了神经元被激活的难易程度。人工神经网络中的激活函数模拟了生物神经网络中神经元的调节器,用来控制神经元的兴奋和静息状态。单个神经元的数学模型hn如下所示:

ecb0ac76-d49f-11ec-bce3-dac502259ad0.png

该公式中,xi是第n个神经元的输入,wni是第i个输入xi对应连接的权重,bn 是第n个的神经元的偏置,φ( )是激活函数,如图1(b)所示,这里用线性整流函数(Rectified Linear Unit)作为激活函数。

1.2卷积神经网络

卷积层是由一系列并行的卷积核(Kernel)组成,通过对输入图像以一定的步长(Stride)进行滑动卷积计算,产生对应的特征图(Feature map),供下一层计算使用。卷积核通常是二维,也有单个点,一维或者三维的。一个典型的卷积核计算公式如下所示:

eccf12ce-d49f-11ec-bce3-dac502259ad0.png

该公式中,Ix,y是第k个卷积核的输入,wi,j,k是第k个输入xx,y对应连接的权重,bk 是第k个卷积核的偏置,x, y分别是输入图像像素点水平和竖直方向上的位置。i,j分别是权重在水平和竖直方向上的索引(Indices)。

池化层是一个在卷积神经网络中常见的操作层,主要有两个作用,一是用来降低维度和计算量。一般卷积计算(步长为1)并不减少维度,而池化层主要是对一定的区域求取最大值或者取均值,这样的操作分别为最大池化(Max pooling)和平均池化(Average pooling),如图2所示,为一个示例展示了平均池化和最大池化分别作用于2×2的区域以2的步长滑动。左边的平均池化是对2 x 2的块内计算平均值,右边的最大池化是对2 x 2的块内寻找最大值。

ece36bfc-d49f-11ec-bce3-dac502259ad0.png

2 2×2平均池化与最大值池化

池化层的另一个作用是尽可能多的保存最有效信息。因为经过卷积计算,图像中的物体特征可以被精确地提取出来,但是并非所有的特征都是有效的,池化操作可以保留最有效的信息,同时降低了卷积神经网络对精确特征的敏感度。

批正则化是由Google在2015年提出的[4],目的是为了加速模型收敛,解决内部协变量平移(Internal covariate shift)以及对模型引入正则化。在训练CNN的过程中,由于数据集太大,我们通常只会将一部分数据(mini-batch)放到CPU或者GPU上。批正则化就是对mini-batch的数据都做正则化,转换到均值为0,标准差为1的正态分布。批正则化的具体公式见图3。批正则化的核心思想就是将数据分布变得比较均匀,这样可以稳定梯度,而且让每一层的学习率变化没那么大。CNN的每一层的均值和标准差都是不一样的,这样可以等效为引入一定的噪声,增加了CNN的正则化效果。

ed21548a-d49f-11ec-bce3-dac502259ad0.png

3 批正则化的具体算法[4]

在人工神经网络中提到的激活函数,是作为一个部件来决定在神经元内的信息通路。从生物学上来说,神经元之间通常由电化学来进行信息传递的。一般神经元会接收到不同来源的电势,如果一个神经元达到了兴奋电势,这个神经元将会产生动作电位,把信息通过神经传递物质或者电势传递给其相邻的神经元。反之,如果一个神经元没有达到兴奋电势,那么它将不能激活也不能传递信息。许多种数学模型用来模拟这个生物特征。S型函数(Sigmoid function)是一个比较常见的激活函数,在人工神经网络和卷积神经网络中使用的比较多,其公式如下:

ed3d4276-d49f-11ec-bce3-dac502259ad0.png

该公式中,x是激活函数的输入。f(·) 是S型函数,将输出限制在0到1之间(0,1)。S型函数通常用在卷积神经网络的输出层,但是该函数在卷积神经网络优化过程中,有两个问题。第一个是当S型函数的输入趋于无穷大时,在反向传播过程中,梯度会趋近于0,产生了梯度弥散问题,导致卷积神经网络无法正常收敛。第二个问题是S型函数中的指数和除法运算都会消耗比较多的硬件计算资源。前文提到的线性整流函数(ReLU)也是一个在卷积神经网络中常用的激活函数。该函数实现简单,同时又能避免S型函数在反向传播中容易出现梯度消失的问题。它的导数是0或者1,不会消耗较多的计算资源同时也很容易收敛。其公式如下:

ed75a814-d49f-11ec-bce3-dac502259ad0.png

在神经网络发展的几十年内,有非常多的理论和应用涌现。本文受限于篇幅,只介绍了基本概念和基础知识。本文只介绍了标准卷积和常用的激活函数,还有很多其他的卷积类型,比如深度卷积(Depthwise convolution),分组卷积(Group convolution),空洞卷积(Dilated convolution),可变性卷积(Deformable convolution)等。激活函数除了S型函数和线性整流函数,还有tanh函数,Leaky ReLU函数,Swish函数等。接下来,笔者会介绍一个基础且经典的卷积神经网络LeNet5,在手写字符识别中的具体应用以及软硬件实现。

二、基于LeNet5 CNN的Matlab的实现

2.1 LeNet5 CNN简介

LeNet5卷积神经网络最早出现在由Yann LeCun等人于1998年发表在Proceedings of The IEEE学术期刊上的“Graident-based Learning Applied to Document Recognition”这篇文章里[5],用于做手写数字识别(Handwritten digit recognition)。LeNet5卷积神经网络的结构非常简单,如图4所示,其中图中的灰色方块代表了一个特征图。

edaafa1e-d49f-11ec-bce3-dac502259ad0.png

4 LeNet5卷积神经网络的架构[5]

LeNet5卷积神经网络有3个卷积层(C1,C3,C5),2个池化层(S2,S4)和2个全连接层(F6和OUTPUT)。LeNet5卷积神经网络的输入是分辨率为32×32的灰度图,所以通道(Channel)数是1。第一层卷积层是由5×5×6的卷积核组成,与输入层进行卷积操作,我们得到28×28×6的特征图,即图4中的C1。经过2×2的平均池化,我们得到14×14×6的特征图,即图4中的S2。然后对S2的特征图进行5×5×16的卷积计算,我们得到10×10×16的特征图,即图4中的C3。后面继续进行池化操作,我们得到5×5×16的特征图,即图4中的S4。最后一层卷积层有5×5×120个卷积核。经卷积计算,我们得到1×1×120的特征图,即图4中的C5。经过两个全连接层,我们最终得到1×1×10的输出,分别对应0-9每个数字的置信度。LeNet5卷积神经网络的结构如表1所示。LeNet5卷积神经网络的参数量大约为60,000左右。

1 LeNet5卷积神经网络架构

通道数

滤波器大小

步长

特征图大小

参数量

输入层

1

32×32×1

卷积层1

6

5×5

1

28×28×6

5×5×6 + 6

池化层1

2×2

2

14×14×6

卷积层2

16

5×5

1

10×10×16

5×5×6×16 + 16

池化层2

2×2

2

5×5×16

卷积层3

120

5×5

1

1×1×120

5×5×16×120 + 120

全连接层1

84

1×1

1×1×84

1×1×120×84 + 84

全连接层2

10

1×1

1×1×10

1×1×84×10 + 10

2.2LeNet5 CNN的Matlab实现

首先我们需要准备MNIST的手写数字数据集,从[6]上下载。该数据集中有60,000个训练数据和对应的标签(Label),还有10,000个测试数据和对应的标签。数据集图片和标签的读入格式如下图5,6所示。数据集图片的像素是按照逐行排列的,像素点值是0-255,0代表白色,255代表黑色,标签是0-9。

edbb39e2-d49f-11ec-bce3-dac502259ad0.png

5数据集图片读入格式[6]

ee425292-d49f-11ec-bce3-dac502259ad0.png

6 标签读入格式[6]

在Matlab中,我们将编写读MNIST数据集的函数来准备好训练集和测试集图片及对应的标签。具体代码见loadMNIST.m。

ee6081ea-d49f-11ec-bce3-dac502259ad0.png

ee9208f0-d49f-11ec-bce3-dac502259ad0.png

7 a)Matlab中读入的手写数字和b)对应的数值

接下来我们将继续构建LeNet5卷积神经网络所需的其他部件,比如卷积层,池化层,激活函数和全连接层。卷积层的输入为H×W×C大小的图像,卷积核为N×Hin×Win×C的一组滤波器,输出为Hout×Wout×N的图像,卷积层还有一个步长参数stride。具体实现代码见Conv2D.m。

eeaf0504-d49f-11ec-bce3-dac502259ad0.png

对于池化层,没有实现论文中的平均池化,我们这里用最大池化来做,平均池化的实现比较类似,读者有兴趣可以自己实现。池化层的输入为H×W×C大小的特征图,输出为(H/Stride)×(W/Stride)×C大小的特征图,只有一个步长参数。具体实现代码见Maxpool.m。

eedf2ca2-d49f-11ec-bce3-dac502259ad0.png

我们选择用ReLU作为激活函数,方便硬件实现。在Matlab中,我们也利用其向量运算的特性来快速实现ReLU函数,具体代码见ReLU.m。

ef1b164a-d49f-11ec-bce3-dac502259ad0.png

全连接层就是特殊的卷积层,其卷积核的H和W为1,且输入的H和W为1。所以这里我们复用了Conv2D的代码,不再具体展示了。

现在有非常多好用的平台进行神经网络的训练和部署,笔者参考了Matlab来训练LeNet5卷积神经网络的,就不详述在Matlab上实现LeNet5卷积神经网络的训练过程了(此部分包含误差的计算和反向传递,权值的更新)。有兴趣的读者可以在网上搜索相关的资料进一步理解。这里我们将TensorFlow训练的模型导出,然后在Matlab中读入,对测试集进行推理。如下图8所示,我们将每一层的结果展示出来,方便我们理解LeNet5卷积神经网络的特征提取过程。

ef3c51e8-d49f-11ec-bce3-dac502259ad0.png

8 LeNet5 Matlab实现中对应的每一层特征图

三、基于LeNet5 CNN的FPGA硬件加速实现

2 LeNet5卷积神经网络的架构和每层所需的内存大小

通道数

滤波器大小

步长

特征图大小

内存大小

输入层

1

32×32×1

1024×8

卷积层1

6

5×5

1

28×28×6

1024×6×16

池化层1

2×2

2

14×14×6

256×6×16

卷积层2

16

5×5

1

10×10×16

128×6×16

池化层2

2×2

2

5×5×16

32×16×16

卷积层3

120

5×5

1

1×1×120

128×16

全连接层1

84

1×1

1×1×84

全连接层2

10

1×1

1×1×10

ef828c80-d49f-11ec-bce3-dac502259ad0.png

13 延时优先的LeNet5卷积神经网络的仿真结果

四、基于摄像头的字符识别FPGA Demo的搭建与实现

效果如下,具体的内容,麻烦等书出版吧,谢谢

efb1b208-d49f-11ec-bce3-dac502259ad0.png

16 字符识别的FPGA Demo系统实时识别,手写字符由Matlab生成显示在屏幕上,下面为FPGA Demo的实时识别结果。

原文标题:基于LeNet5的深度学习FPGA加速实现

文章出处:【微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21748

    浏览量

    603967
  • matlab
    +关注

    关注

    185

    文章

    2977

    浏览量

    230601
  • 卷积神经网络

    关注

    4

    文章

    367

    浏览量

    11877

原文标题:基于LeNet5的深度学习FPGA加速实现

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA实现LeNet-5卷积神经网络

    LeNet-5 是一个经典的卷积神经网络(CNN),由 Yann LeCun 在 1990 年代设计,主要用于手写数字识别任务(如 MNIS
    的头像 发表于 07-11 10:27 2290次阅读

    卷积神经网络如何使用

    卷积神经网络(CNN)究竟是什么,鉴于神经网络在工程上经历了曲折的历史,您为什么还会在意它呢? 对于这些非常中肯的问题,我们似乎可以给出相对简明的答案。
    发表于 07-17 07:21

    卷积神经网络模型发展及应用

    的过程中存在梯度消失的问题[23],神经网络再 次慢慢淡出人们的视线。1998 年 LeCun 发明了 LeNet-5,并在 Mnist 数据 集达到 98%以上的识别准确率,形成影响深远的
    发表于 08-02 10:39

    基于矢量特征编码的手写字符识别技术

    针对手写输入法中手写字符识别技术的应用需求,提出了一种利用矢量字符的矢量方向编码技术和概率论知识设计的手写字符识别系统,避免了传统手写输入法
    发表于 07-30 11:11 21次下载

    【科普】卷积神经网络(CNN)基础介绍

    卷积神经网络的基础进行介绍,主要内容包括卷积神经网络概念、卷积
    发表于 11-16 01:00 1.1w次阅读
    【科普】<b class='flag-5'>卷积</b><b class='flag-5'>神经网络</b>(CNN)基础<b class='flag-5'>介绍</b>

    卷积神经网络CNN架构分析-LeNet

    对于神经网络卷积有了粗浅的了解,关于CNN 卷积神经网络,需要总结深入的知识有很多:人工神经网络 ANN
    发表于 11-16 13:28 2764次阅读
    <b class='flag-5'>卷积</b><b class='flag-5'>神经网络</b>CNN架构分析-<b class='flag-5'>LeNet</b>

    基于卷积神经网络CNN的车牌字符识别方法

    车牌字符识别是智能车牌识别系统中的重要组成部分。针对车牌字符类别多、背景复杂影响正确识别率的问题,提出了一种基于卷积
    发表于 11-30 14:24 21次下载
    基于<b class='flag-5'>卷积</b><b class='flag-5'>神经网络</b>CNN的车牌<b class='flag-5'>字符识别</b>方法

    一种改进的仿射传播聚类的手写字符识别

    对于手写字符识别过程中相似字符较多且相同字符存在大量不规则书写变形的问题,提出一种改进的仿射传播聚类算法加入手写字符识别过程中。该算法基于原始仿射传播( AP)聚类算法,将其与聚类评判
    发表于 01-15 14:30 0次下载
    一种改进的仿射传播聚类的<b class='flag-5'>手写字符识别</b>

    深度学习中的卷积神经网络层级分解综述

    随着深度学习的不断发展,卷积神经网络(CNN)在目标检测与图像分类中受到研究者的广泛关注。CNN从 Lenet5网络发展到深度残差网络,其层
    发表于 05-19 16:11 5次下载

    卷积神经网络的应用 卷积神经网络通常用来处理什么

    神经网络卷积神经网络广泛用于图像识别、自然语言处理、视频处理等方面。本文将对卷积神经网络的应用
    的头像 发表于 08-21 16:41 5005次阅读

    卷积神经网络如何识别图像

    多层卷积层、池化层和全连接层。CNN模型通过训练识别并学习高度复杂的图像模式,对于识别物体和进行图像分类等任务有着非常优越的表现。本文将会详细介绍
    的头像 发表于 08-21 16:49 1945次阅读

    卷积神经网络介绍 什么是卷积神经网络算法

    卷积神经网络介绍 什么是卷积神经网络算法 卷积神经网络
    的头像 发表于 08-21 16:49 1891次阅读

    常见的卷积神经网络模型 典型的卷积神经网络模型

    LeNet卷积神经网络的开山祖师,是由Yan LeCunn在1998年提出的经典卷积神经网络模型。它最初是为
    的头像 发表于 08-21 17:11 2848次阅读

    图像识别卷积神经网络模型

    Network,CNN)是一种前向反馈神经网络,具有许多层次的神经元,并且在其层次结构中存在着权重共享的机制。这种结构可以使神经网络对图像的特征提取和分类非常有效。 图像识别是一个广
    的头像 发表于 08-21 17:11 861次阅读

    卷积神经网络实现原理

    卷积神经网络(Convolutional Neural Networks,简称CNN)是一种深度学习模型,广泛应用于图像识别、视频分析、自然语言处理等领域。本文将详细介绍
    的头像 发表于 07-03 10:49 562次阅读