YOLO 是一個即時物件偵測(object detection)的模型,它處理速度可達 30 FPS,可以用在視訊上偵測移動的物體,平均準確度(mAP)可達 43.5%。只是要使用它,必須由原始碼建置,過程有些複雜,因此,將心得記錄下來,與同好分享。
YOLO 已經進化到第4版了,最近才發行,熱得發燙,趕快來試一下。
YOLO 的基礎為 Darknet,以 C 及 CUDA 撰寫而成,官網同時提供 LINUX 及 Windows 作業系統下的建置程序,在 LINUX 上以 GCC 建置應該是比較直覺而簡單,不過,筆者比較習慣使用 Windows 作業系統,因此,本文主要是說明在 Windows 下如何建置Darknet。
前置作業須先安裝下列軟體:
另外,必須把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』。
若無 NVidia 獨立顯卡,也可以建置專案,開啟 darknet-master\build\darknet\darknet_no_gpu.vcxproj、yolo_cpp_dll_no_gpu.vcxproj,建置即可。
將Configuration 改為 release、x64。
修改專案屬性,編修【VC++ Directories】> 【Include Directories】,加上:
建置yolo_cpp_dll_no_gpu.vcxproj,若發生錯誤 LNK2001 unresolved external symbol make_implicit_layer,可依照编译yolo遇到 LNK2001 无法解析的外部符号 make_implicit_layer一文修改,文中的66行不用添加。建置成功的檔案也是yolo_cpp_dll.dll。
在darknet專案上按滑鼠右鍵,選【重建】,若出現【建置成功】,表示大功告成,執行檔在 D:\darknet-master\build\darknet\x64 目錄下。
自 D:\openCV\build\x64\vc15\lib 複製 opencv_world430.lib 至 D:\darknet-master\build\darknet\x64 目錄下。注意使用 vs2017,目錄應改為 vc14。
自 D:\openCV\build\x64\vc15\bin\ 複製 opencv_world430.dll 至 D:\darknet-master\build\darknet\x64 目錄下。注意使用 vs2017,目錄應改為 vc14。
自『這裡』下載 yolov4.weights,放入 D:\darknet-master\build\darknet\x64 目錄。
執行下列指令測試:
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
若要使用 Python 呼叫 darknet API,需重建 yolo_cpp_dll.sln,修改方式與darknet專案相同。
複製必要的函數庫:
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)
還有一個 performBatchDetect function,可一次測試多個檔案。
視訊測試:找一個視訊檔,假設為test.mp4,執行下列指令:
python darknet_video.py --data_file cfg/coco.data --config_file cfg/yolov4.cfg --input test.mp4
輸出截圖如下:
官網另外提供兩種 Windows 版的建置方法,建置時間較長:
依官網建議的方式,筆者從 CMake 著手,雖然很順利建置成功,但測試時卻發生以下錯誤。
Google 一陣子,始終找不到解決的方法,因此,就不浪費篇幅說明建置的過程了。
以下就詳細說明另一種建置方法 -- vcpkg。
搞定上述軟體,開始建置Darknet,程序如下:
花了半天的時間才搞定它,執行檔目錄在 vcpkg\installed\x64-windows\tools\darknet。
測試程序如下:
正確偵測到自行車及狗,勝利成功, Ya !!
使用 VS 2019,建置若有錯誤,可修改下列事項:
沒有 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:
os.add_dll_directory('c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1/bin')
os.add_dll_directory(os.path.dirname(__file__))
YOLO 4 專案雖然持續的擴充功能,但是測試好像不太周延,目前出現許多錯誤,偵錯有點辛苦。
工商廣告一下:
PyTorch:
開發者傳授 PyTorch 秘笈
預計 2022/6/20 出版。
TensorFlow:
深度學習 -- 最佳入門邁向 AI 專題實戰。
想請問一下,當我利用vcpkg安裝完成yolov4並且能成功執行後,我希望能夠對yolov4的部份程式進行修改(新增一些對class的判斷式並且回傳box坐標之類的操作)並且重新編譯,我想請問一下應該要怎麼做?因為在跑完.\vcpkg install darknet[full]:x64-windows後就能有可執行的執行檔了,我要如何修改部份程式並重新編譯產生執行檔呢?
謝謝
src 目錄下有原始程式碼,可修改後,再建置即可。
應該是修改 yolo_layer.c 吧,我沒改過。
我想請問一下,我用cmake build完之後,進去cmd import cv2可是它顯示 No module named 'cv2'
要安裝 opencv for python:
pip install opencv-python
請問一個問題,我也是遇到用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 環境建置有算成功嗎?
圖片上面沒有截到的部分其實有一大堆紅字
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已安裝成功。
請問我要在哪裡輸入第12.的程式碼呢?
我的darknet.exe開了會自動關閉
這是建立失敗了嗎?
我找到方法了
是cmd的語法問題
請問14.的檔案是要複製到哪裡呢
我是使用spyder做撰寫的
感謝您的這篇文章
與 darknet.exe 同目錄。
你好
我都裝完測試正常
最後測試.\darknet
就會出現以下錯誤
還有其他問題QQ 這個很像是因為程式碼抓不到yolov4_cpp_dll但是我看不出來是哪裡出錯
請檢查步驟 13、14 。
我在重置darknet時,出現無法開啟輸入檔,請問我在那裡設定錯了,要如何設定呢?
我找到我的問題點了。謝謝
讚!
請問遇到這個狀況怎麼辦? 在測試python darknet_images.py --input data/dog.jpg時遇到的
請參考【常見錯誤】段落。
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,查詢相關用法與錯誤修正。
我是修正過也丟到x64後遇到這個問題的耶
嘗試過安裝註冊檔zlibwapi.dll但得到結果為不是64位元無法執行註冊~
zlibwapi.dll. Error code 193
懇請指教~謝謝
筆者手邊並無32位元作業系統,無法測試,抱歉。
我是64位元的系統~謝謝您~我在多嘗試網路上的方法~
您好:
請教如果我不使用GPU且不用VS code,但是用PyCharm,那可以安裝Darknet嗎?要如何安裝?謝謝!!!
不使用GPU ==> OK.
Darknet ==> 使用C/C++開發,需使用C/C++編譯器。