(下書き)Jetson NanoにCUDA対応のopencvをインストールする
この記事は未完成です
はじめに
Jetson Nanoにはあらかじめopencvが入っているが、CUDAをサポートしていない。そのため、CUDA対応のopencvを入れ直すことにした。
環境
手順
CUDAテスト用のコード
CUDAが使えているかどうかと性能を確認するためのテストコードを作成する。
iwatake2222さんの記事から拝借いたしました。512x512のlenaさんの画像を読み込み、CPUとGPUでそれぞれ300x300にリサイズして、処理時間を測定。10000回実施して平均値を取得する。というテスト内容です。
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日現在の最新版は以下の様です。
なお、ビルドに際し、メモリを大量に食うためswap領域の確保は必須とのことです。
swap領域確保後、以下スクリプトを走らせます。
#!/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くらいだったのに、あまり早くなっていない・・・
元記事にあったこちらのコードでビルドしてみるか・・・。
GPUの稼働状況をモニタリングしてみる
jtop
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