MetAI 在 2021 年度與 AI4Kids 合力創建了一個對外來物種綠鬣蜥即時偵測、監控的開源專案。這個專案已經收錄於 NVIDIA 官方 Jetson community,您可以透過此連結下載我們開放的相關程式碼資源,在這篇文章當中我將解析所有開發的環節。
專案動機
綠鬣蜥在世界各地都造成相當程度的生態問題,對住宅、商業景觀、設施、農作物等等的損害更不在話下。在台灣的許多縣市,政府每年編列預算用於移除綠鬣蜥,以減少經濟損失。
我們開發了一個開源的專案,透過邊緣運算與電腦視覺對綠鬣蜥進行偵測、追蹤、告警,任何人都可以下載我們的開源專案並使用它在自己的場域,或者基於我們的流程加以修改。
軟體架構
影片 1:系統軟體架構
開發流程
- 資料蒐集
- Selenium 網路爬蟲
- 圖片資料標籤
- 電腦視覺模型訓練及優化
- NVIDIA TAO Toolkit
- NVIDIA TAO Toolkit 流程範例下載
- 體驗 YOLO V4 搭配不同的 backbone
- 模型優化
- 模型再訓練與匯出
- 佈署
- 在 Jetson Nano 上產生優化的 TensorRT 引擎
- 使用 NVIDIA DeepStream 產生即時推論與串流流程
- 監控
- Plotly Dash
- ELK stack
-
資料蒐集
1.1 Selenium 網路爬蟲
Selenium 是一個 Python 函式庫和工具,用於自動化 Web 瀏覽器以執行許多任務。Selenium 的熱門應用之一是被用於網路爬蟲,爬取網頁上有用的資料和信息。我們使用 Selenium 在生物相關的數個網頁上抓取鬣蜥圖像,最終我們收集了將近 5,000 張圖像。
1.2 圖片標籤
我們在 makesense.ai 中創建了整個 yolo 格式的綠鬣蜥標記資料集。Makesense.ai 是一款免費的線上照片標註工具,因為不需要任何的安裝、使用方式也很簡單,使用起來非常方便。
-
電腦視覺模型訓練及優化
2.1 NVIDIA TAO Toolkit
NVIDIA TAO Toolkit 是一個遷移學習工具包,包含許多熱門的 AI 預訓練模型,包含電腦視覺與對話式 AI。
市面上有許多深度學習框架,但 NVIDIA TAO Toolkit 對我們的目的來說最適合,因為它的 no-code 體驗,大幅簡化深度學習框架的複雜性。最重要的是,NVIDIA TAO Toolkit 能夠對模型進行優化,以便在各種邊緣運算硬體上部署深度學習推論網路,這讓我們可以把精力都放在達到我們的目的上,快速做出驗證。
2.2 NVIDIA TAO Toolkit 流程範例下載
NVIDIA Tao Toolkit 中所包含的所有 AI 模型,其訓練流程的程式碼都可以從 NGC 下載。這些流程程式碼包含了完整的模型訓練、優化、匯出流程,在模型開發過程當中僅需改變部分參數,不需要自行撰寫任何的程式碼。
2.3 YOLO V4 搭配不同的 backbone
NVIDIA TAO Toolkit 當中包含許多熱門的預訓練物件偵測模型,其中我們使用 Yolo V4 辨識綠鬣蜥。
以 YOLO V4 為基底,我們分別使用不同的 backbone 來進行訓練時間的測試, 以下是不同的 backbone 訓練時間紀錄。
2.4 模型優化
NVIDIA TAO Toolkit 可以針對訓練後的模型進行優化,它提供了一個稱為模型剪枝的功能,它可以刪除神經網路中不必要的連接,從而無需執行相應的計算,從而釋放記憶體、時間和運算需求。
我們挑選兩個不同 backbone 的訓練後模型進行剪枝,記錄如下:
-
佈署
我們使用的推論硬體為入門級的邊緣運算裝置 Jetson Nano,因為進入門檻低、大部分的使用者都能入手,卻有足夠的運算能力運行即時的推論。
3.1 在 Jetson Nano 上產生優化的 TensorRT 引擎
透過 NVIDIA TAO Toolkit產生的預訓練模型可以通過 tao-converter 工具轉換成 TensorRT 最佳化推論引擎,TensorRT 引擎可以運行於 x86 和 Jetson 平台,同時在轉換過程當中也可以將模型轉化為較較低的精度如:FP16 與 INT8。
所有版本的 tao-converter 都可以在這個頁面中找到,針對不同的佈署平台與系統環境,應挑選正確的對應版本使用。
要產生一個可以執行在 Jetson Nano 上的 TensorRT 引擎,首先需要將對應的 tao-converter 以及 NVIDIA TAO Toolkit 訓練完畢的模型下載到 Jetson Nano中,再使用 tao-converter 對模型進行轉換。
依照模型的參數量差異,轉換的時間也有長短之分,以下是我們在 Jetson Nano 上轉換兩個不同 backbone 的 YOLO V4 模型所花費的時間
3.2 使用 NVIDIA DeepStream 產生即時推論與串流流程
至此,偵測綠鬣蜥的即時推論引擎已經完備,最後一步則是運行偵測程式、推論的結果(綠鬣蜥數量、位置等)透過特定的通信協定即時回饋給使用者,針對此目的我們使用 NVIDIA DeepStream 來達成。 NVIDIA DeepStream 可以使用 TensorRT 引擎進行深度學習推論、影像和感測器處理,並在串流應用程式中將洞見傳送至雲端。當部署在邊緣端時,應用程式可以在 IoT 裝置與雲端標準訊息代理程式(例如 Kafka 和 MQTT)之間通訊,以進行大規模的廣域佈署。
設置 DeepStream 的主要步驟包括安裝 DeepStream SDK、為 YOLO V4 建構邊界框解析器、建構 DeepStream 應用程式,最後運行應用程式。
DeepStream 應用程式接收即時圖像、預測並且即時串流預測結果。預測結果包含:綠鬣蜥偵測的邊界框影像、當前綠鬣蜥的數量、綠鬣蜥的位置…等等。
我們選擇 MobileNet V2 作為 YOLO V4 的backbone,通過調整 DeepStream 的參數,綠鬣蜥偵測的程式能夠較貼近即時的推論速度。
YOLO V4 CspDarknet53 實際於 Jetson Nano 推論
影片 2:以 YOLO V4 CspDarknet53 進行推論
YOLO V4 Mobilenet V2 實際於 Jetson Nano 推論
影片 3:以 YOLO V4 Mobilenet V2 進行推論
4. 監控
綠鬣蜥偵測應用程式的監控儀表板由 Plotly Dash 和 Python 建構。Plotly Dash 專為資料視覺化而設計,並且可以用附屬的套件 dash-bootstrap-components 的網格系統快速佈局,更輕鬆地產生響應式佈局的網頁應用程序。
5. 系統改善
以上的流程是我們在有限時間內產生的概念驗證,因此還有很多改善空間:
- 目前發布的開源專案程式碼使用 NVIDIA TLT (NVIDIA TAO Toolkit 的前身),日後將更新為 NVIDIA TAO Toolkit SDK
- NVIDIA TAO Toolkit 已整合進 YOLO V4 tiny,對 Jetson Nano 的推論速度會有所改善
- DeepStream 有原生的 Kafka 插件,資料串流的效率會更好
- 後端使用 ELK stack 會是更好的選擇
我們將與 MetAI 逐步就上述的幾點繼續完善我們的開源專案,任何的更新都會在此 github repo 裡釋出。