Jetson Nanoで学習済みモデルを使って、いろいろやってみる(4-3)手の形推定(trt_pose_hand)


ここではチュートリアルとは少し趣向を変えてやってみます。

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

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

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

Jetsonコーディングの流儀からはちょい外れてるかも^^

JetsonのカメラインターフェースはJetCam以外にもVideo-Viewerというのもあります。

 


trt_pose_hand は trt_pose の手の形推定バージョンです。

こういう推定をします。

trt_pose_handには5つのNotebookが用意されています。

1.live_hand_pose.ipynb

カメラを通して上図ような手の形(gesture)にpose画像(線と丸)を表示するだけのシンプルなNotebook

2.mini_paint_live_demo.ipynb

カメラを通して手の形(gesture)を5つのパターンで認識して、カメラ画面の上に点で動きをトレースして描画したり消去したりするNotebook

3.cursor_control_live_demo.ipynb

カメラを通して手の形(gesture)を5つのパターンで認識して、マウスカーソルをコントロールするNotebook

4.gesture_data_collection_pose.ipynb

独自の手の形(gesture)を学習して分類するためのデータセットを作成するNotebook

5.gesture_classification_live_demo.ipynb

独自に手の形(gesture)を分類するための学習を実行するNotebook

 

今回は1と2の中間にあるようなものを作ってみましょう。

ただしNotebookは使いません。

カメラを通して手の形(gesture)を5つのパターンで認識して、どんなパターンかを画面に文字表示してみます。

パターンはこんな感じ(panとstopの違いがよく分かりませんでした)。

手がフレームアウトすると「no hand」と表示されます。

こんな感じ。

 

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

 


1.実行環境作成

Jetson Nano、jetpack(4.5.1)、NVIDIAコンテナーを使います。

実行環境はtrt_pose がベースになっています。

作業用ディレクトリはwork-hand、コンテナ名はmy_handとしておきます。

コンテナの設定や起動まではこのページを参照してください。ただし、JetCamやJupyterの拡張機能のインストールは不要です。trt_poseのインストールまでをやっておきます。

Pythonファイルの実行にはscikit-learn が使われている箇所があります。SVMを使った分類です。

コンテナのscikit-learnのバージョンは0.24.1なので0.23.2にダウングレードする必要があります。

必須というわけではないですが、しないと以下のような物騒なメッセージが表示されます。

UserWarning: Trying to unpickle estimator StandardScaler from version 0.23.2 when using version 0.24.1. This might lead to breaking code or invalid results. Use at your own risk.

まぁ、やっておきます(小一時間ほどかかります….)

 

tkinterをインストール

 

 


2.trt_pose_hand 用の環境作成

まず、以下のようにGithub からtrt_pose_hand 用の環境をダウンロードしておきます。

次に、重みファイルをダウンロード

Model Weight
hand_pose_resnet18_baseline_att_224x224_A download model

 

解凍したディレクトリファイル内のmodelディレクトリにこの重みファイルをコピーしておきます。

 

最後にディレクトリファイルをまるごと、1.で作成したコンテナのマウントフォルダー(/home/jetson/work-hand/torch2trt/trt_pose/tasks)にコピーします。

 

例えば、こんなコマンドを使います(ディレクトリ名などが違っていたら修正)


sudo cp -r /home/jetson/Downloads/trt_pose_hand-main /home/jetson/work-hand/torch2trt/trt_pose/tasks

 


3.TensorRTで重みファイル(hand_pose_resnet18_baseline_att_224x224_A)を最適化しておく

torch2trtで最適化します。

コンテナで以下を実行

ディレクトリを移動してPythonコンソールに入ります。

最適化を実行

hand_pose_resnet18_att_244_244.pthがtorch2trtで最適化されて、hand_pose_resnet18_att_244_244_trt.pthが作成されます。

 

 


4.Pythonファイルを作っておく

JetsonではUSBカメラが1台のみ繋がっている前提で。

 

コンテナでPythonファイルを作っておきます。エディターはnano を使っていますが、なんでもいいです。

【pose_view.py】

カメラインターフェースはOpenCVです。CVでキャプチャーした画面のサイズは1280x720、アスペクト比は16:9なので、clipとresizeで224x224にして使っています。

#—————-で挟まれたコードはlive_hand_pose.ipynbmini_paint_live_demo.ipynbから抽出した部分

#—————-の外側がカメラ画像をOpenCVでキャプチャしてcanvasに転送している部分

キャプチャしたフレームごとにexecuteに送って、解析して文字合成した画像をcanvasに表示しています。

ファイルを閉じて、コンテナも閉じます。

 


5.実行

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

コンテナを起動

ディレクトリを移動して実行

 

終了処理は入れていません、強制終了します。

ウィンドウを閉じて、Ctrl + Zで終了


文字表示などは、preprocessdata.pyを参照。

panやstopなどのクラスはpreprocess/gesture.json に記述されています。

OpenCVは日本語化していません。

日本語化などはラズベリーパイ3で顔認識のページの下段などを参考してみてください。

カメラ画像をOpenCVでキャプチャしてcanvasに転送している部分を別スレッドにすれば、コードもすっきりするかも….。  たいしてすっきりはしませんです。キャプチャ部分をスレッド化する場合はこんな感じ?、参考までに。

分類の検出がうまくいってません。自前で再学習が必要かもしれません。あるいは照明が暗かった?

 


スレッドを使った場合

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*