---
# System prepended metadata

title: 'Day-04:從YOLO v4 到 YOLO v3'

---

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)