Instalar OpenCV + CUDA en Windows

Introduccion


Este artículo se centrará en el ensamblaje e instalación de OpenCV 4 para C / C ++ , Python 2 y Python 3 a partir de archivos fuente con módulos CUDA 10 adicionales en Windows .

Traté de incluir aquí todas las sutilezas y matices que puede encontrar durante la instalación, y sobre los cuales no está escrito en el manual oficial .


La asamblea fue probada para:

  • 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

Atencion La compilación no funcionará para la versión OpenCV 4.0.1 y / o CUDA por debajo de la versión 10. CUDA 9 y versiones posteriores son compatibles con OpenCV 3 .

Lo que necesitas instalar


Las siguientes herramientas se utilizaron en mi ensamblaje:

  1. CMake 3.15
  2. Herramientas de MS Visual Studio 2019 de 64 bits + CMake C ++ para 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 y OpenCV-contrib-4.1.1

Instalación


Dado que la instalación se realiza a través de comandos de la consola, debe llevar a cabo todos los pasos con cuidado y precisión. Además, si es necesario, cambie las rutas de instalación a las suyas.
Primero debe instalar el software requerido, y Visual Studio debe instalarse antes de CUDA :


Después de instalar todos los componentes, asegúrese de que las rutas para CMake, Visual Studio, Python, CUDA, CuDNN estén escritas en las variables PATH, PYTHONPATH, CUDA_PATH y cudnn, respectivamente.

A continuación, descargue los archivos fuente opencv-4.1.1 y opencv-contrib-4.1.1 en la ubicación deseada (en mi caso, esto es 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" 



Cree la compilación / carpeta dentro de opencv-4.1.1.



A continuación, generamos archivos de ensamblaje utilizando cmake . Utilizaremos la versión de consola de cmake , ya que cmake-gui confunde los tipos de algunas variables (por ejemplo, OPENCV_PYTHON3_VERSION ) y, como resultado, genera archivos incorrectamente.

Abrimos la consola a lo largo de la ruta C: \ OpenCV \ y registramos las 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" 

Nota Para Visual Studio 2017, el generador está escrito como " Visual Studio 15 2017 Win64 " y sin la marca -A .

También puede especificar explícitamente las bibliotecas de Python para python 2 y python 3 en caso de que el recopilador no pueda encontrarlas automáticamente.

 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" 

Nota Tenga en cuenta que la biblioteca NumPy debe tener la misma profundidad de bits que OpenCV . Verificar esto es fácil:
 import numpy.distutils.system_info as sysinfo print(sysinfo.platform_bits) 

Genere archivos de ensamblaje utilizando el comando largo a continuación. En caso de generación o errores sin éxito después de ejecutar el comando, la generación repetida debe realizarse limpiando todos los archivos en build / y .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%" 

El significado de algunas banderas
  • BUILD_opencv_world: un módulo opcional que contiene copias de todas las bibliotecas seleccionadas durante la instalación. Esto es útil cuando se desarrolla en C ++ , porque en lugar de conectar un montón de dependencias opencv , puede conectar una dependencia opencv_world411.lib al proyecto
  • INSTALL_EXAMPLES / INSTALL_TESTS - instalación de ejemplos / pruebas de código opencv
  • CUDA_FAST_MATH, WITH_CUBLAS: módulos adicionales para CUDA , diseñados para acelerar los cálculos
  • CUDA_ARCH_PTX: versión de instrucciones PTX para mejorar el rendimiento informático
  • OPENCV_EXTRA_MODULES_PATH - ruta a módulos adicionales desde opencv-contrib (requerido para CUDA )
  • BUILD_PROTOBUF: para que algunos módulos opencv funcionen, se requiere Protobuf (el recopilador opencv establecerá BUILD_PROTOBUF = ON de todos modos )


Después de unos 10 minutos, la información de ensamblaje y las líneas finales " Configuración realizada " y " Generación realizada " deberían aparecer en la consola. Verificamos toda la información, especialmente las secciones de NVIDIA CUDA, Python 2, Python 3 .



A continuación, recogemos la solución. La construcción puede tardar varias horas, según el procesador y la versión de Visual Studio .

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

Instala la solución.

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

Después de una instalación exitosa, cree la variable de sistema OPENCV_DIR con el valor C: \ OpenCV \ opencv-4.1.1 \ build \ install \ x64 \ vc15 \ bin y también agréguela a PATH .

Prueba


Probaremos la funcionalidad de OpenCV con el módulo CUDA usando un ejemplo simple de multiplicación de matrices.

Conecte OpenCV a un proyecto de Visual Studio
  1. Establezca el tipo de compilación release / x64 (para Depurar, compile OpenCV con el indicador de depuración)
  2. Propiedades del proyecto → C / C ++ → General → Agregue la línea “C: \ OpenCV \ opencv-4.1.1 \ build \ install \ include” a los directorios de inclusión adicionales
  3. Propiedades del proyecto → Enlace → General → Agregue la línea “C: \ OpenCV \ opencv-4.1.1 \ build \ install \ x64 \ vc16 \ lib” a Directorios de bibliotecas adicionales
  4. Propiedades del proyecto → Vinculador → General → Agregar "; opencv_world411.lib" ("; opencv_world411d.lib" para depuración) al final de las dependencias adicionales


Ejemplo de 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") 

Salida de la consola

 Time elapsed: 0.3130002021789551 

Ejemplo de 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; } 

Salida de la consola

 Time elapsed: 0.354 

Eliminar


Para eliminar OpenCV , debe ejecutar el comando.

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

y elimine la variable de sistema OPENCV_DIR y elimine la ruta a OpenCV de PATH .

Conclusión


En este artículo, examinamos la instalación de OpenCV 4 para Windows 10 . Este algoritmo se probó en Windows 8.1 y Windows 10 , pero, en teoría, se puede construir en Windows 7 . Para obtener más información, consulte la lista de fuentes a continuación.

PD Finalmente, incluiremos todos los comandos de instalación en un archivo .bat para aquellos que quieran automatizar la instalación.

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 


Lista de fuentes


  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. Capítulo "Creación de bibliotecas desde la fuente" del libro Visión práctica acelerada por GPU con OpenCV y CUDA

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


All Articles