# 首次嘗試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)。  >YOLOV7優於其他版本,V7已棄用Darknet架構改為Pytorch,環境的安裝變得非常愉快。 --- ## 設備 | 零件 | 型號 | | -------- |---------- | | CPU | i9-9920X | | 記憶體 | 128G | | 顯示卡 | RTX 2080Ti | ## 作業環境 Windows 10 專業版 2004 ## 開始實作 ### 第一步: 先把總項目載下來 ``` git clone https://github.com/WongKinYiu/yolov7 ```  >可以看到此文件的結構 ### 第二步: 環境架設 ###### 路徑: */yolov7/* 進入該資料夾中安裝環境 ``` cd 你的資料夾 //cd yolov7 pip install -r requirements.txt ``` 這個包有點大,我網路環境不穩,下載了兩次都time out,所以安裝需要一定時間,希望你的網路還不錯。  安裝成功!  ### 第三步: 權重模型下載 ###### 路徑: */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裡面的圖片有五張  辨識成功的話就會出現下列結果。  如果執行錯誤的話就該看看環境上有甚麼東西沒有裝到而報錯。 >報錯: **RuntimeError: Numpy is not available** >解方: **`pip3 install -U numpy`** 結果將會存放在 runs/detect/exp 裡,讓我們看看馬的結果。 >辨識前  >辨識後  ### 如果到這邊為止照常運行,恭喜你,環境裝成功了! --- ## 訓練自己的權重 訓練yolo需要 1. 確認自己想要訓練什麼 2. 準備要訓練的圖片 3. 標記圖片(yolo格式) 4. 開始訓練 **列如我想要偵測人臉,我們就需要準備一定數量的人臉圖片,以此來訓練。** ### 準備工作 在最外層建立存放訓練資料集的資料夾,這邊取名為dataset。 ``` mkdir dataset ```  >dataset裡面的結構將會如下: >face-img: 將會存放**訓練集**與**驗證集**的圖片。 >face-label: 將會存放**訓練集**與**驗證集**標註完成之yolo格式txt檔(標註程式產生)。 >trainList: 存放**訓練檔**圖片之路徑,供程式讀取。 >valList: 存放**驗證檔**圖片之路徑,供程式讀取。 >face.name: 存放標記名字。  --- #### 圖片準備 我已經準備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取名  >*face-img/validation/* >**驗證集:** 編號由101-120取名  >把training之圖片路徑放入trainList > >把validation之圖片路徑放入validation > >在face.name裡打上標記的名字 > > ### **做到這邊,恭喜你,你已經把圖片與路徑都用好了,接下來是圖片的標記!** #### 圖片標記 標記工具使用[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  >打開後選擇要標記的圖片資料夾,再選擇face.name作為我的標記代號,就可以直接進行標註了! >**標註完成後程式將會自動產出yolo格式的txt放在原資料夾裡面**,將會作為電腦訓練的根據,yolo訓練時會自動搜尋此檔案,讀取其bbox資訊,請注意每一張都有標註到,不然會報錯。   ### 待把訓練集與驗證集標記完之後,資料的準備就只剩模型設定與數據集設定了。 --- #### 訓練文件設定 訓練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就好了。  ##### 設定數據集文件 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(自己欲偵測物件的名字)  ### 到這邊為止,所有前置作業都準備完成了,只剩送去訓練! --- ### 開始訓練! 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找到,請各位自行參考。  ### 訓練結果 #### 權重 待漫長的時間過後終於訓練完成了,訓練完成的權重模型可以在**runs/train/exp/weights**找到,訓練期間系統會依照一定的規律保存模型,接下來我們將使用最好的權重模型best.pt進行辨識。  #### 其他文件 其他預測文件將被保存在**runs/train/exp**,包括混淆矩陣、F1曲線、準確率與置信度的曲線關係圖等等...。  >對這些文件有興趣的人可以參考這邊很不錯的文章: >[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 ``` >可以看到訓練結果不太準確,會把書、麥克風等辨識成臉,我猜想是因為訓練次數不足、訓練資料的不足所導致,但以結果來說,能辨識到大部分的臉已經令人滿意。    ### 結論 yolov7不管是在建設環境與訓練甚至到偵測的過程都比yolov4進步許多,在整個過程中是非成愉快的,沒有了yolov4的darkent環境建置過程,改為pytorch真是一大福音。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up