[关闭]
@liuhui0803 2017-05-13T08:46:04.000000Z 字数 3624 阅读 2919

MXNet API入门 — 第6篇

机器学习 深度学习 神经网络 MXNet AWS


摘要:

Apache MXNet是一种功能全面、可以灵活编程并且扩展能力超强的深度学习框架,支持包括卷积神经网络(CNN)与长短期记忆网络(LSTM)在内的顶尖深度模型。这一系列文章介绍了MXNet的基本概念和使用方法。本篇主要介绍不同模型的对比结果。

正文:

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

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

在树莓派上构建MXNet

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

  1. $ uname -a
  2. Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux

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

  1. $ sudo apt-get update
  2. $ 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已经可以成功构建。做的好!)。

  1. $ git clone https://github.com/dmlc/mxnet.git --recursive
  2. $ cd mxnet
  3. # List tags: v0.9.3a is the latest at the time of writing
  4. $ git tag -l
  5. $ git checkout tags/v0.9.3a

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

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

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

  1. $ export USE_S3=1
  2. $ screen make -j2

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

  1. $ cd python
  2. $ sudo python setup.py install
  3. $ python
  4. Python 2.7.9 (default, Sep 17 2016, 20:26:04)
  5. [GCC 4.9.2] on linux2
  6. Type "help", "copyright", "credits" or "license" for more information.
  7. >>> import mxnet as mx
  8. >>> mx.__version__
  9. '0.9.3a'

加载模型

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

试试看加载VGG16。

  1. >>> vgg16,categories = init("vgg16")
  2. terminate called after throwing an instance of 'std::bad_alloc'
  3. what(): std::bad_alloc

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

  1. >>> resnet152,categories = init("resnet-152")
  2. Loaded in 11056.10 microseconds
  3. >> print predict("kreator.jpg",resnet152,categories,5)
  4. Predicted in 7.98 microseconds
  5. [(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。

  1. >>> inceptionv3,categories = init("Inception-BN")
  2. Loaded in 2137.62 microseconds
  3. >> print predict("kreator.jpg",resnet152,categories,5)
  4. Predicted in 2.35 microseconds
  5. [(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毫秒内完成预测。就算成功加载该模型之后,树莓派依然有大量可用内存可用于运行其他程序,因此它非常适合某些嵌入式应用。我们接着继续 :)

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

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

  1. >>> inceptionv3,categories = init("Inception-BN")
  2. >>> import picamera
  3. >>> camera = picamera.PiCamera()
  4. >>> filename = '/home/pi/cap.jpg'
  5. >>> print predict(filename, inceptionv3, categories, 5)

这里有个例子。

1-ZRHWR2Bzb-S0mccRVTQcwQ.jpeg-110.9kB

  1. Predicted in 12.90 microseconds
  2. [(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对同一张图片进行了识别。

  1. $ ./rekognitionDetect.py jsimon-public cap.jpg copy
  2. 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篇文章,我们真是取得了不错的进展,我们已经了解了如何:

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

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

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注