Hace unos días, vi un tutorial sobre el uso de OpenCV para llamar a CUDA para acelerar la detección de objetivos y la detección de puntos clave en Bilibili. La velocidad de inferencia ha mejorado significativamente en comparación con Pytorch. Recientemente instalé un RTX4070, así que quería probarlo. . Como acabo de cambiar mi computadora y no tengo un entorno relevante, me encontré con algunos problemas durante el proceso de configuración, así que escribí este artículo récord.
Tabla de contenido
Configuracion basica
- Sistema: Windows11-22H2
- Tarjeta gráfica: RTX4070
- Controlador: CUDA-11.8, cudnn-windows-x86_64-8.9.2.26
- Software de compilación: CMake, Visual Studio 2019
- Versión: OpenCV 4.7.0, contribución 4.7.0
Condiciones previas
Instale Visual Studio2019, CMake, CUDA y cuDNN
- Dirección de descarga de Visual Studio
- Enlace de descarga de CMake
- Enlace de descarga CUDA
- Enlace de descarga de cuDNN
La instalación de VS y CMake es muy simple, como el software normal. Para descargar e instalar CUDA y cuDNN, consulte este artículo anterior.
Descargar y modificar OpenCV
descargar
DIRECCIÓN
Cabe señalar que las versiones del paquete principal OpenCV descargado y el paquete Contrib deben ser consistentes, yo usé la versión 4.7.0.
Después de la descarga, descomprima los dos paquetes en el mismo directorio para facilitar la búsqueda. Al mismo tiempo, para almacenar la biblioteca OpenCV compilada que admite CUDA, es necesario crear una nueva carpeta, aquí creé una carpeta llamada opencv_cuda_build en el mismo directorio, como se muestra en la Figura 1 .
Dado que el paquete compilado OpenCV descargado no tiene soporte relevante en los paquetes CUDA y contrib, se requiere la compilación del código fuente para generar una biblioteca OpenCV personalizada que admita Contrib y CUDA. Se requieren los siguientes pasos entre el código fuente OpenCV descargado y los archivos de la biblioteca que necesitamos para acelerar la inferencia:
- Utilice CMake para configurar el proyecto de código fuente OpenCV y generar los archivos de proyecto necesarios para la compilación VS.
- Utilice VS para compilar el código fuente en el archivo de biblioteca correspondiente
- Configure el archivo de biblioteca OpenCV generado por la compilación en VS antes de vincularlo a nuestra propia biblioteca compilada en el proyecto VS.
Cambio de configuracion
Debido a algunas razones objetivas, algunas bibliotecas necesarias para compilar OpenCV y contrib no se pueden descargar en China, por lo que se requieren algunas modificaciones en la configuración del código descargado para evitar fallas de compilación causadas por la falta de ciertas bibliotecas.
Específicamente, se trata principalmente de las bibliotecas ffmpeg, ippicv y contrib de OpenCV, xfeatures2d.
La solución es modificar las direcciones de descarga de estas bibliotecas y agregar agentes delante de las direcciones de descarga originales.
Por ejemplo, la dirección de descarga original en el archivo ippicv.cmake de ippicv
https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
Agregue una dirección de proxy al frente
https://ghproxy.com/
Simplemente modifícalo así
https://ghproxy.com/https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
Como se muestra en la Figura 2
, por analogía, el archivo de configuración ffmpeg es opencv\sources\3rdparty\ffmpeg\ffmpeg.cmake , y el archivo de configuración xfeatures2d está en opencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\xfeatures2d\ directorio cmake**.Download_boostdesc.cmake y download_vgg.cmake**, el archivo de configuración de face es F:\packages\opencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\face\ CMakeLists .
Compilar OpenCV
Se completa el trabajo preliminar y comenzamos a compilar el OpenCV que necesitamos.
1. Utilice CMake para configurar el proyecto de código fuente OpenCV
-
Abra el software CMake y seleccione la ruta del código fuente OpenCV que descomprimimos en la columna ¿ Dónde está el código fuente ? En mi caso, es F:/packages/opencv/sources. En la columna Dónde construir los archivos binarios , seleccione la carpeta opencv_cuda_build que creamos. Luego haga clic en Configurar para realizar la Configuración por primera vez, seleccione VS 2019 y x64 en el cuadro de diálogo emergente y luego haga clic en finalizar.
Una vez completada la ejecución, la interfaz se muestra a continuación:
-
A continuación, busque CUDA en el cuadro de búsqueda de CMake y marque la opción CUDA emergente.
-
Buscar y comprobar temas relacionados con las matemáticas.
-
Busca y comprueba NO GRATIS
-
Busque y verifique BUILD_opencv_world
-
Busque GENERATE_SETUPVARS y desmarque
-
Finalmente, busque MÓDULOS y agregue la ruta al paquete contrib.
En este punto, complete la selección de configuración de este paso. Haga clic en configurar por segunda vez y espere a que se complete la configuración, como se muestra a continuación:
-
Una vez completada la configuración, busque CUDA_ARCH_BIN y elija conservar el valor correspondiente según la potencia informática de su propia GPU. Los valores correspondientes a la GPU específica se pueden encontrar en la web oficial de Nvidia . Dado que la potencia informática de la tarjeta gráfica de la serie 40 es 8.9, y la potencia informática máxima admitida por la versión 4.7 de OpenCV es 8.6, elegí 8.6 aquí.
A continuación, haga clic en configurar por tercera vez . Después de esperar a que finalice, haga clic en generar como se muestra a continuación:
Luego puede hacer clic en Abrir proyecto para abrir Visual Studio 2019. En este punto, CMake ha completado su misión.
2.Visual Studio 2019 Compile el código fuente de OpenCV
- Después de abrir el proyecto VS, seleccione la versión Release x64, haga clic con el botón derecho en ALL_BUILD en el directorio CMakeTargets en el Administrador de soluciones , seleccione Generar e inicie la compilación. (Este proceso lleva mucho tiempo, la compilación de 13600K tarda unos 50 minutos)
- Después de completar la compilación ALL_BUILD, seleccione INSTALAR y también haga clic derecho para realizar la operación de generación
. Después de completar este paso, la carpeta de instalación se generará en la carpeta opencv_cuda_build/:
los archivos en la carpeta de instalación generada son los archivos que Necesito ¡En este punto, la compilación de OpenCV finaliza!
Configurando Visual Studio 2019
Después de compilar OpenCV, debe configurar VS para poder hacer referencia a nuestra biblioteca OpenCV compilada en nuestro proyecto. En concreto, existen principalmente
- Agregar directorio de inclusión
- Agregar directorio de biblioteca
- Agregar dependencias adicionales
- Agregar variables de entorno
- Primero, creamos un proyecto VS C++ en blanco y agregamos el archivo fuente main.cpp, luego seleccionamos Release x64 , hacemos clic derecho en Release |
F:\packages\opencv_cuda_build\install\include
F:\packages\opencv_cuda_build\install\include\opencv2
- Luego agregue la ruta lib en el directorio de la biblioteca a continuación :
F:\packages\opencv_cuda_build\install\x64\vc16\lib
- Finalmente, agregue todos los nombres de los archivos lib en la carpeta opencv_cuda_build\install\x64\vc16\lib en la opción vinculador->entrada->dependencias adicionales . Solo tengo opencv_img_hash470.lib y opencv_world470.lib aquí.
- Finalmente, debe agregar la ruta del archivo binario compilado a la variable de entorno, buscar y editar la variable de entorno en la barra de búsqueda del sistema y agregar la ruta bin en la columna Ruta :
F:\packages\opencv_cuda_build\install\x64\vc16\bin
En este punto, la configuración de VS está completa y podemos llamar al OpenCV compatible con CUDA que acabamos de compilar en VS.
Programa de prueba
Agregue el siguiente programa de muestra al main.cpp que acaba de crear:
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/cudaarithm.hpp>
#include <iostream>
using namespace std;
using namespace cv;
using namespace cv::cuda;
int main()
{
// OpenCV版本号
cout << "OpenCV_Version: " << CV_VERSION << endl;
// CUDA
int num_devices = getCudaEnabledDeviceCount();
if (num_devices)
cout << "CUDA is available, num_devices:" << num_devices << endl;
else
cout << "CUDA is not available." << endl;
//读取图片
Mat img = imread("D:/CUDA_ARCH_BIN.png");
imshow("picture", img);
waitKey(0);
return 0;
}
Si la imagen y CUDA se pueden mostrar correctamente, ¡la instalación se realizó correctamente!