成功构建后,带有 Cuda 的 Python OpenCV 无法正常工作

Posted

技术标签:

【中文标题】成功构建后,带有 Cuda 的 Python OpenCV 无法正常工作【英文标题】:Python OpenCV with Cuda not working after successful build 【发布时间】:2021-11-13 16:34:17 【问题描述】:

我在 Windows 10 上,使用 Python 3.9.6,我的 cv2 版本是 4.4.0。我用 Cuda 成功构建了 OpenCV,在调用 cv2.cuda.getCudaEnabledDeviceCount() 后,它按预期返回 1。以下几行也可以正常工作。

net = cv2.dnn.readNetFromCaffe(proto_file, weights_file)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

# multiple lines
# processing frame
# and setting input blob

net.setInput(in_blob)

但是,执行以下行会引发异常。

output = net.forward()

例外:

cv2.error: OpenCV(4.4.0) G:\opencv-4.4.0\opencv-4.4.0\modules\dnn\src\dnn.cpp:2353:错误: (-216:不支持 CUDA)OpenCV 不是为使用选定的而构建的 设备。请在您的构建中检查 CUDA_ARCH_PTX 或 CUDA_ARCH_BIN 配置。在功能上 'cv::dnn::dnn4_v20200609::Net::Impl::initCUDABackend'

消息说我的 Cuda 不是为与所选设备(我猜是我的 GPU)一起工作而构建的。 它似乎遇到了与 CUDA_ARCH_BIN 和/或 CUDA_ARCH_PTX 的冲突。我的 GPU 模型是 NVIDIA Geforce MX130,它的 CUDA_ARCH_BIN 值是我发现的 6.1,我根据 CMake 设置它。 我该如何解决这些问题?如果我需要提供更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

“消息来源说”MX130 具有 Maxwell 内核,而不是 Pascal 内核。麦克斯韦是帕斯卡的前身。

因此,您只有 CUDA 计算能力 5.0。

您应该使用适当的工具(例如 GPU-Z)进行检查,该工具会尽力查询硬件而不是按照规格进行。

来源:

https://en.wikipedia.org/wiki/GeForce_10_series#GeForce_10_(10xx)_series_for_notebooks(注意Fab (nm) 不同,代号是GM108,而不是GPxxx) https://www.techpowerup.com/gpu-specs/geforce-mx130.c3043

【讨论】:

那么,我应该将 CUDA_ARCH_BIN 设置为 5.0 吗?为什么大多数地方都说6.1?在 GPU 硬件规格方面,我是初学者。 NVIDIA 的 website 表示 Maxwell (5.x)。我找不到任何表明 MX130 具有计算能力 6.1 (Pascal) 的网站 是的,我现在就试试 5.0。我认为它会工作。 OpenCV 的 CUDA 模块的默认值编译为几个计算能力,这也是构建启用 CUDA 的 OpenCV 需要这么长时间的原因。 我通过将 CUDA_ARCH_BIN 设置为 5.0 来重建它。它奏效了。

以上是关于成功构建后,带有 Cuda 的 Python OpenCV 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NVIDIA 驱动程序/CUDA(支持 tensorflow-gpu)和带有 pip 的 Python3 为图像制作 Dockerfile?

Tensorflow CUDA减少Op没有完全减少

使用 Meson 构建 CUDA 内核

getCudaEnabledDeviceCount() 返回 -1:使用 vcpkg 构建的 OpenCV [cuda]

如何用TensorFlow构建RNN

如何用TensorFlow构建RNN