來源:Greatway9999


1.前言

繼YOLOv4後,中研院資訊所所長廖弘源、博士後研究生王建堯和YOLO網路維護者Alexey Bochkovskiy再度推出YOLOv7。iThomeAI周報第193期指出,2022年07月所推出的即時物件偵測新模型YOLOv7,表現碾壓YOLO系列和Transformer類物件偵測模型。

本文將聚焦在使用YOLOv7進行自定義資料集的訓練與故障排除。若您對論文與YOLOv7的原理有興趣,可參考以下連結。


2.實作

2.0. 訓練前準備

2.0.0. 環境建置

關於實作環境的建置,請參考< Pytorch (Windows) 環境建置 與 YOLOv4 起手式實作 >。

接著依據作者提供的requirements.txt進行安裝。以下2個套件,請讀者選擇適合自己GPU版本的套件進行安裝。

  • #torch>=1.7.0,!=1.12.0
  • #torchvision>=0.8.1,!=0.13.0


筆者本次實作的主要環境資訊如下:

  • RTX 2060
  • pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.1


2.0.1. 下載YOLOv7程式碼和預訓練權重

環境建置完畢後,請下載YOLOv7作者的程式碼並置於你的工作區(開發專區)。

下載連結:https://github.com/WongKinYiu/yolov7


接著在作者github頁面中下載預訓練權重,本文使用YOLOv7的針對MS COCO的預訓練權重,點擊下圖YOLOv7連結,即可下載權重。

來源:https://github.com/WongKinYiu/yolov7


完成權重下載後,請在第一層建立一個 "weights" 的資料夾,將預訓練權重(yolov7.pt)放入。如下圖所示。

來源:Greatway9999


2.0.2. 訓練前的測試

承上點說明,在開始進行自定義資料之訓練,我們可以使用官方提供 yolov7.pt 和 horses.jpg 來測試程式碼與所安裝的套件是否正常運作。

因此,打開 detect.py 這支程式,修改權重與圖片路徑。如下圖156與157行所示。

來源:Greatway9999

若運作正常,辨識後的結果在以下路徑:

runs/detect/exp/horses.jpg


原圖與辨識結果如下圖所示:

來源:Greatway9999


2.1. 自定義訓練資料準備與訓練

2.1.0 資料標記

關於資料標記,請參考本篇文章 < 在Pytorch框架下以YOLOv4訓練自定義資料集 >。

特別要注意的是,由於YOLOv7會使用txt格式的標記檔進行訓練,因此使用Labelme標記工具,要將標記資料存成txt檔,可省去將xml再轉乘txt格式的時間。

或是可從Kaggle等平台下載已標記好的資料集來練習,也是不錯的選擇。


2.1.1. 切分資料為train、val、test

依需求,將資料切分。每個資料夾內會有 "images" 和 "labels" 兩個資料夾。"images" 放 格式為JPG的圖片,而 "labels" 放格式為txt的標記檔。如下圖所示。


來源:Greatway9999


2.1.2.設定檔調整

將 yolov7\data 下 coco.yaml 複製到 yolov7-main\data 的路徑下。

為了區別,筆者將 coco.yaml 更改名稱為 classes.yaml。檔案的內容則依據自己的訓練需求修改。總共會有資料集路徑、類別數量與類別名稱需修改。

1.修改資料集路徑

  • train: ./data/train/images 
  • val: ./data/train/images 
  • test: ./data/train/images


2.修改自定義資料集類別(此例為1例)

  • nc: 1


3.定義類別名稱

  • names: [ 'Pothole' ] #你自行定義的類別名稱


如下圖:

來源:Greatway9999


接著修改yolov7.yaml,路徑如下:

yolov7-main\cfg\training


將 nc 的類別數量改成自定義資料集的類別數量(此例為1例)

來源:Greatway9999


接著修改train.py中的參數。條列如下: 

  • –weights  (預訓練權重,本文使用 yolov7.pt)
  • –cfg   (模型設定檔,本文使用 yolov7.yaml)
  • –data  (資料類別,本文使用 classes.yaml)
  • –hyp (yolov7的超參數設定,本文使用 hyp.scratch.p5)
  • –epochs (訓練的epoch數,預設300)
  • –device (訓練使用的裝置,筆者僅有1顆GPU可用,因此改參數為0。因為Python是從0開始數)

來源:Greatway9999


至此,即可開始進行訓練。

此外,筆者將本次實作YOLOv7所遇到的bug與解決方式彙整於下個章節,希望能幫助遇到相同狀況的你縮短解決問題的時間。


2.2.可能遇到的bug與解決方式

bug1:OSError: [WinError 127] 找不到指定的程序

來源:Greatway9999

可能原因:

此文作者判定torch_geometric安裝出錯。


解決方式:

選擇對應cuda版本的torch相關套件之版本,輸入以下指令進行安裝:

pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.7.1+cu102.html

pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.7.1+cu102.html

pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.7.1+cu102.html

pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.7.1+cu102.html

pip install torch-geometric


Debug參考資料:

bug2:OSError: [WinError 127] 找不到指定的模块。anaconda\lib\site-packages\torch\lib\caffe2_detectron_ops.dll“

來源:Greatway9999

承bug1,如bug還是存在,且顯示 Error loading ... caffe2_detectron_ops.dll...dependencies。

可能原因:

此文作者表示此bug為cup的pytorch和gpu的pytorch文件裡面的caffe2_detectron_ops.dll文件名重複了,然後你更換为gpu版本的時候由於此文件存在,就没有下載,保留了原本cpu版本的。


解決方式:

在上述連結中,保留GPU版

  • caffe2_detectron_ops_gpu.lib
  • caffe2_detectron_ops_gpu.dll

刪除CPU版

  • caffe2_detectron_ops.lib
  • caffe2_detectron_ops.dll

若找不到GPU版,則重裝。

Debug參考資料:


bug3:module 'torch.nn' has no attribute 'SiLU'

來源:Greatway9999

可能原因:

從此討論文中,判斷原因為torch版本過低 (torch=1.6.0)。


解決方式:

挑選對應自己的cuda版本,安裝pytorch==1.7以上的相關套件。

筆者採用cuda10.1,因此安裝以下版本號的相關套件即可解決問題。

conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.1 -c pytorch


Debug參考資料:


bug4:RuntimeError: DataLoader worker (pid(s) 7872, 15356, 19144, 16296) exited unexpectedly

來源:Greatway9999


可能原因:

此文作者表示,因為torch.utils.data.DataLoader中設置了num_works=4,也就是多執行緒讀取。pytorch在Windows下的多執行緒讀取好像有點問題,將num_works改為1問題即可解決。如果還是報錯的話,可以試試將num_works這個參數去掉。


解決方式:

將num_works改為1問題即可解決。如果還是報錯的話,可以將num_works這個參數去掉。

經筆者測試,將num_works設為0才將問題解決。


然而,若將num_works設為0,可能會發生GPU利用率低的現象,詳細說明請參見本文bug7之說明。


Debug參考資料:


bug5:OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. 

來源:Greatway9999

詳細錯誤內容如下:

OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.


可能原因:

原因如上述。


解決方式:

此文作者提供的解決方式為在train.py中加入兩行程式。

import os

os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"


Debug參考資料:


bug6:CUDA out of memory

來源:Greatway9999

可能原因:

如錯誤碼所示,這表示batch_size太大導致RAM不夠。


解決方式:

調小batch_size。筆者設定batch_size為8。


bug7:GPU利用率低

當使用GPU進行運算時,可用 nvidia-smi 指令查看GPU使用率。若發現GPU利用率呈現 0 的狀態,代表本次模型訓練未能好好利用GPU的能力,大大增加了訓練的時間。如下圖。

來源:Greatway9999


可能原因:

承bug4之內容,若將num_works設為0,因為CPU計算發生瓶頸,導致GPU出現等待的問題而發生GPU利用率低的現象。


解決方式:

如下圖,以筆者的電腦狀況,將num_works設為4,既不會發生 bug4,也讓GPU利用率不再呈現 0 的狀態。這表示本次模型訓練確實有使用到GPU,比起用CPU訓練,訓練的時間會大大縮短。

來源:Greatway9999


Debug參考資料:


2.3.預測(prediction)/推論(inference)

2.3.1.修改 detect.py的參數

需修改的參數條列如下: 

  • –weights  (訓練後之權重,預設放在run/train/exp(number)的資料夾中,因此指定對應的路定即可,例如 :default='./runs/train/exp22/weights/best.pt' )
  • –source (愈辨識標的的路徑,例如:default='inference/images')  
  • –device (訓練使用的裝置,筆者僅有1顆GPU可用,因此改參數為0。因為Python是從0開始數)

參數調整完後即可執行detect.py。辨識的結果會保存在 runs/detect/下的exp資料夾中。

來源:Greatway9999


(本文結束)

---

參考資料


#YOLOv7 #object_detection #real_time 

0 留言