【MediaPipe】Jetson Xavier NXで環境構築し、Multi Hand TrackingをGPUで動かしてみた(v0.7.6)
カフェチームの山本です。
今まで、MediaPipeをデスクトップPC・クラウド環境で動かしていました。
前々回・前回は、エッジ側で安価なデバイスで処理するために、MediaPipeをシングルボードで動かすことを目的として、Raspberry Pi 4とJetson Nanoにインストールする方法を調べました。しかし、Jetson NanoのGPUで処理した場合が一番速かったのですが、処理速度は4[fps]程度であり、少しパワー不足感がありました。
今回は、RasPi4に代えて、MediaPipeをJetson Xavier NXで動かしてみました。Jetson Xavier NXの方が性能が高いため、高速に処理することが期待できます。Hello Worldで動作確認し、Multi Hand Tracking CPU/GPU版をビルドし、動作することを確認しました。
また、MediaPipe v0.7.6が7/9に新たに公開されたため、早速利用してみました。ちょうど良く、JetsonやRaspberry Piでのインストール方法が追加されていたため、それに沿って実行しました。
結果として、MediaPipeの公式ガイド通りに進めて実行できました。Multi Hand Trackingを動かし、GPUを用いた場合は20[fps]程度で処理でき、2プロセス同時に動かしても10[fps]程度で処理できました。
(MediaPipeに関連する記事はこちらにまとめてあります。)
留意事項
インストールにあたって
実行までに数時間がかかるので、なにかの作業と並行して進めることをオススメします。
インストール手順
ステップ0:用意するもの
Jetson Xavier NXで動かすのに必要なものです。今回は以下のものを使用しました。ほとんど秋月電子通商で購入できるので参考にリンクを貼っておきます。
- micro SDカード:32GBのものを利用しました。
- SDカードライター
- Jetson Xavier NX開発者キット:(http://akizukidenshi.com/catalog/g/gM-15308/)。ACアダプタ(電源)が付属しています。ヒートシンク・ファンもついており、簡単なガードもついています。
- USBキーボード・マウス
- モニタ用ケーブル:HDMI - HDMI(http://akizukidenshi.com/catalog/g/gC-13562/)
- モニタ:HDMI入力
- ネットワーク環境:無線 or 有線。どちらでも問題ありません。
- カメラ:RasPiカメラモジュールV2 or USBカメラ。どちらでも問題ありません。 (カメラがなくても、動画ファイルの処理は可能です。)
ステップ1:Jetson Nanoをセットアップする
ステップ1-1 :Jetson Xavier NX用のSDカードイメージをダウンロードする
以下のリンクから、Jetson Xavier NX用のSDカードイメージをダウンロードします。
下図の赤枠のリンクからダウンロードできます。6GBと結構大きいので注意してください。
ダウンロードしたら解凍します。
ステップ1-2:SDカードにイメージを書き込む
赤枠下の「Follow these instructions」にしたがって進めます。
ステップ1-3:OSをセットアップする
SDカードをJetson Nanoに挿し、ディスプレイ・キーボード・マウスを接続します。立ち上がったら、指示にしたがって、OSをセットアップしてください。
ステップ1-4:Jetson用の設定をする
起動後、再起動が求められた場合は、再起動してください。
- ファンを回す
ファンが回っていない場合、以下のコマンドでファンを回しておきましょう。255で設定してファンの音が気になる場合は、127でも問題ないとは思います。(再起動のたびに必要かもしれません)
# ファンを回す ## 全力、少しうるさい sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm' ## そこそこ、静か sudo sh -c 'echo 127 > /sys/devices/pwm-fan/target_pwm'
- パワーモードを変更する
画面右上の「MODE ~~ 」と書いてあるところ(WiFiマークの左)をクリックし、電力モードを「MODE 15W 6CORE」(フルパワー)に変更します。
- スクリーンオフ・ロックの解除
これはお好みで構いません。System Setting(左のタスクトレイ中の歯車のようなアイコン)からをクリックします。Personal の 「Brightness & Lock」を選択します。「Turn screen off when in active for」を1hour程度に、「Lock」をOFFに設定しておくと良いでしょう。
ステップ1-5:更新
セットアップが終わったら、ターミナルを開き、以下のコマンドで更新しておきます。数十分ほどかかります。
sudo apt update sudo apt upgrade -y sudo reboot
ステップ2:MediaPipe をインストールする
公式ガイドにしたがってインストールしていきます。
ステップ2-1:MediaPipeのリポジトリをクローンする
ターミナルを開いて、以下のコマンドを実行します。
cd ~ git clone https://github.com/google/mediapipe.git
ステップ2-2:OpenCVとFFmpegをインストールする
今回は、インストールガイドのOption 2を利用しました
cd ~/mediapipe chmod +x setup_opencv.sh ./setup_opencv.sh
数十分かかるので、次のステップを並行して進めます。
ステップ2-3:bazelをインストールする
必要なライブラリをインストールしておきます
sudo apt-get install build-essential openjdk-8-jdk python zip unzip
以下のコマンドで、bazelをインストールします。unzipまでは、上のインストールと同時並行で行っても問題ありません。
# For Bazel 3.0.0 cd ~ mkdir bazel_build cd bazel_build wget https://github.com/bazelbuild/bazel/releases/download/3.0.0/bazel-3.0.0-dist.zip unzip bazel-3.0.0-dist.zip env EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh sudo cp output/bazel /usr/local/bin/
Hello Worldで動作確認
公式ガイド通りビルドして動作させます。
CPU版の場合、以下のようなコマンドになります。
# cd ~/mediapipe export GLOG_logtostderr=1 bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world
GPU版の場合、以下のようなコマンドになります。
# cd ~/mediapipe export GLOG_logtostderr=1 bazel run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 \ mediapipe/examples/desktop/hello_world:hello_world
bazelのビルド後(数十分かかります)、以下のように「Hello World!」が10回表示がされればOKです。
I20200629 11:55:45.702250 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702352 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702378 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702397 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702419 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702440 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702461 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702484 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702507 28131 hello_world.cc:56] Hello World! I20200629 11:55:45.702527 28131 hello_world.cc:56] Hello World!
Multi Hand Trackingを動かす
公式ガイド通りビルドして動作させます。カメラを接続してください。
CPU版の場合、以下のようなコマンドになります。
# cd ~/mediapipe bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/multi_hand_tracking:multi_hand_tracking_cpu export GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_cpu \ --calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt
GPU版の場合、以下のようなコマンドになります。
# cd ~/mediapipe bazel build -c opt --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 \ mediapipe/examples/desktop/multi_hand_tracking:multi_hand_tracking_gpu export GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_gpu \ --calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt
カメラがない場合は、動画ファイルを用意し、以下のようにオプションでファイルパスを渡してください。
bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_gpu \ --calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt \ --input_video_path="video.mp4" \ --output_video_path="video_gpu.mp4"
bazelのビルド後(数時間かかります)、検出結果のウィンドウが表示されます。(ファイルパスを指定した場合は、少し時間が立った後ファイルが出力されます。)
検出している様子は、以下の動画のようでした
GPU版では、処理速度は20[fps]程度で、検出の様子は以下のようでした。
また、別のターミナルを開いて、同じコマンドを実行し、2プロセスを同時に動作させてみた様子が、下の動画です。1プロセスのときよりも処理測度は落ちていますが、10[fps]程度で動作しているようでした。
まとめ
今回は、MediaPipe v0.7.6をJetson Xavier NXにインストールし、Multi Hand Trackingを動かしました。インストールは、公式ガイド通り問題なく行うことができました。処理速度はGPUを利用して20[fps]程度で動き、実利用に十分なレベルでした。また、2プロセス同時に処理させた場合も、処理速度は10[fps]程度でした。常時カメラの映像に対して検出をかけ続けて、人の行動を認識するには十分なレベルでした。