🙌
JetsonでROS Melodic向けにCUDAを有効にしたOpenCVをビルドした忘備録
はじめに
- デフォルトの OpenCV では CUDA が無効になっており、GPU を利用するには OpenCV をソースからビルドする必要があります。
OpenCV のバージョンについて
- JetPack 4.4 ~ 4.6 は Ubuntu 18.04 ベースで、CUDA 10.2 が含まれます。
- Ubuntu 18.04 用の ROS ディストロは Melodic です。
- ROS Melodic のデフォルトの OpenCV のバージョンは 3.2.0 です。
- OpenCV のバージョンを変更してビルドすることも可能ですが、ここでは CUDA を有効にするだけにしたいので、バージョンは同じにします。
ビルド手順
- Installation in Linux を参考にしながらインストールを実行します。
- GitHub からソースをクローンします。
$ cd ~/<my_working_directory> $ git clone -b 3.2.0 --depth 1 https://github.com/opencv/opencv.git $ git clone -b 3.2.0 --depth 1 https://github.com/opencv/opencv_contrib.git $ cd opencv $ mkdir build $ cd build
- 環境に合わせてソースを一部修正します。詳細については下の各節を参照してください。
- NVIDIA NPPI 対応のため
cmake/FindCUDA.cmake
を修正 - fp16 ヘッダファイル対応のため
modules/cudev/include/opencv2/cudev/common.hpp
を修正
- NVIDIA NPPI 対応のため
- CMake を使ってビルドします。オプションの詳細は下の各節を参照してください。
$ cmake \ -DWITH_CUDA=ON \ -DCUDA_ARCH_BIN=xx \ -DENABLE_PRECOMPILED_HEADERS=OFF \ -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. $ make $ sudo make install
NVIDIA NPPI について
- NVIDIA NPPI は CUDA で画像処理するためのライブラリです
- OpenCV のビルドに必要ですが、CUDA 8.0 以降の NPPI はいくつかに分割されており、OpenCV 3.2.0 ではこの分割に未対応です
- OpenCV 3.4.0 以降は対応済みのようなので、それを参考に
cmake/FindCUDA.cmake
の一部を以下のように変更する必要があります
fp16 ヘッダファイルについて
- CUDA 9.0 以降、fp16に関する一部のビルトイン機能が削除されたらしく、同様の機能を利用するには
cuda_fp16.h
ヘッダファイルをインクルードする必要があります。 -
modules/cudev/include/opencv2/cudev/common.hpp
に#include <cuda_fp16.h>
を追加します。
-DCUDA_ARCH_BIN オプションについて
- NVIDIA の GPU は型番によって Compute Capability (CC) が設定されています。
- Jetson Nano は Maxwell アーキテクチャで、CC は 5.3
- Jetson TX2 は Pascal アーキテクチャで、CC は 6.2
- Jetson Xavier は Volta アーキテクチャで、CC は 7.2
- CUDA を有効にして OpenCV をビルドする際、本来はビルド可能な CC が自動で複数設定されますが、OpenCV 3.2.0 だと Jetson 向けのいずれも設定されません。
- Jetson 向けには cmake のオプション
-DCUDA_ARCH_BIN
で CC を指定する必要があります
-DENABLE_PRECOMPILED_HEADERS オプションについて
- ビルド時間短縮のため、コンパイル済みのヘッダーを利用するオプションです。
-
fatal error: stdlib.h: No such file or directory
というエラーになることがあります。その場合、このオプションを OFF にします。
既存のパッケージのアンインストール
- 既存の OpenCV とそれに依存するパッケージ (cv_bridge等) をアンインストールします。関連パッケージもアンインストールされてしまうので十分注意してください。(既存の OpenCV と共存させる方法は未調査です)
$ sudo apt purge ros-melodic-cv-bridge $ sudo apt purge libopencv*
- アンインストールされたパッケージのソースを ~/catkin_ws にクローンしてビルドします。
$ cd ~/catkin_ws/src $ git clone -b melodic https://github.com/ros-perception/vision_opencv.git $ git clone https://github.com/ros-visualization/rqt_image_view.git
参考
- Installation in Linux
- OpenCV configuration options reference
- REP3 Target Platforms
- CMake Error: Variables are set to NOTFOUND
- Error compiling OpenCV, fatal error: stdlib.h: No such file or directory
- NVIDIA ON-DEMAND/Your GPU Compute Capability
- Jetson XavierでOpenCV 4.0 + CUDAをビルドすると、Xavierで実行できないプログラムが出来上がる
Discussion