windows下的编译情况
[写的比较乱,没有很好整理,主要给自己看的,见谅!]
电脑情况
Windows 11
之前安装过cuda, 忘了怎么安装的,是不是直接在安装Pytorch的时候安装的?总之,检查了cuda,版本号是10.2.89.
cudnn, 之前没有专门安装过,但是我用conda安装了pytorch-gpu,所以不需要安装cudnn,可能cuda 也不需要安装。
考虑到opencv 可能需要cudnn
参考主页:https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html 安装cudnn 【这个好像有点老了】
参考:https://blog.csdn.net/anmin8888/article/details/127910084
参考:https://blog.csdn.net/weixin_44128004/article/details/125795131?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125795131-blog-127133516.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125795131-blog-127133516.pc_relevant_landingrelevant&utm_relevant_index=1
- 找到最新的符合我的cuda 10.2版本的cudnn, 进行了下载。解压后,将里面的内容拷贝到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2
(我暂时没有装zlib, 因为search了一下,似乎已经有很多zlib版本在电脑了)
(另外,没有按照网上的说明,进一步设置系统的路径)
另外,检查了:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2
里面的sample, 有visual 2017 和 visual 2019,不知道是否支持2022
安装opencv
- 下载
wget -O opencv-4.6.0.zip https://github.com/opencv/opencv/archive/4.6.0.zip
wget -O opencv-4.6.0_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.6.0.zip
选定源文件文件夹和编译后的目标文件夹,然后点Configure
选了2017和x64, 然后点 Finish
结果如上图,Configure下面的信息中有warning,是关于python等,似乎不重要。然后进行勾选:
搜索CUDA,把带CUDA的选上。
搜索modules, 将OPENCV_EXTRA_MODULES_PATH 设为 opencv_contrib下面的modules目录,然后点configure,
搜索java, 将其去掉。应该可以去掉更多,但我暂时就这样吧。【参考https://www.cnblogs.com/Fish0403/p/16728393.html】
改变CUDA_ARCH_BIN里面的值,仅保留7.0, 7.5. 我的显卡是2060,应该就是用7.5
勾选 OPENCV_ENABLE_NONFREE
然后再次点configure, 然后点Generate
All_Build 右键生成 ,结果如下:
205>------ 已启动生成: 项目: ALL_BUILD, 配置: Debug x64 ------
========== 生成: 成功 203 个,失败 2 个,最新 0 个,跳过 0 个 ==========
最后,说有两个项目生成失败, 用error作为关键词搜索:
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2059: 语法错误:“for”
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2143: 语法错误: 缺少“)”(在“;”的前面)
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2065: “i”: 未声明的标识符
166>dpm_cascade.cpp
166>dpm_cascade_detector.cpp
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2059: 语法错误:“)”
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(325): error C2275: “std::string”: 将此类型用作表达式非法
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(325): note: 参见“std::string”的声明
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(325): error C2146: 语法错误: 缺少“)”(在标识符“input_info”的前面)
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(327): error C2065: “input_info”: 未声明的标识符
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(349): error C2065: “input_info”: 未声明的标识符
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(349): error C2512: “testing::AssertionResult”: 没有合适的默认构造函数可用
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\ts\include\opencv2/ts/ts_gtest.h(19805): note: 参见“testing::AssertionResult”的声明 (编译源文件 D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp)
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(511): error C2059: 语法错误:“}”
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(511): error C2143: 语法错误: 缺少“;”(在“}”的前面)
203>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
解决方案资源管理器—>CMakeTargets—>INSTALL—>生成”然后又是等,好在这次时间很短。完成后你的build文件夹中会出现一个install文件夹
同样的动作对Release再做一遍。这回只有一个error, 就是上面qrcode那个,python那个在Release下没有问题。
用vs2022 做一个试试
参考:https://www.cnblogs.com/Fish0403/p/16728393.html 进行了选择
2.2.2 再次Configure,在新生成的选项中,勾选/取消勾选相关内容:
1. 勾选WITH_TBB
2. 勾选CUDA相关
3. 取消选择 java 的编译选项(个人不需要)
4. 勾选nonfree
5. 取消勾选TEST,加速编译
6. 勾选 BUILD_opencv_world 最终只生成一个动态链接库方便使用
7. 在 OPENCV_EXTRA_MODULES_PATH 中填入 OpenCV_contrib 解压文件夹 modules 的路径
8. 取消选择 OPENCV_GENERATE_SETUPVARS
2.2.3 再次Configure,xfeatures和face报错,因为用不到,我取消了勾选。选择显卡算力,10系卡为6.1,20系卡为7.5,30系卡为8.6。 (这个地方不知道是不是opencv470, 没有出现)
(configure后可能会有红字,要多次点configure后才产生无误的)
编译失败了:
23>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include\crt/host_config.h(158): fatal error C1189: #error: -- unsupported Microsoft Visual Studio version! Only the versions between 2015 and 2019 (inclusive) are supported!
原因是我的cuda不支持2022.
回到2017 编译 opencv 470
fatal error LNK 1210:已超过内部ILK大小限制,链接使用/INCREMENTAL:NO。
https://www.codenong.com/cs106881617/
解决方法:在opencv.sln中找到modules文件下对应的opencv_world工程,然后右键:属性->连接器->常规->启用增量链接:选择否(/INCREMENTAL:NO)。然后重新回到ALL_BUILD进行生成,然后INSTALL生成即可。
后续的测试
-
显示一个简单的图片(简单任务)
vs2022 + opencv 470, vs 2017 + opencv 470 都OK。 -
做个yolov4的测试,就是opencv 自带的sample。
opencv 470不行,出错。不管是用 vs2022 还是 vs2017编译器都有错,错误是说vector 有问题。 “vector subscript out of range”。这个问题就相对来说难查了,因为vector是系统的文件,基本上不能错,所以肯定中间某个地方出错了。具体出错的语句是:net.forward(outs, outNames); 这个比较难查了。 -
回到上面的460进行测试。
没有办法,回到460。用vs2017 进行编辑调试,那个yolo sample 是OK的。然后为了验证cuda的效果,强制其用cuda, 结果就出错了。给出的信息是“bin\cudnn_cnn_infer64_8.dll”。模块已生成,不包含符号”。我以这个为信息,进行百度,看到如下文章说缺少zlibwapi.dll (我之间检测错误的时候,好像在错误信息里面看到说找不到zlibwapi.dll,但是我再回去找却找不到了,所以我觉得这个应该是有价值尝试一下)
https://zhuanlan.zhihu.com/p/508176067,
按照上面的说法,去官网 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#install-zlib-windows
下载了zlibwapi.
果然,就OK了,然后用了cuda以后,检测速度明显提高很多。
然后又尝试了用vs2022来调试这个例子,用了460,都很OK。