iT邦幫忙

5

YOLO v4 建置心得 -- Windows 環境

  • 分享至 

  • xImage
  •  

前言

YOLO 是一個即時物件偵測(object detection)的模型,它處理速度可達 30 FPS,可以用在視訊上偵測移動的物體,平均準確度(mAP)可達 43.5%。只是要使用它,必須由原始碼建置,過程有些複雜,因此,將心得記錄下來,與同好分享。

YOLO 已經進化到第4版了,最近才發行,熱得發燙,趕快來試一下。

安裝

YOLO 的基礎為 Darknet,以 C 及 CUDA 撰寫而成,官網同時提供 LINUX 及 Windows 作業系統下的建置程序,在 LINUX 上以 GCC 建置應該是比較直覺而簡單,不過,筆者比較習慣使用 Windows 作業系統,因此,本文主要是說明在 Windows 下如何建置Darknet。

前置作業

前置作業須先安裝下列軟體:

  1. VS 2017 或 2019:須安裝 VC toolset、English language pack 元件。
    https://ithelp.ithome.com.tw/upload/images/20200520/20001976nSIaGFhOfy.png

https://ithelp.ithome.com.tw/upload/images/20200520/20001976WYqH35ICFD.png

  1. 若有NVidia獨立顯卡,需安裝 CUDA SDK:CUDA版本 > 10.0, cuDNN版本 > 7.0
    CUDA/CuDNN 並不是安裝最新版,需參考專案檔內的設定(darknet-master\build\darknet\darknet.vcxproj),使用記事本觀看最後幾行,目前是採用 v11.1:
    https://ithelp.ithome.com.tw/upload/images/20211108/200019761nBm81mbap.png

另外,必須把CUDA 的 bin 路徑加入環境變數 path 中,另外加入一環境變數 CUDA_PATH_V11_1,值為CUDA安裝路徑『C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1』。

可以使用記事本修改darknet.vcxproj,將CUDA版本更新,例如,11.1改為11.2,注意有兩處要改,可搜尋【11.】,環境變數也要隨之更改為CUDA_PATH_V11_2,值為CUDA安裝路徑『C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2』。

  1. OpenCV:版本須 > 2.4,下載原始程式碼

編譯及建置

  1. OpenCV官網下載 OpenCV Sources。
  2. 解壓縮至 c:\ 或 d:\,以下假設解壓縮在d:\opencv。
  3. Darknet github下載程式碼,解壓縮,,以下假設安裝在D:\darknet-master。
  4. 以 Visual Studio 開啟 D:\darknet-master\build\darknet\darknet.sln 檔案,會出現升級視窗,點選【確定】。 注意,若無NVidia獨立顯卡,改開啟 darknet_no_gpu.sln。如要使用其他版本,例如11.2,請修改darknet.vcxproj、yolo_cpp_dll.vcxproj,搜尋11.1 改為 11.2 (有兩處)。

若無 NVidia 獨立顯卡,也可以建置專案,開啟 darknet-master\build\darknet\darknet_no_gpu.vcxproj、yolo_cpp_dll_no_gpu.vcxproj,建置即可。

  1. 將Configuration 改為 release、x64。
    https://ithelp.ithome.com.tw/upload/images/20200616/20001976th8GtYAgqU.png

  2. 修改專案屬性,編修【VC++ Directories】> 【Include Directories】,加上:

  • D:\opencv\build\include
  • D:\opencv\build\include\opencv2
    https://ithelp.ithome.com.tw/upload/images/20200616/200019763NMcjHiSOY.png

https://ithelp.ithome.com.tw/upload/images/20200616/20001976UqidrEam4V.png

  1. 編修【連結器】> 【輸入】> 【其他相依性】,加上:
  • D:\openCV\build\x64\vc15\lib\opencv_world430.lib
  • 注意,若安裝較新版本的openCV,lib名稱會不同,例如opencv_world454.lib。後面有d的檔案為debug mode 使用,例如opencv_world454d.lib。
    https://ithelp.ithome.com.tw/upload/images/20200616/20001976NKkfUloMov.png

https://ithelp.ithome.com.tw/upload/images/20200616/20001976Ld2hq4sf4H.png

建置yolo_cpp_dll_no_gpu.vcxproj,若發生錯誤 LNK2001 unresolved external symbol make_implicit_layer,可依照编译yolo遇到 LNK2001 无法解析的外部符号 make_implicit_layer一文修改,文中的66行不用添加。建置成功的檔案也是yolo_cpp_dll.dll。

  1. 在darknet專案上按滑鼠右鍵,選【重建】,若出現【建置成功】,表示大功告成,執行檔在 D:\darknet-master\build\darknet\x64 目錄下。

  2. 自 D:\openCV\build\x64\vc15\lib 複製 opencv_world430.lib 至 D:\darknet-master\build\darknet\x64 目錄下。注意使用 vs2017,目錄應改為 vc14。

  3. 自 D:\openCV\build\x64\vc15\bin\ 複製 opencv_world430.dll 至 D:\darknet-master\build\darknet\x64 目錄下。注意使用 vs2017,目錄應改為 vc14。

  4. 『這裡』下載 yolov4.weights,放入 D:\darknet-master\build\darknet\x64 目錄。

  5. 執行下列指令測試:

darknet.exe detect .\cfg\yolov4.cfg .\yolov4.weights .\data\dog.jpg

另外目錄下還有許多 *.cmd 檔案可測試。
若無 NVidia 獨立顯卡,使用 darknet_no_gpu.exe,指令如下:

darknet_no_gpu.exe detect .\cfg\yolov4.cfg .\yov4.weights .\data\dog.jpg
  1. 若要使用 Python 呼叫 darknet API,需重建 yolo_cpp_dll.sln,修改方式與darknet專案相同。

  2. 複製必要的函數庫:

  • 自D:\darknet-master\3rdparty\pthreads\bin 複製 pthreadGC2.dll、pthreadVC2.dll
  • 自D:\openCV\build\bin 複製 opencv_videoio_ffmpeg430_64.dll
  • 自 D:\openCV\build\x64\vc15\lib 複製 opencv_world430.lib
  1. 複製D:\darknet-master\darknet_images.py至D:\darknet-master\build\darknet\x64目錄內,注意,2022/05版本darknet_images.py程式106行有錯:
if type(image_or_path) == "str":
# 應改為
if type(image_or_path) == str:

執行下列指令測試:

python darknet_images.py --input data/dog.jpg

要測試 no gpu 版本,可建置 yolo_cpp_dll_no_gpu.sln。

若發現dll找不到,可修改darknet.py加一行:

lib = CDLL("yolo_cpp_dll.dll", RTLD_GLOBAL)
  1. 還有一個 performBatchDetect function,可一次測試多個檔案。

  2. 視訊測試:找一個視訊檔,假設為test.mp4,執行下列指令:

python darknet_video.py --data_file cfg/coco.data --config_file cfg/yolov4.cfg --input test.mp4

輸出截圖如下:
https://ithelp.ithome.com.tw/upload/images/20211108/200019768TmEXkAumn.png

vcpkg 建置成功的程序

官網另外提供兩種 Windows 版的建置方法,建置時間較長:

  1. CMake:官網建議的方式。
  2. vcpkg:程序比較複雜。

依官網建議的方式,筆者從 CMake 著手,雖然很順利建置成功,但測試時卻發生以下錯誤。
https://ithelp.ithome.com.tw/upload/images/20200520/20001976e9i3EFxOoK.png

Google 一陣子,始終找不到解決的方法,因此,就不浪費篇幅說明建置的過程了。

以下就詳細說明另一種建置方法 -- vcpkg。

搞定上述軟體,開始建置Darknet,程序如下:

  1. 執行cmd,開啟DOS視窗。
  2. 首先從『官網』下載程式碼或執行下列指令:
    git clone https://github.com/Microsoft/vcpkg.git
  3. 更改當前目錄至vcpkg:
    cd vcpkg
  4. 執行 .\bootstrap-vcpkg.bat
  5. 建置 Darknet,執行下列指令,需要執行20分鐘以上:
    .\vcpkg install darknet[full]:x64-windows

花了半天的時間才搞定它,執行檔目錄在 vcpkg\installed\x64-windows\tools\darknet。
測試程序如下:

  1. 下載 yolov4.cfgyolov4.weights,放在 vcpkg\installed\x64-windows\tools\darknet 目錄中。
  2. 放一些圖片在 data 目錄中,執行下列指令:
    darknet detector cfg/yolov4.cfg yolov4.weights data/dog.jpg

https://ithelp.ithome.com.tw/upload/images/20200520/20001976yxqfzQ7bTb.png
正確偵測到自行車及狗,勝利成功, Ya !!

建置注意事項

使用 VS 2019,建置若有錯誤,可修改下列事項:

  1. 注意 darknet.vcxproj、yolo_cpp_dll.vcxproj 內的 CUDA 版本,目前(2021/11/08) 為 CUDA 11.1。需加入一環境變數 CUDA_PATH_V11_1,值為CUDA安裝路徑(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1)。, 如要使用其他版本,例如11.2,請修改darknet.vcxproj、yolo_cpp_dll.vcxproj,搜尋11.1 改為 11.2 (有兩處)。
  2. 複製 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions\*.* 至 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations。
  3. 修改專案屬性 > C/C++ > 命令列,在其他選項加 /FS,點選【套用】鈕。
  4. 清除專案,再建置專案。
  5. 若出現【dropout_layer_kernels.cu error code 2】錯誤,在【工具》選項》專案和方案》建置並執行】的【平時專案組見的最大數目】修改為 1。

無 NVidia 獨立顯卡

沒有 NVidia 獨立顯卡,也可以建置專案,開啟 darknet-master\build\darknet\darknet_no_gpu.vcxproj、yolo_cpp_dll_no_gpu.vcxproj,建置即可。

目前(2021/11/08)下載的yolo_cpp_dll_no_gpu.vcxproj有問題,專案需加入representation_layer.c、 representation_layer.h 兩個檔案,同時專案屬性的目標名稱須改為『$(ProjectName)』。
參閱『LNK2001 usresolved external symbol make_implicit_layer』

常見錯誤

yolo_cpp_dll.dll not found:

  1. 檢查相關的OpenCV library是否複製到目前目錄下(第14步驟)。
  2. 正確版本的 CUDA/CuDNN 是否安裝。
  3. 如果安裝較新版本的CUDA/CuDNN,也可能出現此錯誤,可在程式中加入以下指令,直接指定CUDA/CuDNN 所在位置及yolo_cpp_dll.dll/yolo_cpp_dll_no_gpu.dll所在目錄。
os.add_dll_directory('c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1/bin')
os.add_dll_directory(os.path.dirname(__file__))

參見StackOverflow

  1. 編譯時發生【CUDA 11.target XAML 無法編譯】錯誤時,請將c:windows\temp目錄盡可能清空,再重建專案即可。每隔一段時間重新編譯Darknet,總是會出現各式的問題,都要搞到半夜,錢難賺啊!!

結語

YOLO 4 專案雖然持續的擴充功能,但是測試好像不太周延,目前出現許多錯誤,偵錯有點辛苦。

工商廣告一下:
PyTorch:
開發者傳授 PyTorch 秘笈
https://ithelp.ithome.com.tw/upload/images/20220531/20001976MhL9K2rsgO.png
預計 2022/6/20 出版。

TensorFlow:
深度學習 -- 最佳入門邁向 AI 專題實戰
https://ithelp.ithome.com.tw/upload/images/20220531/20001976ZOxC7BHyN3.jpg


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
asdsdlgl
iT邦新手 5 級 ‧ 2020-07-15 09:46:38

想請問一下,當我利用vcpkg安裝完成yolov4並且能成功執行後,我希望能夠對yolov4的部份程式進行修改(新增一些對class的判斷式並且回傳box坐標之類的操作)並且重新編譯,我想請問一下應該要怎麼做?因為在跑完.\vcpkg install darknet[full]:x64-windows後就能有可執行的執行檔了,我要如何修改部份程式並重新編譯產生執行檔呢?
謝謝

src 目錄下有原始程式碼,可修改後,再建置即可。
應該是修改 yolo_layer.c 吧,我沒改過。

3
rtfgvb74125
iT邦新手 4 級 ‧ 2020-08-14 16:45:59

想請問yolo需要安裝在anaconda底下嗎?

不需要,任一目錄均可。

0
wishican0115
iT邦新手 5 級 ‧ 2021-02-25 16:20:42

我想請問一下,我用cmake build完之後,進去cmd import cv2可是它顯示 No module named 'cv2'

要安裝 opencv for python:
pip install opencv-python

orga_an21 iT邦新手 5 級 ‧ 2022-07-26 15:19:48 檢舉

請問一個問題,我也是遇到用cmake build完之後,進去cmd import cv2可是它顯示 No module named 'cv2'
那我看到您說要pip install opencv-python的留言,我照做了之後出現一大堆紅字,最後出現`WARNING: You are using pip version 19.2.3, however version 22.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
這些,我就直接下python -m pip install --upgrade pip然後opencv就升到4.6.0版本會不會太新了,我原本是用4.1.0
雖然到最後import cv2沒甚麼事發生然後輸入cv2.version
後就真的顯示4.6.0

這樣YOLO v4 -- Windows 環境建置有算成功嗎?
圖片上面沒有截到的部分其實有一大堆紅字
https://ithelp.ithome.com.tw/upload/images/20220726/201483510ElXxKw0YX.png

ERROR: Could not build wheels for opencv-python which use PEP 517 and cannot be installed directly
WARNING: You are using pip version 19.2.3, however version 22.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

C:\Users\user>python -m pip install --upgrade
ERROR: You must give at least one requirement to install (see "pip help install")
WARNING: You are using pip version 19.2.3, however version 22.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

C:\Users\user>python -m pip install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/9b/9e/9e0610f25e65e2cdf90b1ee9c47ca710865401904038558ac0129ea23cbc/pip-22.2-py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 19.2.3
    Uninstalling pip-19.2.3:
      Successfully uninstalled pip-19.2.3
Successfully installed pip-22.2

C:\Users\user>pip install opencv-python
Collecting opencv-python
  Downloading opencv_python-4.6.0.66-cp36-abi3-win32.whl (26.2 MB)
     ---------------------------------------- 26.2/26.2 MB 1.8 MB/s eta 0:00:00
Requirement already satisfied: numpy>=1.14.5 in c:\users\user\appdata\local\programs\python\python37-32\lib\site-packages (from opencv-python) (1.21.6)
Installing collected packages: opencv-python
Successfully installed opencv-python-4.6.0.66

C:\Users\user>pip install opencv-python
Requirement already satisfied: opencv-python in c:\users\user\appdata\local\programs\python\python37-32\lib\site-packages (4.6.0.66)
Requirement already satisfied: numpy>=1.14.5 in c:\users\user\appdata\local\programs\python\python37-32\lib\site-packages (from opencv-python) (1.21.6)

C:\Users\user>python
Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 09:44:33) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.6.0'
>>>

紅字有些是套件不相容的問題,opencv-python已安裝成功。

0
s1103
iT邦新手 5 級 ‧ 2021-08-09 14:23:11

請問我要在哪裡輸入第12.的程式碼呢?
我的darknet.exe開了會自動關閉
這是建立失敗了嗎?

s1103 iT邦新手 5 級 ‧ 2021-08-09 14:33:07 檢舉

我找到方法了
是cmd的語法問題
請問14.的檔案是要複製到哪裡呢
我是使用spyder做撰寫的
感謝您的這篇文章

與 darknet.exe 同目錄。

1
crowntail
iT邦新手 4 級 ‧ 2021-10-27 17:01:54

:D
謝謝,好詳盡的解說

謝謝,動力+1。

0
tony89294
iT邦新手 5 級 ‧ 2021-10-27 21:27:26

你好
我都裝完測試正常
最後測試.\darknet
就會出現以下錯誤
https://ithelp.ithome.com.tw/upload/images/20211027/20143491fcJtfPhXKG.jpg

tony89294 iT邦新手 5 級 ‧ 2021-10-27 21:40:44 檢舉

https://ithelp.ithome.com.tw/upload/images/20211027/20143491xYt7uG0seq.jpg
還有其他問題QQ 這個很像是因為程式碼抓不到yolov4_cpp_dll但是我看不出來是哪裡出錯

請檢查步驟 13、14 。

0
s10955047
iT邦新手 5 級 ‧ 2022-02-16 00:01:41

請問是在步驟12指令執行時就會跑出Yolo的檢測框嗎?

會喔。

0
piazza
iT邦新手 5 級 ‧ 2022-07-24 10:41:52

我在重置darknet時,出現無法開啟輸入檔,請問我在那裡設定錯了,要如何設定呢?
https://ithelp.ithome.com.tw/upload/images/20220724/20150714Mhzvx7YNqE.jpg

piazza iT邦新手 5 級 ‧ 2022-07-24 11:05:54 檢舉

我找到我的問題點了。謝謝

讚!

0
alexlee24
iT邦新手 5 級 ‧ 2022-08-17 00:04:37

https://ithelp.ithome.com.tw/upload/images/20220817/20151509Bl9EPHmfOZ.png
請問遇到這個狀況怎麼辦? 在測試python darknet_images.py --input data/dog.jpg時遇到的

看更多先前的回應...收起先前的回應...

請參考【常見錯誤】段落。

alexlee24 iT邦新手 5 級 ‧ 2022-08-17 10:15:15 檢舉

Traceback (most recent call last):
File "D:\YOLO\darknet-master\build\darknet\x64\darknet_images.py", line 237, in
main()
File "D:\YOLO\darknet-master\build\darknet\x64\darknet_images.py", line 219, in main
image, detections = image_detection(
File "D:\YOLO\darknet-master\build\darknet\x64\darknet_images.py", line 102, in image_detection
width = darknet.network_width(network)
File "D:\YOLO\darknet-master\build\darknet\x64\darknet.py", line 61, in network_width
return lib.network_width(net)
ctypes.ArgumentError: argument 1: <class 'OverflowError'>: int too long to convert
修改完之後可以跑了,但跑完到done之後,出現了以上這些,請問怎麼辦呀? 謝謝

在本文搜尋darknet_images.py,查詢相關用法與錯誤修正。

alexlee24 iT邦新手 5 級 ‧ 2022-08-18 09:09:17 檢舉

我是修正過也丟到x64後遇到這個問題的耶

0
csiefly0722
iT邦新手 5 級 ‧ 2022-11-22 07:13:43

問題圖片
嘗試過安裝註冊檔zlibwapi.dll但得到結果為不是64位元無法執行註冊~
zlibwapi.dll. Error code 193
懇請指教~謝謝

筆者手邊並無32位元作業系統,無法測試,抱歉。

我是64位元的系統~謝謝您~我在多嘗試網路上的方法~

0
sunnyyao37
iT邦新手 5 級 ‧ 2023-02-06 14:24:53

您好:
請教如果我不使用GPU且不用VS code,但是用PyCharm,那可以安裝Darknet嗎?要如何安裝?謝謝!!!

不使用GPU ==> OK.
Darknet ==> 使用C/C++開發,需使用C/C++編譯器。

我要留言

立即登入留言