element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Personal Blogs
  • Community Hub
  • More
Personal Blogs
Legacy Personal Blogs 为树莓派3b部署手写数字识别卷积神经网络
  • Blog
  • Documents
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
  • Share
  • More
  • Cancel
Group Actions
  • Group RSS
  • More
  • Cancel
Engagement
  • Author Author: dremofly
  • Date Created: 25 Jan 2018 6:28 AM Date Created
  • Views 459 views
  • Likes 1 like
  • Comments 0 comments
Related
Recommended

为树莓派3b部署手写数字识别卷积神经网络

dremofly
dremofly
25 Jan 2018

题目:为树莓派3b部署手写数字识别卷积神经网络

介绍:

在2012年的ImageNet竞赛上,基于卷积神经网络的AlexNet横空出世,以绝对优势拿下冠军。从那以后,人们开始认识到神经网络在图像识别领域具有巨大的潜力。其实早在1986年时,LeCun就发表了Lenet,但是由于计算能力等问题,神经网络一直没有流行起来。直到2012年,Hinton和他的弟子Alex创新地使用两块Gtx 580进行神经网络的计算,才使得计算能力的问题在一定程度上得到了解决。

同样是因为计算能力的问题,现在的神经网络训练甚至使用都得在装有高级显卡的服务器或者PC上运行,使得神经网络的应用场景受到很大的限制。

为了让神经网络能在嵌入式设备上运行(如树莓派3b),微软发布了Embedded Learning Library (以下简称ELL)。ELL允许开发者将神经网络的模型部署到资源有限的嵌入式设备中,比如Raspberry Pi,Arduino和micro:bit等。这些网络可以在本地运行,不需要和云端交换数据,不用网络连接也可以运行。

本文的目标就是使用ELL将Lenet部署到树莓派中,让树莓派可以识别手写字符。

 

原理

软硬件

硬件:
    * 树莓派3b(系统版本2017-07-05-raspbian-jessie)
    * usb摄像头
    * PC(ubuntu16.04)
软件有:
    * CNTK
    * Opencv
    * ELL

卷积神经网络的原理:

卷积神经网络在当前计算机视觉,自然语言处理,自动驾驶技术中都有非常广泛的应用。就计算机视觉来说,卷积神经网络是google net, vgg net, gan等的重要组成部分。这里我们简要的介绍下神经网络,卷积神经网络的原理。

神经网络:

图1中为单个神经元的模型。该神经元可以看作一个计算单元,输入为(其中+1表示添加一个偏置,也就是后面的+b,这是为了编程方便),输出为。称为激活函数(activation function)。imageimage

image

 

图1. 单个神经元[1]

神经网络就是有多个神经元组成的,如图2为一个神经网络的模型。图中最左边的称为输入层,最右边的称为输出层,中间的为计算单元。

image

 

图2. 神经网络[1]

在这个网络中,输入层是给定的,输出层是输入层经过计算layer  L2计算出来的。因此,网络中可以训练的参数在L2中。我们定义参数为(W,b),则

image

图中神经网络的计算过程为:

image

 

 

 

 

我们将上面的过程称为前向传播。

参考:http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/

神经网络除了前向传播算法,还有方向传播算法,因为树莓派中部署了网络以后用到的主要是前向传播,因此就不再介绍。

卷积神经网络:

图3为卷积神经网络的计算过程。黄色部分代表卷积核,绿色的部分代表输入的数据(如图像),粉色的为输出的数据。

image

 

图3. 卷积神经网络的计算过程

与神经网络类似,卷积核参数可以表示为

。image

卷积核在图像上计算,移位,再计算,再移位,往复循环,最终得到一个输出矩阵。

每次计算可以表示为:

image

 

上面描述的为卷积神经网络的前向传播过程,在树莓派中用到的也是卷积神经网络的前向传播过程。

 

Lenet

 

Lenet是由Yan Lecun提出的用来识别手写字母的卷积神经网络。该网络包含两个卷积和两个全连接层。

image

ELL介绍

ELL是微软推出的可用于嵌入式设备的神经网络框架。在官网里面有用于树莓派3b上的教程,在教程中使用的是用于ImageNet的模型。因此他的模型比较大,在树莓派上跑的时候速度比较慢。因此,我需要自己训练模型,移植到树莓派上。训练模型的时候用到的是CNTK。

CNTK介绍

CNTK(Cognitive Tooki)是微软推出的一款开源的深度学习框架。他用代码来构建深度学习的运算图。CNTK中包含了神经网络所需的DNN,CNN,RNN/LSTM单元,SGD,ADAM等学习算法也一应俱全。同时,CNTK支持使用GPU进行计算。除此之外,CNTK支持的编程语言非常广泛,包括python,C, C++, C#等等。CNTK训练出来的模型可以直接使用ELL进行转换,因此,我们使用CNTK。

 

过程

github地址

 

目录树

 

image

在PC上安装ELL

参考:https://github.com/Microsoft/ELL/blob/master/INSTALL-Ubuntu.md。在ubuntu系统的电脑上安装ELL。具体过程就不描述了,严格对照安装指南中的版本号检测自己的GCC和CMAKE基本上不会出现问题。

 

在树莓派3b上安装ELL

根据:https://microsoft.github.io/ELL/tutorials/Setting-up-your-Raspberry-Pi 再树莓派3b上安装ELL。

需要特别注意的是ELL在树莓派上的安装对于系统有要求,一定要是微软指定的Raspbian Jessie版本(https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2017-07-05/)。

 

对树莓派3b上的ELL进行测试

在电脑和树莓派上都安装完ELL后,使用ELL里面的例程(https://microsoft.github.io/ELL/tutorials/Getting-started-with-image-classification-on-the-Raspberry-Pi/)进行测试。

image

 

 

 

image

微软给的例程中使用的网络是在imagenet上训练的,网络本身也比较大,所以树莓派跑着非常吃力。在程序运行的过程中,树莓派的温度非常高(微软官方建议采用主动散热),视频帧数2帧左右。

 

编写CNTK的网络训练代码

官方例程测试完毕,证明ELL可以正常运行。于是可以开始训练自己的手写数字识别网络。Training 的数据使用的是经典的MNIST数据集,使用的深度学习框架为同为微软推出的CNTK。

为了易于实现,稍微改动Lenet的参数后再使用CNTK进行实现。

其中CNTK代码中,z.save('mnist.model')是用来保存cntk训练完成的模型及参数的。有了这些训练参数才能进行下一步。

训练结果如下

 

 

image

将CNTK的网络和参数转化成ELL的

参考:https://github.com/Microsoft/ELL/blob/master/docs/tutorials/Importing-models/index.md 。 我们可以将之前保存的mnist.model转化成ell的模型。

首先将mnist.model进行重命名

mv mnist.model model.cntk

然后使用cntk_importer将model.cntk转化成ell模型

python <ELL-root>/tools/importers/CNTK/cntk_import.py model.cntk

这时候文件夹下会出现一个名为model.ell的文件。这时候我们已经将CNTK保存的模型转化成ELL可以使用的格式了。

在笔记本上编译和运行ELL的模型

参考:https://microsoft.github.io/ELL/tutorials/Getting-started-with-image-classification-on-the-Raspberry-Pi/

使用下面的命令将model.ell转化成cmake project

python <ELL-root>/tools/wrap/wrap.py model.ell -lang python -target host

编译cmake project


cd host
mkdir build
cd build   
cmake .. -DCMAKE_BUILD_TYPE=Release && make && cd ../..

运行源码中的call_model.py

python call_model.py

测试通过

在树莓派上编译和运行ELL的模型

在PC上运行以下命令,将ELL模型转化成使用于树莓派3b的cmake project

python <ELL-root>/tools/wrap/wrap.py model.ell -lang python -target pi3

这时候文件夹中将出现一个名为pi3的文件,将其拷贝到树莓派中,接下来将在树莓派中进行编译。

安装上面在PC中编译的做法,在树莓派中也进行编译。

编写树莓派中驱动模型的程序

具体的代码在源码中。

 

 

结果

在pc上运行得到的准确率为:98.8%

由于没有那么多的样本,在树莓派上通过摄像头采集图像并进行判断的准确率难以测量,达不到直接使用数据集中的图片数据进行测试得到的结果。因为用摄像头采集的数据是非理想的。我认为,非理想表现在以下两个方面。首先图片中除了数字还有其物体,这会影响网络的判别。另外,摄像头得到的彩色数据和原来的二值化数据有差别。我们还为对摄像头采集的图片进行优化,这个可以作为我们的future work。

  • Sign in to reply
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube