CUDA(GPU)作为OpenCV后端

8
我正在尝试将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,欢迎提供任何指导。


OpenCV 还可以利用 DNN 模块之外的 GPU,即透明 API。因此有理由编译带有 cuda 支持的 OpenCV。而如果使用 OpenCL 作为后端,会发生什么呢?这也应该能够利用 GPU。 - Timo
@Timo 但是这不能用于生产推理,因为要求在更高的fps下运行模型,CUDA比opencl更好,所以您能否更详细地阐述透明API。 - U.Swap
我明白了。我不熟悉 DNN 模块,所以在这方面无法为您提供帮助。透明 API 是大多数 OpenCV 函数的透明包装器(因此得名),允许它们在 GPU 上执行。我只是想指出,在 OpenCV 中有 CUDA 的用途。但这与 DNN 模块没有任何关系。 - Timo
目前,DNN推理没有CUDA支持。如果您需要在GPU上获得良好的性能,请使用您喜欢的DL库(Tensorflow、PyTorch、MxNet、Chainer等)。 - Catree
1
@Timo OpenCL后端在CUDA GPU上非常慢。OpenCL后端不支持所有层,因此推理过程涉及在OpenCL和CPU后端之间切换(作为备用方案)。如果您使用集成图形,则效果很好,但对于不共享主内存的设备,速度将非常慢。CUDA设备和CPU之间的内存传输成本使得大部分可能获得的加速效果都被抵消了。 - Yashas
2个回答

5
目前,使用CUDA支持DNN模块仍在GSOC任务中进行,因此还没有官方版本发布。您可以通过访问其存储库此处了解最新进展。
更新:看起来CUDA后端集成已完成,并已包含在版本4.2.0中,您可以查看此处的更改日志。

1
您可以按照以下方式在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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接