「ONNX TensorRTを用いた物体検出」を様々なバージョンのYOLOで試す

解説

「ONNX TensorRTを用いた物体検出」を様々なバージョンのYOLOで試してみます。

GitHubで公開されている「ONNX TensorRTを用いた物体検出」を様々なバージョンのYOLOで試すことができるデモである「jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」を試してみます。

今回、Jetsonに最適化された機械学習開発用のコンテナ「L4T ML」上で試してみることとします。

機械学習開発用のコンテナの起動

Dockerコンテナを実行してJupyterLabにアクセス」に従い、コンテナ起動スクリプトファイルを作成します。

「コンテナ上にいるTerminalから画像表示用のウィンドウを表示」できるようにするために、スクリプトファイルのコンテナ起動コマンドのオプションに以下を追加します。



コンテナ起動スクリプトファイルの内容としては以下のようにします。


「コンテナ上にいるTerminalから画像表示用のウィンドウを表示」できるようにするために、コンテナを起動する前に以下のコマンドを実行します。(ローカルホストからのXサーバーへのアクセスを許可します。)



以下のコマンドを実行し、「L4T ML」コンテナを起動します。



以降の操作は、起動したコンテナ上にいるTerminalで行ないます。

リポジトリのクローン

ファイル操作は、ホストのディレクトリをマウントした「/work」ディレクトリ内で行ないます。「/work」ディレクトリ以外でのファイル操作は、次回コンテナ起動時に引き継がれません。

以下のコマンドを実行し、「/work」ディレクトリに移動します。



以下のコマンドを実行し、「jkjung-avt / tensorrt_demos」のソースコードをローカルにコピーします。



コマンドの結果として、「/work」ディレクトリの下に、「tensorrt_demos」ディレクトリが作成され、その中にソースコードがコピーされます。

以下のコマンドを実行し、「tensorrt_demos」ディレクトリに移動します。

pycudaのインストール

jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」の「step 1」は「pycudaのインストール」です。

以下のコマンドを実行し、pycudaがインストールされているか確認します。



コマンドの結果として、インストールされているPythonパッケージのリストが表示されます。
リストに「pycuda (2022.2.2)」とありました。pycudaはバージョン2022.2.2がインストール済みです。

jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」の「step 1」の「pycudaのインストール」で指定されたpycudaインストールスクリプトのコードを確認したところ、pycudaのバージョン2019.1.2をインストールするスクリプトです。

より新しいバージョンのpycudaがインストール済みなので、pycudaインストールスクリプトの実行はスキップしました。

Python3 onnx モジュールのインストール

jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」の「step 2」は「Python3 onnxモジュールのインストール」です。

以下のコマンドを実行し、Python3 onnxモジュールがインストールされているか確認します。



コマンドの結果として、インストールされているPythonパッケージのリストが表示されます。
リストに「onnx (1.13.0)」とありました。Python3 onnxモジュールはバージョン1.13.0がインストール済みです。

jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」の「step 2」の「Python3 onnxモジュールのインストール」で指定されたonnxインストールコマンドは、onnxのバージョン1.9.0をインストールするコマンドです。

より新しいバージョンのPython3 onnxモジュールがインストール済みなので、onnxインストールコマンドの実行はスキップしました。

「yolo_layer」プラグインのmake

jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」の「step 3」は「『yolo_layer』プラグインのmake」です。

以下のコマンドを実行し、「yolo_layer」プラグインをmakeします。



数秒待ちます。
コマンドの結果として、「libyolo_layer.so」ファイルが生成されます。

学習済みのYOLOモデルのダウンロード

jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」の「step 4」は「学習済みのYOLOモデルのダウンロード、YOLOモデルのONNX変換、ONNXのTensorRTエンジン変換」です。
まず「学習済みのYOLOモデルのダウンロード」を行ないます。

以下のコマンドを実行し、学習済みのYOLOモデルをダウンロードします。



数分待ちます(待ち時間はネットワーク速度に依存します。全体で1.6GBほどのデータをダウンロードします。)
コマンドの結果として、以下の「学習済みのYOLOモデル」のcfgファイルとweightsファイルがダウンロードされます。

ダウンロードされたファイルを元に、以下の「学習済みのYOLOモデル」のcfgファイルとweightsファイルが作成されます。

YOLOモデルのONNX変換

続いて「YOLOモデルのONNX変換」を行ないます。

「学習済みのYOLOモデルのダウンロード」で作成された「学習済みのYOLOモデル」の中から、使用する「学習済みのYOLOモデル」を選びます。
「yolov3-608」を使用することとしました。

以下のコマンドを実行し、YOLOモデル(cfgファイルとweightsファイル)をONNXに変換します。



コマンドオプション解説

-m
使用するYOLOモデルを指定します

10秒ほど待ちます。
コマンドの結果として、「yolov3-608.onnx」ファイルが出来ます。

ONNXのTensorRTエンジン変換

続いて「ONNXのTensorRTエンジン変換」を行ないます。

以下のコマンドを実行し、ONNXをTensorRTエンジンに変換します。



コマンドオプション解説

-m
使用するYOLOモデルを指定します

10分ほど待ちます。
コマンドの結果として、「yolov3-608.trt」ファイルが出来ます。

物体検出プログラムの実行

jkjung-avt / tensorrt_demos」の「Demo #5: YOLOv4」の「step 4」は「物体検出プログラムの実行」です。

以下のコマンドを実行し、「tensorrt_demos」ディレクトリに移動します。



以下のコマンドを実行し、物体検出を行なう画像をダウンロードします。



コマンドの結果として、「dog.jpg」がダウンロードされます。

以下のコマンドを実行し、物体検出を行ないます。



コマンドオプション解説

--image
画像ファイルを指定します
-m
使用するYOLOモデルを指定します

コマンドの結果として、物体検出結果ウィンドウが表示されます。

指定した画像に対して物体検出が繰り返し実行されます。
FPS値が物体検出結果ウィンドウの左上に表示されます。
FPS値は物体検出毎に多少変化しますが、22.64ほどでした。

参考)
旧世代のjetson nanoで実行した場合は、FPS値は物体検出毎に多少変化しますが、2.35ほどでした。

別のYOLOモデルを試す

「yolov3-608」以外のYOLOモデルを試してみます。
「yolov4-608」「yolov4-tiny-288」について試してみます。

それぞれのモデルについて以下を行います。

yolov4-608」による物体検出結果のスクリーンショット

FPS値は物体検出毎に多少変化しますが、20.33ほどでした。

参考)
旧世代のjetson nanoで実行した場合は、FPS値は物体検出毎に多少変化しますが、2.21ほどでした。

yolov4-tiny-288」による物体検出結果のスクリーンショット

FPS値は物体検出毎に多少変化しますが、100.25ほどでした。

参考)
旧世代のjetson nanoで実行した場合は、FPS値は物体検出毎に多少変化しますが、25.18ほどでした。

画像ファイル以外を入力とした物体検出

物体検出プログラム「trt_yolo.py」は、画像ファイル以外を入力として指定可能です。

物体検出プログラム「trt_yolo.py」は、コマンドオプションにて、以下の入力を指定可能です。

--image
画像ファイルを指定します。例えば「--image test_image.jpg」
--video
動画ファイルを指定します。例えば「--video test_video.mp4」
--usb
USB Webカメラを指定します。例えば「/dev/video0」のwebカメラを指定する場合は「--usb 0」とします
--rtsp
IPカメラなどのRTSPソースを指定します。例えば「--rtsp rtsp://admin:123456@192.168.1.1/live.sdp」
--onboard
オンボードカメラを指定します。例えば「--onboard 0」

動画ファイルを入力とした物体検出

以下のコマンドを実行し、動画ファイルを入力として物体検出を行ないます。



動画ファイルを入力とした物体検出結果のスクリーン動画像(動画像をクリックで大きいサイズの動画像表示)

「person」「car」「bus」「handbag」などが検出されました。
入力動画:【4K】Walk on Shibuya(渋谷) at Tokyo【2020】

Webカメラを入力とした物体検出

Webカメラにアクセスできるようにするために、コンテナ起動コマンドを変更します。

起動したコンテナ上にいるTerminalで「exit」と入力し、一度、コンテナを終了します。

Webカメラにアクセスできるようにするために、コンテナ起動コマンドのオプションに以下を追加します。



コンテナ起動スクリプトファイルの内容としては以下のようにします。


Jetson に Webカメラを接続します。

以下のコマンドを実行し、「L4T ML」コンテナを起動します。



以下のコマンドを実行し、「tensorrt_demos」ディレクトリに移動します。



以下のコマンドを実行し、Webカメラを入力として物体検出を行ないます。



Webカメラを入力とした物体検出結果のスクリーン動画像(動画像をクリックで大きいサイズの動画像表示)

「cell phone」「mouse」「spoon」「fork」「scissors」が検出されました。

コンテナの終了

コンテナを終了するには、起動したコンテナ上にいるTerminalで「exit」と入力します。

コンテナを終了したら以下のコマンドを実行します。(ローカルホストからのXサーバーへのアクセス許可を解除します。)

参考ウェブサイト