---
# System prepended metadata

title: 首次嘗試YOLO V7

---

# 首次嘗試YOLO V7


## :memo: 前言
Yolo版本更動非常快，自v4正式版本後也接續過非官方推出的V5、V6，經歷了風風雨雨，終於到**YOLO V7**了，由中研院**王建堯博士**改良演算法，在不僅在準確率超越了所有YOLO版本，且擁有不俗的速度。於2022年7月發表[論文](https://arxiv.org/abs/2207.02696)，並附上YoloV7之[Github](https://github.com/WongKinYiu/yolov7)。
![](https://i.imgur.com/yNCMBTR.png)
>YOLOV7優於其他版本，V7已棄用Darknet架構改為Pytorch，環境的安裝變得非常愉快。
---
## 設備
| 零件 | 型號  |
| -------- |---------- |
| CPU      | i9-9920X   |
| 記憶體   | 128G       |
| 顯示卡   | RTX 2080Ti |
## 作業環境
Windows 10 專業版 2004
## 開始實作
### 第一步: 先把總項目載下來
```
git clone https://github.com/WongKinYiu/yolov7
```
![](https://i.imgur.com/hUkdW0S.jpg)
>可以看到此文件的結構


### 第二步: 環境架設
###### 路徑: */yolov7/*
進入該資料夾中安裝環境
```
cd  你的資料夾 //cd yolov7
pip install -r requirements.txt
```
這個包有點大，我網路環境不穩，下載了兩次都time out，所以安裝需要一定時間，希望你的網路還不錯。
![](https://i.imgur.com/1q192TL.png)
安裝成功!
![](https://i.imgur.com/ONEwW8B.png)


### 第三步: 權重模型下載
###### 路徑: */yolov7/weights*
先創建一個/weights/文件夾，此資料夾的作用在於存放權重檔案，下載好了之後就可以放入。
```
mkdir weights //建立wwight資料夾
cd  weights //進入weights資料夾
```
>**遷移學習模型**: [yolov7_training.pt](https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7_training.pt)
>此權重將用於訓練
>**已經訓練完成的權重**: [yolov7.pt](https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt)
>此權重將用於測試

### 第三步:測試環境
基本上到這邊為止就已經把環境架好了，可以開始測試YOLOV7到底可不可以順跑了!
在第二步時我們有下載已經訓練完成的權重[yolov7.pt](https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt)並放在weights資料夾裡，現在我們就可以利用這個權重來辨識圖片及影片了。
>現在我們回到/yolov7/這個路徑下做測試，輸入下列指令。
```
python detect.py --weights weights/yolov7.pt --source inference/images 
```
>**--weights** 代表要用哪個權重進行辨識，將訓練好的權重名字就會放在這邊
>**--source** 代表要辨識的圖片或影片，可以指定辨識單張，直接輸入資料夾的話會辨識全部

inference/images裡面的圖片有五張
![](https://i.imgur.com/bDQwA8p.png)

辨識成功的話就會出現下列結果。
![](https://i.imgur.com/kn5E1XI.png)

如果執行錯誤的話就該看看環境上有甚麼東西沒有裝到而報錯。
>報錯: **RuntimeError: Numpy is not available**
>解方: **`pip3 install -U numpy`**

結果將會存放在 runs/detect/exp 裡，讓我們看看馬的結果。
>辨識前
![](https://i.imgur.com/5mrI0Iu.png)

>辨識後
![](https://i.imgur.com/NndS7hf.png)

### 如果到這邊為止照常運行，恭喜你，環境裝成功了!

---

## 訓練自己的權重
訓練yolo需要
1. 確認自己想要訓練什麼
2. 準備要訓練的圖片
3. 標記圖片(yolo格式)
4. 開始訓練

**列如我想要偵測人臉，我們就需要準備一定數量的人臉圖片，以此來訓練。**
### 準備工作
在最外層建立存放訓練資料集的資料夾，這邊取名為dataset。
```
mkdir dataset
```
![](https://i.imgur.com/npAb5Ra.png)

>dataset裡面的結構將會如下:
>face-img: 將會存放**訓練集**與**驗證集**的圖片。
>face-label: 將會存放**訓練集**與**驗證集**標註完成之yolo格式txt檔(標註程式產生)。
>trainList: 存放**訓練檔**圖片之路徑，供程式讀取。
>valList: 存放**驗證檔**圖片之路徑，供程式讀取。
>face.name: 存放標記名字。
![未命名](https://hackmd.io/_uploads/rJUInQpe1g.png)



---

#### 圖片準備
我已經準備120張人臉圖片，100張分給訓練檔集20張分給驗證集。
```python=
with open('face_list.txt', 'w') as f:
  for i in range(1, 100):
    f.write(f'dataset/face/face-img/training/{i}.jpg\n')

```
```python=
import os
path = "pic"

files = os.listdir(path)
for i, file_name in enumerate(files, 1):
    if os.path.isfile(os.path.join(path, file_name)):
        _, extension = os.path.splitext(file_name)
        new_name = str(i) + extension
        os.rename(os.path.join(path, file_name), os.path.join(path, new_name))
print("重新命名完成")
```
>*face-img/training/*
>**訓練集:** 編號由1-100取名
![](https://i.imgur.com/7WNtLSm.jpg)

>*face-img/validation/*
>**驗證集:** 編號由101-120取名
![](https://i.imgur.com/PDdsPBZ.png)

>把training之圖片路徑放入trainList
>![](https://i.imgur.com/vZRlEDu.png)

>把validation之圖片路徑放入validation
>![](https://i.imgur.com/zotspbW.png)

>在face.name裡打上標記的名字
>![](https://i.imgur.com/nbNHjsM.png)

>
### **做到這邊，恭喜你，你已經把圖片與路徑都用好了，接下來是圖片的標記!**
#### 圖片標記

標記工具使用[YOLO-Label](https://github.com/developer0hye/Yolo_Label)，[按這裡](https://github.com/developer0hye/Yolo_Label/releases/download/v1.1.1/YoloLabel_v1.1.1.zip)直接下載。
>下載完後解壓縮直接打開Yololabel.exe
![](https://i.imgur.com/1TdmHy1.png)

>打開後選擇要標記的圖片資料夾，再選擇face.name作為我的標記代號，就可以直接進行標註了!
>**標註完成後程式將會自動產出yolo格式的txt放在原資料夾裡面**，將會作為電腦訓練的根據，yolo訓練時會自動搜尋此檔案，讀取其bbox資訊，請注意每一張都有標註到，不然會報錯。
![](https://i.imgur.com/LeKjOwN.png)
![](https://i.imgur.com/2B24bDG.png)

### 待把訓練集與驗證集標記完之後，資料的準備就只剩模型設定與數據集設定了。


---

#### 訓練文件設定
訓練yolo需要設定兩個文件，**第一個**是模型文件，**第二個**是數據集文件。
* /yolov7/cfg/training/yolov7.yaml
* /yolov7/data/coco.yaml

##### 設定模型文件
1. 找到/yolov7/cfg/training/**yolov7.yaml**，並複製一個新的，放在一樣的地方，命名為**yolov7_face.yaml**(或是任何你喜歡的名字)。
2. 打開**yolov7_face.yaml**，找到最上面parameters的地方，修改**nc**為1(專案中有幾個辨識要求就寫幾個，因為我只有辨識臉，所以是1)，其餘不用改，直接save就好了。
![](https://i.imgur.com/qufifhV.png)
##### 設定數據集文件
1. 找到/yolov7/data/**coco.yaml**，並複製一個新的，放在一樣的地方，命名為**face.yaml**(或是你喜歡的)。
2. 打開**face.yaml**
    1.第四行的download: bash註解。
    2.將第7行的train改為./dataset/face/trainList.txt(訓練集路徑)
    3.將第8行的val改為./dataset/face/valList.txt(驗證集路徑)
    4.將第9行test註解
    5.將第12行nc改為1
    6.將第15行的names改為face(自己欲偵測物件的名字)


![](https://i.imgur.com/s56emfV.png)
### 到這邊為止，所有前置作業都準備完成了，只剩送去訓練!


---
### 開始訓練!
yolo的訓練都需要三個文件
1. 預訓練模型 **yolov7/weights/yolov7training.pt**
2. 模型文件 **yolov7/cfg/training/yolov7_face.yaml**
3. 數據集文件 **yolov7/data/face.yaml**

訓練的命令可以參考下面:
* **batch-size**需要依照顯卡的顯存來設定，如使用cpu訓練，就對應到記憶體，請謹慎設定，不然會讓自己電腦記憶體被吃光光，很困擾。
* **device**需依照自己顯卡的編號設定，如使用cpu訓練，請打: --device cpu，如報錯，找不到顯卡的話，有可能是因為安裝的cuda版本與torch版本不合，請依照自身torch版本安裝適當的cuda。
* **epoch**為訓練次數，如無設定就是預設訓練300次，因時間關係，我只有訓練100次。
```
python train.py --weights weights/yolov7_training.pt --cfg cfg/training/yolov7_face.yaml --data data/face.yaml --device 0 --batch-size 32 --epoch 50
```

>基本會用到的指令已經在上面了，其餘指令及解釋可在train.py找到，請各位自行參考。
![](https://i.imgur.com/WDA64x9.png)

### 訓練結果

#### 權重
待漫長的時間過後終於訓練完成了，訓練完成的權重模型可以在**runs/train/exp/weights**找到，訓練期間系統會依照一定的規律保存模型，接下來我們將使用最好的權重模型best.pt進行辨識。
![](https://i.imgur.com/9mVptjy.png)
#### 其他文件
其他預測文件將被保存在**runs/train/exp**，包括混淆矩陣、F1曲線、準確率與置信度的曲線關係圖等等...。
![](https://i.imgur.com/2mXC0NR.png)

>對這些文件有興趣的人可以參考這邊很不錯的文章:
>[yolov7模型訓練結果分析及如何評價yolov7模型訓練效果](https://blog.csdn.net/weixin_43397302/article/details/127073824)

#### 測試訓練的結果
我從網路上抓了一些人臉的圖片來測試，和測試時的指令差不了多少，有兩個地方需要換
* **我訓練好的權重**
* **想要測試的圖片**
```
 python detect.py --weights runs/train/exp/weights/best.pt --source inference/detect_img
```

>可以看到訓練結果不太準確，會把書、麥克風等辨識成臉，我猜想是因為訓練次數不足、訓練資料的不足所導致，但以結果來說，能辨識到大部分的臉已經令人滿意。
![](https://i.imgur.com/RprAdeI.png)
![](https://i.imgur.com/u3Ens2B.jpg)
![](https://i.imgur.com/UHZb41t.png)



### 結論
yolov7不管是在建設環境與訓練甚至到偵測的過程都比yolov4進步許多，在整個過程中是非成愉快的，沒有了yolov4的darkent環境建置過程，改為pytorch真是一大福音。




