windows下编译yolo(2021/1月更新)

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并且编译,应该是版本不一样,这个很烦,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做两种修改:

    1. 将所有的CUDA 11.x(具体数字忘了) props改成自己cuda的版本

    2. 打开darknet项目根目录下的Makefile,往下翻看到ARCH的值和显卡信号的对应,找到你的显卡对应的值:

      image-20210131174945464

      然后在darknet.vcproj搜索compute,把compute和sm后面的数字都换成Makefile中你显卡对应的形式。例如我的显卡是1050,那么就应该改为<CodeGeneration>compute_61,sm_61;compute_61,sm_61</CodeGeneration>。如果不改的话就会爆MSB372错误,这个解决方法是我在github中看到作者回复一个人的issue中找到的,其他博客很少提到(傲娇.jpg)

    3. 成功编译(如果有其他问题自行百度,我想不起来了2333)

    4. 但是!我使用编译出来的.exe文件会爆错!

      image-20210131172545160

      这个错误它的意思可能是文件地址不对,也就是命令行输入的命令参数有问题,但是我把它都改成了绝对路径、怎么改也无济于事,而且没办法debug(或者是我不会233)除非一点一点看源码,在vs里是不能直接debug的,会爆符号缺失(无法找到PBD文件),即使你设置了联网下载dll的符号文件,也有windows自己的符号下载不下来(猜测是闭源文件?)

    5. 但是幸好生成dll用python调用的方法是可用的,这个需要我们再编译那个yolo_cpp_dll.sln项目,也是需要改yolo_cpp_dll.vcxporj两种地方。这个python调用的方法自由度就高多了,可以用来实现各种功能

    6. 生成dll之后可以用darknet_images.py或者darknet_videos.py调用了,其实这一步也是玄学满满,我电脑上安装了三个版本的python,其他两个版本的都会爆找不到dll(即使它的dll路径是正确的),但是anaconda下的python是可以的。而且还可以遇到一些路径问题,这种就尽量尝试把相对路径改成绝对路径试下

    7. 最后成功出图:

      image-20210131173251044

    8. 还有一个要注意的地方,就是如果你和我一样把项目迁移到了另外一台电脑上应用的话(我的1050显存太小,放不下视频检测的模型。。。):

      1. 最好两个windows里opencv安装路径以及cuda的版本是一样的,这样编译后的版本才可能直接用,因为我试图直接调用的时候就爆了找不到文件,错误提示里面的路径是我原来电脑的路径
      2. 如果你这篇文章的方法添加了opencv的属性表,你们就要注意在.vcxporj文件下是有这个路径的,所以如果opencv路径不一样的话需要先到.vcxproj文件下把原来的路径删掉(具体在哪很好找,就是../../opencv这样的路径)再添加新的属性表
    9. 其实还遇到了一些其他的琐碎问题,但是我记不太清了,而且绝大多数能够通过搜索较快解决

    10. 对于自己训练好的模型,提供.data文件(data里主要就是classes的数要和.names文件对上以及.names文件路径正确)、.cfg文件(.cfg文件的最后输出classes也要和上面对上)、.names文件、训练好的.weight文件即可用于GPU加速的视频和图像的目标检测,注意可能要把资源路径变成绝对路径

posted @ 2021-01-31 17:52  别再闹了  阅读(1184)  评论(0编辑  收藏  举报