YOLOv5全面解析教程②:如何製作訓練效果更好的資料集

語言: CN / TW / HK



撰文 | Fengwen, BBuf

本文主要介紹 One-YOLOv5 使用的資料集格式以及如何製作一個可以獲得更好訓練效果的資料集。本節教程的資料集標準部分翻譯了 Ultralytics/YOLOv5 wiki 中對資料集相關的描述(https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results)

程式碼倉庫地址:

https://github.com/Oneflow-Inc/one-yolov5

本系列教程原文點選 

https://start.oneflow.org/oneflow-yolo-doc 可達(保持動態更新教程和原始碼解讀和修復一些bug)。

 

1

 

資料集結構解讀

1. 建立dataset.yaml

COCO128是官方給的一個小的資料集 由COCO( https://cocodataset.org/#home) 資料集前 128 張圖片組成。這128幅影象用於訓練和驗證,判斷 YOLOv5 指令碼是否能夠過正常進行。

 

資料集配置檔案 coco128.yaml 

(https://github.com/Oneflow-Inc/one-yolov5/blob/master/data/coco128.yaml) 定義瞭如下的配置選項:

# 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/]
# 訓練和驗證影象的路徑相同train: ../coco128/images/train2017/ val: ../coco128/images/train2017/
# number of classesnc: 80 # 類別數
# class names 類名列表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) 用於自動下載的可選下載命令/URL 。download: https://ultralytics.com/assets/coco128.zip

注意:如果是自定義資料集的話按自己需求修改這個yaml檔案。主要修改以下兩點。

  1. 修改訓練和驗證影象的路徑為自定義資料集路徑

  2. 修改類別數和類名列表

再展示一下 coco.yaml 的資料集路徑配置,這裡的訓練和驗證影象的路徑就是直接用txt表示:

2. 建立 Labels

使用工具例如 CVAT  (https://github.com/opencv/cvat) makesense.ai  (https://www.makesense.ai/``) Labelbox  (https://labelbox.com/``) LabelImg(在下一節制作資料集中介紹LabelImg工具使用) 等,在你自己的資料集提供的圖片上做目標框的標註,將標註資訊匯出為一個txt字尾結尾的檔案。 (如果影象中沒有目標,則不需要*.txt檔案)。

*.txt檔案規範如下所示:

  • 每一行 一個目標。

  • 每一行是 class x_center y_center width height 格式。

  • 框座標必須採用標準化xywh格式(從0到1)。如果框以畫素為單位,則將x_center和width除以影象寬度,將y_centre和height除以影象高度。

  • 類號為零索引的編號(從0開始計數)。

這裡假設以 COCO 資料集的目標類別約定來標註

與上述影象相對應的標籤檔案包含2個人(class 0)和 一個領帶(class 27):

3. COCO128 資料集目錄結構組織

在本例中,我們的 coco128 是位於 YOLOv5 目錄附近。YOLOv5 通過將每個影象路徑 xx/images/xx.jpg 替換為 xx/labels/xx.txt 來自動定位每個影象的標籤。例如:

dataset/images/im0.jpg  # imagedataset/labels/im0.txt  # label

coco 和 coco128 資料集組織結構

 2

 

製作資料集

1. 資料集標註工具

這裡主要介紹 LabelImg 是一種矩形標註工具,常用於目標識別和目標檢測,可直接生成 YOLOv5 讀取的txt標籤格式,但其只能進行矩形框標註(當然也可以選用其它的工具進行標註並且網上都有大量關於標註工具的教程。)

首先labelimg的安裝十分簡單,直接使用cmd中的pip進行安裝,在cmd中輸入命令列:

pip install labelimg

安裝後直接輸入命令:

labelimg

即可開啟執行。

點選Open Dir選擇資料集資料夾,再點選Create RectBox進行標註。

當你繪製框結束就會彈出標籤選擇框,然後標註類別。這個類別編輯更改在Labelimg檔案裡,裡面有classes.txt文件,開啟手動更改類別即可(當出現新類別時也可在標籤選擇框裡輸入點OK就自動新增類別了)。

標註好後選擇 yolo 格式,點選 Save 儲存。標註結果儲存在圖片名.txt檔案中,txt檔案和圖片名稱一致,內容如下:

  3

 

一個好的資料集標準?

  • 每個類的影象。>= 1500 張圖片。

  • 每個類的例項。≥ 建議每個類10000個例項(標記物件)

  • 圖片形象多樣。必須代表已部署的環境。對於現實世界的使用案例,我們推薦來自一天中不同時間、不同季節、不同天氣、不同照明、不同角度、不同來源(線上採集、本地採集、不同攝像機)等的影象。

  • 標籤一致性。必須標記所有影象中所有類的所有例項。部分標記將不起作用。

  • 標籤準確性。

  • 標籤必須緊密地包圍每個物件。物件與其邊界框之間不應存在任何空間。任何物件都不應缺少標籤。

  • 標籤驗證。檢視train_batch*.jpg 在 訓練開始驗證標籤是否正確,即參見 mosaic (在 YOLOv5 的訓練日誌 runs/train/exp* 資料夾裡面可以看到)。

  • 背景影象。背景影象是沒有新增到資料集以減少 False Positives(FP)的物件的影象。我們建議使用大約0-10%的背景影象來幫助減少FPs(COCO有1000個背景影象供參考,佔總數的1%)。背景影象不需要標籤。

     

下圖展示了多種資料集的標籤特點:

其中:

  • Instances per category 表示每個類別的例項數

  • Categories per image 表示每幅影象的類別

  • (a) Instances per image 表示每幅影象的例項數

  • (b) Number of categories vs. number of instances 表示類別數目 vs 例項數目 (我們可以看到 COCO 資料集的類別和例項的數目達到了一個較好的平衡)

  • (c) Instance size 表示例項個數

  • (d) Number of categories 表示類別數

  • (e) Percent of image size 表示影象大小百分比

  4

 

參考文章

  • https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results

  • https://docs.ultralytics.com/tutorials/train-custom-datasets/#weights-biases-logging-new

 

其他人都在看

歡迎 Star、試用 OneFlow 最新版本:https://github.com/Oneflow-Inc/oneflow/


 

本文分享自微信公眾號 - OneFlow(OneFlowTechnology)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。