如何在python(Windows)的openCV dnn模块上使用GPU加速?

时间:2020-09-07 13:16:11

标签: python opencv gpu opencv-python

我想使用opencv-python4.4对YOLOv3进行推断。但是默认情况下使用CPU。我已阅读此说明here,说新版本opencv4.2.0已支持GPU。但是该指令仅适用于Ubuntu,而我的指令是Windows10

我试图请您逐步指导我如何在Wondows10中实现此功能,python?当我直接使用它时,发生了错误:

cv::dnn::dnn4_v20191202::Net::Impl::setUpNet DNN module was not built with CUDA backend; switching to CPU

似乎我必须手动编译opencv,但是不是Cpp吗?但是我只想在python上实现它。有人可以给我一些指示吗?

2 个答案:

答案 0 :(得分:1)

您确实需要自己构建OpenCV。

在将Python绑定用于OpenCV时,OpenCV库本身是用C ++而不是Python编写的。这也说明了OpenCV如何使用CUDA(另一个C ++库)来访问NVidia GPU。

您链接的说明来自与OpenCV无关的人员,该人员承认存在Windows偏见。这意味着这些说明对您没有用。

These instructions确实涵盖了Windows版本。

摘要:

  • 使用Visual Studio 2019(Microsoft最新的C ++编译器)和CMake
  • 下载并安装OpenCV
  • 下载并安装CUDA和cuDNN
  • 下载并安装Anaconda3,并将其用作默认Python
  • 设置环境变量,以便CMake可以找到您已安装的库
  • 设置环境变量和选项,以便CMake知道您还需要OpenCV的Python绑定
  • 使用CMake为Visual Studio创建.sln文件
  • 在Visual Studio中打开.sln并进行构建。
  • 这会生成您需要的cv2.cp37-win_amd64.pyd文件。

答案 1 :(得分:0)

我想通了...两个

const filterItemsFlat = (items, results = []) => {
    items.forEach(item => {
        if (item.items) filterItemsFlat(item.items, results)
        if (item.visible) results.push(item)
    })

    results.forEach(r => delete r.items)

    return results
}

console.log(filterItemsFlat(
    [
        { id: 'a', visible: 1 },
        { id: 'b', visible: 0 },
        {
            id: 'c',
            visible: 0,
            items: [
                { id: 'd', visible: 1 },
                { id: 'e', visible: 0 }
            ]
        },
        { id: 'f', visible: 1, items: [{ id: 'g', visible: 0 }] },
        { id: 'h', visible: 0, items: [{ id: 'i', visible: 0 }] },
    ]
))

必须指定,否则-DBUILD_opencv_python3=ON -DBUILD_opencv_python2=OFF 将完全不包含任何python模块。