阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

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

关注

评论

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

还不会搭建自己的产品帮助中心?来看看这个

Baklib

Hinton等谈深度学习十年;PyTorch落地Linux基金会的影响;机器学习界的“GitHub”|AI系统前沿动态

OneFlow

人工智能

中国移动政企科创专题:耕“云”不辍,厚积薄发

Geek_2d6073

大数据调度平台Airflow(四):Airflow WebUI操作介绍

Lansonli

airflow 9月月更

本周四晚19:00知识赋能第八期第2课丨ArkUI自定义组件

OpenHarmony开发者

OpenHarmony

后疫情时代,远程办公发展趋势如何?

Baklib

协同办公 文档管理

国民粮油品牌益海嘉里首个天猫超级品牌日交出完美答卷

HTML自带的拉风属性

大师兄

前端 HTML5, CSS3 9月月更

一文读懂数字化转型中的数据存储

元年技术洞察

数据库 数据中台 数据治理

带你了解CANN的目标检测与识别一站式方案

华为云开发者联盟

人工智能 目标检测 CANN 企业号九月金秋榜 目标识别

一条sql了解MYSQL的架构设计

京东科技开发者

MySQL 数据库 架构 innodb 存储引擎

活动报名|9月24日 Apache Flink Meetup · 北京站,Flink 1.16 新版本发布!

Apache Flink

大数据 flink 流计算 活动 实时计算

Baklib|7步教你写出实用的在线产品手册

Baklib

产品 产品文档 产品手册 在线协作

反诈骗要卷起来!隐私计算助攻反诈行动把握主动权

Jessica@数牍

数据安全 隐私计算 反欺诈

以百分点大数据操作系统(BD-OS)为例 解读ToB产品架构设计的挑战及应对方案

百分点科技技术团队

SPI机制是什么,懂了

知识浅谈

spi 9月月更

一起瓜分20万奖金!第三届火焰杯软件测试大赛开始公开选拔!

测吧(北京)科技有限公司

测试

ESP32-C3入门教程 基础篇(五、RMT应用 — 控制SK6812全彩RGB 灯)

矜辰所致

ESP32-C3 9月月更 RMT

“易+”开源 | 简单可信赖,GameSentry 正式开源

网易智企

开源 安全测试

《2022 社交泛娱乐出海白皮书》发布,最全出海破局指南

融云 RongCloud

社交 白皮书 泛娱乐

EasyNLP玩转文本摘要(新闻标题)生成

阿里云大数据AI技术

自然语言处理 深度学习 开源技术 文本检测 企业号九月金秋榜

依赖项安全检测新利器:Scorecard API

SEAL安全

开源项目 开源安全 依赖项管理 开源组件 企业号九月金秋榜

百草味推出“潮卤江湖”系列新品 聚焦地域风味创新

E科讯

clickhouse 索引、索引局限与解决方案

水滴

Clickhouse 索引 解决方案 稀疏索引

百分点大数据技术团队:Cesium技术在智慧应急行业的应用

百分点科技技术团队

推动零信任加速落地应用 天翼云为企业铸牢安全基石

Geek_2d6073

PostgreSQL逻辑复制解密

京东科技开发者

数据库 postgresql 数据迁移 WAL 逻辑复制

从零到一了解APP速度测评

百度Geek说

App 网络 企业号九月金秋榜 速度测评

前端必读:如何在 JavaScript 中使用SpreadJS导入和导出 Excel 文件

葡萄城技术团队

JavaScript Excel canvas 数据导入 数据导出

堡垒机全称是什么?是运维安全审计系统吗?

行云管家

网络安全 堡垒机

直播预告 | PolarDB-X 动手实践系列——PolarDB-X 的表组与分区变更

阿里云数据库开源

MySQL 数据库 阿里云 开源 PolarDB-X

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