亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統
選自AWS
機器之心編譯
參與:思源
在過去的五年中,深度神經網路已經解決了許多計算困難的問題,特別是計算機視覺。因為深度神經網路需要大量的計算力來訓練模型,所以我們經常使用多塊 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
跟著安裝指導在樹莓派上安裝 MXNet:http://mxnet.io/get_started/install.html
在本文中,我們構建的 MXNet 不需要 OpenCV 庫。
如果在樹莓派的終端鍵入如下命令行可以打開 Python 2.7 Read-Eval-Print-Loop (REPL) 環境,那麼就安裝成功了:
python
本地執行預測
如果需要對樹莓派相機所捕捉到的圖像執行預測,我們需要從 MXNet Model Zoo 中抽取預訓練深度神經網路模型。在樹莓派的根目錄創建一個 Python 文件,並命名為 load_model.py,然後從 Model Zoo 下載 ImageNet 預訓練模型並載入到樹莓派的 MXNet 中:
源代碼請見原文
下載了高精度的輕量模型後,可以嘗試利用 ImageNet 預訓練的 SqueezeNet V1.1 模型識別一張貓的照片,我們可以在樹莓派的根目錄上運行如下命令行:
"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"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
--synset-url "http://data.mxnet.io/models/imagenet/synset.txt"
如下所示,輸出確實將「貓」作為最佳的標籤:
(0.16912524, "n02325366 wood rabbit, cottontail, cottontail rabbit"),[(0.57816696, "n02123045 tabby, tabby cat"), (0.19830757, "n02124075 Egyptian cat"),
(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,然後就可以選擇下一步了。
註冊你的設備名為「MyRaspberryPi」。
選擇下一步並在 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 的新文件,並將下面代碼添加到其中:
源代碼請見原文
現在可以在樹莓派的根目錄中鍵入以下命令運行該文件:
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:
為了在 AWS 實時看到預測流,我們需要在 Test 頁面中選擇新主題的名稱。即使網路連接很慢或掉線了,AWS IoT 也確保了數據包不會遺失,並且預測日誌仍然會保持更新。
為了發送命令到樹莓派以更新 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 客戶端中的樣子:
樹莓派從 Model Zoo 中下載新的神經網路符號和參數文件,然後載入它們持續進行預測。我們不需要下載一個新的 synset。因為這兩個模型都是用於挑戰 ImageNet 任務而構建,所以我們試圖識別的物體都是一樣的。
下一步
通過在樹莓派上運行 MXNet 以執行預測,還有利用 AWS IoT 連接它到 AWS Cloud,我們已經構建了一個近乎最好的計算機視覺系統。我們的系統不會依賴於穩定的高帶寬視頻流,也不會依賴用雲端昂貴的 GPU 伺服器來處理視頻。實際上,通過在樹莓派上使用 AWS 和 MXNet,我們能很容易地構建一個更加可靠和高效的智能視覺系統。通過這種方式,我們享受到了雲模型監控和管理的好處,但同時也不需要每月為雲端伺服器和數據遷移花大價錢,我們只需要花 400 元左右買樹莓派和攝像頭就行了。
這種智能攝像系統只是開端,我們還可以利用 AWS Cloud 建立更多的應用,如使用遷移學習將預訓練模型更好地適配到我們自己的計算機視覺任務中。
機器之心實操
機器之心 AI 新手小編在讀完該篇文章後,也嘗試著使用樹莓派實現這一有意思的應用,但在該過程中遇到了許多困難。雖然機器之心小編暫時還沒有成功,但在實現的過程中還是發現了許多有用的經驗,因此希望能與讀者共同玩轉樹莓派,並實現實時目標識別。這裡也歡迎想要嘗試的讀者在文章下留言,分享實現這一教程的經驗。最後補充一句:新手上路,老司機莫要嘲笑!
首先是系統,樹莓派最常用的是系統是 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 界面設置:
下面我們可以調校和測試攝像頭,如果測試攝像頭靜態拍照,我們可以鍵入 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 等。
由於樹莓派的內存只有 1GB,我們需要從 TF 卡分配 1GB 的存儲空間作為 swap 交換空間,不然 MXNet 安裝到裡面會因為內存太小而報錯。我們試了幾種修改交換空間大小的方式(默認交換空間的大小為 100MB),最後實測可以在 root 許可權下修改 dphys-swapfile 文檔而實現 swap 交換空間大小的更改。即在 root 許可權下鍵入命令 nano /etc/dphys-swapfile,然後如下圖修改 CONF_SWAPSIZE=100 為 1024。最後保存文檔並退出,然後重啟系統。這一次重啟的時間會有些增加,但只是在分配空間而已。
隨後在安裝 MXNet 的時候,我們遇到了更大的困難。最開始按照 MXNet 的官方教程安裝,但在 mxnet 文件夾下 make 的時候,一直報錯,應該是 opencv 庫的路徑沒有添加到環境變數中。後來在 Medium 上發現有大神如是說:
然後我們又跟著這篇技術博客重新安裝,不出意料的是,還是無法在 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 也會一直有如下報錯:
雖然這一次並沒有成功,但我們還會繼續在樹莓派上實現這一實時目標識別過程。我們準備下一步再嘗試各種方式,如果實在 Raspbian 不行的話,我們可能會換 Ubuntu 系統,再進行嘗試。同時我們也希望讀者能與我們共同交流,一起實現這一有趣的任務。
※無監督學習中的兩個非概率模型:稀疏編碼與自編碼器
※今日頭條AI技術沙龍馬毅:低維模型與深度模型的殊途同歸
※專訪深度好奇創始人呂正東:通向理解之路
※百度開源新一代深度學習硬體測試工具:覆蓋Titan Xp到iPhone7
TAG:機器之心 |
※樹莓派搭建WiFi釣魚系統
※用KPPW搭建解放號這類軟體IT眾包平台,你也可以!
※如何搭建自己的專屬VPN
※如何搭建小馬網這類知識產權服務平台?KPPW為您揭秘
※終章!如何從零開始搭建MMOARPG系統框架?
※揭秘如何用KPPW搭建文創行業類平台
※使用 Angular CLI 搭建項目
※菜鳥跟你一起學用樹莓派搭建NAS
※阿里技術專家帶你使用Spring框架快速搭建Web工程項目
※揭秘如何用KPPW搭建一個雲沃客網,開啟自由員工新時代!
※rasa NLU+CORE 搭建自己的智能客服
※別了單點智能時代,阿里鎖定IoT為其全新主賽道,做物聯網基礎設施的搭建者
※CentOS搭建DNS伺服器實錄
※如何搭建 Redis 集群
※用 Keras 搭建 GAN:圖像去模糊中的應用
※自行搭建私有雲ownCloud,啟用SSL
※向「假臉」說 No:用OpenCV搭建活體檢測器
※從零學習Spring MVC框架「環境搭建和MVC架構」
※手把手教你如何使用GitHub的伺服器搭建自己的簡單網站
※Windows系統下如何搭建Node.js伺服器詳解