2020年5月12日 星期二

YOLOv4 來了!!


一段時間沒上GitHub看看

沒想到YOLOv4真的來了!!


YOLOv3的原作者Joe Redmon

先前已經宣布不再投入CV方面的研究

大家原本不對YOLO後續有太多的期待

沒想到YOLOv4就這樣來了!!

接手的就是過去在GitHub上主力維護Darknet的大神AlexeyAB

先前介紹的YOLOv3就是採用其版本

沒想到YOLOv4的論文就是由他來主筆(Alexey Bochkovskiy)

而更令人震驚的是

論文中另外兩位共同作者竟然是台灣人!!
(Chien-Yao Wang、Hong-Yuan Mark Liao)

若研究所是學習影像處理相關,應該對Mark Liao不陌生才是...



過去YOLOv3已被業界認為是即時物件檢測的最佳解

server site可能採用YOLOv3

edge site則採用YOLOv3-tiny

而這次YOLOv4在速度及準確率皆超越了YOLOv3

實在太驚人了!!

看看在相同FPS上,YOLOv4的AP比YOLOv3高出10個百分點!!


而在GitHub的實測說明上

用過YOLOv3應該對於修改cfg的width、height不陌生吧

YOLOv4可用更小的長寬 320x320,即可達到mAP 60% !!

遠超過YOLOv3預設416x416的mAP 55%

既然如此當然要下載來實測看看


YOLOv4的建置方法就跟過去說明的完全一樣

這裡就不再從頭說明,前期需準備的nVidia CUDA套件、CUDNN、OpenCV 3.4

請參考前篇說明

若你已經下載過上述套件,一樣到GitHub下載source code

原作者採用VS2015,若你用2017以上,會出現升級動作


下載source code後,在build->darknet可以看到許多VS的方案檔,這邊用darknet.sln做說明

步驟其實跟YOLOv3完全一樣

1. 先將方案的組態設定為release, x64


一樣先嘗試編譯,會出現以下錯誤


2. 對著專案按右鍵到屬性頁面,設定CUDA C/C++的路徑


CUDA路徑預設是在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0

再次編譯,會出現OpenCV錯誤


3. 對著專案按右鍵到屬性頁面,加入OpenCV套件參考

VC++目錄->Include目錄加入三個路徑


就看你下載的OpenCV 3.4.0的位置,加入

build\include\opencv2、build\include\opencv、build\include 三個資料夾路徑

接著在程式庫目錄 加入OpenCV 3.4.0的資料夾

build\x64\vc14\lib 這個路徑


最後在連接器頁簽->輸入 其他相依性 加入 opencv_world340.lib


以上步驟缺一不可,才能完整地把OpenCV套件加入


再次編譯


恭喜!! 完成建置!!


建置完成產生的darknet.exe位置在build\darknet\x64目錄上

使用方法完全一樣,到一台有GPU的主機上

把x64部分資料夾(cfg, data)與exe、dll複製出來,如下圖


需要cfg、data資料夾

當初建置所使用的cudnn64_7.dll, opencv_world340.dll, opencv_ffmpeg340_64.dll, pthreadVC2.dll

darknet.exe

以及YOLOv4的cfg、weights (下載位置:YOLOv4 cfg, YOLOv4 weights)

裡面放置了一個測試圖片 dog.jpg

執行測試的cmd如下:

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

這次YOLOv4執行一開始多了很多資訊


多了像是CUDA版本、CUDNN版本、GPU的型號...等等資訊

預設的cfg的大小為608x608

結果如下:


抓到了四個物件,執行時間為37ms

比過去v3版本多抓了一個...花盆... XDD


竟然都跑YOLOv4了,當然也要把YOLOv3跑來看看差別,也把cfg改成608x608


YOLOv3只抓到了3個物件,果然抓不到花盆 XDD

但耗時34ms (還比v4快耶!!) XDD


後來測試同樣的大小(width, height) YOLOv3並不會比較慢,但應該準確度較差??


因此YOLOv4可用較小的大小,來達到相同YOLOv3的準確度

YOLOv3預設是採用416x416,採用RTX2070的速度是:23ms

而YOLOv4若是採用320x320,速度是:19ms

但結果出現了一個誤判:


因此實際是否能把原先使用YOLOv3 416x416換成YOLOv4 320x320,有待考驗!!


而若是YOLOv4採用416x416,速度是:24ms

因此由實驗得知在同樣大小的設定

在處理速度上,YOLOv4其實略比YOLOv3慢一點點

但準確度卻大幅提升?? (有待實測驗證)


這裡分享一個好用的指令,用於測試影片比較方便

由於darknet也整合了opencv_ffmpeg,因此可直接讀入影片檔,以及把結果匯出影片

darknet.exe detector demo cfg/coco.data yolov4.cfg yolov4.weights test.mp4 -out_filename result.mp4

以上指令就是把測試影片test.mp4讀入辨識後,在儲存成result.mp4


用來demo model的效果,真的是非常方便的指令呢!!


以上是初步的分享嘍

1 則留言:

  1. 請問darknet如何整合opencv_ffmpeg
    已將opencv_ffmpeg放入darknet.exe的目錄下
    仍出現video-stream stoped錯誤

    回覆刪除