亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

思源發表於2017-07-02
在過去的五年中,深度神經網路已經解決了許多計算困難的問題,特別是計算機視覺。因為深度神經網路需要大量的計算力來訓練模型,所以我們經常使用多塊 GPU 或雲端伺服器進行分散式地訓練。實際上,在深度神經網路模型經過訓練後,它只需要相對較少的計算資源就能執行預測。這就意味著我們能將模型部署到低功耗的邊緣裝置中,並且在沒有網路連線的情況下執行。

亞馬遜的開源深度學習引擎 Apache MXNet 除了支援多 GPU 訓練和部署複雜模型外,還可以生成非常輕量級的神經網路模型。我們也可以將這些模型表徵部署到有限記憶體和計算力的移動端中。這就令 MXNet 可以完美地在樹莓派中執行深度學習模型。

在本文中,我們將使用 MXNet 在樹莓派上建立計算機視覺系統。我們同樣也會討論如何使用 AWS IoT 以連線到 AWS Cloud 中,因此我們可以使用雲端管理輕量卷積神經網路,並令其在樹莓派中實時執行目標識別。

所需裝置

為了跟隨本文完成這一實現,我們需要一個 Raspberry Pi 3 Model B 裝置,並且它執行 Jessie 或其他更新版的 Raspbian 作業系統,同時還需要 Raspberry Pi Camera Module v2 和一個 AWS 賬號。

配置樹莓派

首先,我們需要設定樹莓派的相機模組為攝像機,然後再安裝 MXNet。這兩步允許我們對樹莓派「看見」的物體執行基於深度神經網路的分析。

設定相機模組:https://www.raspberrypi.org/learning/getting-started-with-picamera/worksheet/

設定樹莓派的相機模組,並通過乙太網埠或 WiFi 連線裝置到網路中。然後開啟終端,鍵入以下命令以安裝本文所需要的 Python 依賴庫:

sudo apt-get update
sudo apt-get install python-pip python-opencv python-scipy \
python-picamera

跟著安裝指導在樹莓派上安裝 MXNet:http://mxnet.io/get_started/install.html

在本文中,我們構建的 MXNet 不需要 OpenCV 庫。

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

如果在樹莓派的終端鍵入如下命令列可以開啟 Python 2.7 Read-Eval-Print-Loop (REPL) 環境,那麼就安裝成功了:

python
>>> import mxnet as mx
>>> mx.__version__

本地執行預測

如果需要對樹莓派相機所捕捉到的影象執行預測,我們需要從 MXNet Model Zoo 中抽取預訓練深度神經網路模型。在樹莓派的根目錄建立一個 Python 檔案,並命名為 load_model.py,然後從 Model Zoo 下載 ImageNet 預訓練模型並載入到樹莓派的 MXNet 中:

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

原始碼請見原文

下載了高精度的輕量模型後,可以嘗試利用 ImageNet 預訓練的 SqueezeNet V1.1 模型識別一張貓的照片,我們可以在樹莓派的根目錄上執行如下命令列:

wget https://upload.wikimedia.org/wikipedia/commons/b/b9/CyprusShorthair.jpg -O cat.jpg
python load_model.py --img 'cat.jpg' --prefix 'squeezenet_v1.1' --synset 'synset.txt' --params-url 
'http://data.mxnet.io/models/imagenet/squeezenet/squeezenet_v1.1-0000.params' --symbol-url 'http://data.mxnet.io/models/imagenet/squeezenet/squeezenet_v1.1-symbol.json'
--synset-url 'http://data.mxnet.io/models/imagenet/synset.txt'

如下所示,輸出確實將「貓」作為最佳的標籤:

[(0.57816696, 'n02123045 tabby, tabby cat'), (0.19830757, 'n02124075 Egyptian cat'), 
(0.16912524, 'n02325366 wood rabbit, cottontail, cottontail rabbit'),
(0.020817872, 'n02123159 tiger cat'), (0.020065691, 'n02326432 hare')]

為了對樹莓派相機所捕捉到的圖片進行識別,我們需要將相機指向需要分類的目標,並在樹莓派的根目錄中執行如下命令:

python load_model.py –img ‘cam’ –prefix ‘squeezenet_v1.1’ –synset ‘synset.txt’

然後我們會看到抓拍圖片的快速預覽,然後我們的模型會執行並返回預測的目標標籤。

連線到 AWS IoT

在樹莓派上本地執行模型只是第一步。如果我們需要可靠性集中(reliably centralize)和儲存預測結果,或遠端更新模型,我們就需要連線樹莓派到 AWS Cloud 中。為了連線到 AWS,首先第一步就需要在樹莓派中設定 AWS IoT。

在 AWS IoT 控制檯中,我們可以使用 AWS IoT Connect wizard。對於平臺,選擇 Linux/OSX;對於 SDK 型別,選擇 Python,然後就可以選擇下一步了。

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

註冊你的裝置名為「MyRaspberryPi」。

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

選擇下一步並在 connect_device_package.zip 中下載連線工具箱到樹莓派中。但當我們解壓縮 connect_device_package.zip 檔案並抽取內容到樹莓派的根目錄中時,我們將看到需要確保裝置和 AWS 中間的安全連線:

  • myraspberrypi.cert.pem
  • myraspberrypi.private.key
  • myraspberrypi.public.key
  • start.sh

為了在裝置和 AWS Cloud 中建立安全連線,我們需要跟著下面在樹莓派上執行 start.sh 指令碼。該指令碼會下載 Symantec Root-CA 認證到樹莓派中,並安裝 AWS IoT SDK,這將令 Python 和 AWS IoT 的互動更加簡單。該指令碼同樣確保了樹莓派可以和 AWS IoT 對話。現在我們可以使用 AWS IoT 在樹莓派上建立服務,即可以近乎實時地進行目標識別並將結果推送到 AWS Cloud 中。它還提供了在樹莓派上無縫更新模型的機制。

現在在我們的根目錄下,建立一個名為 iot_service.py 的新檔案,並將下面程式碼新增到其中:

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

原始碼請見原文

現在可以在樹莓派的根目錄中鍵入以下命令執行該檔案:

python iot_service.py -e my-device-endpoint.amazonaws.com -r root-CA.crt -c myraspberrypi.cert.pem -k myraspberrypi.private.key

在 AWS IoT 控制檯選擇 Test,並提交 sdk/test/monitor topic:

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

為了在 AWS 實時看到預測流,我們需要在 Test 頁面中選擇新主題的名稱。即使網路連線很慢或掉線了,AWS IoT 也確保了資料包不會遺失,並且預測日誌仍然會保持更新。

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

為了傳送命令到樹莓派以更新 MXNet 模型的執行,我們能釋出 MQTT 主題。例如,如需要更新 SqueezeNet 模型為更大、更精確的 ResNet 模型時,我們可以在 MQTT 客戶端的 Publish 部分中,傳送如下 JSON 到 sdk/test/load topic 中:

{"synset": "synset.txt","prefix": "resnet-18","label_name": "softmax_label","params_url": "http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-0000.params","symbol_url": "http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-symbol.json"}

下圖就是在 MQTT 客戶端中的樣子:

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

樹莓派從 Model Zoo 中下載新的神經網路符號和引數檔案,然後載入它們持續進行預測。我們不需要下載一個新的 synset。因為這兩個模型都是用於挑戰 ImageNet 任務而構建,所以我們試圖識別的物體都是一樣的。

下一步

通過在樹莓派上執行 MXNet 以執行預測,還有利用 AWS IoT 連線它到 AWS Cloud,我們已經構建了一個近乎最好的計算機視覺系統。我們的系統不會依賴於穩定的高頻寬視訊流,也不會依賴用雲端昂貴的 GPU 伺服器來處理視訊。實際上,通過在樹莓派上使用 AWS 和 MXNet,我們能很容易地構建一個更加可靠和高效的智慧視覺系統。通過這種方式,我們享受到了雲模型監控和管理的好處,但同時也不需要每月為雲端伺服器和資料遷移花大價錢,我們只需要花 400 元左右買樹莓派和攝像頭就行了。

這種智慧攝像系統只是開端,我們還可以利用 AWS Cloud 建立更多的應用,如使用遷移學習將預訓練模型更好地適配到我們自己的計算機視覺任務中。

機器之心實操

機器之心 AI 新手小編在讀完該篇文章後,也嘗試著使用樹莓派實現這一有意思的應用,但在該過程中遇到了許多困難。雖然機器之心小編暫時還沒有成功,但在實現的過程中還是發現了許多有用的經驗,因此希望能與讀者共同玩轉樹莓派,並實現實時目標識別。這裡也歡迎想要嘗試的讀者在文章下留言,分享實現這一教程的經驗。最後補充一句:新手上路,老司機莫要嘲笑!

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

首先是系統,樹莓派最常用的是系統是 Raspbian,它是一種基於 Debian 的小型作業系統,我們需要下載系統並燒錄到 TF 卡中。

  • Raspbian 下載地址為:https://www.raspberrypi.org/downloads/raspbian/
  • Win32DiskImager 燒錄工具地址為:https://sourceforge.net/projects/win32diskimager/files/latest/download

啟動 Raspbian 系統並裝上攝像頭元件後,我們需要測試並調校攝像頭。

一般我們可以鍵入命令:sudo raspi-config,再設定啟用攝像頭。或者如下直接進入 Raspberry Pi Configuration 介面設定:

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

下面我們可以調校和測試攝像頭,如果測試攝像頭靜態拍照,我們可以鍵入 raspistill 開啟拍照應用。開啟後會顯示很多命令,我們可以根據這些命令和後面的解釋調整攝像頭,比如鍵入 raspistill -sh 30 就表明調整銳度為 30(-100 到 100)。如果我們嘗試進行拍照,可以鍵入 raspistill -o image.jpg -t 2000,即延遲兩秒輸出名為 image.jpg 的圖片。或者可以鍵入命令 raspistill -o image%d.jpg -t 20000 -tl 1000 -v:即持續 20 秒,每一秒輸出一張相片,且圖片命名為 image0.jpg、image1.jpg、image2.jpg 等。

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

由於樹莓派的記憶體只有 1GB,我們需要從 TF 卡分配 1GB 的儲存空間作為 swap 交換空間,不然 MXNet 安裝到裡面會因為記憶體太小而報錯。我們試了幾種修改交換空間大小的方式(預設交換空間的大小為 100MB),最後實測可以在 root 許可權下修改 dphys-swapfile 文件而實現 swap 交換空間大小的更改。即在 root 許可權下鍵入命令 nano /etc/dphys-swapfile,然後如下圖修改 CONF_SWAPSIZE=100 為 1024。最後儲存文件並退出,然後重啟系統。這一次重啟的時間會有些增加,但只是在分配空間而已。

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

隨後在安裝 MXNet 的時候,我們遇到了更大的困難。最開始按照 MXNet 的官方教程安裝,但在 mxnet 資料夾下 make 的時候,一直報錯,應該是 opencv 庫的路徑沒有新增到環境變數中。後來在 Medium 上發現有大神如是說:

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

然後我們又跟著這篇技術部落格重新安裝,不出意料的是,還是無法在 mxnet 資料夾下執行 make,總是報錯。

  • MXNet 官方安裝教程:http://mxnet.io/get_started/install.html
  • Julien Simon 安裝教程:https://medium.com/@julsimon/an-introduction-to-the-mxnet-api-part-6-fcdd7521ae87

最後我們另外為依賴庫執行了一句命令:sudo apt-get install -y build-essential Git libblas-dev libopencv-dev,然後真的可以 make 了,但在持續進行兩小時後,還是報錯了。後面再 make 也會一直有如下報錯:

亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

雖然這一次並沒有成功,但我們還會繼續在樹莓派上實現這一實時目標識別過程。我們準備下一步再嘗試各種方式,如果實在 Raspbian 不行的話,我們可能會換 Ubuntu 系統,再進行嘗試。同時我們也希望讀者能與我們共同交流,一起實現這一有趣的任務。亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統

相關文章