AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

C++ STL【常用算法】详解

Fire_Shield

算法 stl 9月月更

FlyFish开发者说|开源低代码平台的体验与思考

云智慧AIOps社区

前端 低代码 开源项目 数据可视化 可视化大屏

中小企业如何有效应对计算资源的弹性变化需求?

阿里巴巴中间件

阿里云 Serverless 云原生 中小企业

华为云WeLink直播助力高校毕业典礼:这届毕业生,我们云上嗨

科技怪咖

上海华为云SaaS应用创新创业大赛暨828 B2B企业节发布仪式

科技怪咖

数据库系统助力企业降本增效的技术要点|Meetup 回顾与预告

OceanBase 数据库

CLIP-as-service 升级啦!

Jina AI

开源 算法 神经搜索

一文详解东数西算下绿色数据中心节能减排十大技术、智算中心八大趋势

GPU算力

2个原则,8个小撇步,带你探究 Dockerfile 在工程实践中的实战技巧!

Jina AI

Dockfile

合阔智云核心生产系统切换到服务网格 ASM 的落地实践

阿里巴巴中间件

阿里云 Kubernetes 云原生 服务网格 合作

MySQL 数据库 - 通用语法 DDL DML DQL DCL

喜羊羊

MySQL 9月月更

ShareSDK Android端微信回调冲突解决方案

MobTech袤博科技

android sdk

我们的月饼不一样!来线上 DIY 微软限定款

Azure云科技

技术 活动报名

Sovit3D数字孪生智慧港口三维可视化解决方案

数据可视化平台

物联网 智慧港口 5G智慧港口 港口三维可视化 智慧港口解决方案

如何理解「数字化是 IT 公司在给传统企业贩卖焦虑」?

BizFree

数字化转型 企业 焦虑 智能制造

XDR的技术栈参考

极盾科技

网络安全 数据安全 xdr

云对象 - 重新定义前后端交互

崔红保

uni-app Serverless unicloud

OpenSSF发布npm 最佳实践指南,应对开源依赖风险

SEAL安全

npm DevSecOps 开源安全 软件供应链安全 开源安全与治理

jdbcs之连接池和框架

楠羽

JDBC 笔记 9月月更

得物云原生全链路追踪Trace2.0架构实践

得物技术

云原生 监控 链路追踪 OpenTelemetry 企业号九月金秋榜

开发者必读:2022年移动应用技术趋势白皮书

HarmonyOS SDK

力扣20 - 有效的括号【暴力、分支判断、哈希表】

Fire_Shield

算法 哈希表 9月月更

高端扫地机销量占比全球第一 石头科技创新驱动增长

科技热闻

LeetCode-13. 罗马数字转整数(java)

bug菌

9月日更 Leet Code 9月月更

LeetCode-9. 回文数(java)

bug菌

9月日更 9月月更

吃透JAVA的Stream流操作,多年实践总结

Java快了!

stream java;

5年专业研究,这份云原生安全指南请查收!

博文视点Broadview

对话杨传辉:国产数据库新战绩背后,OceanBase坚持自研的初心与决心

OceanBase 数据库

库调多了,都忘了最基础的概念-《线程池篇》

知识浅谈

线程池 9月月更

MySQL 数据库 - 函数 约束 多表查询 事务

喜羊羊

MySQL 9月月更

如何理解「数字化转型的本质是人的转型」?

BizFree

数字化转型 工业4.0 智能制造 机器换人 数字化工具

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