本次曠世大作yolo v4 的 GitHub連結在此:https://github.com/AlexeyAB/darknet
以下的內容基本上會照著Readme的說明一步步建立環境
本篇會記錄在Win10 ver 1909 作業環境之下使用VS2019編譯Darknet的過程
有關Linux的部分,GitHub上的Readme有說明,但我只是個業餘小弱弱,基本上沒用過,所以Linux的部分皆不會在本文出現
一、電腦基本配置
我的電腦是Windows 10 Version 1909 x64
基本上Version 1909的判斷就是「開始」旁邊有沒有一個很大的搜尋空白列
硬體配備都是老機器了
CPU: Intel® Core™ i5-4460 @3.20GHz
RAM: 8G
GPU: NVIDIA GeForce GTX 750
從Dxdiag上查到:
記憶體總計約為:6050MB
顯示記憶體(VRAM):2007MB
共用記憶體:4043MB
不知道這樣算是幾G的GPU記憶體容量
二、前置準備
Readme的第0節:Requirements
Readme上有說需要準備幾項(Readme上僅有1~6,7的ZED SDK是我自己補上):
1. CMake >= 3.8 for modern CUDA support: https://cmake.org/download/
我自己是下載這個: cmake-3.17.2-win64-x64.msi
安裝過程會遇到要加入環境變數的選單,選擇all users
2. CUDA 10.0: https://developer.nvidia.com/cuda-toolkit-archive
因為我使用VS2019 所以這裡必須使用CUDA10.1,否則到時CMake在跑Configure時會出錯,我是抓CUDA Toolkit 10.1 update2 [Aug 2019]
network安裝和local安裝都一樣,我選擇network安裝
我第一次安裝時選快速,結果不知是發生什麼事,竟然沒有安裝完全,所以第二次改用自訂確認安裝路徑
3. OpenCV >= 2.4: OpenCV official site (on Windows set system variable OpenCV_DIR = C:\opencv\build)
當前最新版本是4.3.0,就直接抓Windows版本,解壓縮後放在C:\下
然後建立環境變數OpenCV_DIR(此步驟可以等1~7的前置安裝都完成後再來進行,因為我在安裝過程發現這個環境變數會被洗掉)
4. cuDNN >= 7.0 for CUDA 10.0 => 7.6.4 [September 27, 2019], for CUDA 10.1: https://developer.nvidia.com/rdp/cudnn-archive
(on Windows copy cudnn.h,cudnn64_7.dll, cudnn64_7.lib as desribed here https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installwindows )
需要NVIDIA Developer的帳號才能下載,跟NVIDIA是不同帳戶(我是沒有NVIDIA帳戶而只有辦NVIDIA Developer的帳戶),所以快去辦一個吧~
辦好後就可以進入如下畫面下載cuDNN
deeplearning SDK Document的4.3說明,執行1~4步驟,第5步驟不用
簡單說,就是把cuDNN的三個檔案放到CUDA對應的資料夾內即可,然後再於環境變數增加CUDA_PATH的變數
不過這個步驟應該在安裝CUDA時就已經自動寫入,可以在這個步驟再檢查一次
5. GPU with CC >= 3.0: https://en.wikipedia.org/wiki/CUDA#GPUs_supported
NVIDIA自己給的介紹,並經wiki整理的表得知,我的GeForce GTX 750很幸運擁有Compute capability 5.0的等級,超過yolo v4要求的3.0,不然這一篇也不用寫了~
6. on Windows MSVC 2015/2017/2019 : https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community
我的電腦本身就有裝VS2019,我有試過2015和2017,自己是失敗地莫名其妙,所以就只寫出2019成功建置經過啦~”~
安裝的時候需要勾選「使用C++的桌面開發」,可以順便勾選「Python開發」
7. ZED SDK ver 3.1.2 for CUDA 10.0 for Windows 10 : https://www.stereolabs.com/developers/release/
需要這個SDK的原因在於後續CMake建立Configure時會用到,所以雖然Readme沒有將ZED SDK列入Requirements,但我還是把這個寫入前置準備
三、在Windows編譯Darknet
在這個步驟,我選擇用Readme推薦的Using CMake-GUI
1. Configure
CMake,Where is the source code指定有「CMakeLists.txt」的路徑,Where to build the binaries指定Darknet內的build\darknet,這是VS要Compile的源代碼資料夾
2. Optional platform for generator (Set: x64)
3. Finish
下圖是GitHub上的Demo結果,有展開的部分我盡量能保持一致就一致
以下是我的展開圖
在執行時,可能發生以下問題:
A. Looking for a CUDA compiler – NOTFOUND
請依照以下步驟排除問題:
- 前往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檢查此路徑下是否不存在這四個檔案
- 若真的不存在,則將1.的四個檔案複製到2.的路徑之下
4. 從CMake -> File -> Delete Cache,刪除上次的結果
5. 重新在CMake上Configure一次,若成功即可在Log上看到已抓到CUDA 10.1的編譯器
B. OpenCV發生找不到的問題
請依以下流程排除問題
- 檢查環境變數裡的Open_DIR有沒有在剛剛一系列的安裝中莫名消失,有的話請補上
- 關閉CMake,重新開一個新的程式,讓CMake重新讀取環境變數
- 從CMake -> File -> Delete Cache,刪除上次的結果
- 重新在CMake上Configure一次,若成功即可在Log上看到已抓到OpenCV
4. Generate : 會在build下產生新的Darknet.sln
5. Open Project
6. Set: x64 & Release
7. Build & 8. Build solution è F6按鈕 : 等輸出Log跑完
只要是0失敗即可
我的電腦是輸出到Release之下,要將Release內的檔案全複製到x64之下
四、How to use on the command line
使用命令式來確認Darknet.exe可以正常執行
1. 若發生下圖錯誤,須至C:\opencv\build\x64\vc15\bin找到opencv_world430.dll,並複製到D:\YOLOv4\darknet-master\build\darknet\x64之下
2. 如果發生pthreadVC2.dll的錯誤
則可以到以下網址下載
https://sourceware.org/pthreads-win32/#download
ftp://sourceware.org/pub/pthreads-win32
下載後解壓縮,將\Pre-built.2\dll\x64內的pthreadVC2.dll,放到D:\YOLOv4\darknet-master\build\darknet\x64之下就可以
(D:\YOLOv4\darknet-master\build\darknet\x64裡面應該本來就有)
預練模型下載:
將以下進入的文字全複製,存成yolov4.cfg
https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4.cfg
再下載 yolov4.weights
兩個檔案都放到D:\YOLOv4\darknet-master\build\darknet\x64之下
開始執行command line
darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
如果發生CUDA out of menory的錯誤,代表GPU的自帶記憶體不夠大,有兩種解決辦法
打開cfg/yolov4.cfg (如果command line裡面不是用cfg/yolov4.cfg 而是 yolov4.cfg,則需要開啟的檔案是x64之下你剛剛自己製作並放進去的檔案)
1. 在最上面找到subdivisions,後面數字越大越好,不清楚最高是不是64,但是錯誤內容會跟你說可以將這個參數調高
意義是每次訓練時batch的數量再依照subdivisions切割一次,變成每次跑batch/subdivisions,跑完再合併成一個batch,所以越大可以減少同時的記憶體負擔量
2.找到width和height,把這兩個數字調小,同樣可以減少每次模型訓練的資源耗用
width=608
height=608
一切成功的話會看到161層的模型跑完
呼叫經典的dog.jpg驗證模型結果
D:\YOLOv4\darknet-master\build\darknet\x64\dog.jpg
影片分析:
我用的素材是復仇者聯盟4的預告片: https://www.youtube.com/watch?v=ZrB7EdfPBJU
我將影片下載下來(網上有很多youtube影片下載工具,自行選擇吧)
因為怕電腦跑不動,所以只載壓縮後的640x266大小
在Readme上有說請盡量不要選擇影片大小超過1920x1080的,可能會影響CPU效能,但我想我的慘況應該還不用到那麼高畫質來懲罰...
執行以下命令
darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights Averger4Pre360.mp4 -out_filename Averger4Pre360Res.mp4
在Readme上是寫讀取test.mp4,可轉成res.avi,代表可以針對*.mp4和*.avi自由切換,但好像也僅限這兩種格式
如果執行後出現CvCapture initStream Failed to set mediaType之類的錯誤
請到C:\opencv\build\x64\vc15\bin將opencv_videoio_ffmpeg430_64.dll複製到D:\YOLOv4\darknet-master\build\darknet\x64之下
在執行過程,如果該幀有可被判讀的物件,就會在cmd裡秀出判定的物件跟判定機率,如下圖
最後跑完會存檔成Avenger4Pre360Res.mp4
我的電腦太渣了,AVG_FPS只有1.8,一個2分半的預告片生生被我跑了快1個小時才分析完
最後結果如下
說一下對於分析結果的看法,可能是因為訓練資料是微軟的COCO,這是一份人臉辨識的資料庫
所以影片中對於"人"的準確率很高,但其他的就不怎麼OK了
例如Tony Stark的鋼鐵心臟,被分析成時鐘(陳時中??XD不好意思 自動選字跳出"時中" 笑了一下)
箭靶也是時鐘,黑幕變成冰箱???
後續再繼續玩看看還有沒有其他花招吧
我先去了解要如何提高AVG_FPS吧~
下一篇是YOLOv4辨識自定義物件 with LabelImg
歡迎來指導我寫錯或漏操作的步驟,謝謝!!