CUDA(GPU)作为OpenCV后端

CUDA(GPU) as OpenCV backend

本文关键字:OpenCV 后端 作为 GPU CUDA      更新时间:2023-10-16

我试图使用 CUDA 作为 opencv-4.1.1 中提供的 dnn 模块的后端,我已经在启用 CUDA 的情况下构建了 opencv,nvidia 驱动程序和 CUDA 已正确放置在系统上,这里使用 manjaro 作为开发平台。

我正在尝试使用 cv2.dnn 模块加载预先训练的 YOLOv3 权重,

net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')

但它使用 CPU 作为定义的推理引擎,但我尝试使用 GPU 作为后端 IE,来自官方的 opencv 文档,我发现以下内容

DNN_TARGET_CPU  
DNN_TARGET_OPENCL   
DNN_TARGET_OPENCL_FP16  
DNN_TARGET_MYRIAD       
DNN_TARGET_FPGA 

作为目标后端,但不支持直接 GPU 推理,那么如果它不使用 GPU 作为底层推理引擎,那么使用 CUDA 编译 openCV 有什么意义,

为了确保进程在GPU上运行,我发布了输出nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GT 710      Off  | 00000000:01:00.0 N/A |                  N/A |
| 40%   40C    P0    N/A /  N/A |    598MiB /  1998MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+

GPU利用率的进程 ID 为 0,显然表示没有使用 GPU 的进程,任何指导都将不胜感激。

目前,在 GSOC 任务下,CUDA 对 DNN 模块的支持正在进行中,因此尚未正式发布。您可以在此处查看其存储库以查看进度。

编辑:看起来CUDA后端集成已完成并包含在发布版本4.2.0中,您可以在此处查看更改日志。

您可以在 OpenCV 上使用 CUDA 后端,如下所示。

# Loading trained YOLO v3 Objects Detector
network = cv2.dnn.readNetFromDarknet('yolo-coco-data/yolov3.cfg',
'yolo-coco-data/yolov3.weights')
# CUDA Backend
network.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
network.setPreferableTarget(cv2.dnn. DNN_TARGET_CUDA)
# Also you can use following code for 16 FPS(if your system supports). 
#network.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA_FP16)