windows下编译yolo(2021/1月更新)
之前模型的话一般都是用tensorflow或者pytorch框架下的实现,但是现在有个任务是最好用yolo,并且最好是windows平台,所以搞了一下,还挺麻烦,有不少坑。这里总结下。
项目地址:https://github.com/AlexeyAB/darknet
windows平台下根据文档所说是两种编译方法,一种是借助VS的CMake,一种是vcpkg.
vcpkg方法
vcpkg的方法其实就是这几行命令:
PS Code\> git clone https://github.com/microsoft/vcpkg
PS Code\> cd vcpkg
PS Code\vcpkg> $env:VCPKG_ROOT=$PWD
PS Code\vcpkg> .\bootstrap-vcpkg.bat
PS Code\vcpkg> .\vcpkg install darknet[full]:x64-windows #replace with darknet[opencv-base,cuda,cudnn]:x64-windows for a quicker install of dependencies
PS Code\vcpkg> cd ..
PS Code\> git clone https://github.com/AlexeyAB/darknet
PS Code\> cd darknet
PS Code\darknet> powershell -ExecutionPolicy Bypass -File .\build.ps1
- 首先遇到的问题是如果你的vs安装的是中文版会提示缺少英文语言包,这个去vs installer下一个语言包就好了
- 主要的,vcpkg下载巨慢(国内网络嘛,理解),当然你可以开代理,但是我没有,这个也没有什么换源的操作。所以只能粘贴它的下载url到迅雷来P2P加速下载,问题是有些包你自己下载完了放到download目录它就会当成是cache用,但是有些就不行,比如它下载OpenCV时先下载到tmp文件夹中的包,无论你怎么粘贴它都会重新下载,这个网络要是不好的话会折腾很久很久,这个vcpkg包管理还是慎用
- 我之前其实已经安装了opencv的windows版,也加了环境变量,但是它还是会重新下载opencv并且编译,应该是版本不一样
- 我一开始使用vs2019社区版,编译opencv会出错(原谅我实在不记得是什么错误了,在浏览器历史记录找了半天没找到),网上搜索有一个建议是用vs2017及以下,卸载vs2019重装vs2017成功编译
- 编译完Opencv后会下载darknet相关的文件,这里vcpkg有两个哈希是错的,github上去年有人已经提出了这个issue了,这里我们需要去portfile.cmake里把这两个哈希改了
- 重点来了,在按命令要求运行.\build.ps1后,会提示‘找不到路径“darknet\build_win_release\DarknetConfig.cmake”,因为该路径不存在‘,github上也有人提到了同样的问题:https://github.com/AlexeyAB/darknet/issues/5996 这个这个,确实目录下是没有这个文件的,然后也没有什么好的解决办法,感觉可能是作者改项目目录然后和vcpkg的命令没有协调好。所以这也是我为什么在标题里加上了日期,因为我网上看到有其他人vcpkg是可以编译成功的,可能是最近出现的新问题
cmake方法
-
需要先安装好opencv\cuda\cudnn\vs,这里我参考的是这篇文章的步骤.注意这里cuda安装时会同时安装一个visual studio integration,但是如果你和我一样所示先安装的cuda后安装的vs那么我建议重新下载cuda的安装包安一下。我笔记本的显卡是1050,下载cuda10.1安装后没有成功安装visual studio integration,改为安装cuda10.0后正常。可以进你vs安装目录的下的Common7\IDE\VC\VCTargets\BuildCustomizations看看有没有CUDA XX.X props\targets
-
clone好代码后进入darknet\build\darknet,点击darknet.sln打开vs。这里注意要对darknet.vcproj做两种修改:
-
将所有的CUDA 11.x(具体数字忘了) props改成自己cuda的版本
-
打开darknet项目根目录下的Makefile,往下翻看到ARCH的值和显卡信号的对应,找到你的显卡对应的值:
然后在darknet.vcproj搜索compute,把compute和sm后面的数字都换成Makefile中你显卡对应的形式。例如我的显卡是1050,那么就应该改为
<CodeGeneration>compute_61,sm_61;compute_61,sm_61</CodeGeneration>
。如果不改的话就会爆MSB372错误,这个解决方法是我在github中看到作者回复一个人的issue中找到的,其他博客很少提到(傲娇.jpg) -
成功编译(如果有其他问题自行百度,我想不起来了2333)
-
但是!我使用编译出来的.exe文件会爆错!
这个错误它的意思可能是文件地址不对,也就是命令行输入的命令参数有问题,但是我把它都改成了绝对路径、怎么改也无济于事,而且没办法debug(或者是我不会233)除非一点一点看源码,在vs里是不能直接debug的,会爆符号缺失(无法找到PBD文件),即使你设置了联网下载dll的符号文件,也有windows自己的符号下载不下来(猜测是闭源文件?)
-
但是幸好生成dll用python调用的方法是可用的,这个需要我们再编译那个yolo_cpp_dll.sln项目,也是需要改yolo_cpp_dll.vcxporj两种地方。这个python调用的方法*度就高多了,可以用来实现各种功能
-
生成dll之后可以用darknet_images.py或者darknet_videos.py调用了,其实这一步也是玄学满满,我电脑上安装了三个版本的python,其他两个版本的都会爆找不到dll(即使它的dll路径是正确的),但是anaconda下的python是可以的。而且还可以遇到一些路径问题,这种就尽量尝试把相对路径改成绝对路径试下
-
最后成功出图:
-
还有一个要注意的地方,就是如果你和我一样把项目迁移到了另外一台电脑上应用的话(我的1050显存太小,放不下视频检测的模型。。。):
- 最好两个windows里opencv安装路径以及cuda的版本是一样的,这样编译后的版本才可能直接用,因为我试图直接调用的时候就爆了找不到文件,错误提示里面的路径是我原来电脑的路径
- 如果你这篇文章的方法添加了opencv的属性表,你们就要注意在.vcxporj文件下是有这个路径的,所以如果opencv路径不一样的话需要先到.vcxproj文件下把原来的路径删掉(具体在哪很好找,就是../../opencv这样的路径)再添加新的属性表
-
其实还遇到了一些其他的琐碎问题,但是我记不太清了,而且绝大多数能够通过搜索较快解决
-
对于自己训练好的模型,提供.data文件(data里主要就是classes的数要和.names文件对上以及.names文件路径正确)、.cfg文件(.cfg文件的最后输出classes也要和上面对上)、.names文件、训练好的.weight文件即可用于GPU加速的视频和图像的目标检测,注意可能要把资源路径变成绝对路径
-