Seeed K.K.の中井です。
最近「ピクトグラミー」というスポーツに興味があり、 Maker Faireなどのイベント用のデモとして似たようなものを作れないかなと思っていました。
ピクトグラミーのようなものを作る場合には姿勢推定が必要と思うので、 OpenCV+OpenPoseを試そうと 手元にあったreComputer J1020(Jetson Nano)を触り始めたところ、 Jetson Nanoに対応するJetPack4.6.2のOpenCVはCUDAに非対応ということがわかりました。
CUDA (GPU)なしでOpenCVでは処理速度が期待できない(と思う)ので 今回CUDA対応のOpenCVをインストールしてみたので紹介したいと思います。
使ったハードウェアreComputer J1020はコチラ。
準備
reComputer J1020にJetPackを入れるとeMMCの16GBでは容量不足のようなのでNVMe SSD 128GBを装着。 熱問題が起こりうるようなのでヒートシンクもつけておきました。
この程度の高さのヒートシンクであればケースに入れても2mm程度の余裕があります。
肝心の冷却効果は、、熱測定をしていないので詳しくはわからないのですが、いまのところはまぁ問題なさそうです。(冬だからかもしれません)
JetPackをインストール
JetPackのインストール手順は、こちらの記事にまとまっているので参考にしました。
記事を参考にeMMCにJetson Linux 32.7.2をインストールし、 そのrootファイルシステムをNVMe SSDにコピーしています。
続いてJetPack 4.6.2をインストールします。
~$ cat /etc/nv_tegra_release # R32 (release), REVISION: 7.2, GCID: 30192233, BOARD: t210ref, EABI: aarch64, DATE: Wed Apr 20 21:34:48 UTC 2022 ~$ sudo apt install nvidia-jetpack
jetson_releaseでインストール情報を確認すると、OpenCVはCUDA非対応の4.1.1です。 OpenCVでCUDAが使えないのはもったいないので今回はこのOpenCVをCUDA対応のものに差し替えてみました。
~$ jetson_release - NVIDIA Jetson Nano * Jetpack 4.6.2 [L4T 32.7.2] * NV Power Mode: MAXN - Type: 0 * jetson_stats.service: active - Libraries: * CUDA: 10.2.300 * cuDNN: 8.2.1.32 * TensorRT: 8.2.1.8 * Visionworks: 1.6.0.501 * OpenCV: 4.1.1 compiled CUDA: NO * VPI: ii libnvvpi1 1.2.3 arm64 NVIDIA Vision Programming Interface library * Vulkan: 1.2.70
CUDA対応のOpenCVをインストール
OpenCVでCUDAを扱えるようにする方法を調べてみると、下記のトピックが見つかりました。
要はCUDAを有効にしたOpenCVをビルドして使ってくれということでした。 ビルド方法はGithubにスクリプトがあるようなのでこれを利用。
cloneしてスクリプトを実行するだけでインストールができました。 ビルドにはかなり時間がかかりそうだったので、ビルドを開始した後は1晩放置しておきました。 そのため詳しい所要時間はわかりませんが、数時間はかかっていると思います。(SSDが遅いのか??)
~$ git clone https://github.com/mdegans/nano_build_opencv.git
~$ cd nano_build_opencv/
~/nano_build_opencv$ ./build_opencv.sh
OpenCVが差し変わったので念のためインストール情報を確認。
「OpenCV: 4.4.0 compiled CUDA: YES」となり、
バージョンが4.1.1から4.4.0に更新され、CUDAが利用可能になりました。
~/nano_build_opencv$ jetson_release - NVIDIA Jetson Nano * Jetpack 4.6.2 [L4T 32.7.2] * NV Power Mode: MAXN - Type: 0 * jetson_stats.service: active - Libraries: * CUDA: 10.2.300 * cuDNN: 8.2.1.32 * TensorRT: 8.2.1.8 * Visionworks: 1.6.0.501 * OpenCV: 4.4.0 compiled CUDA: YES * VPI: ii libnvvpi1 1.2.3 arm64 NVIDIA Vision Programming Interface library * Vulkan: 1.2.70
動作確認
冒頭にも書きましたが、 最近「ピクトグラミー」というスポーツに 興味があり似たようなものを作れないかなと思ってたので、 動作確認には姿勢推定のOpenPoseを用いています。
ソースコードをダウンロードしてOpenPoseで利用する学習済みのモデルを取得、 今回はpythonで動作確認してみました。
~$ git clone https://github.com/spmallick/learnopencv.git ~$ cd learnopencv/OpenPose ~/learnopencv/OpenPose$ ./getModels.sh ~/learnopencv/OpenPose$ find pose -name *.caffemodel pose/mpi/pose_iter_160000.caffemodel pose/coco/pose_iter_440000.caffemodel
サンプル画像の姿勢推定を行うOpenPoseImageでは次のような結果でした。
(学習済みモデルを指定できるようにコードに手を加えてあります)
MPIモデル
~/learnopencv/OpenPose$ python OpenPoseImage.py --device cpu --mode MPI Using MPI Using CPU device time taken by network : 15.231 Total time taken : 15.407 ~/learnopencv/OpenPose$ python OpenPoseImage.py --device gpu --mode MPI Using MPI Using GPU device time taken by network : 7.180 Total time taken : 7.357
COCOモデル
~/learnopencv/OpenPose$ python OpenPoseImage.py --device cpu --mode COCO Using COCO Using CPU device time taken by network : 22.930 Total time taken : 23.086 ~/learnopencv/OpenPose$ python OpenPoseImage.py --device gpu --mode COCO Using COCO Using GPU device time taken by network : 8.455 Total time taken : 8.662
学習済みモデルや画像にもよると思いますが、CPU vs GPU では2倍以上の処理速度の差がありました。
続いて動画を用いた姿勢推定のサンプルOpenPoseVideoでは、GPUの効果は歴然でした。
CPU | GPU |
---|---|
$ python OpenPoseVideo.py --device cpu
|
$ python OpenPoseVideo.py --device gpu
|
約15秒/フレーム | 約1.3秒/フレーム |
ただ、、GPUを使っても1.3秒/フレームなので、リアルタイムに姿勢を取得したいアプリケーションでは厳しいですね。 2023年1月に発売予定のJetson Orin nanoに期待したい。
参考リンク
- ディスクを拡張 NVMe SSD編 - reComputer J1020 - Seeed K.K. エンジニアブログ
- OSをクリーンインストール - reComputer J1010 - Seeed K.K. エンジニアブログ
- Python OpenCVで骨格検出AI OpenPose | みやしんのプログラミングスキル通信
- OpenCV 4.1.1 in Jetpack 4.3 is built without CUDA support - Jetson Nano - NVIDIA Developer Forums
- Jetson Linux Developer Guide
変更履歴
日付 | 変更者 | 変更内容 |
---|---|---|
2022/12/2 | mnakai | 作成 |