机器学习:如何编译OpenCV以包括CUDA GPU支持?

磐创AI
关注

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 FilesCMakeincmake.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.batset path=%openCvBuild%installd c16in;%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%Anaconda3envspy38Libsite-packagescv2*"

这个输出应该是:05/15/2021 | 12:26 PM | 9,133,056 | cv2.cp38-win_amd64.pyd如果不是,请在命令提示符下键入:dir "%openCvBuild%libpython3cv2.cp38-win_amd64.pyd"以检查我们的Python绑定。它应该定位到文件。如果找到该文件,则需要确保env的conda site-packages文件夹中包含该cv2.cp38-win_amd64.pyd文件。

如果不是,你可以:1.从以下位置手动复制/粘贴文件:OpenCV_Buildopencv-4.5.2uildlibpython3并将其粘贴到conda文件夹位置:C:UsersYOUR_NAMEnaconda3envsYOUR_ENV_NAMELibsite-packages。然后重新运行dir "%USERPROFILE%Anaconda3envspy38Libsite-packagescv2*"命令。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%installd c16in;%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%installd c16inopencv_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.2uildinstalld c16in文件夹位置。它应该位于你的OpenCV_Build文件夹中。与以前不同,请确保在此处使用反斜杠(“ ”)而不是斜杠(“ /”)。在“系统变量”部分中执行相同的操作。检查PyCharm现在是否可以运行,如果没有,请继续下一步。

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

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

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

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

你将要创建另一个符号链接,但不是anaconda,而是要将opencv-4.5.2uildinstalld c16in文件夹链接到anaconda3 site-packages文件夹。mklink /D E:OpenCV_Buildopencv-4.5.2uildinstalld c16in C:UsersBengenaconda3envspy38libsite-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

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存