windows10下编译darknet版的yolo过程及踩坑记录(CPU/GPU)

0 背景

原先是在ubuntu16.04下运行的GPU下的darknet版的yolo网络,最近由于需要制作GUI界面,加之之前看到过windows下也可以编译,因此切换到windows下。

1 CPU版的编程

1.1 生成darknet.exe

网上win下的编译教程很多,如:【Win10+VS2015安装配置YOLO3(CPU/GPU)】和【Windows10+YOLOV3+VisualStudio2017最新版本超详细过程】等,其中第二篇博客也列出了一些error的解决办法
编译过程也很顺利,打开darknet.sln,切换到Release+x64模式下,点击项目右键"生成",编译成功后,在x64文件夹下生成了darknet.exe后,便可以在x64目录下创建darkent_no_gpu.cmd,写入“darknet.exe detector test voc.data yolo.cfg yolo.weights”,双击打开该文件,自动弹出命令行,相当于在命令行下调用

darknet.exe detector test voc.data yolo.cfg yolo.weights

运行算法,当提示输入图片路径时,输入待识别的图片路径名,对图片进行识别了。
一开始考虑采用MATLAB制作GUI,采用system(cmd)语句,事先将需要在命令行中运行的语句赋值给cmd:

cmd = 'darknet.exe detector test voc.data yolo.cfg yolo.weights';
system(cmd);

但是这样就会占用matlab的命令输出窗口作为命令行的显示,无法进行交互,无法在处理完一张图像后接着输入另一幅图像的路径,只能一次处理一副图像,然后重新调用模型进行识别:

%// 处理十张图片
for i = 1:10
  cmd = ['darknet.exe detector test voc.data yolo.cfg yolo.weights figures/' num2str(i) '.jpg'];
  system(cmd);
end

于是转到vs工程。

1.2 生成yolo_cpp_dll_no_gpu.dll

方法类似于darknet的步骤,只是变成了编译yolo_cpp_dll_no_gpu.sln。编译完成后,即可在x64文件夹下生成yolo_cpp_dll_no_gpu.dll。
参考【VS2015图形界面YOLO3应用程序】即可创建调用该dll的界面程序。需要注意的是调用dll的工程与生成dll的工程配置需一致,如均为debug、x64,或者均为release、x64。
但是调用时间较长,大约30秒一副图像,因此考虑GPU版。

2 GPU版的编程

2.1 安装cuda和cuDnn

安装的是cuda10.2和对应的cudnn7.6,显卡1080ti安装了对应cuda10.2的【441.28-desktop-win10-64bit-international-nsd-whql-rp】

2.2 生成darknet.exe文件

修改darknet.vcxproj文件中的两处cuda版本号,打开darknet.sln文件,添加opencv的配置项,切换到Release、x64模式下,重新编译darknet.sln,在x64文件夹下便可得到生成的darknet.exe文件。
运行darknet_gpu.cmd即可打开命令行,调用模型,当提示“Enter Image Path:”时,输入相对于darknet.exe的图像路径,如net/1.jpg,可得到识别结果分数和弹出的识别结果图。

2.3 生成yolo_cpp_dll.dll

修改yolo_cpp_dll.vcxproj文件中的两处cuda版本号,打开yolo_cpp_dll.sln文件添加opencv的配置项,切换到Release、x64模式下,重新编译yolo_cpp_dll.sln,在x64文件夹下可得到生成的yolo_cpp_dll.dll文件,可用于其他工程调用。

3 踩坑的地方

3.1 CPU下编译dll文件

errror1:调用dll语句报错
一开始编译yolo_cpp_dll_no_gpu.dll时,忽略了模式的设置,在debug、x64模式下生成,因此在编写MFC界面采用release + x64模式调用dll时,在运行到调用detector语句时报错,无法正常调用dll文件。后来将MFC程序在debug + x64 模式下运行即可正常运行(opencv也要在该模式下进行配置)。

3.2GPU下安装CUDA

(1)下载安装cuda10.2+cudnn7.6

error2:cmd下运行darknet.exe报错

扫描二维码关注公众号,回复: 16755991 查看本文章

一开始未看显卡驱动的版本,只看到网上说cuda需要和cudnn版本一致,且官网上只看到最新版的,于是就下了【最新版的cuda10.2】,以及对应的cudnn版本【需要官网注册,一开始网络不好,一直进不去】,安装后,编译darknet.sln后能成功生成darknet.exe文件,但是运行cmd文件调用darknet.exe,报错:CUDA driver version is insufficient for CUDA runtime version
再上网查看,发现安装的cuda、cudnn的版本以及显卡驱动版本均要匹配,匹配关系可以看【nvidia显卡,驱动以及cuda版本对应查询】,或者是【官网的Release Note 说明】。
Table 1. CUDA Toolkit and Compatible Driver Versions

CUDA Toolkit Linux x86_64 Driver Version Windows x86_64 Driver Version
CUDA 10.2.89 >= 440.33 >= 441.22
CUDA 10.1 (10.1.105 general release, and updates) >= 418.39 >= 418.96
CUDA 10.0.130 >= 410.48 >= 411.31
CUDA 9.2 (9.2.148 Update 1) >= 396.37 >= 398.26
CUDA 9.2 (9.2.88) >= 396.26 >= 397.44
CUDA 9.1 (9.1.85) >= 390.46 >= 391.29
CUDA 9.0 (9.0.76) >= 384.81 >= 385.54
CUDA 8.0 (8.0.61 GA2) >= 375.26 >= 376.51
CUDA 8.0 (8.0.44) >= 367.48 >= 369.30
CUDA 7.5 (7.5.16) >= 352.31 >= 353.66
CUDA 7.0 (7.0.28) >= 346.46 >= 347.62

桌面右键进入nvidia控制面板,点击左下角的系统信息,在显示中可以查看此时的驱动版本为:391.35,在组件中可以查看对应的cuda版本为9.1.84。

(2)下载安装cuda9.0+cudnn7.1

error3:编译darknet.sln工程生成darknet.exe报错
然后按照显卡控制提示和匹配表,上网下了cuda9.0【NVIDIA CUDA各版本下载链接(更新至2019-12-11,包含最新10.2版本)】和cudnn7.1,卸载了10.2后再安装,再修改相应的配置并编译darknet.sln时,提示errror…msb3721,已退出,返回值为1,不知道哪里出错了,可能时卸载的不够完全。
此时通过nvidia控制面板,查看到此时的驱动版本为:388.19,在组件中可以查看对应的cuda版本为9.1.83。

(3)重新安装441.28版本驱动+cuda10.2+cudnn7.6

error4:安装新版显卡驱动时版本不兼容报错
考虑到一开始cuda10.2可以正常编译,因此又下了【1080ti的显卡驱动】:”442.19-desktop-win10-64bit-international-nsd-dch-whql,可是安装时提示DHC版本不支持该windows版本,搜索一番,发现驱动也有不同版本,于是又下了一个【standard版本】:441.28-desktop-win10-64bit-international-nsd-whql-rp,未卸载cuda9.0,然后再安装cuda10.2和cudnn7.6,只是重新解压了一个工程,重新配置,然后就生成成功了,速度的确是比cpu版的要快。

猜你喜欢

转载自blog.csdn.net/alansss/article/details/104448347