🚖

(下書き)Jetson NanoにCUDA対応のopencvをインストールする

2022/07/14に公開

この記事は未完成です

はじめに

Jetson Nanoにはあらかじめopencvが入っているが、CUDAをサポートしていない。そのため、CUDA対応のopencvを入れ直すことにした。

環境

https://zenn.dev/sumire0204/articles/64f1f9f016be78

手順

CUDAテスト用のコード

CUDAが使えているかどうかと性能を確認するためのテストコードを作成する。
iwatake2222さんの記事から拝借いたしました。512x512のlenaさんの画像を読み込み、CPUとGPUでそれぞれ300x300にリサイズして、処理時間を測定。10000回実施して平均値を取得する。というテスト内容です。

opencv-cuda-test.py
import sys
import time
import cv2

### VALUES
NUM_REPEAT = 10000

### Read source image
img_src = cv2.imread("resource/lena.jpg")
cv2.imshow('img_src', img_src)


### Run with CPU
time_start = time.time()
for i in range (NUM_REPEAT):
    img_dst = cv2.resize(img_src, (300, 300))
time_end = time.time()
print ("CPU = {0}".format((time_end - time_start) * 1000 / NUM_REPEAT) + "[msec]")
cv2.imshow('CPU', img_dst)


### Run with GPU
img_gpu_src = cv2.cuda_GpuMat() # Allocate device memory only once, as memory allocation seems to take time...
img_gpu_dst = cv2.cuda_GpuMat()
time_start = time.time()
for i in range (NUM_REPEAT):
    img_gpu_src.upload(img_src)
    img_gpu_dst = cv2.cuda.resize(img_gpu_src, (300, 300))
    img_dst = img_gpu_dst.download()
time_end = time.time()
print ("GPU = {0}".format((time_end - time_start) * 1000 / NUM_REPEAT) + "[msec]")
cv2.imshow('GPU', img_dst)

key = cv2.waitKey(0)
cv2.destroyAllWindows()

print(cv2.cuda.getCudaEnabledDeviceCount())

実行

$ python opencv-cuda-test.py 
Gtk-Message: 09:50:05.848: Failed to load module "canberra-gtk-module"
CPU = 2.73261501789[msec]
Traceback (most recent call last):
  File "opencv-cuda-test.py", line 27, in <module>
    img_gpu_src.upload(img_src)
cv2.error: OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/core/include/opencv2/core/private.cuda.hpp:107: error: (-216:No CUDA support) The library is compiled without CUDA support in function 'throw_no_cuda'

gtkモジュールについてのエラーが出ていますが、これは別記事で対処法を書きます(2つパッケージインストールするだけですが)。本題は後半の方で、やはりNo CUDA supportとなっています。現在インストールされているものをuninstallして、新しくopencvをビルドしたいと思います。

opencv(CUDA support)のビルド

Jetson Nano へ OpenCV 4.1.0 をインストールするにあるスクリプトを使わさせていただきました。参考記事を遡ると、nvidiaのforumでissueとして上がっており、公式が出したスクリプトを元にしているようです。なお、インストール前に、既にインストール済みのopencvパッケージを削除するコードを追加しました。
2021年10月16日現在の最新版は以下の様です。
https://github.com/AastaNV/JEP/tree/master/script
なお、ビルドに際し、メモリを大量に食うためswap領域の確保は必須とのことです。
https://zenn.dev/sumire0204/articles/43b843492afcfd/
swap領域確保後、以下スクリプトを走らせます。

install-opencv-4.3.0
#!/bin/bash
#
# Copyright (c) 2018, NVIDIA CORPORATION.  All rights reserved.
#
# NVIDIA Corporation and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto.  Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA Corporation is strictly prohibited.
#

if [ "$#" -ne 1 ]; then
    echo "Usage: $0 <Install Folder>"
    exit
fi
folder="$1"
user="nvidia"
passwd="nvidia"

# 既存パッケージの削除を追加
echo "** Remove other OpenCV first"
sudo sudo apt-get purge *libopencv*

echo "** Install requirement"
sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y python2.7-dev python3.6-dev python-dev python-numpy python3-numpy
sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install -y libv4l-dev v4l-utils qv4l2 v4l2ucp
sudo apt-get install -y curl
sudo apt-get update

echo "** Download opencv-4.1.0"
cd $folder
curl -L https://github.com/opencv/opencv/archive/4.1.0.zip -o opencv-4.1.0.zip
curl -L https://github.com/opencv/opencv_contrib/archive/4.1.0.zip -o opencv_contrib-4.1.0.zip
unzip opencv-4.1.0.zip 
unzip opencv_contrib-4.1.0.zip 
cd opencv-4.1.0/

echo "** Building..."
mkdir release
cd release/
cmake -D WITH_CUDA=ON -D CUDA_ARCH_BIN="5.3" -D CUDA_ARCH_PTX="" -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.0/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

make -j3
sudo make install
sudo apt-get install -y python-opencv python3-opencv

echo "** Install opencv-4.1.0 successfully"
echo "** Bye :)"

install先のフォルダを指定して実行

$ mkdir opencv
$ ./install-opencv-4.3.0 opencv

再度テストコードを実行

$ python opencv-cuda-test.py 
CPU = 2.7011095047[msec]
GPU = 2.29308321476[msec]
1

元々のコードでは、GPUだと0.8msecくらいだったのに、あまり早くなっていない・・・
元記事にあったこちらのコードでビルドしてみるか・・・。
https://github.com/AastaNV/JEP/blob/master/script/install_opencv4.5.0_Jetson.sh

GPUの稼働状況をモニタリングしてみる
jtop
https://qiita.com/zrock/items/ab9a4b3042b0d6d9c41e

sumire@jetson-nano:~/Documents$ jtop
The jetson_stats.service is not active. Please run:
sudo systemctl restart jetson_stats.service
sumire@jetson-nano:~/Documents$ sudo systemctl restart jetson_stats.service
sumire@jetson-nano:~/Documents$ jtop
I can't access jetson_stats.service.
Please logout or reboot this board.

Discussion