使用opencv-python与GPU。

20

我想在Windows 10上使用带有GPU的opencv-python。

我使用pip安装了opencv-contrib-python,版本为v4.4.0.42,同时我的电脑上也有Cuda并在路径中。

这是我尝试编译的(简单的)代码:

import cvlib as cv
from cvlib.object_detection import draw_bbox

bbox, label, conf = cv.detect_common_objects(img,confidence=0.5,model='yolov3-worker',enable_gpu=True)

output_image = draw_bbox(img, bbox, label, conf)

首先,这是一行代码告诉我tf是否支持cuda:

2020-08-26 5:51:55.718555: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library cudart64_101.dll

但是当我尝试使用GPU分析图像时,出现了以下情况:

[ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-j8nxabm_\opencv\modules\dnn\src\dnn.cpp (1429) cv::dnn::dnn4_v20200609::Net::Impl::setUpNet DNN module was not built with CUDA backend; switching to CPU

有没有一种方法可以在不使用cmake安装opencv的情况下解决这个问题?在Windows上太麻烦了...

4个回答

10
问题在于你的系统(Windows)所配送的版本的opencv没有编译使用Cuda支持。因此,您无法使用该构建与cuda相关的任何功能。
如果您想要具有cuda支持的opencv,则必须自己编译它(在Windows上可能会很繁琐),或者在其他地方找到一个预先构建的版本。如果您选择第一种解决方案,请注意这个链接可能会帮助您完成该过程:https://programming.vip/docs/compile-opencv-with-cuda-support-on-windows-10.html。请记住,在此过程中,这将需要您安装一堆SDK

非常感谢您的回答。我使用pip安装了opencv-python(以及contrib版本),但是没有办法使用pip编译Cuda吗?因为我不想使用Cmake... - Panda50
抱歉回复晚了。很遗憾,pip只是一个包管理器,用于在用户之间分发软件包。我怀疑没有带有cuda支持的python-opencv版本,并且opencv团队也没有计划推出这样的版本。主要问题是运行cuda程序所需的运行时依赖项,以及可能涉及一些许可问题。 - Harry333Cover
然而,我建议您不要害怕通过cmake编译它。几个月前,我不得不这样做(但是在Linux上),即使安装了最先进的gcccuda,该过程也非常简单。对于如此大的项目来说,情况并非总是如此。 - Harry333Cover
是的,我理解这一点,并且至少需要一个cudnn帐户。因此,我正在使用Cmake进行操作,比上次尝试要容易一些,但它起作用了(期望当我打开GPU时,但我认为这是因为我使用cuda 10.1与cudnn 8.something,我正在使用Cuda 10.2和相同版本的cudnn来看会发生什么)。非常感谢你的回答Harry,祝你有愉快的一天。 - Panda50

7

自这个问题最初被提出以来,情况似乎有所改变:

https://github.com/opencv/opencv-python

选项1 - 主模块包:pip install opencv-python

选项2 - 完整包(包含主模块和contrib / extra模块):pip install opencv-contrib-python(请查看OpenCV文档中的contrib / extra模块列表) ==> https://docs.opencv.org/master/

可悲的是,并非所有上述模块都在“完整包”中可用,例如cudafilters。 如果有人知道更好的方法,我会非常感激学到更多。


6

对于那些遇到同样问题的人。正如Harry所提到的,无法通过pip来使用opencv和GPU,您需要使用Cmake手动构建(适用于Windows)。

这有点棘手,但有许多教程可以帮助您。 我花了两天时间来使cvlib工作,原因是:Nvidia网站上当前可用的其中一个cudnn.dll的名称为:

Cudnn64_8.dll

而opencv(或更准确地说是tensorflow)需要

Cudnn64_7.dll

实际上,您只需要将8替换为7! ;) 这是唯一困难的部分,我相信这是由cmake过程引起的。

再次感谢Harry。


你能详细说明一下吗?我正在尝试在Ubuntu 20上构建OpenCV 4.5,但似乎无论我做什么都无法找到cudnn。哪个cmake文件指向了错误的cudnn库? - blueether
如果你使用的是Ubuntu,我强烈推荐你自己构建opencv。这样会更容易些。 - Panda50

1

有非官方预编译的 CUDA 版本可用,但仅适用于有限数量的 CUDA 版本(请参阅OpenCV Python CUDA wheels

由于每个预编译版本都必须针对特定的 CUDA 版本构建,因此只支持最新的 OpenCV 和 CUDA 组合。


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