【OpenCV】OpenCV 4.3.0(CUDA 10.1)をWindowsでビルドしてPythonから使う方法~ビルド編~

Windows環境でGPUありのOpenCVをPythonで使用できるように環境を構築します。今回は第3回目の記事で、内容としてはCMakeでのビルドとAnacondaの仮想環境にもソースビルドしたOpenCVを適用したいと思います。下記フローの3~5にあたります。

  1. ソフトウェア・ライブラリの事前準備
  2. CMakeのための事前準備
  3. CMakeによるOpenCVビルド
  4. PythonでのGPU有効でのOpenCV動作確認
  5. Anacondaの仮想環境でソースビルドしたOpenCVの使用方法

第1回目の記事はこちらです。【OpenCV】OpenCV 4.3.0(CUDA 10.1)をWindowsでビルドしてPythonから使う方法~導入編~

第2回目の記事はこちらです。【OpenCV】OpenCV 4.3.0(CUDA 10.1)をWindowsでビルドしてPythonから使う方法~事前準備編~

第3回目の記事はこちらです。【OpenCV】OpenCV 4.3.0(CUDA 10.1)をWindowsでビルドしてPythonから使う方法~ビルド編~

3. CMakeによるOpenCVビルド

Python3のCMakeビルドの確認

「3. CMakeによるOpenCVビルド」では、第2回でメモしたPython3の実行場所と、Compute Capabilityのバージョンを使用します。まずは、Python3の実行場所からCMakeでビルドに必要なライブラリなどが本当にあるかを確認します。

C:/Program Files/Python37/python.exeが実行場所の場合、CMakeのビルドでは以下のようになります。事前にPythonのライブラリ(.exe, .lib, Numpyライブラリ)が本当に存在するのかはエクスプローラーで確認しておきましょう。ファイルやライブラリ自体が存在しなければビルドは成功しませんのでご注意ください。

  • -DPYTHON_DEFAULT_EXECUTABLE=C:/Program Files/Python37/python.exe
  • -DPYTHON3_EXECUTABLE=C:/Program Files/Python37/python.exe
  • -DPYTHON3_INCLUDE_DIR=C:/Program Files/Python37/include
  • -DPYTHON3_LIBRARY=C:/Program Files/Python37/libs/python37.lib
  • -DPYTHON3_NUMPY_INCLUDE_DIRS=C:/Program Files/python37/lib/site-packages/numpy/core/include

CUDAのCMakeビルドの確認

続いてCUDAのビルドに移りたいと思います。第2回でメモしたCompute Capabilityが7.5であった場合、CMakeのビルドでは以下のようになります。Compute Capabilityのバージョンを指定しない場合でも、ビルドは成功しますが、全てのバージョンでビルドするので自分の環境でビルドに3時間かかりました。バージョンを指定した場合は30分までビルド時間を短縮できたので必ず指定しておきましょう!

  • -DWITH_CUDA=ON ^
  • -DCUDA_FAST_MATH=ON ^
  • -DWITH_CUBLAS=ON ^
  • -DWITH_CUDNN=ON ^
  • -DWITH_NVCUVID=ON ^
  • -DOPENCV_DNN_CUDA=ON ^
  • -DCUDA_ARCH_PTX=7.5 ^
  • -DCUDA_ARCH_BIN=7.5 ^

OpenCVのインストール

①OpenCVのインストール

続いてOpenCVをGithubからインストールしたいと思います。Gitのインストールが必要なので、インストールできていない場合はインストールお願いします。

Windowsでコマンドプロンプトを管理者として実行します。(エラー出る可能性もあるらしいので、Visual Studio 2019のx64 Native Tools コマンドプロンプト (Command Prompt)を管理者で実行してください。)

ここから「3. CMakeによるOpenCVビルド」の終わりまでほとんどOpenCV 4.3.0 (最新版) のビルドとインストール,CUDA 対応可能(ソースコードを使用)(Windows 上)を参考にしています。

②ディレクトリの削除

管理者で開いたコマンドプロンプトで作業していきます。下記コマンドをコマンドプロンプトで入力してください。

$ mkdir C:\tools
$ cd C:\tools
$ rmdir /s /q opencv
$ rmdir /s /q opencv_contrib

③OpenCV と OpenCV contrib のソースコードをGithubからダウンロード

管理者で開いたコマンドプロンプトで作業していきます。下記コマンドをコマンドプロンプトで入力してください。

$ cd C:\tools
$ git clone -b 4.3.0 https://github.com/opencv/opencv.git
$ git clone -b 4.3.0 https://github.com/opencv/opencv_contrib.git

以上でOpenCVのインストールは完了です。続いてCMakeのビルドを行います。

CMakeでのGPUありOpenCVのPythonビルド

①CMakeでのビルド

管理者でコマンドプロンプトで下記のコマンドを順に入力してください。Pythonのバージョン・CUDAのCompute Capabilityのバージョン・Visual Studioのバージョンによってビルドの変数が異なります。変数の部分は太字にしています。

$ cd c:\tools
$ cd opencv
$ rmdir /s /q build
$ mkdir build
$ cd build
$ del CMakeCache.txt
$ cmake -G "Visual Studio 16 2019" -A x64 -T host=x64 ^
-DCMAKE_BUILD_TYPE=RELEASE ^
-DWITH_CUDA=ON ^
-DOPENCV_EXTRA_MODULES_PATH=C:/tools/opencv_contrib/modules ^
-DINSTALL_TESTS=ON ^
-DINSTALL_C_EXAMPLES=ON ^
-DWITH_PYTHON=ON ^
-DINSTALL_PYTHON_EXAMPLES=ON ^
-DBUILD_opencv_python2=OFF ^
-DPYTHON_DEFAULT_EXECUTABLE="C:/Program Files/Python37/python.exe" ^
-DBUILD_opencv_python3=ON ^
-DPYTHON3_EXECUTABLE="C:/Program Files/Python37/python.exe" ^
-DPYTHON3_INCLUDE_DIR="C:/Program Files/Python37/include" ^
-DPYTHON3_LIBRARY="C:/Program Files/Python37/libs/python37.lib" ^
-DPYTHON3_NUMPY_INCLUDE_DIRS="C:/Program Files/Python37/lib/site-packages/numpy/core/include" ^
-DBUILD_EXAMPLES=ON ^
-DWITH_OPENGL=ON ^
-DOPENCV_ENABLE_NONFREE=OFF ^
-DWITH_CUDA=ON ^
-DCUDA_FAST_MATH=ON ^
-DWITH_CUBLAS=ON ^
-DWITH_CUDNN=ON ^
-DWITH_NVCUVID=ON ^
-DOPENCV_DNN_CUDA=ON ^
-DCUDA_ARCH_PTX=7.5 ^
-DCUDA_ARCH_BIN=7.5 ^
..

ソースコードからビルドし、インストールします。下記コマンドをコマンドプロンプトで入力してください。

$ cmake --build . --config RELEASE --target INSTALL

②環境変数設定

最後に、Windowsのシステム環境変数Pathの設定を行います。コントロールパネルから環境変数を設定してください。

C:\tools\opencv\build\bin\release

4. PythonでのGPU有効でのOpenCV動作確認

①cv2の確認

先ほどのビルドでOpenCV(cv2)がインストールできたかどうか確認します。Python3の場所は、第2回で各自メモした場所に変更してください。下記コマンドをコマンドプロンプトで入力してください。

$ dir "C:\Program Files\Python37\lib\site-packages\cv2"

②PythonのOpenCVの確認

バージョン4.3がインストールされていれば成功です。下記コマンドをコマンドプロンプトで入力してください。

$ python -c "import cv2; print( cv2.__version__ )"
4.3.0

ここまでで、仮想環境ではなくGPUありでPythonでOpenCVのビルドが完了しています。

③GPU使用の確認

GPUありでPythonでOpenCVが動作しているか確認したいと思います。適当なフォルダを作成し、sample.pngという名前の画像を作成してください。下記のtest.pyというPythonファイルを作成し、画像ファイルと同じ階層のディレクトリで実行してください。下記はPythonファイルなので、コピペしてください。

import cv2
import sys
import time

### VALUES
NUM_REPEAT = 10000

img_src = cv2.imread("sample.png")

### 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]")

### 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()
img_gpu_src.upload(img_src)
time_start = time.time()
for i in range (NUM_REPEAT):
    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]")

下記コマンドを作成したフォルダでコマンドプロンプトで入力してください。

$ python test.py

CPUとGPUでの実行速度が出力されると思います。

5. Anacondaの仮想環境でソースビルドしたOpenCVの使用方法

Anacondaはanaconda3フォルダの直下のenvsの仮想環境の下にインストールしたライブラリを保存してます。なので、本体にインストールしたcv2ライブラリをAnacondaの仮想環境のライブラリにコピーするとAnacondaの仮想環境で使用できます。

まずはanaconda3の場所を確認しましょう。ユーザーネームがhogeだった場合で考えてみます(保存場所は各自異なります)。下記コマンドをコマンドプロンプトで入力してください。

$ where anaconda
C:\Users\hoge\anaconda3\Scripts\anaconda.exe

Python3の場所は、第2回で各自メモした場所に変更し、コピー先である仮想環境にcv2ライブラリをコピーしたいと思います。既にPython3.7系で仮想環境が作成されている想定です。今回、3.7系でcv2をインストールしているため、仮想環境も3.7系に合わせていますが、他のバージョンでもインストールしたバージョンと同様であれば問題ないかと思います。仮想環境名はopencv-gpuという名前で考えています。

下記コマンドをコマンドプロンプトで入力してください。

$ conda create --name opencv-gpu python=3.7 -y
$ robocopy "C:\Program Files\Python37\lib\site-packages\cv2" "C:\Users\hoge\anaconda3\envs\opencv-gpu\Lib\site-packages"

仮想環境をアクティベイトします。

$ C:\Users\hoge\anaconda3\Scripts\activate.bat

先ほどと同様にcv2が使用できるか確認します。下記コマンドをコマンドプロンプトで入力してください。

4.3のOpenCVが確認できれば完了です。

$ conda activate opencv-gpu
(opencv-gpu)$ python -c "import cv2; print( cv2.__version__ )"
4.3.0

まとめ

全3回でのビルド紹介はいかがだったでしょうか。やはりWindowsでの環境構築は大変だと思いました。

Linux環境は最強です。

第1回目の記事はこちらです。【OpenCV】OpenCV 4.3.0(CUDA 10.1)をWindowsでビルドしてPythonから使う方法~導入編~

第2回目の記事はこちらです。【OpenCV】OpenCV 4.3.0(CUDA 10.1)をWindowsでビルドしてPythonから使う方法~事前準備編~

第3回目の記事はこちらです。【OpenCV】OpenCV 4.3.0(CUDA 10.1)をWindowsでビルドしてPythonから使う方法~ビルド編~

資料

参考資料です。

OpenCV 4.3.0 (最新版) のビルドとインストール,CUDA 対応可能(ソースコードを使用)(Windows 上)

OpenCVをソースからビルドしてanacondaにインストール

【Anaconda-python3.5】Ubuntu16.04でcv2.VideoCapture()が使えないとき

OpenCVの画像処理をGPU(CUDA)で高速化する

Installing OpenCV for Conda Virtual Environments

OpenCV 4.0.1(CUDA 10.0, VTK 8.2.0, Qt5.12.2)をWindowsでビルドしてPythonから使う方法

python-opencv-cuda