🙌

JetsonでROS Melodic向けにCUDAを有効にしたOpenCVをビルドした忘備録

2022/05/01に公開

はじめに

  • デフォルトの 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 を修正
  • 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 の一部を以下のように変更する必要があります

https://github.com/opencv/opencv/blob/6d4f66472e14b29b8e1623859cfebfdc67f677c3/cmake/FindCUDA.cmake#L790-L806

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 向けのいずれも設定されません。

https://github.com/opencv/opencv/blob/70bbf17b133496bd7d54d034b0f94bd869e0e810/cmake/OpenCVDetectCUDA.cmake#L64-L84

  • 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
    

参考

Discussion