Installer OpenCV + CUDA sur Windows

Présentation


Cet article se concentrera sur l'assemblage et l'installation d' OpenCV 4 pour C / C ++ , Python 2 et Python 3 à partir de fichiers source avec des modules CUDA 10 supplémentaires sur Windows .

J'ai essayé d'inclure ici toutes les subtilités et nuances que vous pourriez rencontrer lors de l'installation, et dont elles ne sont pas écrites dans le manuel officiel .


L'ensemble a été testé pour:

  • Windows 8.1 + Visual Studio 2017 + Python 2/3 + CUDA 10.0 + GeForce 840m
  • Windows 10 + Visual Studio 2019 + Python 2/3 + CUDA 10.0 + GeForce GTX 1060

Attention! La version ne fonctionnera pas pour la version OpenCV 4.0.1 et / ou CUDA en dessous de la version 10. CUDA 9 et inférieur est pris en charge par OpenCV 3 .

Ce que vous devez installer


Les outils suivants ont été utilisés dans mon assemblage:

  1. CMake 3.15
  2. Outils MS Visual Studio 2019 64 bits + CMake C ++ pour Windows
  3. Python 3.7.3 64 bits + NumPy 64 bits
  4. Python 2.7.16 64 bits + NumPy 64 bits
  5. CUDA 10.0
  6. CuDNN 7.6.2
  7. OpenCV 4.1.1 et OpenCV-contrib-4.1.1

L'installation


Puisque l'installation se fait via les commandes de la console, vous devez effectuer toutes les étapes avec soin et précision. Si nécessaire, modifiez également les chemins d'installation en fonction des vÎtres.
Vous devez d'abord installer le logiciel requis et Visual Studio doit ĂȘtre installĂ© avant CUDA :


AprÚs avoir installé tous les composants, assurez-vous que les chemins d'accÚs pour CMake, Visual Studio, Python, CUDA, CuDNN sont écrits dans les variables PATH, PYTHONPATH, CUDA_PATH et cudnn, respectivement.

Ensuite, téléchargez les archives sources opencv-4.1.1 et opencv-contrib-4.1.1 à l'emplacement souhaité (dans mon cas, c'est C: \ OpenCV \ ).

git clone https://github.com/opencv/opencv.git -b "4.1.1" git clone https://github.com/opencv/opencv_contrib.git -b "4.1.1" 



Créez le build / dossier dans opencv-4.1.1.



Ensuite, nous générons des fichiers d'assemblage à l'aide de cmake . Nous utiliserons la version console de cmake , car cmake-gui confond les types de certaines variables (par exemple, OPENCV_PYTHON3_VERSION ) et, par conséquent, génÚre des fichiers incorrectement.

Nous ouvrons la console le long du chemin C: \ OpenCV \ et enregistrons les variables.

 set "opencvSource=opencv-4.1.1" set "opencvExtraModules=opencv_contrib-4.1.1/modules" set "opencvBuild=%opencvSource%\build" set "compiler=Visual Studio 16 2019" set "buildType=Release" 

Remarque Pour Visual Studio 2017, le générateur est écrit comme " Visual Studio 15 2017 Win64 " et sans l'indicateur -A .

Vous pouvez Ă©galement spĂ©cifier explicitement les bibliothĂšques Python pour python 2 et python 3 au cas oĂč le collecteur ne pourrait pas les trouver automatiquement.

 set "python2_executable=C:/Python27/python.exe" set "python2_include_dir=C:/Python27/include" set "python2_library=C:/Python27/libs/python27.lib" set "python2_numpy_include_dirs=C:/Python27/Lib/site-packages/numpy/core/include" set "python2_packages_path=C:/Python27/Lib/site-packages" set "python3_executable=C:/Users/root/Anaconda3/python.exe" set "python3_include_dir=C:/Users/root/Anaconda3/include" set "python3_library=C:/Users/root/Anaconda3/libs/python37.lib" set "python3_numpy_include_dirs=C:/Users/root/Anaconda3/lib/site-packages/numpy/core/include" set "python3_packages_path=C:/Users/root/Anaconda3/Lib/site-packages" 

Remarque Veuillez noter que la bibliothĂšque NumPy doit avoir la mĂȘme profondeur de bits que OpenCV . VĂ©rifier cela est facile:
 import numpy.distutils.system_info as sysinfo print(sysinfo.platform_bits) 

GĂ©nĂ©rez des fichiers d'assemblage Ă  l'aide de la commande longue ci-dessous. En cas d'Ă©chec de la gĂ©nĂ©ration ou d'erreurs aprĂšs l'exĂ©cution de la commande, une gĂ©nĂ©ration rĂ©pĂ©tĂ©e doit ĂȘtre effectuĂ©e en nettoyant tous les fichiers dans build / et .cache / .

 cmake ^ -B"%opencvBuild%/" ^ -H"%opencvSource%/" ^ -G"%compiler%" ^ -Ax64 ^ -DCMAKE_BUILD_TYPE=%buildType% ^ -DBUILD_opencv_world=ON ^ -DINSTALL_TESTS=OFF ^ -DINSTALL_C_EXAMPLES=OFF ^ -DBUILD_EXAMPLES=OFF ^ -DOPENCV_EXTRA_MODULES_PATH="%opencvExtraModules%/" ^ -DBUILD_PROTOBUF=ON ^ -DBUILD_opencv_python_bindings_generator=ON ^ -DWITH_CUDA=ON ^ -DCUDA_FAST_MATH=ON ^ -DWITH_CUBLAS=ON ^ -DCUDA_ARCH_PTX=7.5 ^ -DBUILD_opencv_python2=ON ^ -DPYTHON2_EXECUTABLE="%python2_executable%" ^ -DOPENCV_PYTHON2_VERSION=2.7.16 ^ -DPYTHON2_INCLUDE_DIR="%python2_include_dir%" ^ -DPYTHON2_LIBRARY="%python2_library%" ^ -DPYTHON2_NUMPY_INCLUDE_DIRS="%python2_numpy_include_dirs%" ^ -DPYTHON2_PACKAGES_PATH="%python2_packages_path%" ^ -DBUILD_opencv_python3=ON ^ -DPYTHON3_EXECUTABLE="%python3_executable%" ^ -DOPENCV_PYTHON3_VERSION=3.7.3 ^ -DPYTHON3_INCLUDE_DIR="%python3_include_dir%" ^ -DPYTHON3_LIBRARY="%python3_library%" ^ -DPYTHON3_NUMPY_INCLUDE_DIRS="%python3_numpy_include_dirs%" ^ -DPYTHON3_PACKAGES_PATH="%python3_packages_path%" 

La signification de certains drapeaux
  • BUILD_opencv_world - un module optionnel contenant des copies de toutes les bibliothĂšques sĂ©lectionnĂ©es lors de l'installation. Ceci est utile lors du dĂ©veloppement en C ++ , car au lieu de connecter un groupe de dĂ©pendances opencv , vous pouvez connecter une dĂ©pendance opencv_world411.lib au projet
  • INSTALL_EXAMPLES / INSTALL_TESTS - installation d'exemples / tests de code opencv
  • CUDA_FAST_MATH, WITH_CUBLAS - modules supplĂ©mentaires pour CUDA , conçus pour accĂ©lĂ©rer les calculs
  • CUDA_ARCH_PTX - version des instructions PTX pour amĂ©liorer les performances de calcul
  • OPENCV_EXTRA_MODULES_PATH - chemin vers des modules supplĂ©mentaires depuis opencv-contrib (requis pour CUDA )
  • BUILD_PROTOBUF - pour que certains modules opencv fonctionnent, Protobuf est requis (le collecteur opencv dĂ©finira BUILD_PROTOBUF = ON de toute façon )


AprÚs environ 10 minutes, les informations d'assemblage et les lignes finales « Configuration terminée » et « Génération terminée » devraient apparaßtre dans la console. Nous vérifions toutes les informations, en particulier les sections de NVIDIA CUDA, Python 2, Python 3 .



Ensuite, nous collectons la solution. La construction peut prendre plusieurs heures, selon votre processeur et la version de Visual Studio .

 cmake --build %opencvBuild% --target ALL_BUILD --config Release 

Installez la solution.

 cmake --build %opencvBuild% --target INSTALL --config Release 

Une fois l'installation terminée , créez la variable systÚme OPENCV_DIR avec la valeur C: \ OpenCV \ opencv-4.1.1 \ build \ install \ x64 \ vc15 \ bin et ajoutez-la également à PATH .

Test


Nous testerons la fonctionnalité d' OpenCV avec le module CUDA en utilisant un exemple simple de multiplication matricielle.

Connectez OpenCV Ă  un projet Visual Studio
  1. Définissez le type de build release / x64 (pour Debug, créez OpenCV avec le drapeau Debug)
  2. PropriĂ©tĂ©s du projet → C / C ++ → GĂ©nĂ©ral → Ajoutez la ligne «C: \ OpenCV \ opencv-4.1.1 \ build \ install \ include» aux rĂ©pertoires d'inclusion supplĂ©mentaires
  3. PropriĂ©tĂ©s du projet → Éditeur de liens → GĂ©nĂ©ral → Ajoutez la ligne «C: \ OpenCV \ opencv-4.1.1 \ build \ install \ x64 \ vc16 \ lib» aux rĂ©pertoires de bibliothĂšque supplĂ©mentaires
  4. PropriĂ©tĂ©s du projet → Éditeur de liens → GĂ©nĂ©ral → Ajouter «; opencv_world411.lib» («; opencv_world411d.lib» pour le dĂ©bogage) Ă  la fin des dĂ©pendances supplĂ©mentaires


Exemple Python 3

 import numpy as np import cv2 as cv import time rand = np.random.random((1024, 1024)).astype(np.float32) h_array1 = np.stack([rand, rand],axis=2) h_array2 = h_array1 d_array1 = cv.cuda_GpuMat() d_array2 = cv.cuda_GpuMat() d_array1.upload(h_array1) d_array2.upload(h_array2) start = time.time() cv.cuda.gemm(d_array1, d_array2, 1, None, 0, None, 1) end = time.time() print("Time elapsed:", end - start, "sec") 

Sortie console

 Time elapsed: 0.3130002021789551 

Exemple C ++

 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/cudaarithm.hpp> using namespace std; using namespace cv; using namespace cv::cuda; int main() { Mat h_array1 = Mat::ones(1024, 1024, CV_32FC2); Mat h_array2 = Mat::ones(1024, 1024, CV_32FC2); Mat h_array3 = Mat::zeros(1024, 1024, CV_32FC2); Mat h_result; GpuMat d_array1, d_array2, d_array3, d_result; d_array1.upload(h_array1); d_array2.upload(h_array2); const clock_t begin_time = clock(); cuda::gemm(d_array1, d_array2, 1.0, d_array3, 0.0, d_result); cout << "Time elapsed: " << (float(clock() - begin_time) / CLOCKS_PER_SEC) << " sec" << endl; d_result.download(h_result); return 0; } 

Sortie console

 Time elapsed: 0.354 

Effacer


Pour supprimer OpenCV , vous devez exécuter la commande.

 cmake --build %opencvBuild% --target uninstall --config Release 

et supprimez la variable systĂšme OPENCV_DIR et supprimez le chemin vers OpenCV de PATH .

Conclusion


Dans cet article, nous avons examinĂ© l'installation d' OpenCV 4 pour Windows 10 . Cet algorithme a Ă©tĂ© testĂ© sur Windows 8.1 et Windows 10 , mais, en thĂ©orie, il peut ĂȘtre construit sur Windows 7 . Pour plus d'informations, consultez la liste des sources ci-dessous.

PS Enfin, nous rassemblerons toutes les commandes d'installation dans un seul fichier .bat pour ceux qui souhaitent automatiser l'installation.

install_opencv411.bat
 cd C:\OpenCV git clone https://github.com/opencv/opencv_contrib.git -b "4.1.1" git clone https://github.com/opencv/opencv.git -b "4.1.1" ren opencv opencv-4.1.1 ren opencv_contrib-4.1.1 set "opencvSource=opencv-4.1.1" set "opencvExtraModules=opencv_contrib-4.1.1/modules" set "opencvBuild=%opencvSource%\build" set "compiler=Visual Studio 16 2019" set "buildType=Release" set "python2_executable=C:/Python27/python.exe" set "python2_include_dir=C:/Python27/include" set "python2_library=C:/Python27/libs/python27.lib" set "python2_numpy_include_dirs=C:/Python27/Lib/site-packages/numpy/core/include" set "python2_packages_path=C:/Python27/Lib/site-packages" set "python3_executable=C:/Users/root/Anaconda3/python.exe" set "python3_include_dir=C:/Users/root/Anaconda3/include" set "python3_library=C:/Users/root/Anaconda3/libs/python37.lib" set "python3_numpy_include_dirs=C:/Users/root/Anaconda3/lib/site-packages/numpy/core/include" set "python3_packages_path=C:/Users/root/Anaconda3/Lib/site-packages" cmake ^ -B"%opencvBuild%/" ^ -H"%opencvSource%/" ^ -G"%compiler%" ^ -Ax64 ^ -DCMAKE_BUILD_TYPE=%buildType% ^ -DBUILD_opencv_world=ON ^ -DINSTALL_TESTS=OFF ^ -DINSTALL_C_EXAMPLES=OFF ^ -DBUILD_EXAMPLES=OFF ^ -DOPENCV_EXTRA_MODULES_PATH="%opencvExtraModules%/" ^ -DBUILD_PROTOBUF=ON ^ -DBUILD_opencv_python_bindings_generator=ON ^ -DWITH_CUDA=ON ^ -DCUDA_FAST_MATH=ON ^ -DWITH_CUBLAS=ON ^ -DCUDA_ARCH_PTX=7.5 ^ -DBUILD_opencv_python2=ON ^ -DPYTHON2_EXECUTABLE="%python2_executable%" ^ -DOPENCV_PYTHON2_VERSION=2.7.16 ^ -DPYTHON2_INCLUDE_DIR="%python2_include_dir%" ^ -DPYTHON2_LIBRARY="%python2_library%" ^ -DPYTHON2_NUMPY_INCLUDE_DIRS="%python2_numpy_include_dirs%" ^ -DPYTHON2_PACKAGES_PATH="%python2_packages_path%" ^ -DBUILD_opencv_python3=ON ^ -DPYTHON3_EXECUTABLE="%python3_executable%" ^ -DOPENCV_PYTHON3_VERSION=3.7.3 ^ -DPYTHON3_INCLUDE_DIR="%python3_include_dir%" ^ -DPYTHON3_LIBRARY="%python3_library%" ^ -DPYTHON3_NUMPY_INCLUDE_DIRS="%python3_numpy_include_dirs%" ^ -DPYTHON3_PACKAGES_PATH="%python3_packages_path%" cmake --build %opencvBuild% --target ALL_BUILD --config Release cmake --build %opencvBuild% --target INSTALL --config Release 


Liste des sources


  1. docs.opencv.org/4.1.1/d3/d52/tutorial_windows_install.html
  2. www.learnopencv.com/install-opencv-4-on-windows
  3. jamesbowley.co.uk/build-opencv-4-0-0-with-cuda-10-0-and-intel-mkl-tbb-in-windows
  4. lightbuzz.com/opencv-cuda
  5. Chapitre «Créer des bibliothÚques à partir de la source» du livre Hands-on GPU-Accelerated Computer Vision with OpenCV and CUDA

Source: https://habr.com/ru/post/fr464015/


All Articles