文章目录
- 1. 环境准备
- 2. 兼容性说明
- 3. 算力查询
- 4. 编译步骤
- 5. 网盘资料
提示: 如果读者因网络环境受限,无法正常下载与本文相关的软件安装包、压缩包,以及编译时的依赖文件,可以从文章最后提供的网盘链接下载资源。
1. 环境准备
(1)Windows 10 或 11 ,64位系统 + 算力较高的 NVIDIA 显卡。
(2)安装配置 CUDA + cuDNN 环境。
可参考教程:【番外】01:Windows 安装配置 CUDA 和 cuDNN 教程
(3)获取 opencv + opencv_contrib 工程源码,本文以 4.9.0 版本为例。
- opencv 下载地址:https://opencv.org/releases
找到 4.9.0 版本,点击 Windows 对应链接,下载安装包,运行安装。
- opencv_contrib 下载地址:https://github.com/opencv/opencv_contrib/tags
找到 4.9.0 版本,点击对应的 Zip 压缩包,下载后解压到任意路径。
(4)安装 Visual Studio 2019
下载地址:https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/history#release-dates-and-build-numbers
点击最新的 “专业版” 进行下载,然后运行安装。
(5)安装 CMake 3.10 以上版本,下载地址:https://cmake.org/download
下载 Windows x64 Installer 对应的 msi 安装包,运行安装。
2. 兼容性说明
OpenCV 官方没有直接提供带有 DNN_CUDA 功能的 DLL,这是因为 CUDA、cuDNN 版本,以及显卡种类实在太多,难以全面兼容。
因此,通过本篇教程编译成的 DLL,原则上也只适用于进行编译的电脑环境。
但只要满足以下三点,就可以尝试向其他电脑移植:
(1)CUDA 版本兼容
其他电脑要与编译电脑拥有相同或相近的 CUDA 版本,起码要 同为 cuda11 系列 或 同为 cuda12 系列。
(2)cuDNN 版本一致
其他电脑要与编译电脑拥有尽量相同的 cuDNN 版本。如不相同,可下载相同版本,覆盖安装。
(3)显卡算力兼容
其他电脑的显卡算力必须包含在编译时的 CUDA_ARCH_BIN 变量中,具体见下文。
3. 算力查询
(1)可以通过 NVIDIA 官网查询:https://developer.nvidia.com/cuda-gpus
如果你的 GPU 不在表中,点击 Legacy CUDA GPU Compute Capability ,查询早期 GPU 算力表。
(2)如果你已经安装了CUDA,那么也可以通过官方提供的demo程序查询算力。
进入 CUDA 安装路径下的 ./extras/demo_suite 文件夹,并在此打开命令终端,执行:deviceQuery.exe
输出信息中的 CUDA Capability 就是当前显卡的算力。
4. 编译步骤
下面开始进行编译,首先总结一下本人的电脑环境:
系统 | Win10 (64位) |
---|---|
显卡 | NVIDIA GeForce GTX 1650 |
CUDA | 11.6 |
cuDNN | 8.9.7 |
opencv + opencv_contrib | 4.9.0 |
Visual Studio | 2019 (V16) |
CMake | 3.28.0 |
(1)打开 opencv 安装路径,可以看到一个 build 文件夹和一个 sources 文件夹。其中 sources 是源码,build 是官方提供的编译库(无GPU加速)。在此处新建一个文件夹,命名为 build_cuda,用于装载本次带 CUDA 编译的文件。
(2)启动CMake,如果有上一次的编译缓存残留,可以通过 File >> Delete Cache 将其清空。
接着,在 “Where is the source code” 处填写 opencv 的源码路径,也就是上述的 sources 文件夹。在 “Where to build the binaries” 处填写上述的 build_cuda 文件夹,然后点击左下角的 Configure 按钮。
(3)在弹出的设置窗口中,选择Visual Studio 16 2019,x64,最后点击Finish,等待 Configure 结束。
(4)下载依赖失败与解决方案:
-
Configure 过程中,会从 github 等网站下载依赖文件,暂存于 sources 目录下的 .cache 文件夹中,然后再自动拷贝或解压到 build_cuda 目录下的 3rdparty 文件夹中;
-
如果网络环境受限,将会出现如下图的 Download failed。这种 Warning 虽然不影响 Configuring done,但必须要解决!
-
build_cuda 目录下的 CMakeDownloadLog.txt 完整记录了每个依赖文件的下载链接,以及下载成功时,本应该在 .cache 中的命名与保存路径。可以据此手动下载每个依赖文件,并按格式放入 .cache 中。全部完成后,再次尝试 Configure;
-
如果实在无法下载,并且您编译的 opencv 版本为4.9.0,环境也与我相似,那么可以从本文最后提供的网盘链接下载 .cache 文件夹,直接替换您的 .cache 文件夹。完成后,再次尝试 Configure。
-
下文步骤中每一次 Configure 都需要检查有无 Download failed 警告,并按上述方法解决。其他类型的 Warning 一般不用处理。
(5)运行显示 Configuring done,并且过程中无 Download failed 警告。接下来继续调整参数。
在 Search 框中搜索关键字 cuda,勾选三项:BUILD_CUDA_STUBS、OPENCV_DNN_CUDA 和 WITH_CUDA 。
(6)搜索 nonfree 关键字,勾选 OPENCV_ENABLE_NONFREE 。
(7)搜索 extra 关键字,设置 OPENCV_EXTRA_MODULES_PATH 为解压后的 opencv_contrib-4.9.0 中的 modules 路径。路径分隔符号建议用左斜杠 “ / ”,以防止编译器误转义。
(8)搜索 world 关键字,勾选 BUILD_opencv_world ,代表将所有库编译成一个总集成的 opencv_world490.dll 。
(9)我们本次只编译C++的动态链接库,取消其他语言的编译项。分别搜索 python、java、js、tests 关键字,取消勾选相关的选项。
(10)再次点击 Configure,显示 Configuring done 并且过程中无 Download failed 警告。再进一步调整参数。
(11)搜索 ENABLE_FAST_MATH,将其勾选。
(12)接下来是关键的显卡算力设置。搜索 arch 关键字,出现两个关键变量 CUDA_ARCH_BIN 和 CUDA_ARCH_PTX 。
- CUDA_ARCH_BIN 是兼容的显卡算力,多个算力用分号隔开。兼容的越多,编译时间越长,生成的 DLL 文件也越大。
(注意观察它的初始值,是当前CUDA能支持的所有算力,假如最大值都比你的显卡算力小,那么你应该先升级CUDA) - CUDA_ARCH_PTX 是中间语言 PTX 使用的架构,设为 CUDA_ARCH_BIN 中的最大值即可。
比如,我只想兼容与我的 GTX 1650 算力相同的显卡,就可以将 CUDA_ARCH_BIN 和 CUDA_ARCH_PTX 都设为 7.5 ,这样生成的 DLL 最小,也最匹配。
如果我想同时兼容比我算力小一些的 GTX 1060,就将 CUDA_ARCH_BIN 设为 6.1;7.5,CUDA_ARCH_PTX 依然设7.5,这样生成的 DLL 可以兼容这两种显卡,但文件比较大。
(13)最后一次点击 Configure,显示 Configuring done 并且过程中无 Download failed 警告。再点击 Generate,显示 Generating done 时编译成功,关闭 CMake 。
(14)打开上述 build_cuda 文件夹,找到生成的工程文件 OpenCV.sln,用 VS2019 管理员权限将其打开。
(15)在菜单栏下方,将环境设置为 Release 和 x64 。
(16)在 “解决方案资源管理器” 窗口中,展开 CMakeTargets,对 ALL_BUILD 点右键 >> 生成。
- 该过程需要1小时左右,取决于 CPU性能 和 兼容算力的多少;
- 一定要确保 Cmake 阶段没有 Download failed,否则1小时等来一场空!
(17)完成后,对 INSTALL 点右键 >> 生成。至此,编译过程全部结束。
(18)在上述 build_cuda 文件夹下,找到生成的 install 文件夹,我们需要的 DLL 就位于 ./install/x64/vc16/bin 路径下。其中:
- opencv_world490.dll 是主要的动态链接库,单一显卡算力下,大概有200多MB;
- opencv_videoio_ffmpeg490_64.dll 是处理视频流的依赖库,该 DLL 不区分 opencv 带GPU加速与否,因此可以沿用官方原版;
- opencv_img_hash490.dll 是图像哈希函数库,根据需要选择是否使用,非必需。
5. 网盘资料
网络环境受限的读者,可以通过下面的网盘链接下载资料:
https://pan.baidu.com/s/1gIcTHXKt0nE5tF_acdihwA?pwd=m6a9