“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

MXNet API 入门 —第 6 篇

  • 2017-07-23
  • 本文字数:2568 字

    阅读完需:约 8 分钟

第5 篇文章中,我们使用三种预训练模型进行物体检测,并通过一些图片对他们的效果进行了对比。

在这一过程中发现这些模型有着截然不同的内存需求,最“节省”的Inception v3“只”需要43MB 内存。那这就提出了另一个问题:“能否在某些非常小型的设备,例如树莓派上运行这些模型?”嗯,一起试试吧!

在树莓派上构建MXNet

目前已经有了官方教程,但我发现其中缺少一些关键步骤,因此我也写了一版。该教程在运行最新版Raspbian 的Raspberry Pi 3 上可以完美运行。

复制代码
$ uname -a
Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux

首先需要添加所有必要的依赖项

复制代码
$ sudo apt-get update
$ sudo apt-get -y install git cmake build-essential g++-4.8 c++-4.8 liblapack*
libblas* libopencv* python-opencv libssl-dev screen

随后需要克隆 **MXNet 代码库并签出 ** 最新的稳定版本。最后一步不能省略,因为我发现大部分时候 HEAD 都是损坏的(2017 年 4 月 30 日更新:MXNet 开发团队联系了我,他们说持续集成现已就位,我也确认了 HEAD 已经可以成功构建。做的好!)。

复制代码
$ git clone https://github.com/dmlc/mxnet.git --recursive
$ cd mxnet
# List tags: v0.9.3a is the latest at the time of writing
$ git tag -l
$ git checkout tags/v0.9.3a

MXNet 可以通过 S3 加载和存储数据,因此有必要启用该功能,这样后面的操作可以更简单些。MXNet 还支持 HDFS,但需要在本地安装 Hadoop,所以还是算了吧…… :)

这样就可以直接运行 make 了,但考虑到树莓派有限的处理能力,构建过程会需要很长时间:你肯定不希望由于 SSH 会话超时打断构建过程!可以使用 Screen 解决这个问题。

为了尽可能加快速度,我们可以用(总共四个内核中的)两个内核并行运行一个 make。不建议使用更多内核,我自己这样尝试时树莓派停止响应了。

复制代码
$ export USE_S3=1
$ screen make -j2

整个过程需要大约一小时。最后一步需要安装库文件及其 Python 绑定。

复制代码
$ cd python
$ sudo python setup.py install
$ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mxnet as mx
>>> mx.__version__
'0.9.3a'

加载模型

将模型文件复制到树莓派之后,还需要确保可以实际加载这些模型。此时可以使用第5 篇文章中用到的代码。另外需要提醒的是,CLI 模式下的树莓派有大约580MB 可用内存,所有数据可存储在一张32GB 的SD 卡中。

试试看加载VGG16。

复制代码
>>> vgg16,categories = init("vgg16")
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

糟糕!VGG16太大,内存装不下。那就试试 ResNet-152。

复制代码
>>> resnet152,categories = init("resnet-152")
Loaded in 11056.10 microseconds
>> print predict("kreator.jpg",resnet152,categories,5)
Predicted in 7.98 microseconds
[(0.87835813, 'n04296562 stage'), (0.045634001, 'n03759954 microphone, mike'),
(0.035906471, 'n03272010 electric guitar'), (0.021166906, 'n04286575 spotlight, spot'),
(0.0054096784, 'n02676566 acoustic guitar')]

ResNet-152 只用了大约 10 秒就成功加载,预测工作可在不到 10 微秒内完成。接着再试试 Inception v3。

复制代码
>>> inceptionv3,categories = init("Inception-BN")
Loaded in 2137.62 microseconds
>> print predict("kreator.jpg",resnet152,categories,5)
Predicted in 2.35 microseconds
[(0.4685601, 'n04296562 stage'), (0.40474886, 'n03272010 electric guitar'),
(0.073685646, 'n04456115 torch'), (0.011639798, 'n03250847 drumstick'),
(0.011014056, 'n02676566 acoustic guitar')]

在树莓派这种资源有限的设备上,模型之间的差异就更明显了!Inception v3 加载速度快很多,可在不到 1 毫秒内完成预测。就算成功加载该模型之后,树莓派依然有大量可用内存可用于运行其他程序,因此它非常适合某些嵌入式应用。我们接着继续 :)

使用树莓派的摄像头拍摄图片

我们可以给树莓派添加各种外设,其中最有趣的可能就是摄像头模块。用法也很简单!

复制代码
>>> inceptionv3,categories = init("Inception-BN")
>>> import picamera
>>> camera = picamera.PiCamera()
>>> filename = '/home/pi/cap.jpg'
>>> print predict(filename, inceptionv3, categories, 5)

这里有个例子。

复制代码
Predicted in 12.90 microseconds
[(0.95071173, 'n04074963 remote control, remote'), (0.013508897, 'n04372370 switch,
electric switch, electrical switch'), (0.013224524, 'n03602883 joystick'), (0.00399205,
'n04009552 projector'), (0.0036674738, 'n03777754 modem')]

很酷吧!

增加各类 Amazon AI 服务,反正完全可行!

我还试着通过之前写的 Python 脚本(文章代码)使用 Amazon Rekognition 对同一张图片进行了识别。

复制代码
$ ./rekognitionDetect.py jsimon-public cap.jpg copy
Label Remote Control, confidence: 94.7508468628

Rekognition 的效果也不错。接下来,如果能让树莓派用声音告诉我们图片的内容,是不是感觉更酷了!几步简单操作即可将 Amazon Polly 加入我们的环境(文章)。

Amazon Rekognition 和 Amazon Polly 都是基于深度学习技术的托管服务。用户无需自行考虑模型或基础架构本身,只需要调用 API 即可。

下面这个视频演示了我通过树莓派用 MXNet 中运行的 Inception v3 模型进行实时物体检测,并通过 Amazon Polly 描述识别结果的过程。

Youtube 介绍视频: https://youtu.be/eKGYFfr9MKI

这一系列 6 篇文章,我们真是取得了不错的进展,我们已经了解了如何:

  • 使用 NDArray 管理数据,
  • 使用 Symbol 定义模型,
  • 使用 Module 运行预测,
  • 加载并对比用于物体检测的预训练模型,
  • 在树莓派上实时运行预训练模型。

这一系列文章主要侧重于通过卷积神经网络进行的物体识别,其实 MXNet 的能力远不止于此,以后有机会再说吧。

本系列内容全部完结。希望你喜欢并能有所收获。

作者 Julien Simon 阅读英文原文 An introduction to the MXNet API?—?part 6


感谢杜小芳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-07-23 17:032077
用户头像

发布了 283 篇内容, 共 101.5 次阅读, 收获喜欢 61 次。

关注

评论

发布
暂无评论
发现更多内容

StarRocks 技术内幕 | 多表物化视图的设计与实现

StarRocks

数据库 数据分析

HA软件是做什么的?主要作用是什么?

行云管家

高可用 ha 双机热备

从简历被拒到收割8个大厂offer,我只用了三个月的时间成功逆袭

程序知音

Java java面试 后端技术 Java面试题 Java面试八股文

聚焦“教-学-评-测-练-管一体化”,推动新型人才培养!

华为云开发者联盟

云计算 后端 华为云

java培训如何入门,怎么选择靠谱机构

小谷哥

上海前端培训课程应该怎么来学习呢?

小谷哥

[力扣] 剑指 Offer 第一天 - 用两个栈实现队列

陈明勇

Go 数据结构与算法 力扣 11月月更

ONES 出席产业互联高峰论坛,分享金融企业研发管理实践

万事ONES

白嫖一款免费的GIF录制软件,好用到飞起,萌新小白装机必备。

bug菌

GIF gif录制 视频录制

万物互联,合作共赢:中国物联网行业发展洞察2022

易观分析

物联网 报告

爱了!阿里技术官亲笔的Java快速面试指南,熬夜啃完剑指大厂

程序知音

Java java面试 java架构 后端技术 Java面试八股文

于雨荣获 2022 年度 "OSCAR 尖峰开源人物"

apache/dubbo-go

国有银行发挥普惠金融“头雁”效应,业务成果领跑商业银行

易观分析

普惠金融

java程序员可以参加大数据培训吗

小谷哥

零基础学习大数据培训难吗?

小谷哥

彻底搞懂nodejs事件循环

coder2028

node.js

webpack配置完全指南

Geek_02d948

webpack

大数据培训学习的时候有什么方法吗

小谷哥

python小知识-模块

AIWeker

Python python小知识 11月月更

瓴羊Quick BI,自助式报表分析工具让企业运营更高效

巷子

一文读懂NodeJs知识体系和原理浅析

coder2028

node.js

一文彻底读懂webpack常用配置

Geek_02d948

webpack

webpack高级配置

Geek_02d948

webpack

python小知识-python 文件操作

AIWeker

Python python小知识 11月月更

前端食堂技术周刊第 59 期:GitHub Universe 2022、Rome v10、Parcel v2.8.0、可扩展的 CSS 演变、Solid Start Beta

童欧巴

CSS vim Github Action

智慧物流数字孪生系统

申扬科技

智慧物流 数字孪生

亚洲合作资金项目“上合国家软件产业和数据治理合作论坛”在京召开

Geek_2d6073

如何通过Java代码压缩PDF文档?

在下毛毛雨

Java PDF 压缩PDF

云管平台厂家联系方式谁有?咨询电话多少?

行云管家

云计算 云服务 企业上云 云管平台 云资源

一篇神文就把java多线程,锁,JMM,JUC和高并发设计模式讲明白了

程序知音

Java 高并发 性能调优 java架构 后端技术

杀疯了,GitHub疯传2022Java面试八股文解析+大厂面试攻略

程序知音

java架构 程序员面试 后端技术 Java面试题 Java面试八股文

MXNet API入门 —第6篇_语言 & 开发_Julien Simon_InfoQ精选文章