GitHub上YOLOv5開源代碼的訓練數據定義
代碼地址:https://github.com/ultralytics/YOLOv5
訓練數據定義地址:https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
YOLOv5訓練自定義數據
本指南說明了如何使用YOLOv5 訓練自己的自定義數據集。
開始之前
copy此倉庫,下載教程數據集,並安裝requirements.txt依賴項,包括Python> = 3.7和PyTorch> = 1.5。
git clone https://github.com/ultralytics/yolov5 # clone repo
python3 -c "from yolov5.utils.google_utils import gdrive_download; gdrive_download('1n_oKgR81BJtqk75b00eAjdv03qVCQn2f','coco128.zip')" # download dataset
cd yolov5
pip install -U -r requirements.txt
訓練自定義數據
1.創建Dataset.yaml
data / coco128.yaml是一個小型教程數據集,由COCO train2017 中的前128張圖像組成。在此示例中,這些相同的128張圖像用於訓練和驗證。coco128.yaml
定義1)訓練圖像目錄的路徑(或帶有訓練圖像列表的* .txt文件的路徑),2)與的驗證圖像相同的路徑,3)類數,4)類列表名稱:
#訓練和Val的數據集(圖像目錄或* .txt與圖像路徑文件)
訓練: ../coco128/images/train2017/
VAL: ../coco128/images/train2017/
類數量
#類名稱
名稱: [“人”,“自行車”,“汽車”,“摩托車”,“飛機”,“公共汽車”,“訓練”,“卡車”,“船”,“交通燈”,
“消火栓” ”,“停車標志”,“停車計時器”,“長凳”,“鳥”,“貓”,“狗”,“馬”,“綿羊”,“牛”,
“大象”,“熊”,“斑馬” ','長頸鹿','背包','雨傘','手提包','領帶','手提箱','飛盤',# parameters
nc: 80 # number of classes <------------------ UPDATE to match your dataset
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# yolov5 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 1-P1/2
[-1, 1, Conv, [128, 3, 2]], # 2-P2/4
[-1, 3, Bottleneck, [128]],
[-1, 1, Conv, [256, 3, 2]], # 4-P3/8
[-1, 9, BottleneckCSP, [256, False]],
[-1, 1, Conv, [512, 3, 2]], # 6-P4/16
[-1, 9, BottleneckCSP, [512, False]],
[-1, 1, Conv, [1024, 3, 2]], # 8-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 12, BottleneckCSP, [1024, False]], # 10
]
# yolov5 head
head:
[[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]], # 12 (P5/32-large)
[-2, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 1, Conv, [512, 1, 1]],
[-1, 3, BottleneckCSP, [512, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]], # 16 (P4/16-medium)
[-2, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 1, Conv, [256, 1, 1]],
[-1, 3, BottleneckCSP, [256, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]], # 21 (P3/8-small)
[[], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
2. 創建標簽
使用Labelbox或CVAT等工具標記圖像后,將標簽導出為darknet格式,每個圖像一個*.txt文件(如果圖像中沒有對象,則不需要*.txt文件)。*.txt文件規范如下:
每個對象一行
每一行是類x_center,y_center寬度高度格式。
框坐標必須是標准化的xywh格式(從0到1)。如果方框以像素為單位,請將x_center和寬度除以圖像寬度,將y_center和高度除以圖像高度。
類號是零索引的(從0開始)。
每個圖像的標簽文件應該可以通過在其路徑名中將/image s/*.jpg替換為/labels/*.txt來定位。圖像和標簽對的示例如下:
dataset/images/train2017/000000109622.jpg # image
dataset/labels/train2017/000000109622.txt # label
一個有5個人的標簽文件示例(所有0類):
3. 組織目錄
根據下面的示例組織您的train和val圖像和標簽。注意/coco128應該在/yolov5目錄旁邊。確保coco128/labels文件夾位於coco128/images文件夾旁邊。
4. 選擇模型
從./models文件夾中選擇一個模型。在這里,選擇yolov5s.yaml,最小和最快的型號。請參閱的自述表,了解所有型號的完整比較。一旦您選擇了一個模型,如果您沒有訓練COCO,請更新yaml文件中的nc:80參數,以匹配步驟1中數據集中的類數。
# parameters
nc: 80 # number of classes <------------------ UPDATE to match your dataset
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# yolov5 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 1-P1/2
[-1, 1, Conv, [128, 3, 2]], # 2-P2/4
[-1, 3, Bottleneck, [128]],
[-1, 1, Conv, [256, 3, 2]], # 4-P3/8
[-1, 9, BottleneckCSP, [256, False]],
[-1, 1, Conv, [512, 3, 2]], # 6-P4/16
[-1, 9, BottleneckCSP, [512, False]],
[-1, 1, Conv, [1024, 3, 2]], # 8-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 12, BottleneckCSP, [1024, False]], # 10
]
# yolov5 head
head:
[[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]], # 12 (P5/32-large)
[-2, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 1, Conv, [512, 1, 1]],
[-1, 3, BottleneckCSP, [512, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]], # 16 (P4/16-medium)
[-2, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 1, Conv, [256, 1, 1]],
[-1, 3, BottleneckCSP, [256, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]], # 21 (P3/8-small)
[[], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
5.訓練
運行以下訓練命令以訓練coco128.yaml
5個時期。您可以通過傳遞從零開始訓練yolov5,也可以--cfg yolov5s.yaml --weights ''
通過傳遞匹配的權重文件從預訓練的檢查點進行訓練:--cfg yolov5s.yaml --weights yolov5s.pt
。
# Train yolov5s on coco128 for 5 epochs
$ python train.py --img 640 --batch 16 --epochs 5 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ''
6.可視化
訓練開始后,查看train*.jpg
圖像以查看訓練圖像,標簽和增強效果。請注意,鑲嵌數據加載器用於訓練(如下所示),這是由Ultralytics開發並在YOLOv4中首次使用的新數據加載概念。如果這些圖像中的標簽不正確,則說明您的數據標簽不正確,應重新訪問2.創建標簽。
在第一個階段完成后,查看test_batch0_gt.jpg
以查看測試批次0地面真相標簽:
並查看test_batch0_pred.jpg
以查看測試批次0的預測:
訓練損失和績效指標將保存到Tensorboard以及results.txt
日志文件中。訓練完成后results.txt
繪制results.png
。results.txt
可以用繪制部分完成的文件from utils.utils import plot_results; plot_results()
。在這里,顯示從coco128到100個紀元訓練的yolov5,從零開始(橙色),從預訓練的yolov5s.pt
權重(藍色)開始: