阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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:032083
用户头像

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

关注

评论

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

Python——双向队列 (deque)

在即

6月日更

第6模块作业

高亮

架构训练营

顶级程序员都是如何诞生的?

Nydia

话题讨论

架构实战营模块 6

阿体

从 Flutter 和前端角度出发,聊聊单线程模型下如何保证 UI 流畅性

魅影

大前端 事件驱动 Event iOS 知识体系

不动如山,表备份硬核技术:物理细粒度备份恢复

华为云开发者联盟

集群 数仓 Roach 物理细粒度 备份恢复

自然语言处理的发展

Qien Z.

自然语言处理 6月日更

电商平台微服务拆分(简化版)

白发青年

架构实战营

活久见!低访问量竟然也能导致系统问题

三石

mycat

HarmonyOS学习路之开发篇——Data Ability

爱吃土豆丝的打工人

HarmonyOS Ability 鸿蒙 Ability Data Ability

【Vue2.x 源码学习】第二十篇 - 使用真实节点替换原始节点

Brave

源码 vue2 6月日更

架構實戰營 - 模塊 6 作業

Frank Yang

架构实战营

Linux之mkdir命令

入门小站

Linux

架构实战营 模块六作业

Dylan

架构实战营

Cookie常见面试题

悟空聊架构

缓存 面试 Cookie 6月日更

ES6之set方法

法医

大前端 ES6 6月日更

密码学系列之:blowfish对称密钥分组算法

程序那些事

加密解密 密码学 程序那些事 密码学和算法

架构训练营模块6作业

Neil43

架构训练营

架构实战营模块6课后作业

大肚皮狒狒

聊聊 Redis 内存淘汰策略

蘑菇睡不着

Java redis

鸿蒙究竟是什么?

Nydia

Flink集成hive测试及生产规划

一弦思华年

大数据 hive 实时数仓 数仓 flink 执行

在线crontab表达式执行时间计算工具

入门小站

工具分享

电商系统微服务

贯通

架构实战营

架构实战营 模块六课后作业

iProcess

架构实战营

推荐 3 款超好用的 Docker 图形化管理工具

学神来啦

Docker Linux 程序员 分布式 运维

云图说|初识云数据库GaussDB(for Cassandra)

华为云开发者联盟

开源 Cassandra 云数据库 GaussDB(for Cassandra) 宽列数据库

模块六 作业

夏日

架构实战营

Nginx简单属性和使用总结

赵镇

模块六:课后作业

菲尼克斯

架构实战营

【Flutter 专题】128 图解 ColorTween 颜色补间动画 & ButtonBar 按钮容器

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

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