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加速的視頻和圖像的目標檢測,注意可能要把資源路徑變成絕對路徑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM