Python影像辨識筆記(十七):ultralytics/yolov3使用教學及注意事項

更新補充:

2020/07/29:
訓練時發現epoch跟darknet採用的max_batches不同
以COCO資料集為例(117263張圖片,80個class):500200 * batch-size * accumulate / images = epochs
500200 * 32 * 2 / 117263 = 273 epochs
也就是說,500200個batches大約等於273個epochs的訓練,至於為什麼是500200,目前沒有人知道。
除此之外,500200次的說法,也跟darknet宣稱每個class*2000次epoches有所出路2000 * 80 * 32 * 2 / 117263 = 87.325 = 88 epochs 2020/07/30:
如何解讀訓練結果?(results.txt)
原文內容似乎有誤,我將其修正如下所示:(有遺漏的部分代表還沒弄清楚)1.Epoch, 2.GPU Memory , 3.GIoU loss, 4.Objectness loss, 5.Classification loss, 6.total loss, 7., 8.img size, 9.Precision, 10.Recall, 11.mAP@0.5, 12.F1, 13.Val GIoU, 14.Val objectness, 15.Val classification2020/08/03:
若Server上有多顆GPU的話,請使用1顆GPU去訓練就好,否則會出現一些奇怪BUG(如:mAP@0.5的數值不變化、Val GIoU, Val objectness, Val classification都是nan的問題)
$ CUDA_VISIBLE_DEVICES=0 python3 train.py --data coco2014.data --batch 32 --epochs 300 --img 416 --cfg yolov3-tiny-twin-xxxx-DY.cfg --weights yolov3-tiny.conv.15 --name from_yolov3-tiny.conv.152020/08/08:
若我們想把自定義的layer在不同的電腦上,進行mAP測試的時候,可能會遇到model.load_state_dict錯誤的問題,我們可以參考此篇的教學,將test.py的第40行修改成False,即可將不同環境下訓練的模型在該環境上載入
model.load_state_dict(torch.load(weights, map_location=device)['model'])model.load_state_dict(torch.load(weights, map_location=device)['model'],False)2020/09/10:
如果想要使用python test.py指令去測試mAP時,照理說,連GFLOPS計算量應該也要一起計算才對,但是在aiForge和TWCC上都沒有出現。仔細檢查了一下utils/torch_utils.py,才發現沒有安裝thop工具,使用指令安裝:pip install thop後,即可正常顯示計算量
2020/09/11:
如果想要用不同的backbone去進行transfer learning該怎麼做呢?
以yolov3-tiny.weights為例:
#在darknet原始C語言版本的資料夾底下
wget https://github.com/smarthomefans/darknet-test/raw/master/yolov3-tiny.weights
#針對weights檔案進行cutoff,切出前13層
./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.13 13
#回到yolov3底下,修改models.py中的load_darknet_weights函數,新增以下兩行即可
elif file =='yolov3-tiny.conv.13':
cutoff = 13
2020/09/22:
進行訓練的最後,會出現透過COCO API進行偵測的mAP結果,只是不知道為什麼,這時候出現的mAP,比起手動使用test.py進行測試還要低。
因此,目前建議在模型訓練完成後,透過test.py再測一次,以取得較佳的數值。2020/09/26:
繪製訓練結果成圖片
將results.txt中的紀錄進行可視化https://github.com/WongKinYiu/PyTorch_YOLOv4/issues/93
from utils.utils import *; plot_results_overlay()2020/10/08:
發現快速訓練YOLO的方法,採用ultralytics/yolov5當中coco128的dataset (下載coco128.zip)
我這邊提供一個已經將訓練路徑都設定好的zip檔案(coco128.zip),請依照自己需求修改。 zip壓縮檔案中的coco128.data和coco128.txt請放到yolov3/data/底下。在Tesla V100的GPU下,訓練300個epochs,費時0.501小時使用的訓練指令如下:
python3 train.py --data coco128.data --batch 64 --epochs 300 --img 416 --cfg yolov3.cfg --nosave --cache --weights darknet53.conv.74 --name orig_v3
2020/10/13:
(coco10k.zip)(注意,使用此方法必須先使用get_coco2014.sh取得完整的dataset)
前幾天所發現coco128的方式雖然在訓練上很快速,但是如果重新設計YOLO的cfg檔案去訓練,可能會遇到GIoU Loss無法下降的問題,因此想到一個方式解決coco128圖片太少;coco2014又太多張圖片的問題。[1]複製coco2014.data成coco10k.data,把對應的檔案名稱進行修改
[2]將coco2014.data中的trainvalno5k.txt和5k.txt透過head指令,分別顯示出前1萬張和前500張圖片的路徑,再傳到新的train10k.txt和val500.txt當中。
實際操作流程如下:cd yolov3/data
cp coco2014.data coco10k.data
#coco2014.dataclasses=80
train=../coco/trainvalno5k.txt #有11萬張照片(training set)
valid=../coco/5k.txt #有5000張照片(val set)
names=data/coco.names
#coco10k.data (我們要的新dataset檔案)
# 10000:500的比例是按照原dataset中11萬:5千的比例去抓取的
classes=80
train=../coco/train10k.txt #透過下列步驟取得training set中的前10000張圖片
valid=../coco/val500.txt #透過下列步驟取得val set中的前500張圖片
names=data/coco.names
cd ../coco
head -10000 trainvalno5k.txt > train10k.txt # training set
head -500 5k.txt > val500.txt # validation set
cd ../yolov3
python3 train.py --data coco10k.data --batch 64 --epochs 300 --img 416 --cfg yolov3.cfg --weights yolov3.conv.79 --name orig_from_yolov3.conv.79
2020/10/14:
使用昨天10/13的方法雖然迅速,但是可能會遇到包含某些類別的圖片比較少的問題,因此今天找到Linux上的一個指令,隨機選出n張圖片的路徑,獨立成一個新的檔案
shuf -n 10000 trainvalno5k.txt > coco10k_rand.txt # training set
shuf -n 10000 5k.txt > val500_rand.txt # val set
2020/10/15:
上述的dataset建立步驟,訓練出來的model在val set的表現上都怪怪的,目前採用COCO完整的11萬張照片進行訓練。
2020/10/22:
在多GPU訓練下,val loss比單GPU低的問題。
我自己實際將多GPU訓練和單GPU訓練完成的weights,透過test.py去測試,發現mAP並沒有任何差異,唯獨learning curve的差異有點大
https://github.com/ultralytics/yolov3/issues/1436#issuecomment-675615055
2020/11/19:
該Repo的作者提出了最後一個Final Darknet Compatible Release,未來似乎都將針對YOLOv5的更新為主。
https://github.com/ultralytics/yolov3/releases/tag/v8
Image for post
Image for post
同樣cfg下,使用單顆GPU與2顆GPU的Learning curve

正文:

ultralytics/yolov3是由國外一間公司用PyTorch實現的YOLOv3

特點:

  1. 能自動從Google Drive下載缺少的Weight (如: yolov3.weights, yolov3-tiny.weights)
  2. 能在不需要OpenCV(C++)的環境下進行資料增強及Model訓練
  3. 可以直接進行mAP測試,不須上傳至CodaLab,不過測試時間大概需要25分鐘(以官方weight為例)
  4. 能將yolov3的weights檔案與pytorch模型進行格式相互轉換

除此之外,更多特點可以參考官方GitHub REPO:

注意事項:

但是官方的程式碼有一些BUG,我有整理可完整執行的流程

除此之外,COCO資料集的路徑與AlexeyAB/darknet擺放方式不同。

AlexeyAB的COCO路徑可以放在darknet底下;ultralytics的COCO路必須放在yolov3資料夾的平行目錄。

例如:

工作目錄:/work/yanwei.liu/yolov3COCO目錄:/work/yanwei.liu/coco

如果將coco放在yolov3當中,如:

/work/yanwei.liu/yolov3/coco

可能會在mAP測試時,出現錯誤。

使用方式:

請注意自己的python指令預設是python2還是python3版本,如果是python3版本可以放心使用下列指令;若不是,請使用python3指令

# 基本環境建置(get_coco2014.sh用來取得coco的資料,若不需要進行mAP測試可跳過)git clone https://github.com/ultralytics/yolov3
bash yolov3/data/get_coco2014.sh
cd yolov3
pip install -U pycocotools
pip install -r requirements.txt
# 安裝對應版本的相關套件(以aiForge為例)pip install torch==1.6.0+cu92 torchvision==0.7.0+cu92 -f https://download.pytorch.org/whl/torch_stable.htmlpip install tensorboard==1.15.0pip install thop# Training
python train.py --data coco2014.data --batch 64 --epochs 300 --img 416 --cfg yolov3.cfg --weights yolov3.conv.79 --name from_yolov3.conv.79
# Inference
python detect.py --cfg cfg/yolov3.cfg --weights yolov3.pt
python detect.py --cfg cfg/yolov3-tiny.cfg --weights yolov3-tiny.pt
# mAP testing
python test.py --cfg yolov3.cfg --weights weights/yolov3.pt --img 416 --augment
# Conversion Model (*.weights <-> *.pt )
# convert darknet cfg/weights to pytorch model
python -c "from models import *; convert('cfg/yolov3-spp.cfg', 'weights/yolov3-spp.weights')"
# convert cfg/pytorch model to darknet weights
python -c "from models import *; convert('cfg/yolov3-spp.cfg', 'weights/yolov3-spp.pt')"

Written by

Machine Learning / Deep Learning / Python / Flutter cakeresume.com/yanwei-liu

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store