《YOLOv5全面解析教程》二,YOLOv5數(shù)據(jù)集結(jié)構(gòu)解析&如何制作一個(gè)可以獲得更好訓(xùn)練效果的數(shù)據(jù)集
前言
??代碼倉(cāng)庫(kù)地址:https://github.com/Oneflow-Inc/one-yolov5歡迎star one-yolov5項(xiàng)目 獲取 最新的動(dòng)態(tài)。 如果您有問(wèn)題,歡迎在倉(cāng)庫(kù)給我們提出寶貴的意見(jiàn)。?????? 如果對(duì)您有幫助,歡迎來(lái)給我Star呀??~ 本系列教程原文點(diǎn)擊 https://start.oneflow.org/oneflow-yolo-doc 可達(dá)(保持動(dòng)態(tài)更新教程和源碼解讀和修復(fù)一些bug)。
本文主要介紹 one-yolov5 使用的數(shù)據(jù)集的格式以及如何制作一個(gè)可以獲得更好訓(xùn)練效果的數(shù)據(jù)集。本節(jié)教程好的數(shù)據(jù)集標(biāo)準(zhǔn)部分翻譯了 ultralytics/yolov5 wiki 中對(duì)數(shù)據(jù)集相關(guān)的描述(https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results) 。
數(shù)據(jù)集結(jié)構(gòu)解讀
1.創(chuàng)建dataset.yaml
COCO128是官方給的一個(gè)小的數(shù)據(jù)集 由COCO(https://cocodataset.org/#home) 數(shù)據(jù)集前 128 張圖片組成。這128幅圖像用于訓(xùn)練和驗(yàn)證,判斷 yolov5 腳本是否能夠過(guò)正常進(jìn)行。數(shù)據(jù)集配置文件 coco128.yaml(https://github.com/Oneflow-Inc/one-yolov5/blob/master/data/coco128.yaml) 定義了如下的配置選項(xiàng):
# YOLOv5 ?? by Ultralytics, GPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Example usage: python train.py --data coco128.yaml
# parent
# ├── one-yolov5
# └── datasets
# └── coco128 ← downloads here (7 MB)
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
# 訓(xùn)練和驗(yàn)證圖像的路徑相同
train: ../coco128/images/train2017/
val: ../coco128/images/train2017/
# number of classes
nc: 80 # 類(lèi)別數(shù)
# class names 類(lèi)名列表
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard',
'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
'teddy bear', 'hair drier', 'toothbrush']
# Download script/URL (optional) 用于自動(dòng)下載的可選下載命令/URL 。
download: https://ultralytics.com/assets/coco128.zip
注意:如果是自定義數(shù)據(jù)集的話按自己需求修改這個(gè)yaml文件。主要修改以下兩點(diǎn)。
修改訓(xùn)練和驗(yàn)證圖像的路徑為自定義數(shù)據(jù)集路徑 修改類(lèi)別數(shù)和類(lèi)名列表
再展示一下 coco.yaml 的數(shù)據(jù)集路徑配置,這里的訓(xùn)練和驗(yàn)證圖像的路徑就是直接用txt表示:

2.創(chuàng)建 Labels
使用工具例如 CVAT(https://github.com/opencv/cvat) , makesense.ai(https://www.makesense.ai/``), Labelbox(https://labelbox.com/``) ,LabelImg(在下一節(jié)制作數(shù)據(jù)集中介紹LabelImg工具使用) 等,在你自己的數(shù)據(jù)集提供的圖片上做目標(biāo)框的標(biāo)注,將標(biāo)注信息導(dǎo)出為一個(gè)txt后綴結(jié)尾的文件。(如果圖像中沒(méi)有目標(biāo),則不需要*.txt文件)。
*.txt文件規(guī)范如下所示:
每一行 一個(gè)目標(biāo)。 每一行是 class x_center y_center width height 格式。 框坐標(biāo)必須采用標(biāo)準(zhǔn)化xywh格式(從0到1)。如果框以像素為單位,則將x_center和width除以圖像寬度,將y_centre和height除以圖像高度。 類(lèi)號(hào)為零索引的編號(hào)(從0開(kāi)始計(jì)數(shù))。

這里假設(shè)以 COCO 數(shù)據(jù)集的目標(biāo)類(lèi)別約定來(lái)標(biāo)注
與上述圖像相對(duì)應(yīng)的標(biāo)簽文件包含2個(gè)人(class 0)和 一個(gè)領(lǐng)帶(class 27):

3.COCO128 數(shù)據(jù)集目錄結(jié)構(gòu)組織
在本例中,我們的 coco128 是位于 yolov5 目錄附近。yolov5 通過(guò)將每個(gè)圖像路徑 xx/images/xx.jpg 替換為 xx/labels/xx.txt 來(lái)自動(dòng)定位每個(gè)圖像的標(biāo)簽。例如:
dataset/images/im0.jpg # image
dataset/labels/im0.txt # label

制作數(shù)據(jù)集
數(shù)據(jù)集標(biāo)注工具
這里主要介紹 LabelImg: 是一種矩形標(biāo)注工具,常用于目標(biāo)識(shí)別和目標(biāo)檢測(cè),可直接生成 yolov5 讀取的txt標(biāo)簽格式,但其只能進(jìn)行矩形框標(biāo)注。(當(dāng)然也可以選用其它的工具進(jìn)行標(biāo)注并且網(wǎng)上都有大量關(guān)于標(biāo)注工具的教程。)
首先labelimg的安裝十分簡(jiǎn)單,直接使用cmd中的pip進(jìn)行安裝,在cmd中輸入命令行:
pip install labelimg
安裝后直接輸入命令:
labelimg
即可打開(kāi)運(yùn)行。
點(diǎn)擊Open Dir選擇數(shù)據(jù)集文件夾,再點(diǎn)擊Create RectBox進(jìn)行標(biāo)注。

當(dāng)你繪制框結(jié)束就會(huì)彈出標(biāo)簽選擇框,然后標(biāo)注類(lèi)別。這個(gè)類(lèi)別編輯更改在Labelimg文件里,里面有classes.txt文檔,打開(kāi)手動(dòng)更改類(lèi)別即可。(當(dāng)出現(xiàn)新類(lèi)別時(shí)也可在標(biāo)簽選擇框里輸入點(diǎn)OK就自動(dòng)添加類(lèi)別了)
標(biāo)注好后選擇 yolo 格式,點(diǎn)擊 Save 保存。標(biāo)注結(jié)果保存在圖片名.txt文件中,txt文件和圖片名稱(chēng)一致,內(nèi)容如下:

一個(gè)好的數(shù)據(jù)集標(biāo)準(zhǔn)?
每個(gè)類(lèi)的圖像。>= 1500 張圖片。 每個(gè)類(lèi)的實(shí)例。≥ 建議每個(gè)類(lèi)10000個(gè)實(shí)例(標(biāo)記對(duì)象) 圖片形象多樣。必須代表已部署的環(huán)境。對(duì)于現(xiàn)實(shí)世界的使用案例,我們推薦來(lái)自一天中不同時(shí)間、不同季節(jié)、不同天氣、不同照明、不同角度、不同來(lái)源(在線采集、本地采集、不同攝像機(jī))等的圖像。 標(biāo)簽一致性。必須標(biāo)記所有圖像中所有類(lèi)的所有實(shí)例。部分標(biāo)記將不起作用。 標(biāo)簽準(zhǔn)確性。 標(biāo)簽必須緊密地包圍每個(gè)對(duì)象。對(duì)象與其邊界框之間不應(yīng)存在任何空間。任何對(duì)象都不應(yīng)缺少標(biāo)簽。 標(biāo)簽驗(yàn)證。查看train_batch*.jpg 在 訓(xùn)練開(kāi)始驗(yàn)證標(biāo)簽是否正確,即參見(jiàn) mosaic (在 yolov5 的訓(xùn)練日志 runs/train/exp* 文件夾里面可以看到)。 背景圖像。背景圖像是沒(méi)有添加到數(shù)據(jù)集以減少 False Positives(FP)的對(duì)象的圖像。我們建議使用大約0-10%的背景圖像來(lái)幫助減少FPs(COCO有1000個(gè)背景圖像供參考,占總數(shù)的1%)。背景圖像不需要標(biāo)簽。
下圖展示了多種數(shù)據(jù)集的標(biāo)簽特點(diǎn):
其中:
Instances per category 表示每個(gè)類(lèi)別的實(shí)例數(shù) Categories per image 表示每幅圖像的類(lèi)別 (a) Instances per image 表示每幅圖像的實(shí)例數(shù) (b) Number of categories vs. number of instances 表示類(lèi)別數(shù)目 vs 實(shí)例數(shù)目 (我們可以看到 COCO 數(shù)據(jù)集的類(lèi)別和實(shí)例的數(shù)目達(dá)到了一個(gè)較好的平衡) (c) Instance size 表示實(shí)例個(gè)數(shù) (d) Number of categories 表示類(lèi)別數(shù) (e) Percent of image size 表示圖像大小百分比
參考文章
https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results https://docs.ultralytics.com/tutorials/train-custom-datasets/#weights-biases-logging-new
