reComputer J1020 (Jetson Nano)にCUDA対応のOpenCVを入れてみた

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はコチラ。

www.seeedstudio.com

準備

reComputer J1020にJetPackを入れるとeMMCの16GBでは容量不足のようなのでNVMe SSD 128GBを装着。 熱問題が起こりうるようなのでヒートシンクもつけておきました。

この程度の高さのヒートシンクであればケースに入れても2mm程度の余裕があります。

肝心の冷却効果は、、熱測定をしていないので詳しくはわからないのですが、いまのところはまぁ問題なさそうです。(冬だからかもしれません)

JetPackをインストール

JetPackのインストール手順は、こちらの記事にまとまっているので参考にしました。

lab.seeed.co.jp

記事を参考に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を扱えるようにする方法を調べてみると、下記のトピックが見つかりました。

forums.developer.nvidia.com

要はCUDAを有効にしたOpenCVをビルドして使ってくれということでした。 ビルド方法はGithubにスクリプトがあるようなのでこれを利用。

github.com

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に期待したい。

参考リンク

変更履歴

日付 変更者 変更内容
2022/12/2 mnakai 作成