Jetson Nanoで学習済みモデルを使って、いろいろやってみる(5)YOLOv4(TensorRT)


物体検出のYOLOをJetson Nanoでやってみます。

以前やったのはYOLOv3でしたが今回は趣向を変えてコンテナ+YOLOv4+TensorRTでやってみます。

また、姿勢推定では、torch2trtというツールを使いましたが、今回はONNXを介してTensorRTで重みを最適化してみます。

チュートリアルはtensorrt_demos のDemo#5ですが、上で書いたようにちょっとアレンジしています。

USBカメラを使った物体検出もやってみました。

なお、Step1~Step6では作業に4時間くらいはかかります。

 


環境構築

Jetson Nano 、Jetpack 4.4.1(L4T R32.4.4)、NVIDIAコンテナ

Nanoの初期設定はこちらをご参照ください。

 

コンテナイメージはnvcr.io/nvidia/l4t-ml:r32.4.4-py3です。

作業環境を作成します。

ディレクトリのアーカイブをダウンロード

ホスト側で作業用ディレクトリを作成

ダウンロードしたファイルの解凍先をこのディレクトリにします。

こういうディレクトリ構造になります。jetsonは適宜ご自分のアカウント名で置き換えてください。

/home/jetson/work-tensorrt-demos/tensorrt_demos-master

 


Step1:コンテナ作成

イメージを取ってきます。

コンテナの作成

sudo docker create -it --name my_tensorrt_demos --gpus all --network host -e DISPLAY=$DISPLAY --device /dev/video0:/dev/video0 -v /home/jetson/work-tensorrt-demos/tensorrt_demos-master:/work -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-ml:r32.4.4-py3

起動

アップデート&アップグレードして他のパッケージをインストール

 

 


Step2:OpenCV 4.1.1 のインストール

shellファイル作成

以下のコードをコピー・ペースト

インストール実行

確認

Python3(python2)

>>>import cv2

何もなければOK

 


Step3:ONNX 1.4.1 インストール

既存のONNX(1.7.0)を削除

(新しいバージョンでは不具合がでるそうで、1.4.1が指定されています)

バージョン指定(1.4.1)してインストール

 


Step4:protobuf-3.8.0 インストール

shellファイル作成

以下のコードをコピー・ペースト

インストール実行

確認

 


Step5:準備

「plugins /」サブディレクトリに移動し、「yolo_layer」プラグインをビルド

以下のファイルが作成されます。

libyolo_layer.so

 

YOLO(cfg、weights)をダウンロード

以下のファイルがダウンロードされます。

Creating yolov3-tiny-288.cfg and yolov3-tiny-288.weights
Creating yolov3-tiny-416.cfg and yolov3-tiny-416.weights
Creating yolov3-288.cfg and yolov3-288.weights
Creating yolov3-416.cfg and yolov3-416.weights
Creating yolov3-608.cfg and yolov3-608.weights
Creating yolov3-spp-288.cfg and yolov3-spp-288.weights
Creating yolov3-spp-416.cfg and yolov3-spp-416.weights
Creating yolov3-spp-608.cfg and yolov3-spp-608.weights
Creating yolov4-tiny-288.cfg and yolov4-tiny-288.weights
Creating yolov4-tiny-416.cfg and yolov4-tiny-416.weights
Creating yolov4-288.cfg and yolov4-288.weights
Creating yolov4-416.cfg and yolov4-416.weights
Creating yolov4-608.cfg and yolov4-608.weights
Creating yolov4-csp-256.cfg and yolov4-csp-256.weights
Creating yolov4-csp-512.cfg and yolov4x-csp-512.weights
Creating yolov4x-mish-320.cfg and yolov4x-mish-320.weights
Creating yolov4x-mish-640.cfg and yolov4x-mish-640.weights

 

テスト用画像をダウンロードしておく

 


Step6:TensorRT最適化

Step5で取得したデータはいろいろあります。YOLOv3とYOLOv4。

画像サイズが288、416、608のもの(サイズは32の倍数)。

ネットワークモデルは5種類。

通常のモデル以外に

tiny:conv layer数などを減らして、より軽量化したモデル、通常の1/10くらいのサイズ
SPP:Spatial Pyramid Pooling Based YOLO
CSP:Cross Stage Partial connections
mish:活性化関数

 

画像サイズ416のYOLOv4、tinyモデルでやってみます。

ONNXに変換

weights,cfg ー>onnx

以下のファイルが作成されます。

yolov4-tiny-416.onnx 

 

 

TensorRTエンジンに変換

onnxー>trt

以下のファイルが作成されます。

yolov4-tiny-416.trt 

 

In case “onnx_to_tensorrt.py” fails (process “Killed” by Linux kernel), it could likely be that the Jetson platform runs out of memory during conversion of the TensorRT engine. This problem might be solved by adding a larger swap file to the system. Reference: Process killed in onnx_to_tensorrt.py Demo#5.
「onnx_to_tensorrt.py」が失敗した場合(Linuxカーネルによる「Killed」プロセス)、TensorRTエンジンの変換中にJetsonプラットフォームのメモリが不足している可能性があります。 この問題は、より大きなスワップファイルをシステムに追加することで解決できる可能性があります。

killされないまま、プロセスに不具合が生じて完了しない場合もあります。10分以上経過しても終了せずjetson-statsを見てもCPUがどれもフル稼働していないような場合はコンテナを再起動してonnx_to_tensorrt.pyを再実行してみてください。

 

USBカメラを使う場合は、描画にtkinter + canvas を使うので、tkinter をインストールしておきます。

 

 

これで道具は一通りそろったので、コンテナを終了しておきます。

Ctrl + D   で抜ける。

 


Step7:実行

Test the TensorRT “yolov4-tiny-416” engine with the “dog.jpg” image.
TensorRT「yolov4-tiny-416」エンジンを「dog.jpg」画像でテストします。

ホスト側でxhostを実行

 

コンテナを起動して以下を実行

こんな感じ。

 


USBカメラを使ってみます。

 

こんな感じで物体検出します。

YOLOv4-tiny-416のTensorRTエンジンを使った場合。

この例では、Windowの下に赤字で検出した人の数を表示しています。

 

例えば、コードはこんな感じ。

category_numberやモデル名、画像サイズなどはハードコードしています、必要なら適宜変更してくださいませ。

詳しくは、trt_yolo.pyやtrt_yolo_cv.pyをご参照ください。

もうちょい細かくデータを取得したい場合は、utils/visualization.py などをご参照ください。

 

NanoとXavier NX とでは、検出精度に差はないと思われますが、カメラのパフォーマンスを含めると….(まぁ、当然ですけど)

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*