Jetson Nanoで学習済みモデルを使って、いろいろやってみる(4-2)姿勢推定(TensorRT)


New(2021/03/19)

Nano(2GB)の実行環境を変更してみました


Jetson Nanoで学習済みモデルを使って、いろいろやってみる(4-1)姿勢推定(ResNet-18)で作成した、TensorRTで最適化した重みデータを使ってみます。

上記ページで「resnet18_baseline_att_224x224_A_epoch_249_trt.pth」というファイル名で保存されます。

 Please note that TensorRT has device specific optimizations, so you can only use an optimized model on similar platforms.
TensorRTにはデバイス固有の最適化があるため、同様のプラットフォームでのみ最適化されたモデルを使用できることに注意してください。

とのこと。

Xavier NX で作成したものとNano(4GB)で作成したものがJetson Nano(2GB)で再利用できるか試してみました。

NXの場合はどうでしょう?

結論から言うと不可です。

ファイルをロードする段階でエラーになります。

NVIDIAによれば、このメッセージが出た場合は以下をチェックする必要があるそうです。

1.Linux distro and version
2.GPU type
3.Nvidia driver version
4.CUDA version
5.CUDNN version
6.Python version [if using python]
7.Tensorflow and PyTorch version
8.TensorRT version

今回は同じバージョンのJetpack(4.5.1)とコンテナイメージを使ったので、2以外は同じものです。

NXのGPUはVoltaアーキテクチャですが、NanoはMaxwellです。

従って

同じアーキテクチャのNano(4GB)はどうだったかというと

 

では、Nano(2GB)で実際に読み込んでパフォ-マンスを見てみます。

以下の記述で/home/jetsonのユーザー名は適宜ご自分の環境のユーザー名で置き換えてください。

 


Jetson Nano (2GB)に環境構築

まず、JetpackはNano(2GB)用にデスクトップが軽量化されて最適化されたJetpack(4.5.1)を使用。

 

コンテナイメージは4.5.1用に「nvcr.io/nvidia/l4t-ml:r32.5.0-py3」です。

OSをセットアップしてコンテナを起動するまでは、Jetson Nanoで学習済みモデルを使って、いろいろやってみる(4-1)姿勢推定(ResNet-18)と同じです。

 


Notebookを使う前に最適化されたファイル「resnet18_baseline_att_224x224_A_epoch_249_trt.pth」をNano(2GB)に移しておきます。

例えばこんなコマンドです。ディレクトリ名は適宜、置き換えてください。

sudo cp /home/jetson/Public/resnet18_baseline_att_224x224_A_epoch_249_trt.pth /home/jetson/work-pose/torch2trt/trt_pose/tasks/human_pose

 

Swapが4GBくらいアサインされているのを確認してください。Swap領域が少ないと実行途中でほぼフリーズ状態になります。

 

コンテナ起動後、

ブラウザーでNotebook を開きます。

127.0.0.1:8888

パスワードを聞かれたら「nvidia」です。

Notebook でPython3を使いましょう。

ディレクトリは/work/torch2trt/trt_pose/tasks/human_poseです。

 


以下のコードを実行します。pthは作成せずに読み込むだけですので、Jetson Nanoで学習済みモデルを使って、いろいろやってみる(4-1)姿勢推定(ResNet-18)の場合とは少し異なります。

 

トポロジーテンソルを作成

モデルをロード

サンプルデータ作成

最適化された重みを読み込みます。

FPSでモデルをベンチマーク、やってもやらなくてもいいと思います。

元々BGR8 / HWC形式の画像を前処理する関数を定義

ニューラルネットワークからオブジェクトを解析するために使用される2つの呼び出し可能なクラスを定義し、解析されたオブジェクトを画像上に描画します。

jetcamパッケージを使用して、BGR8 / HWC形式で画像を生成する使いやすいカメラを作成

視覚化されたカメラフィードを表示するために使用されるウィジェットを作成

メインの実行ループを定義

カメラフレームで関数を1回実行、シングルショットで姿勢推定画像を取得

実行関数をカメラの内部値にアタッチします。 これにより、新しいカメラフレームが受信されるたびにexecute関数が呼び出されます。ムービーで姿勢推定動画像を取得

カメラフレームコールバックのアタッチを解除

 


Nano(2GB)

1フレームの解析自体は4GBと遜色ない速度で実行されます。

ただ、動画の場合はRAMが2GBしかないので、読み込みがカクカクしていて、ちとしんどいかな。

シングルショットでの姿勢推定の解析は問題ないです。

解析速度には問題ないのだからこういう構成でなんかできないかな?

 


Next

では、Nano(2GB)しか持っていない場合はどうするか?

Colabは使えないのは分かったので、無料で使える(らしい)学習環境のNVIDIA DIGITS を試してみる予定。

 


Appendix

Nano(4GB)で作成した重みファイルです(111MB)。

上記と同じ環境なら実行可能なはずです。

resnet18_baseline_att_224x224_A_epoch_249_trt.pth

 


実行環境の変更

このページに倣って、trt_poseの実行環境を以下のようにしてみました。

●Jupyter Notebookは使わずに、Pythonファイルで実行できるようにする

●PythonのカメラインターフェースはJetCam ではなくOpenCVのVideoCaptureクラスを使う

●ビデオ表示にはtkinter + canvas を使う

これでNotebookより軽快に動作します。

で、コンテナ環境にも変更点があります。

1.JetCamやJupyterの拡張機能のインストールは不要です。

2.scikit-learnをダウングレードしておく

3.tkinterをインストール

 

Pythonファイルを作っておきます。

USBカメラが1台だけ接続されている前提です。

改めてコンテナを起動

ディレクトリを移動

以下のようなPythonファイルを作成
上記のNano(4GB)で作成した最適化済み重みファイル(resnet18_baseline_att_224x224_A_epoch_249_trt.pth)をロードするだけです。

【pose_view.py】

とりあえずファイルを閉じて、コンテナも終了しておきます。

改めて、実行

ホスト側で以下を実行しておきます。

コンテナを起動

ディレクトリを移動してPythonファイル実行

trtファイルのロードに2分くらいかかりますが、起動すればtkinterで作ったウィンドウに画像が表示されます。

ラジオ体操やってます

終了する場合は、ウィンドウを閉じてCtrl + Z

再起動は、コンテナの再起動から行います。

 


 

 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*