使用樹莓派和Python實現目標檢測

本文爲 AI 研習社編譯的技術博客,原標題 :

Object detection with Raspberry Pi and Python

作者 | Quantum

翻譯 | leogle97、謝玄xx    校對 | 鄧普斯•傑弗

審覈 | 醬番梨    整理 | Pita

原文鏈接:

https://medium.com/@Quantum_inc/object-detection-with-raspberry-pi-and-python-bc6b3a1d4972


今天我們將討論如何建立一個簡單、便宜的移動目標探測器。

這項研究的目的是確定在一個便宜的移動設備上的對象檢測模型是否可以用於現實世界的任務。

作爲一個移動平臺,我們使用的是樹莓派3B。樹莓派是一款售價35美元的單板機,這意味着微處理器、內存、無線收音機和端口都在一塊電路板上。它是一臺Linux計算機,所以從技術上講,它可以做Linux計算機能做的一切事情,比如運行電子郵件和網絡服務器,充當網絡存儲,或者用於對象檢測。與大多數具有內置硬盤或SSD存儲選項的計算機不同,樹莓派的操作系統安裝在microSD卡上,而microSD卡是存放所有文件的地方,因爲這塊板不包含任何內置存儲(不過,你可以添加USB硬盤驅動器)。通過交換microSD卡,這種結構可以方便地擴展存儲空間並在不同操作系統之間切換。

作爲目標探測器的硬件部分,我們使用了樹莓派3B和樹莓派助學金V2。我們需要安裝Raspbian Stretch 9,因爲在運行Raspbian 9時,TensorFlow 1.9正式支持樹莓派。我們還需要一個至少16GB內存的microSD卡,因爲構建OpenCV可能是一個非常消耗內存的過程。

目標檢測模型

針對本實驗,我們選擇了以下型號:小型YOLO和SSD MobileNet lite。

YOLO(You Only Look Once)是在Darknet上實現的最先進的實時物體檢測系統。先前的檢測系統是重新利用分類器或定位器來執行檢測的,而這些檢測系統將模型應用於多位置和規模的圖像。圖像的高評分區域被視爲檢測結果。與基於分類器的系統相比,該模型具備幾大優點。這個模型在測試時查看整個圖像,因此它的預測是通過圖像中的全局背景來實現的。除此之外,不像需要數千個單個圖像纔可進行預測的R-CNN系統一樣,它也可以使用單一網絡的評估進行預測。

爲了執行檢測,圖像就劃分爲SxS網格(如左圖所示)。每個單元將預測N個可能的“邊界框”以及它們中的每一個的確定性(或概率)水平(圖像在中心),這意味着需要計算SxSxN個正方形。絕大多數這些方形的預測率都非常低,這就是算法持續刪除預測率低於特定最小閾值方塊的原因。剩餘的盒子通過“非極大值抑制”來消除可能的重複檢測,因此只留下最精確的方塊(如右圖所示)。

SSD(Single Shot MultiBox Detector)是一種流行的物體檢測算法。SSD通過消除對區域生成網絡的需求來加速該過程。爲了防止精度下降,SSD採用了包括多尺度功能和默認框在內的一些改進方法。這些改進使SSD能夠以較低分辨率的圖像匹配更快的R-CNN精度,從而進一步提高檢測速度。帶有MobileNet的SSD是一種針對移動設備推理進行了優化的對象檢測模型。

這裏的關鍵思想是採用單個網絡(速度)而不需要區域提議。相反,它使用不同的邊界框,然後作爲預測的一部分調整邊界框。網絡的最後幾層中的每一層都負責預測逐漸變小的邊界框,並且最終預測是所有這些預測的並集,從而實現不同的邊界框預測。

對於對象檢測,我們使用OpencCV,Tensorflow Object Detection API和Darkflow。 TensorFlow的Object Detection API是一個非常強大的工具,任何人(特別是那些沒有真正的機器學習背景的人)都可以快速構建和部署功能強大的圖像識別軟件。API爲終端用戶提供培訓和在OCO數據集中運行檢測模型和模型的儀器,如Faster R-CNN,SSD Mobile等。由於YOLO是在基於C ++的深度學習框架上實現的,所以我們使用Darknet的TensorFlow就翻譯爲爲Darkflow。

環境設置

接下來,我們將設置環境。首先,在具有所有依賴項的Raspberry Pi 3上安裝OpenCV。你可以在下面這個網站中找到一個不錯的安裝途徑:

https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/。

下一步是設置並啓用相機。我們還需要安裝一個名爲picamera [array]的python模塊。該模塊提供了一個界面,用於將來自攝像機的圖像表示爲NumPy陣列。下面的網站是另一個不錯的安裝指南:

https://www.pyimagesearch.com/2015/03/30/accessing-the-raspberry-pi-camera-with-opencv-and-python/。

如上所述,TF 1.9+全面支持Raspberry Pi,但這並不意味着我們可以僅使用pip來進行安裝。Pip僅能在0.11.0版本下安裝,不滿足目標檢測API的要求。我們應該從源代碼構建Tensorflow,但由於處理器速度慢且RAM有限,因此不建議在Raspberry Pi上構建。這需要很多時間。在更強大的主機上構建TensorFlow .whl包更容易,然後將其安裝在Raspberry上。我們可以使用官方安裝指南來構建軟件包或下載已經構建的軟件包。之後,將wheel文件複製到Raspberry Pi並使用pip安裝它。


接下來,我們需要爲YOLO配置環境。 YOLO在基於C的深度學習框架中實現,稱爲Darknet。爲了避免在Raspberry Pi上構建Darknet,我們使用Darkflow作爲Darknet轉換來運行TensorFlow(這裏is聽譯有誤)。 Darkflow易於安裝,因爲其具有官方存儲庫的安裝教程。此外,我們使用了來自Darkflow

(https://drive.google.com/drive/folders/0B1tW_VtY7onidEwyQ2FtQVplWEU)作者的YOLO預訓練權重tiny-yolo-voc.weights 和來自Darkflow源存儲庫的網絡配置tiny-yolo-voc.cfg

現在,我們需要從TensorFlow檢測模型表下載MobileNet SSDLite模型。所謂“模型表”,是Google的預訓練對象檢測模型集合,具有不同級別的處理速度和準確性。 Raspberry Pi具有弱處理器(weak聽譯有誤)和有限的RAM,因此我們需要使用處理能力較低的模型。儘管該模型運行得更快,但它的精確度較低。我們嘗試使用SSD MobileNet模型但是在加載模型圖時它會導致內存分配異常,而Raspberry Pi並沒有爲此任務提供所需的內存量。然後,下載SSDLite-MobileNet模型並將其解壓縮。我們需要唯一的frozen_inference_graph.pb文件。

部分代碼如下

首先,爲探測器定義一個抽象類別:

接下來,實現SSD和YOLO模型界面。對於SSD,我們使用來自目標檢測API的代碼。而YOLO對象檢測器只是Darkflow TFNet類的包裝。

現在我們實現一個檢測腳本。首先初始化camera:

接下來,從stream中獲取圖像並對其進行檢測。對結果可視化如下:

總結

我們運行了兩個模型並得到了這些結果:

-  YOLO tiny - 0.32 FPS;

-  SSD MobileNet Light - 1.07 FPS。

因此,結合以上結果,我們可以得出結論——我們可以使用帶有SSD MobileNet的移動探測器進行真實的簡單行人跟蹤,或者用於檢測草坪上的貓的房屋安全系統。或者尺寸和功率使用更爲關鍵的情況(1 FPS就足夠了)。

此外,我們嘗試使用MXNet網絡,但在模塊導入期間,我們遇到了../libmxnet.soon Raspberry Pi問題。

下方爲可視化結果:

該文章最早於2018年11月26日在www.quantumobile.com上發佈。

想要繼續查看該篇文章相關鏈接和參考文獻?

長按鏈接點擊打開或點擊【使用樹莓派和Python實現目標檢測】:

https://ai.yanxishe.com/page/TextTranslation/1384

AI研習社每日更新精彩內容,觀看更多精彩內容:

盤點圖像分類的竅門

深度學習目標檢測算法綜述

生成模型:基於單張圖片找到物體位置

注意力的動畫解析(以機器翻譯爲例)

等你來譯:

如何在神經NLP處理中引用語義結構 

(Python)用Mask R-CNN檢測空閒車位

高級DQNs:利用深度強化學習玩吃豆人遊戲

深度強化學習新趨勢:谷歌如何把好奇心引入強化學習智能體 

【AI求職百題斬 - 每日一題】

(今天的題目還是複習題,學習就要溫故而知新哦!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章