以 Jetson Nano 實現外來物種即時偵測、監控系統

作者 NVIDIA

MetAI 在 2021 年度與 AI4Kids 合力創建了一個對外來物種綠鬣蜥即時偵測、監控的開源專案。這個專案已經收錄於 NVIDIA 官方 Jetson community,您可以透過此連結下載我們開放的相關程式碼資源,在這篇文章當中我將解析所有開發的環節。

專案動機

綠鬣蜥在世界各地都造成相當程度的生態問題,對住宅、商業景觀、設施、農作物等等的損害更不在話下。在台灣的許多縣市,政府每年編列預算用於移除綠鬣蜥,以減少經濟損失。

我們開發了一個開源的專案,透過邊緣運算與電腦視覺對綠鬣蜥進行偵測、追蹤、告警,任何人都可以下載我們的開源專案並使用它在自己的場域,或者基於我們的流程加以修改。

圖 1:綠鬣蜥偵測、監控系統介面

軟體架構

影片 1:系統軟體架構

開發流程

  1. 資料蒐集
    • Selenium 網路爬蟲
    • 圖片資料標籤
  2. 電腦視覺模型訓練及優化
    • NVIDIA TAO Toolkit
    • NVIDIA TAO Toolkit 流程範例下載
    • 體驗 YOLO V4 搭配不同的 backbone
    • 模型優化
    • 模型再訓練與匯出
  3. 佈署
    • 在 Jetson Nano 上產生優化的 TensorRT 引擎
    • 使用 NVIDIA DeepStream 產生即時推論與串流流程
  4. 監控
    • Plotly Dash
    • ELK stack
  1. 資料蒐集

1.1 Selenium 網路爬蟲

Selenium 是一個 Python 函式庫和工具,用於自動化 Web 瀏覽器以執行許多任務。Selenium 的熱門應用之一是被用於網路爬蟲,爬取網頁上有用的資料和信息。我們使用 Selenium 在生物相關的數個網頁上抓取鬣蜥圖像,最終我們收集了將近 5,000 張圖像。

1.2 圖片標籤

我們在 makesense.ai 中創建了整個 yolo 格式的綠鬣蜥標記資料集。Makesense.ai 是一款免費的線上照片標註工具,因為不需要任何的安裝、使用方式也很簡單,使用起來非常方便。

圖 2:用 makesense.ai 進行物件偵測標註
  1. 電腦視覺模型訓練及優化

2.1 NVIDIA TAO Toolkit

NVIDIA TAO Toolkit 是一個遷移學習工具包,包含許多熱門的 AI 預訓練模型,包含電腦視覺與對話式 AI。

圖 3:NVIDIA TAO Toolkit 預訓練模型種類豐富,涵蓋主流電腦視覺任務

市面上有許多深度學習框架,但 NVIDIA TAO Toolkit 對我們的目的來說最適合,因為它的 no-code 體驗,大幅簡化深度學習框架的複雜性。最重要的是,NVIDIA TAO Toolkit 能夠對模型進行優化,以便在各種邊緣運算硬體上部署深度學習推論網路,這讓我們可以把精力都放在達到我們的目的上,快速做出驗證。

圖 4:NVIDIA TAO Toolkit 預訓練模型種類豐富,涵蓋主流電腦視覺任務

2.2 NVIDIA TAO Toolkit 流程範例下載

NVIDIA Tao Toolkit 中所包含的所有 AI 模型,其訓練流程的程式碼都可以從 NGC 下載。這些流程程式碼包含了完整的模型訓練、優化、匯出流程,在模型開發過程當中僅需改變部分參數,不需要自行撰寫任何的程式碼。

圖 5:所有 NVIDIA TAO Toolkit 收錄的模型,程式碼流程都可以在 NGC 下載

2.3 YOLO V4 搭配不同的 backbone

NVIDIA TAO Toolkit 當中包含許多熱門的預訓練物件偵測模型,其中我們使用 Yolo V4 辨識綠鬣蜥。

圖 6:物件偵測模型 YOLO V4 有可替換的多種 backbone

以 YOLO V4 為基底,我們分別使用不同的 backbone 來進行訓練時間的測試, 以下是不同的 backbone 訓練時間紀錄。

architecture backbone images resolution training time / epoch GPU
YOLO V4 ResNet 18 4,700 1248*338 05:30 RTX 3090*1
YOLO V4 ResNet 34 4,700 1248*338 08:17 RTX 3090*1
YOLO V4 CSPDarkNet 19 4,700 1248*338 07:46 RTX 3090*1
YOLO V4 CSPDarkNet 53 4,700 1248*338 12:03 RTX 3090*1
YOLO V4 MobileNet V2 4,700 1248*338 03:21 RTX 3090*1
表 1:YOLO V4 搭配不同 backbone 的訓練時間紀錄

2.4 模型優化

圖 7:NVIDIA TAO Toolkit 可直接對預訓練模型進行剪枝優化

NVIDIA TAO Toolkit 可以針對訓練後的模型進行優化,它提供了一個稱為模型剪枝的功能,它可以刪除神經網路中不必要的連接,從而無需執行相應的計算,從而釋放記憶體、時間和運算需求。

我們挑選兩個不同 backbone 的訓練後模型進行剪枝,記錄如下:

architecture backbone threshold Parameters Parameters pruned
YOLO V4 CSPDarkNet 53 0.1 ≈28,000,000 ≈14,000,000
YOLO V4 MobileNet V2 0.1 ≈3,400,000 ≈23,800
表 2:比較不同 backbone 剪枝的參數量
  1. 佈署

圖 8:Jetson Nano 邊緣運算開發版

我們使用的推論硬體為入門級的邊緣運算裝置 Jetson Nano,因為進入門檻低、大部分的使用者都能入手,卻有足夠的運算能力運行即時的推論。

3.1 在 Jetson Nano 上產生優化的 TensorRT 引擎

透過 NVIDIA TAO Toolkit產生的預訓練模型可以通過 tao-converter 工具轉換成 TensorRT 最佳化推論引擎,TensorRT 引擎可以運行於 x86 和 Jetson 平台,同時在轉換過程當中也可以將模型轉化為較較低的精度如:FP16 與 INT8。

所有版本的 tao-converter 都可以在這個頁面中找到,針對不同的佈署平台與系統環境,應挑選正確的對應版本使用。

圖 9:經過 Tao converter 轉換的模型可運行於 x86 與 Jetson 平台

要產生一個可以執行在 Jetson Nano 上的 TensorRT 引擎,首先需要將對應的 tao-converter 以及 NVIDIA TAO Toolkit 訓練完畢的模型下載到 Jetson Nano中,再使用 tao-converter 對模型進行轉換。

依照模型的參數量差異,轉換的時間也有長短之分,以下是我們在 Jetson Nano 上轉換兩個不同 backbone 的 YOLO V4 模型所花費的時間

architecture backbone platform OS conversion
YOLO V4 CSPDarkNet 53 Jetson Nano Jetpack 4.5 63 minutes
YOLO V4 MobileNet V2 Jetson Nano Jetpack 4.5 28 minutes
表 3:不同 backbone 的 YOLOY V4 所花費的轉換時間比較

3.2 使用 NVIDIA DeepStream 產生即時推論與串流流程

至此,偵測綠鬣蜥的即時推論引擎已經完備,最後一步則是運行偵測程式、推論的結果(綠鬣蜥數量、位置等)透過特定的通信協定即時回饋給使用者,針對此目的我們使用 NVIDIA DeepStream 來達成。 NVIDIA DeepStream 可以使用 TensorRT 引擎進行深度學習推論、影像和感測器處理,並在串流應用程式中將洞見傳送至雲端。當部署在邊緣端時,應用程式可以在 IoT 裝置與雲端標準訊息代理程式(例如 Kafka 和 MQTT)之間通訊,以進行大規模的廣域佈署。

圖 10:使用 DeepStream 的流程一覽

設置 DeepStream 的主要步驟包括安裝 DeepStream SDK、為 YOLO V4 建構邊界框解析器、建構 DeepStream 應用程式,最後運行應用程式。

DeepStream 應用程式接收即時圖像、預測並且即時串流預測結果。預測結果包含:綠鬣蜥偵測的邊界框影像、當前綠鬣蜥的數量、綠鬣蜥的位置…等等。

我們選擇 MobileNet V2 作為 YOLO V4 的backbone,通過調整 DeepStream 的參數,綠鬣蜥偵測的程式能夠較貼近即時的推論速度。

architecture backbone infer-dims platform skip frame inference speed RTSP streaming (邊界框影像) MQTT streaming (當前綠鬣蜥的數量、綠鬣蜥的位置等)
YOLO V4 CSPDarkNet 53 3*384*1248 Jetson Nano 0 0.2 fps Yes No
YOLO V4 MobileNet V2 3*384*1248 Jetson Nano 0 16 fps Yes No
YOLO V4 MobileNet V2 3*384*1248 Jetson Nano 4 27fps Yes No
YOLO V4 MobileNet V2 3*384*1248 Jetson Nano 0 10 fps Yes Yes
YOLO V4 MobileNet V2 3*384*1248 Jetson Nano 8 18 fps Yes Yes
表 4:DeepStream 參數調整與推論速度比較

YOLO V4 CspDarknet53 實際於 Jetson Nano 推論


影片 2:以 YOLO V4 CspDarknet53 進行推論

YOLO V4 Mobilenet V2 實際於 Jetson Nano 推論


影片 3:以 YOLO V4 Mobilenet V2 進行推論

4. 監控

圖 11:以 Plotly Dash 建構的系統介面

綠鬣蜥偵測應用程式的監控儀表板由 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 裡釋出。