Anaconda3—具有Windows 10的CUDA GPU支持的OpenCV

本文将逐步介绍如何编译OpenCV以包括CUDA GPU支持,以便可以在基于视觉的机器学习项目中使用它。

Anaconda3—具有Windows 10的CUDA GPU支持的OpenCV_第1张图片

Pre:我之所以决定写这篇文章,是因为我发现现有指南缺少一些更详细的信息,无法说明如何使用CUDA GPU支持从源代码构建OpenCV,以便将其导入python3.8conda环境。大多数人都以构建过程结束,但低估这只是使OpenCV在项目中正常工作的第一步。

先决条件

在开始之前,我们必须下载一些文件,安装一些程序。我还将假设你正在将Anaconda软件包管理器环境用于Python 3.8,并将其设置为启用的默认python和环境变量。如果没有,我不确定以下内容是否对你有用。我不建议偏离主要任务。

Anaconda软件包管理器环境:https://www.anaconda.com/distribution/#download-p

1. Visual Studio 2019

请确保VisualStudio 2019安装了“带有C++的桌面开发”包。这是在Visual Studio的安装过程中完成的。

如果你已经安装了VS2019,但是不确定是否已安装工作负载,可以通过安装可执行文件重新安装(修改)来完成。

Anaconda3—具有Windows 10的CUDA GPU支持的OpenCV_第2张图片

使用C ++开发的Visual Studio 2019

2. OpenCV和OpenCV贡献文件

在计算机上的某个位置创建一个名为“ OpenCV_Build”的文件夹。它不必确切地命名为这个,你要看一眼就知道它是什么。然后,你将同时下载OpenCV和OpenCV contrib.zip。

OpenCV:https://github.com/opencv/opencv/archive/4.4.0.zip

OpenCV contrib:https://github.com/opencv/opencv_contrib/archive/4.4.0.zip

下载完成后,解压缩zip并将生成的文件夹移到OpenCV_Build中。它应该类似于:

OpenCV_Build/opencv-4.5.2 OpenCV_Build/opencv_contrib-4.5.2

你要确保它们都是相同的版本(在本例中为4.5.2)。

我还想确保它们是顶级目录,而不是嵌套在具有相同名称的文件夹中,但这不是完全必要的,只是使得我们的环境路径更加精简。

3. CMake GUI

下载并安装CMake GUI

CMake GUI:https://cmake.org/

我使用的是3.20.2版,但是安装哪个版本都没有关系。

4. CUDA 11.0工具包

下一步,你必须在Nvidia网站上注册才能下载并安装CUDA工具包,该工具包既快速又简单,完全不需要花费很多时间。

下载CUDA工具包:https://developer.nvidia.com/cuda-downloads

5. cuDNN

此步骤与上一步非常相似,但是你必须下载cuDNN才能利用DNN CUDA后端。

下载cuDNN:https://developer.nvidia.com/rdp/cudnn-download

在Nvidia开发人员程序中注册后,你将需要选择显示以下内容的版本:

“for CUDA 11.x”.

6.提取cuDNN文件

cuDNN下载完成后,解压缩zip并打开结果文件夹。在内部,你应该看到一个名为cuda的文件夹,将其打开,然后剩下3个子文件夹,分别为**“ bin”,“ include”“ lib”。**

你将把文件从每个子文件夹复制到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3 中的相应文件夹中。

downloads/cuda/bin contents to: CUDA/v11.3/bin downloads/cuda/include contents to: CUDA/v11.3/include downloads/cuda/lib/x64 contents to: CUDA/v11.3/lib/x64

7.下载Ninja以获得更快的构建时间

Ninja将极大地加快OpenCV的构建过程。

Ninja:https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip

我个人发现,Ninja从1小时45分钟缩短到不到15分钟。解压缩它,然后将Ninja.exe放在你之前创建的“ OpenCV_Build”文件夹中。

将所有文件放入各自的文件夹后,应完成prereqs部分。

建议:设置Conda Env

我建议你使用Anaconda,以确保你所做的一切与我所做的相同。你可以使用以下命令设置conda env:

conda create -n py38 anaconda python=3.8

建议:为简单起见,创建一些.bat文件

为简单起见,我建议制作一些.bat文件,以防万一在构建过程中出现问题。这样,你可以快速对cmd进行编辑,然后重新运行它,而不必经历一次又一次地重新设置所有环境变量的过程。

当出现问题时,它还有助于将事情分解成更易于管理的状态,而且几乎肯定会出错。

set_env_paths.bat

右键单击OpenCV_Build文件夹,然后创建一个名为set_env_paths.bat的新文本文件。完成此操作后,需要编辑以下示例以包含文件夹位置:

ECHO -- Set these variables below --
set "openCvSource=E:/OpenCV_Build/opencv-4.5.2"
set "openCVExtraModules=E:/OpenCV_Build/opencv_contrib-4.5.2/modules"
set "openCvBuild=%openCvSource%/build"
set "toolkitRoot=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0"
ECHO -- Set this to the location of your Conda Env
set "pathToAnaconda=C:/Users/Benge/anaconda3/envs/py38"
ECHO -- Leave these variables alone --
set "buildType=Release"
set "generator=Ninja"
set "pyVer=38"

同样要记住的重要一点是,所有文件夹路径都不应包含反斜杠(“ \”),而应替换为正斜杠(“ /”)。我发现这是一个奇怪的CMake操作,不幸的是,这是确保在构建过程中不会失败的唯一方法。

configure_and_build_opencv.bat

这是我们配置和构建OpenCV道路上的必经之路。从本质上讲,这只是一堆链接在一起的命令提示符,从而使整个过程变得更加容易。

它实际上是初始化VS2019构建批处理文件,调用我们在set_env_paths中设置的环境变量,调用CMake以使用GPU加速的CUDA及其各种设置来生成我们的配置(在我看来,这比在CMake中单独执行更容易)。

包括Anaconda build env Python绑定,以便我们实际上可以在我们的项目中导入和利用新构建的模块,然后开始构建OpenCV的过程。

ECHO -- Starting OpenCV Configuration --
ECHO ---- Opening Visual Studio builder ----
call "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build/vcvars64.bat"
ECHO ---- Setting up environment variables ----
call set_env_paths.bat
ECHO ---- Running CMake Commands ----
call "C:/Program Files/CMake/bin/cmake.exe" -B"%openCvBuild%/" -H"%openCvSource%/" -G"%generator%" -DCMAKE_BUILD_TYPE=%buildType% -DOPENCV_EXTRA_MODULES_PATH="%openCVExtraModules%/" ^
-DINSTALL_TESTS=ON -DINSTALL_C_EXAMPLES=ON -DBUILD_EXAMPLES=ON ^
-DBUILD_opencv_world=ON ^
-DWITH_CUDA=ON -DCUDA_TOOLKIT_ROOT_DIR="%toolkitRoot%" -DCUDA_FAST_MATH=ON -DWITH_CUBLAS=ON -DCUDA_ARCH_BIN=7.5 -DWITH_NVCUVID=ON ^
-DWITH_OPENGL=ON -DENABLE_FAST_MATH=ON ^
-DWITH_MFX=ON ^
-DBUILD_opencv_python3=ON -DPYTHON3_INCLUDE_DIR=%pathToAnaconda%/include -DPYTHON3_LIBRARY=%pathToAnaconda%/libs/python%pyVer%.lib -DPYTHON3_EXECUTABLE=%pathToAnaconda%/python.exe -DPYTHON3_NUMPY_INCLUDE_DIRS=%pathToAnaconda%/lib/site-packages/numpy/core/include -DPYTHON3_PACKAGES_PATH=%pathToAnaconda%/Lib/site-packages/ -DOPENCV_SKIP_PYTHON_LOADER=ON
ECHO -- OpenCV Configuration has finished, proceeding to build phase --
call "C:\Program Files\CMake\bin\cmake.exe" --build %openCvBuild% --target install
:End
PAUSE

运行configure_and_build_opencv.bat文件

双击我们的文件,然后运行该进程。视你的系统而定,如果没有出现任何错误,它可能需要15分钟到一个小时。

有时,你会看到它停止打印到命令提示符。这是Windows 10 命令提示符的一个已知问题,因此只需在窗口中单击并按Enter,它就会恢复运行。

如果不继续,则可能只是在处理一些较大的内容,可能需要一分钟才能完成。让它继续运行几分钟,如果在此之后没有继续运行,请关闭窗口,然后重新运行bat文件。

CMake在windows上很奇怪,我真的不知道为什么,它有时还会冻结。

完成后,它应该暂停并要求你按Enter键以关闭命令提示符。这样做只是为了确保一切都正确构建。如果超时,它也可能在构建后自动关闭自己。

验证OpenCV正确构建

假设构建正确完成,我们可以验证OpenCV现在可以正常工作了。你将要打开另一个“命令提示符”实例,并cd到你的OpenCV_Build文件夹。

进入该文件夹后,你需要在命令提示符下输入以下几行:call set_env_paths.bat

set path=%openCvBuild%\install\x64\vc16\bin;%path%

ipython

然后将下一位复制粘贴到命令窗口中。

import numpy as np
import cv2 as cv
npTmp = np.random.random((1024, 1024)).astype(np.float32)
npMat1 = npMat2 = npMat3 = npDst = np.stack([npTmp,npTmp],axis=2)
cuMat1 = cuMat2 = cuMat3 = cuDst = cv.cuda_GpuMat(npMat1)
%timeit cv.cuda.gemm(cuMat1, cuMat2,1,cuMat3,1,cuDst,1)

完成此操作后,按Enter键,你应该会看到以下内容:

2.79 ms ± 63.8 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

好的,很酷。因此,现在我们知道可以使用Python来访问OpenCV模块了。接下来,让我们确保它在我们的Conda环境里。

在同一窗口中,粘贴:

dir "%USERPROFILE%\Anaconda3\envs\py38\Lib\site-packages\cv2*"

这个输出应该是:05/15/2021 | 12:26 PM | 9,133,056 | cv2.cp38-win_amd64.pyd

如果不是,请在命令提示符下键入:dir "%openCvBuild%\lib\python3\cv2.cp38-win_amd64.pyd"

以检查我们的Python绑定。它应该定位到文件。

如果找到该文件,则需要确保env的conda site-packages文件夹中包含该cv2.cp38-win_amd64.pyd文件。如果不是,你可以:

1.从以下位置手动复制/粘贴文件:OpenCV_Build\opencv-4.5.2\build\lib\python3

并将其粘贴到conda文件夹位置:C:\Users\YOUR_NAME\anaconda3\envs\YOUR_ENV_NAME\Lib\site-packages

然后重新运行dir "%USERPROFILE%\Anaconda3\envs\py38\Lib\site-packages\cv2*"命令。

2.使用以下cmd:

copy "%openCvBuild%/lib/python3/cv2.cp38-win_amd64.pyd" "%USERPROFILE%/Anaconda3/envs/py38/Lib/site-packages/cv2.cp38-win_amd64.pyd"

测试OpenCV版本

在同一cmd提示符下,键入:

set path=%openCvBuild%\install\x64\vc16\bin;%path%
python -c "import cv2; print(f'OpenCV: {cv2.__version__} for python installed and working')"

它应该输出类似以下内容:OpenCV: 4.5.2 for python installed and working

确认CUDA配置正确

最后,如果其他所有方法都获得成功,则还应确认CUDA的配置正确:

"%openCvBuild%\install\x64\vc16\bin\opencv_perf_cudaarithm.exe" --gtest_filter=Sz_Type_Flags_GEMM.GEMM/29

在输出的底部,你应该看到绿色的内容:[ PASSED ] 1 test.

如果仍然遇到麻烦,请查看下面的“Credits”部分,并查看JamesBowley的文章。在故障排除方面,他比我更深入。

PyCharm故障排除

如果你像我一样使用PyCharm,你会发现,尽管OpenCV现在可以在PyCharm之外运行,但在PyCharm中打开项目时却无法使用。

造成这种情况的原因有很多,但是我发现实际可行的解决方案是Stackoverflow和Github问题跟踪器提供的答案的组合。

1.将OpenCV_Build添加到你的环境路径

按下Windows键,然后键入env,会弹出一个选项来编辑系统环境变量。打开窗口,单击右下角的“环境变量”。

该窗口有两个部分。一个标题为“用户名的用户变量”,另一个标题为“系统变量”。在“用户名的用户变量”部分中,双击名为“ Path”的变量。

然后单击“新建”以添加新条目。

然后复制并粘贴opencv-4.5.2\build\install\x64\vc16\bin\文件夹位置。它应该位于你的OpenCV_Build文件夹中。与以前不同,请确保在此处使用反斜杠(“ \”)而不是斜杠(“ /”)。

在“系统变量”部分中执行相同的操作。

检查PyCharm现在是否可以运行,如果没有,请继续下一步。

2.将anaconda symlink文件夹添加到Anaconda3

这显然不是必需的步骤,但PyCharm仍然存在一些错误,它寻找一个不存在的文件夹anaconda而不是anaconda3,所以我们将继续将它们符号链接。

mklink /D C:\Users\Benge\anaconda C:\Users\Benge\Anaconda3

仔细检查PyCharm(可能仍然无法使用)。如果没有,请继续下一步。

3.将构建文件夹SymLink添加到Conda站点包

你将要创建另一个符号链接,但不是anaconda,而是要将opencv-4.5.2\build\install\x64\vc16\bin\文件夹链接到anaconda3 site-packages文件夹。

mklink /D E:\OpenCV_Build\opencv-4.5.2\build\install\x64\vc16\bin C:\Users\Benge\anaconda3\envs\py38\lib\site-packages

很明显,把它改成你的conda env的名字和位置,而不是像我给它取名叫做py38。

PyCharm警告

你的项目应该可以在启用了自定义CUDA的OpenCV上正常运行,但是你可能会注意到PyCharm在该行下仍然显示红色的import cv2

我不知道为什么它坚持认为尽管存在该软件包并且它可以正确运行,但仍然找不到该软件包。这只是PyCharm中的一个烦人的bug,我发现没有什么东西可以修复它。

Credits:

之所以能够启动并运行OpenCV,很大一部分原因是依赖了JameBowley的指南。

  • JameBowley的指南:https://jamesbowley.co.uk/accelerate-opencv-4-4-0-build-with-cuda-and-python-bindings/#troubleshooting

它非常有用,但我发现它有点混乱并且没有包括我发现的一些步骤,这些步骤对于在PyCharm的Conda env内构建和运行OpenCV是必需的。

向M. Haroon Shakeel欢呼,以获取有关使用CUDA构建OpenCV的简明指南(但不幸的是,尚未完成)。他是第一本深入探讨在Windows上构建OpenCV的实际指南,而不仅仅是说要使用Linux。

  • M. Haroon Shakeel:https://haroonshakeel.medium.com/build-opencv-4-4-0-with-cuda-gpu-support-on-windows-10-without-tears-aa85d470bcd0

感谢Stackoverflow的Miki帮了我的忙,并最终指引我查看 JameBowley 的指南。

  • Miki:https://stackoverflow.com/questions/67537383/how-do-i-access-opencv-source-compiled-package-from-my-python-project-venv-on-wi?noredirect=1#comment119377208_67537383

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

Anaconda3—具有Windows 10的CUDA GPU支持的OpenCV_第3张图片

你可能感兴趣的:(python,cmake,java,人工智能,windows)