Day-04:從YOLO v4 到 YOLO v3 ==== ## 楔子 > 寫會程式最重要的環節 > 就是是從亂改參數開始... > --- 筆者幹話集 昨天我們成功讓YOLO v4 在WSL上執行。或許很多讀者也是第一次接觸WSL... 其實,會有這個想法是WSL2 發布的時候,讀者跟同事曾經想在讓WSL直接使用GPU,但是經過多次測試都未果。後來筆者發現,沒有GPU的加持之下,其實YOLO v4也會工作!!! 所以才開始了這一波... 叛逆的操作~ ## 前言 大家都在ubuntu下使用yolo。筆者偏偏要在Windows下執行。而且嘗試用一個比較快的方法實現XD (謎之音...你明明是借用WSL的能力...) 相信隨著驅動程式的更新,WSL 早晚也會開始支援CUDA的~ 如果有讀者測出來還請指導筆者... 今天的內容,我們將嘗試交叉比對一下 YOLO v3, v4 , v3-tiny, v4-tiny。並簡單介紹yolo的重要組成。 簡單的說,今天想討論的是如何"用" ## 改用YOLO v3 首先,我們先討論一個觀念:YOLOv4真的比YOLOv3好嗎? 筆者的結論是:不見得,必須綜合運用場合來討論。例如YOLOv2所需要的資源就低於YOLOv3。 所以我的建議是: **在Target Device上測試一下數據** 綜合各項資源再來討論之~ ### 下載權重檔 從YOLOv4的[Repo](https://github.com/AlexeyAB/darknet)上,幾乎無法找到v3的權重檔下載位置,所以筆者從原始作者的[網站](https://pjreddie.com/darknet/yolo/)中找到下列語法: ```shell= wget https://pjreddie.com/media/files/yolov3.weights ``` ![](https://i.imgur.com/d4LGrnC.png) ### 使用V3權重進行辨識 同樣從上述網站中也可以找到下列語法: ```shell= ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg ``` ![](https://i.imgur.com/4i5W4lz.png) 請注意執行的結果。相較於v4而言,YOLOv3對於dog的偵測信心居然是1.0(即100%)!!! 當相較之下少了pottedplant(盆栽)的辨識。而執行時間就CPU來說,好像快了不少。 這就是筆者說的,具體要看您的運用場合以及硬體資源。 開啟所辨識的圖檔如下: ![](https://i.imgur.com/7u2hw02.png) ### 小結 就目前而言,筆者整理了一個簡單的概念如下: ![](https://i.imgur.com/pf8vz21.png) 如上圖所示,YOLOv3 YOLOv4都是架構在Darknet之上,所以抽換不同的設定檔(cfg)以及權重檔(weights)理論上可以達成各種版本的抽換。這就是在鬼故事那篇提及的v5為何可以快速發表出來的原因,因為只要製作出對應的cfg/weights就可以宣稱有v5 v6 v7 的版本了... (謎之音:只是做了一個大家都不承認的版本...自己爽而已...) ## 發現新天地 藉由上面的測試,我們知道修改不同的cfg跟weights可以得到不同的結果。於是筆者就好奇是否還有其他設定檔: ```shell= cd cfg ls ``` ![](https://i.imgur.com/cJ0lh5E.png) 看來有很多的cfg檔在召喚我們... (眼睛發亮模式) 其中,如果您有關注YOLO原作者的網站,不難發現,其實還有一個輕量版本稱為tiny,又稱Lite版。也就是上圖框選出來的檔案。 ### 總是愛惡搞... :P 如同筆者在楔子所提及,身為一名軟體工程師,亂改參數進行測試是最基本的... (壞)習慣 XD 所以難免會開始進行下列的測試: ```shell= ./darknet detect cfg/yolov3-tiny.cfg yolov3.weights data/dog.jpg ``` ![](https://i.imgur.com/7ajv4N2.png) 居然!甚麼都**沒有**!!可見不可以亂配... ![](https://cdn-origin.cool-style.com.tw/cool/2020/05/tenor.gif) >圖片[來源](https://www.cool-style.com.tw/wd2/archives/517959) 「反正我很閒」 筆者覺得自己就像上圖一樣,不測試各種惡搞的組合,誓不罷休... (壞習慣又來了...) 於是有了下面的測試集合: ```shell= ./darknet detect cfg/yolov4-tiny.cfg yolov3.weights data/dog.jpg ./darknet detect cfg/yolov3-tiny.cfg yolov4.weights data/dog.jpg ./darknet detect cfg/yolov4-tiny.cfg yolov4.weights data/dog.jpg ``` 恭喜我! 得到全部都失敗的結果!!!! ### 回歸正常用法 >是否有很多次... 你都跟筆者一樣.... > 不愛看說明書... 根據上面的錯誤實驗,筆者還是去原作者官方網站找到下列命令 ```shell= wget https://pjreddie.com/media/files/yolov3-tiny.weights ``` ![](https://i.imgur.com/OgqPsF3.png) 嘗試執行 ```shell= ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg ``` ![](https://i.imgur.com/UwTGAyr.png) 圖片結果: ![](https://i.imgur.com/uyVc3uR.png) 可以看到執行速度非常快!而辨識結果的信心值卻掉下來了。 ### YOLO v4 tiny 呢? 從 [GitHub](https://github.com/AlexeyAB/darknet)中可以找到yolov4-tiny的權重檔案。下載如下: ```shell= wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights ``` ![](https://i.imgur.com/iwlxJ1T.png) 執行結果測試看看吧~ ```shell= ./darknet detect cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg ``` ![](https://i.imgur.com/nCTvUnl.png) 相對應的圖檔如下: ![](https://i.imgur.com/p2wGHoa.png) 注意上圖中的辨識速度,注意,這是CPU模式!! ## 結論 至今為止,我們嘗試了v3 v4 v3-tiny v4-tiny的辨識方式。 通過實驗,我們再次證明了,只有最適用的AI模型,沒有最好的AI模型。 雖然YOLOv4有較準確的結果,但YOLOv4-tiny辨識速度非常快速。 至於要準度,還是速度,就是實際運用場域的問題了。 另外,我們通過多次的測試(含失敗)可以得到一個結論cfg跟weight是配套的。不可以亂設定. 未來的日子裡,我們將慢慢對cfg 跟weight 抽絲剝繭 來進行討論。 ## 後記 早知道不要寫甚麼鬼故事...結果自己就遇到鬼故事... 1) 寫到一半 跳電沒有存好 悲劇= = 2) 第一次執行 v3-tiny的時候檔案居然壞掉= = 3) 我自己的Blog直接掛掉...= = 所以筆者學乖一點還是使用HackMD來編輯好了,日後的文章就同步發表到HackMD了 本文同步發布於 [HackMD](https://hackmd.io/@wupojung/ironman-2020-yolov3-startup)