Tổng quan về các tập dữ liệu Semantic Segmentation

Semantic segmentation gán một nhãn lớp cho mọi pixel trong hình ảnh. Không giống như instance segmentation, semantic segmentation không phân tách các đối tượng riêng lẻ thuộc cùng một lớp. Mục tiêu huấn luyện là một bản đồ lớp dày đặc (dense class map), nơi mỗi pixel lưu trữ một ID lớp.

Hướng dẫn này giải thích định dạng tập dữ liệu được sử dụng bởi các mô hình semantic segmentation Ultralytics YOLO và liệt kê các cấu hình tập dữ liệu tích hợp sẵn cho việc huấn luyện và kiểm thử (validation).

Các định dạng tập dữ liệu được hỗ trợ

Hai định dạng nhãn được hỗ trợ. Trình tải tập dữ liệu (dataset loader) sẽ chọn đường dẫn dựa trên việc tệp YAML của tập dữ liệu có định nghĩa khóa masks_dir hay không.

Định dạng mặt nạ (mask) PNG

Các tập dữ liệu semantic segmentation sử dụng một tệp hình ảnh và một tệp mặt nạ cho mỗi mẫu. Mặt nạ là một hình ảnh đơn kênh, thường là định dạng PNG, trong đó giá trị của mỗi pixel là chỉ số lớp tương ứng với pixel của hình ảnh.

  • Các giá trị pixel 0, 1, 2, ... đại diện cho các ID lớp từ ánh xạ names của tập dữ liệu.
  • Giá trị pixel 255 được xử lý như nhãn bỏ qua (ignore label) và bị loại trừ khỏi tính toán hàm mất mát (loss) và các chỉ số đánh giá (metric).
  • Các tệp mặt nạ nên có cùng tên gốc (stem) với tệp hình ảnh tương ứng, ví dụ: frankfurt_000000_000294.png.
  • Các phần mở rộng tệp mặt nạ được hỗ trợ là .png, .PNG, .bmp.tif.

Bố cục mặc định lưu trữ hình ảnh và mặt nạ trong các thư mục song song. Giá trị masks_dir từ tệp YAML của tập dữ liệu sẽ thay thế thành phần đường dẫn images để tìm các mặt nạ.

dataset/
├── images/
│   ├── train/
│   └── val/
└── masks/
    ├── train/
    └── val/

Ví dụ, một hình ảnh tại images/train/aachen_000000_000019.png sẽ được ghép cặp với một mặt nạ tại masks/train/aachen_000000_000019.png khi masks_dir: masks.

Định dạng nhãn đa giác (polygon) YOLO

Nếu tập dữ liệu của bạn đã có sẵn nhãn đa giác Ultralytics YOLO (một tệp .txt mỗi ảnh với các hàng <class-index> <x1> <y1> <x2> <y2> ...), bạn có thể huấn luyện semantic segmentation trực tiếp từ đó — không cần chuyển đổi sang mặt nạ PNG. Xem định dạng tập dữ liệu instance segmentation để biết bố cục theo từng hàng.

Đường dẫn này được chọn tự động khi tệp YAML của tập dữ liệu bỏ qua masks_dir. Hành vi:

  • Các đa giác được chuyển đổi thành mặt nạ semantic cho mỗi ảnh tại thời điểm tải, được sắp xếp theo diện tích để các đối tượng nhỏ hơn sẽ đè lên đối tượng lớn hơn tại các vùng chồng lấp.
  • Đa lớp (N > 1 trong names): một lớp background bổ sung được thêm vào sau các lớp bạn đã khai báo cho các pixel không nằm trong bất kỳ đa giác nào. Mô hình được xây dựng với N + 1 kênh đầu ra và kênh cuối cùng là background.
  • Đơn lớp (N == 1 trong names): vẫn được huấn luyện như 1 lớp. Mặt nạ là nhị phân, với lớp bạn khai báo hiển thị là 1 và các pixel không nằm trong bất kỳ đa giác nào là 0. Không có lớp background bổ sung nào được thêm vào names.
  • Các pixel được thêm vào bởi kỹ thuật augmentation padding (ví dụ: cắt ngẫu nhiên) vẫn sử dụng 255 làm nhãn bỏ qua.

Sử dụng đường dẫn này khi dữ liệu của bạn đã được gắn nhãn dưới dạng đa giác instance và bạn muốn một mô hình semantic segmentation từ chính các tệp đó.

Định dạng YAML của tập dữ liệu

Các tập dữ liệu semantic segmentation được cấu hình bằng các tệp YAML. Các trường chính bao gồm:

KhóaMô tả
pathThư mục gốc của tập dữ liệu.
trainĐường dẫn hình ảnh huấn luyện tương đối so với path, hoặc đường dẫn tuyệt đối.
valĐường dẫn hình ảnh kiểm thử tương đối so với path, hoặc đường dẫn tuyệt đối.
testĐường dẫn hình ảnh kiểm thử tùy chọn.
masks_dirTên thư mục được sử dụng cho các mặt nạ semantic. Hãy bỏ qua khóa này để chuyển sang định dạng nhãn đa giác YOLO.
namesÁnh xạ từ ID lớp sang tên lớp.
label_mappingÁnh xạ tùy chọn từ các ID tập dữ liệu nguồn sang các ID huấn luyện hoặc ignore_label.
ultralytics/cfg/datasets/cityscapes8.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# Cityscapes semantic segmentation dataset (19 classes)
# Documentation: https://docs.ultralytics.com/datasets/semantic/cityscapes8/
# Example usage: yolo semantic train data=cityscapes8.yaml model=yolo26n-sem.pt
# parent
# ├── ultralytics
# └── datasets
#     └── cityscapes8 ← downloads here (small subset)
#         └── images
#         └── masks

# Dataset root directory
path: cityscapes8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images

masks_dir: masks # semantic mask directory

# Cityscapes 19-class labels
names:
  0: road
  1: sidewalk
  2: building
  3: wall
  4: fence
  5: pole
  6: traffic light
  7: traffic sign
  8: vegetation
  9: terrain
  10: sky
  11: person
  12: rider
  13: car
  14: truck
  15: bus
  16: train
  17: motorcycle
  18: bicycle

# Map source label IDs to train IDs; ignore_label is converted to 255.
label_mapping:
  -1: ignore_label
  0: ignore_label
  1: ignore_label
  2: ignore_label
  3: ignore_label
  4: ignore_label
  5: ignore_label
  6: ignore_label
  7: 0
  8: 1
  9: ignore_label
  10: ignore_label
  11: 2
  12: 3
  13: 4
  14: ignore_label
  15: ignore_label
  16: ignore_label
  17: 5
  18: ignore_label
  19: 6
  20: 7
  21: 8
  22: 9
  23: 10
  24: 11
  25: 12
  26: 13
  27: 14
  28: 15
  29: ignore_label
  30: ignore_label
  31: 16
  32: 17
  33: 18

# Download URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/cityscapes8.zip

Sử dụng label_mapping khi các ID mặt nạ nguồn chưa khớp với các ID lớp huấn luyện liên tục. Cityscapes và ADE20K bao gồm các ánh xạ giúp chuyển đổi ID nhãn gốc thành ID huấn luyện semantic segmentation YOLO và bỏ qua các nhãn không sử dụng.

Cách sử dụng

Huấn luyện mô hình semantic segmentation YOLO26 bằng Python hoặc CLI:

Ví dụ
from ultralytics import YOLO

# Load a pretrained semantic segmentation model
model = YOLO("yolo26n-sem.pt")

# Train on the Cityscapes8 semantic segmentation dataset
results = model.train(data="cityscapes8.yaml", epochs=100, imgsz=1024)

Các tập dữ liệu được hỗ trợ

Ultralytics cung cấp các tệp YAML tập dữ liệu semantic segmentation cho các tập dữ liệu sau:

  • Cityscapes: Tập dữ liệu semantic segmentation cảnh phố đô thị với 19 lớp huấn luyện.
  • Cityscapes8: Một tập con gồm 8 hình ảnh của Cityscapes dùng cho kiểm tra nhanh và CI.
  • ADE20K: Tập dữ liệu phân tích cảnh (scene parsing) với 150 lớp semantic.

Thêm tập dữ liệu của riêng bạn

Lựa chọn A — Mặt nạ PNG

  1. Lưu hình ảnh của bạn trong các thư mục phân chia như images/trainimages/val.
  2. Lưu mỗi mặt nạ đơn kênh cho mỗi hình ảnh trong các thư mục mặt nạ tương ứng, như masks/trainmasks/val.
  3. Đảm bảo các giá trị pixel mặt nạ là các ID lớp. Sử dụng 255 cho các pixel cần bỏ qua.
  4. Tạo một tệp YAML tập dữ liệu với path, train, val, masks_dirnames.
  5. Chỉ thêm label_mapping khi các ID mặt nạ của bạn cần chuyển đổi thành các ID huấn luyện liên tục.
path: path/to/my-semantic-dataset
train: images/train
val: images/val
masks_dir: masks

names:
    0: background
    1: road
    2: building

Lựa chọn B — Nhãn đa giác

  1. Bố trí hình ảnh và các tệp đa giác .txt giống hệt như đối với instance segmentation.
  2. Tạo một tệp YAML tập dữ liệu với path, train, valnamesbỏ qua masks_dir.
  3. Không thêm mục "background" vào names. Đối với các tập dữ liệu đa lớp, trình tải sẽ tự động thêm một mục; đối với các tập dữ liệu đơn lớp, quá trình huấn luyện vẫn ở mức 1 lớp — lớp bạn khai báo sẽ trở thành 1 trong mặt nạ và các pixel không được bao phủ sẽ trở thành 0.
path: path/to/my-polygon-dataset
train: images/train
val: images/val

names:
    0: person
    1: car

Câu hỏi thường gặp

Sự khác biệt giữa mặt nạ semantic segmentation và nhãn instance segmentation là gì?

Mặt nạ semantic segmentation là các bản đồ pixel dày đặc. Mỗi pixel lưu trữ một ID lớp và có một hình ảnh mặt nạ cho mỗi hình ảnh huấn luyện. Nhãn instance segmentation trong Ultralytics YOLO sử dụng các tệp văn bản với tọa độ đa giác, mỗi hàng cho một đối tượng instance.

Giá trị pixel nào bị bỏ qua trong quá trình huấn luyện?

Giá trị pixel 255 được sử dụng làm nhãn bỏ qua. Các pixel này bị bỏ qua trong tính toán loss và metric, điều này hữu ích cho các vùng trống, pixel không có nhãn hoặc các lớp nằm ngoài tập nhãn huấn luyện.

Tên tệp mặt nạ có cần khớp với tên tệp hình ảnh không?

Có. Mỗi mặt nạ semantic nên có cùng tên gốc tệp với hình ảnh tương ứng. Trình tải tập dữ liệu thay thế thành phần thư mục images bằng masks_dir và tìm kiếm các tệp mặt nạ khớp với nhau.

Tôi có thể sử dụng trực tiếp các ID nhãn của tập dữ liệu gốc không?

Có, nếu chúng đã khớp với các ID lớp trong names của bạn. Nếu tập dữ liệu nguồn sử dụng các ID không liên tục hoặc bao gồm các nhãn cần bỏ qua, hãy thêm phần label_mapping để chuyển đổi các giá trị pixel nguồn thành các ID huấn luyện.

Tôi có thể sử dụng tập dữ liệu instance segmentation của mình để huấn luyện semantic segmentation không?

Có. Các tập dữ liệu instance segmentation sử dụng nhãn đa giác Ultralytics YOLO (một tệp .txt mỗi ảnh với các hàng <class-index> <x1> <y1> <x2> <y2> ...), và các tệp đó có thể được tái sử dụng cho semantic segmentation — chỉ cần bỏ qua masks_dir khỏi tệp YAML tập dữ liệu. Trình tải sẽ tự động chuyển đổi đa giác thành mặt nạ cho mỗi ảnh. Đối với các tập dữ liệu đa lớp (N > 1), một lớp background bổ sung được thêm vào và mô hình được xây dựng với N + 1 kênh đầu ra. Đối với các tập dữ liệu đơn lớp (N == 1), huấn luyện vẫn ở mức 1 lớp — mặt nạ hiển thị lớp bạn đã khai báo là 1 và các pixel không được bao phủ là 0.

Bình luận