1. 程式人生 > >mxnet入門--第6篇

mxnet入門--第6篇

第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描述識別結果的過程。

這一系列6篇文章,我們真是取得了不錯的進展,我們已經瞭解瞭如何:

  • 使用NDArray管理資料,
  • 使用Symbol定義模型,
  • 使用Module執行預測,
  • 載入並對比用於物體檢測的預訓練模型,
  • 在樹莓派上實時執行預訓練模型。

這一系列文章主要側重於通過卷積神經網路進行的物體識別,其實MXNet的能力遠不止於此,以後有機會再說吧。

本系列內容全部完結。希望你喜歡並能有所收穫。