Yolov4在Win10部署、訓練和C++調用


最近想試一下使用Yolov4做目標檢測的效果,想要用最快的速度做出效果來,嘗試了使用pytorch,
但是由於需要轉換為C++,把訓練好的pth文件轉換為pt文件應用的過程中出現了各種各樣的問題,暫時不想花費大量的時間在這件事情上,所以轉而選擇了直接使用darknet。
以下全程使用windows,各項配置不發生變化。
測試過程中有一個小發現:我自己訓練用的圖像是三通道的圖像,訓練出來的模型用在單通道圖像上也是可行的,至少沒有出錯。

使用Darknet對已在coco數據集上訓練好的模型做目標檢測

darknet版本:2021.4.7的ID為e83d6526的提交
環境:

Win10
RTX 2060 6G
cuda 11.1
cuDNN 8.0.5 for cuda11.1
opencv 3.4.2
vs2019
darknet e83d6526

部署步驟參考下面的鏈接,有幾條注意事項寫在下面了,配合教程食用更加:
WIN10+YOLOv4,windows上完美執行YOLOv4目標檢測
注意:

  1. 通過查看darknet.vcxproj文件,發現此版本下依賴cuda11.1,上面的參考步驟中使用了cuda10.2,需要注意。
  2. 安裝了多個版本的cuda的情況下要注意有坑,簡單粗暴的方法是把其他版本的cuda卸載掉。由於對cuDNN的版本有要求,千萬不要偷懶,因為以前有安裝過其他版本的cuDNN,就沒有下載對應的版本,版本不對是一個很大的坑。
  3. opencv的版本建議一定要按照上面那個教程中的來,用其他版本有可能會有問題;配置的opencv庫目錄用的是vc14,這里可以改成vc15,親測沒有問題,有高版本的我還是傾向於選擇高版本的。
  4. nvidia的賬號建議注冊一個,不麻煩,下東西會方便很多。
  5. 教程中讓配置的各種環境變量,都配置一下,可以避免之后遇到的很多問題,如果遇到環境變量Path過長的問題,可以先將一些較長的路徑設置設置為名稱較短的系統變量,然后添加到Path中。
  6. 全都配置好之后打開項目編譯,按照上面的步驟應該會編譯通過,如果沒有通過不要慌,看錯誤,缺什么文件補什么文件,可能出現缺少某些opencv相關的dll或者lib文件,簡單粗暴的方法是缺什么就把什么放到程序目錄下;我還遇到過編譯結果只提示有一個錯誤,但是錯誤列表中什么都沒有的情況,排查后發現是cuda版本的問題。
  7. 官方給出的windows上darknet編譯,讓使用cmake來,沒有這個必要,反而對於不熟悉cmake的人來說,會出問題,直接編譯darknet.sln下面的項目就好了。包括其他幾個項目,如果不熟悉cmake,也直接編譯對應的項目就好了。

使用Darknet訓練自己的模型

全程參考了darknet在GitHub上的README,其中對於訓練過程做了詳細的說明,除了是用英文寫的,這份說明非常的完整。
指路:How to train (to detect your custom objects)
注意:

  1. 圖片的標記使用了說明中的Yolo_mark來標記,需要下載下來自己編譯,一般不會遇到太大的問題,opencv的目錄該配置的還是配置一下。標記的時候有一些快捷鍵還挺好用的,不用鼠標去點標簽和圖片了,可以提高效率,具體輸入h可以看幫助,我常用的是和數字鍵。
  2. 訓練過程中出現了顯存不夠的問題,有一些官方提供的解決方案:What does the error message "CUDA Error: out of memory" mean during training?
    我自己改了圖片大小,還把subdivisions改成了128,似乎有點誇張了。
  3. 在知道自己顯卡不太夠用剛好能夠跑起來的情況下,不要作死在訓練的過程中運行其他很占用顯存的程序,會導致訓練斷掉,特別是weights文件一個都還沒有保存的情況下。
  4. 訓練的那行命令不要完全按照說明中寫的來,路徑要按照實際路徑來,怕有問題索性就寫完整路徑,如果出現加載圖片失敗的情況,基本上就可以確定就是路徑出問題了,包括train.txt中的圖片路徑。
  5. 訓練完后可以用訓練的模型按照上面的方法看一下檢測效果。

Windows上C++使用Yolo官方提供的辦法調用自己訓練好的模型

指路官方:How to use Yolo as DLL and SO libraries
簡要概括:

  1. 第一步是要編譯出yolo_cpp_dll.dll和.lib文件,直接編譯yolo_cpp_dll.sln那個解決方案中的項目,編譯過程中可能出錯,
    建議直接按照編譯darknet時候的配置,可以減少很多出錯的可能性,但是還是有可能出錯,
    我遇到了一個cuda相關的錯誤,需要把下圖這個地方配置一下,去掉一些內容。
  2. 調用代碼參考:C++調用YOLOV4模型進行目標檢測-使用YOLOV4官方接口,這篇文章唯一的問題就是他是在Linux上調用的,而我要在Windows上調用。
  3. 自己的項目中要把yolo_cpp_dll.lib文件放進來,添加進鏈接器的附加依賴項中,yolo_v2_class.hpp這個文件也記得放進來,其他的一些項目配置,參考darknet,該放進來的都放進來,編譯過程中遇到鏈接之類的錯誤,一般就是附加依賴項中少配置了什么東西,總體上跑不出這些文件。
  4. 直接搬上面的文章中的代碼有點小問題,因為它是Linux系統中運行的,用了一些Linux系統自由的和時間相關的庫,相關內容去掉或者改成合適的就好了,當然,梳理一下代碼,自己寫出適合自己的就更合適了。


免責聲明!

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



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