YOLOv3 on Nvidia Jetson Nano

CW Lin
5 min readSep 10, 2019

--

深度學習模型若應用場合空間有限或沒有電腦主機時,可以考慮使用 AI 開發板來進行 edge computing ,目前主要有 Nvidia 的 Jetson nano、Google的 Coral edge TPU 、RaspberryPi + Neural Compute Stick 三種,這篇記錄在 Jetson nano 上使用物件辨識的經驗並與 RaspberryPi + NCS2 比較。

Jetson Nano 是一部微型電腦,可執行神經網路計算,是個易於使用的平台,運作只需 5 瓦,作業系統是 Ubuntu 18.04。與樹梅派比較可參考以下:

Jetson nano & RaspberryPi+NCS2 兩大深度學習開發板性能比較

以大小來說樹梅派還是小一點,但運算能力和價錢綜合比較來看,還是Nano划算,而且NCS2插在樹梅派上只能使用 OpenvVINO 僅具推論功能,無法training (雖然基本上也不會用Nano來train model 啦~)。

安裝 &設定

Nano 和Raspberry pi都是使用SD卡來啟動,先使用 SD memory formatter 格式化SD卡並從官方網站下載image檔刷進SD卡,插進去nano開電源就OK了~
開機後的基本設定我是參考這篇

安裝常用模組

Nano default 已預裝好Jetpack, CUDA, cuDNN, OpenCV, TensorRT,其他常用模組安裝可以參考這篇以及這篇

Note: 安裝的速度頗慢,尤其 scipy會等到起度爛

YOLOv3 with TensorRT on Jetson Nano

首先,要先了解什麼是TensorRT,可以看官方的說明文件,或是看這位高人的中文翻譯!

基本上就是把 deep learning model 轉換成 inference 專用,捨棄掉一些back propagation 才需要東西,或像dropout這種 inference時沒用的layer,並做一些layer的合併來加快推論時的速度。
在樹梅派的openVINO 則是一定要做類似的轉換(轉成 IR) 才能做推論。

大致上的流程如下:

yolov3 weight --> onnx --> TensorRT

Jetpack 的 image內也已經提供了相對應的 yolov3 tensorrt example
(cd /usr/src/tensorrt/samples/python/yolov3_onnx),這個 repo 似乎就是從官方抄出來的,照做應該就可以了。

常撞的 error

  • Memory 不夠 → 設定swap、onnx_to_tensorrt.py 裡修改 builder.max_workspace_size = 1 #ori 32(1GB)->28(256MB)
  • onnx版本不符合 →確定安裝 1.1.1 版

另外補充兩點:

  1. onnx_to_tensorrt.py 裡:

2. data_processing 裡:
_process_feats 這個函數換成這個branch下的 function,要不然postprocessYOLO 原本的寫法在sigmoid 和exp的計算太慢。

實測結果

  • Nano: YOLOv3 使用 darknet 未透過 python
    320*320: fps~2.2
    416*416: fps~1.4
    608*608: fps~0.7 (load得很慢)
    Memory 約剩餘300~500M之間
  • Nano: YOLOv3-tiny 使用darknet 未透過 python
    fps 約 9~11
    Memory 約剩餘1.2G
  • Nano: YOLOv3 with TensorRT 透過python interface:
    320*320: fps 約 3~4
    416*416: fps 約 2~3
    608*608: fps 約 1~2
    Memory 約剩餘500~900M之間
  • RaspberryPi3 + NCS2 (IR model with python interface):
    YOLOv3 320*320: fps 約0.9~1.2
    YOLOv3-tiny: fps 約 3~4

其實除了tiny 外要達到real time detection還是有點距離,但若只是每秒需要偵測一張的這種應用已經很夠用了~

--

--

CW Lin
CW Lin

Responses (1)