Ubuntu16環境でCUDAをPythonのOpenCVモジュールから使えるようにする

ちょっと色々あって、Ubuntu16環境でCUDAをPythonのOpenCVから使えるようにする必要が生じました。 GPU使って画像のディープラーニングやってる人なら何のことかわかると思います。

基本的には、こちらのサイトがとても参考になりました。ほとんどこれに沿って作業したらできました。ありがとうございます。

qiita.com

ただ、当方の環境はUbuntu16でしたので、必要なパッケージの名称が少し違っていたりして、そのあたりの調整が必要でした。 それから、コンパイルのフラグもちょっと変更する必要がありまして、以下のようにしました。

CC=gcc-5 CXX=g++-5 cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
 -D OPENCV_GENERATE_PKGCONFIG=ON -D BUILD_opencv_apps=ON -D BUILD_opencv_calib3d=ON -D BUILD_opencv_core=ON \
 -D BUILD_opencv_cudaarithm=ON -D BUILD_opencv_cudabgsegm=ON -D BUILD_opencv_cudacodec=ON \
 -D BUILD_opencv_cudafeatures2d=ON -D BUILD_opencv_cudafilters=ON -D BUILD_opencv_cudaimgproc=ON \
 -D BUILD_opencv_cudalegacy=ON -D BUILD_opencv_cudaobjdetect=ON -D BUILD_opencv_cudaoptflow=ON \
 -D BUILD_opencv_cudastereo=ON -D BUILD_opencv_cudawarping=ON -D BUILD_opencv_cudev=ON \
 -D BUILD_opencv_features2d=ON -D BUILD_opencv_flann=ON -D BUILD_opencv_highgui=ON -D BUILD_opencv_imgcodecs=ON \
 -D BUILD_opencv_imgproc=ON -D BUILD_opencv_ml=ON -D BUILD_opencv_objdetect=ON \
 -D BUILD_opencv_photo=ON -D BUILD_opencv_stitching=ON -D BUILD_opencv_superres=ON \
 -D BUILD_opencv_ts=ON -D BUILD_opencv_video=ON -D BUILD_opencv_videoio=ON -D BUILD_opencv_videostab=ON \
 -D WITH_1394=ON -D WITH_CUBLAS=ON -D WITH_CUDA=ON -D WITH_CUFFT=ON -D WITH_EIGEN=ON -D WITH_FFMPEG=ON \
 -D WITH_GDAL=OFF -D WITH_GPHOTO2=ON -D WITH_GIGEAPI=ON -D WITH_GSTREAMER=ON -D WITH_GTK=ON \
 -D WITH_INTELPERC=OFF -D WITH_IPP=ON -D WITH_IPP_A=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LIBV4L=ON \
 -D WITH_OPENCL=ON -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF \
 -D WITH_OPENEXR=ON -D WITH_OPENGL=ON -D WITH_OPENMP=OFF -D WITH_OPENNI=OFF -D WITH_PNG=ON \
 -D WITH_PTHREADS_PF=OFF -D WITH_PVAPI=ON -D WITH_TBB=ON -D WITH_TIFF=ON \
 -D WITH_UNICAP=OFF -D WITH_V4L=ON -D WITH_VTK=ON -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D WITH_XINE=OFF \
 -D CUDA_NVCC_FLAGS=--expt-relaxed-constexpr -D CUDA_FAST_MATH=ON -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
 -D CUDA_HOST_COMPILER=/usr/bin/gcc-5 -D PYTHON_DEFAULT_EXECUTABLE=python3  ..

それと、ちょっとハマったのが、pyenvやらなんやらでPython環境が色々あって、どれがターゲットになって コンパイルやインストールが行われるのかわからなくなってしまう、ということがありまして… make install 時に sudoを使うと、root環境でのPython環境になってしまって、pyenvの環境にインストールできないが これはどうしたら…といったあたりがハマりどころでした。

結局、今回は、Ubuntu16のデフォルトのPython向けにグローバル環境でインストールするという 割り切りをすることでなんとか使えるようにはなりましたが、振り返ってみると、opencvのインストールディレクトリ をユーザローカル環境に指定すれば、make install で sudoをする必要はなくなるはずですので、そのフラグを コンパイル時につけておけばよいのでしょうね。次に機会があればそういう風にしてみたいと思います。