Cách chuyển đổi COCO Chú thích cho YOLO Định dạng
Việc huấn luyện các mô hình YOLO Ultralytics yêu cầu chú thích trong YOLO Định dạng COCO thường được sử dụng, nhưng nhiều công cụ chú thích phổ biến lại xuất ra định dạng COCO JSON . Hướng dẫn này sẽ chỉ cho bạn cách chuyển đổi định dạng của mình. COCO chú thích cho YOLO Định dạng và bắt đầu huấn luyện các mô hình phát hiện đối tượng , phân đoạn đối tượng và ước lượng tư thế .
Tại sao nên chuyển đổi từ COCO ĐẾN YOLO ?
Cái COCO Định dạng JSON lưu trữ tất cả các chú thích trong một tệp duy nhất, trong khi YOLO sử dụng một tệp văn bản cho mỗi hình ảnh với tọa độ đã được chuẩn hóa. Việc chuyển đổi là cần thiết vì:
- YOLO các mô hình yêu cầu
.txttệp nhãn với một tệp tin cho mỗi hình ảnh, chứaclass x_center y_center width heighttrong hệ tọa độ chuẩn hóa. - COCO JSON sử dụng tọa độ pixel trong
[x_min, y_min, width, height]Định dạng bằng một tệp JSON duy nhất cho tất cả hình ảnh. - ID lớp khác nhau — COCO sử dụng tùy ý
category_idgiá trị, trong khi YOLO Yêu cầu ID lớp có chỉ số bắt đầu từ 0.
| Tính năng | COCO JSON | YOLO TXT |
|---|---|---|
| Kết cấu | Một tệp JSON duy nhất chứa tất cả hình ảnh. | Một .txt mỗi hình ảnh |
| Định dạng bbox | [x_min, y_min, width, height] tính bằng pixel | class x_center y_center width height đã chuẩn hóa (0-1) |
| ID lớp | category_id (có thể bắt đầu từ bất kỳ số nào) | Chỉ số bắt đầu từ 0 |
| Phân đoạn | Mảng đa giác trong segmentation cánh đồng | Tọa độ đa giác sau ID lớp |
| Điểm chính | [x, y, visibility, ...] tính bằng pixel | [x, y, visibility, ...] đã chuẩn hóa |
Bắt đầu nhanh
Cách nhanh nhất để chuyển đổi COCO Chú thích và bắt đầu huấn luyện:
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="path/to/annotations/", # directory containing your JSON files
save_dir="path/to/output/", # where to save converted labels
cls91to80=False, # IMPORTANT: set False for custom datasets
)
Sau khi chuyển đổi, sắp xếp cấu trúc thư mục của bạn, tạo tệp dataset.yaml, và bắt đầu huấn luyện. Xem hướng dẫn chi tiết từng bước đầy đủ bên dưới.
Bộ dữ liệu tùy chỉnh: luôn sử dụng cls91to80=False
Hàm cls91to80=True mặc định được thiết kế chỉ đối với tiêu chuẩn Bộ dữ liệu COCO Với 80 lớp đối tượng, mỗi lớp ánh xạ 91 ID danh mục không liền kề với 80 ID lớp liền kề. Đối với bất kỳ tập dữ liệu tùy chỉnh nào, bạn phải bộ cls91to80=False — nếu không, ID lớp của bạn sẽ bị ánh xạ sai một cách âm thầm và mô hình của bạn sẽ học sai các lớp.
Hướng dẫn chuyển đổi từng bước
1. Chuẩn bị Tập dữ liệu COCO của bạn
Một tập dữ liệu định dạng COCO điển hình được xuất từ các công cụ chú thích có cấu trúc như sau:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ ├── img_002.jpg
│ │ └── ...
│ └── val/
│ ├── img_100.jpg
│ └── ...
└── annotations/
├── instances_train.json
└── instances_val.json
Mỗi tệp JSON đều tuân theo định dạng sau: Định dạng dữ liệu COCO Thông số kỹ thuật với ba trường bắt buộc — images, annotations, và categories:
{
"images": [{ "id": 1, "file_name": "img_001.jpg", "width": 640, "height": 480 }],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 50, 200, 150],
"area": 30000,
"iscrowd": 0
}
],
"categories": [
{ "id": 1, "name": "helmet" },
{ "id": 2, "name": "vest" }
]
}
2. Chuyển đổi Chú thích
Sử dụng convert_coco() hàm để chuyển đổi của bạn COCO Chú thích JSON cho YOLO .txt định dạng:
Chuyển đổi COCO sang định dạng YOLO
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
cls91to80=False,
)
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
use_segments=True,
cls91to80=False,
)
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
use_keypoints=True,
cls91to80=False,
)
3. Tổ chức cấu trúc thư mục
Sau khi chuyển đổi, các tệp nhãn cần được đặt cùng với hình ảnh của bạn. YOLO mong đợi một labels/ thư mục phản ánh images/ thư mục:
import shutil
from pathlib import Path
# Paths
converted_dir = Path("my_dataset/converted/labels")
dataset_dir = Path("my_dataset")
# Move labels next to images for each split
for split in ["train", "val"]:
src = converted_dir / split # convert_coco strips "instances_" prefix from JSON filename
dst = dataset_dir / "labels" / split
dst.mkdir(parents=True, exist_ok=True)
for f in src.glob("*.txt"):
shutil.move(str(f), str(dst / f.name))
Cấu trúc tập dữ liệu cuối cùng của bạn sẽ trông như sau:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ └── ...
│ └── val/
│ └── ...
├── labels/
│ ├── train/
│ │ ├── img_001.txt
│ │ └── ...
│ └── val/
│ └── ...
└── dataset.yaml
4. Tạo dataset.yaml
Tạo một dataset.yaml tệp cấu hình ánh xạ các danh mục COCO của bạn tới tên lớp YOLO. Tệp này cho YOLO biết dữ liệu của bạn ở đâu và các lớp nào cần detect:
import json
from pathlib import Path
import yaml
# Read categories from your COCO JSON
with open("my_dataset/annotations/instances_train.json") as f:
coco = json.load(f)
# Build class names matching convert_coco output (category_id - 1)
categories = sorted(coco["categories"], key=lambda x: x["id"])
names = {cat["id"] - 1: cat["name"] for cat in categories}
# NOTE: convert_coco maps class IDs as category_id - 1, so category_id must
# start from 1. If your categories start from 0, add 1 to each ID first.
# Create dataset.yaml
dataset = {
"path": str(Path("my_dataset").resolve()),
"train": "images/train",
"val": "images/val",
"names": names,
}
with open("my_dataset/dataset.yaml", "w") as f:
yaml.dump(dataset, f, default_flow_style=False)
Tệp YAML kết quả:
path: /absolute/path/to/my_dataset
train: images/train
val: images/val
names:
0: helmet
1: vest
Để biết thêm chi tiết về định dạng YAML của tập dữ liệu, hãy xem hướng dẫn cấu hình tập dữ liệu .
5. Huấn luyện mô hình YOLO của bạn
Sau khi đã chuẩn bị xong tập dữ liệu đã chuyển đổi, hãy tiến hành huấn luyện. YOLO người mẫu:
Đào tạo trên tuyến đường đã được chuyển đổi COCO dữ liệu
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load a pretrained model
results = model.train(data="my_dataset/dataset.yaml", epochs=100, imgsz=640)
yolo detect train model=yolo26n.pt data=my_dataset/dataset.yaml epochs=100 imgsz=640
Để biết các mẹo và phương pháp huấn luyện tốt nhất, hãy xem hướng dẫn huấn luyện mẫu .
6. Xác minh quá trình chuyển đổi của bạn
Trước khi huấn luyện, hãy kiểm tra nhanh một vài tệp nhãn để xác nhận ID lớp và tọa độ là chính xác:
from pathlib import Path
label_file = Path("my_dataset/labels/train/img_001.txt")
for line in label_file.read_text().strip().splitlines():
parts = line.split()
cls_id = int(parts[0])
coords = [float(v) for v in parts[1:5]]
assert cls_id >= 0, f"Negative class ID {cls_id} — category_id in your JSON may start from 0"
assert all(0 <= v <= 1 for v in coords), f"Coordinates out of [0, 1] range: {coords}"
Mẹo
Nếu bạn thấy ID lớp âm, thì... COCO JSON có thể sử dụng category_id Bắt đầu từ 0. Cộng thêm 1 vào tất cả. category_id các giá trị trong JSON của bạn trước khi chạy convert_coco(), vì nó ánh xạ các ID lớp dưới dạng category_id - 1.
Khắc phục các sự cố thường gặp
Mã định danh lớp không chính xác sau khi chuyển đổi
Nếu mô hình của bạn được huấn luyện nhưng phát hiện sai các lớp đối tượng, rất có thể bạn đang sử dụng... cls91to80=True (mặc định) trên một tập dữ liệu tùy chỉnh. Điều này ánh xạ category_id các giá trị thông qua COCO Bảng tra cứu từ 91 đến 80, chỉ chính xác đối với tiêu chuẩn. Bộ dữ liệu COCO.
Giải pháp: Luôn sử dụng cls91to80=False cho các tập dữ liệu tùy chỉnh.
Không tìm thấy nhãn nào trong quá trình huấn luyện
Nếu quá trình đào tạo cho thấy WARNING: No labels found hoặc 0 images, N backgroundsCác tệp nhãn của bạn không nằm trong thư mục dự kiến. convert_coco() lưu nhãn vào một thư mục đầu ra riêng biệt (ví dụ: save_dir/labels/train/), nhưng YOLO mong đợi labels/ song song với images/ bên trong thư mục dữ liệu của bạn.
Giải pháp: Di chuyển các tệp nhãn để khớp với định dạng mong muốn cấu trúc thư mục. Hãy đảm bảo labels/train/ là anh chị em ruột của images/train/.
Lỗi chính tả trong quá trình chuyển đổi
Nếu bạn gặp phải KeyError: 'bbox' hoặc các lỗi tương tự khi chạy convert_coco(), của bạn labels_dir có thể chứa các tệp JSON không phải là tệp JSON riêng biệt (ví dụ: captions_train2017.json) có cấu trúc chú thích khác.
Giải pháp: Chỉ đặt các tệp JSON chú thích thể hiện (ví dụ, instances_train2017.json) trong labels_dir.
Các tập tin nhãn trống sau khi chuyển đổi
Nếu quá trình chuyển đổi hoàn tất nhưng .txt Các tệp trống hoặc bị thiếu, tất cả các chú thích có thể có iscrowd: 1 (phổ biến với SAM-mặt nạ được tạo ra), hoặc các hộp giới hạn Không có chiều rộng hoặc chiều cao.
Giải pháp: Kiểm tra các chú thích JSON của bạn để tìm iscrowd giá trị. Nếu sử dụng SAM mặt nạ, xử lý trước JSON để thiết lập iscrowd: 0.
Khoảng trống ID lớp trong nhãn đã chuyển đổi
Nếu ID lớp trong tệp nhãn không liền kề (ví dụ: 0, 4, 9 thay vì 0, 1, 2), công cụ chú thích của bạn sẽ sử dụng các ID không liền kề. category_id giá trị.
Giải pháp: Xác minh các ID lớp trong .txt các tệp phù hợp với names từ điển trong dataset.yaml. Ánh xạ lại ID thành các giá trị liên tiếp nếu cần.
Để biết đầy đủ chi tiết về API và mô tả tham số, vui lòng xem [liên kết]. convert_coco Tài liệu tham khảo API.
Câu hỏi thường gặp
Tôi chuyển đổi như thế nào? COCO Chú thích JSON cho YOLO định dạng?
Sử dụng convert_coco() hàm từ Ultralytics để chuyển đổi COCO Chú thích JSON cho YOLO .txt Định dạng. Đặt cls91to80=False Đối với các tập dữ liệu tùy chỉnh:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="path/to/annotations/", save_dir="output/", cls91to80=False)
Sau khi chuyển đổi, sắp xếp lại các tệp nhãn của bạn sao cho labels/ phản chiếu images/ thư mục, sau đó tạo một dataset.yaml Xem tập tin. hướng dẫn từng bước cho toàn bộ quy trình làm việc.
Tại sao lại như vậy? YOLO chương trình đào tạo "Không tìm thấy nhãn" sau đó COCO chuyển đổi?
Điều này xảy ra vì convert_coco() lưu nhãn vào một thư mục con bên trong save_dir/labels/ (ví dụ: save_dir/labels/train/) thay vì trực tiếp vào tập dữ liệu của bạn labels/train/ cùng với images/train/. YOLO mong đợi các nhãn nằm song song với hình ảnh — ví dụ, images/train/img.jpg nhu cầu labels/train/img.txt. Di chuyển các nhãn đã chuyển đổi của bạn để khớp với cấu trúc này. Xem sửa cấu trúc thư mục.
Điều đó có nghĩa là gì? cls91to80 thực hiện trong convert_coco()?
Hàm cls91to80 tham số kiểm soát cách thức COCO category_id các giá trị được ánh xạ tới YOLO Mã định danh lớp. Khi nào True (mặc định), nó sử dụng một bảng tra cứu được thiết kế cho tiêu chuẩn Bộ dữ liệu COCO, bao gồm 80 lớp với ID không liền kề (1-90). Đối với các bộ dữ liệu tùy chỉnh, luôn đặt cls91to80=False — thao tác này đơn giản chỉ là trừ 1 khỏi mỗi category_id để tạo ID lớp có chỉ số bắt đầu từ 0.
Tôi có thể huấn luyện YOLO trực tiếp trên COCO JSON mà không cần chuyển đổi không?
Không phải với tình hình hiện tại YOLO quy trình đào tạo — các chú thích phải nằm trong YOLO .txt Định dạng với một tệp tin cho mỗi hình ảnh. Sử dụng convert_coco() để chuyển đổi của bạn COCO Đầu tiên là JSON, sau đó làm theo cách này. hướng dẫn để tổ chức và đào tạo. Để biết thêm thông tin về các định dạng được hỗ trợ, hãy xem định dạng tập dữ liệu.
Tôi có thể chuyển đổi chú thích phân đoạn COCO sang định dạng YOLO không?
Vâng, hãy sử dụng use_segments=True khi gọi convert_coco() bao gồm mặt nạ phân đoạn đa giác trong quá trình chuyển đổi YOLO nhãn. Thao tác này tạo ra các tệp nhãn tương thích với YOLO mô hình phân đoạn:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_segments=True, cls91to80=False)
Tôi chuyển đổi như thế nào? COCO chú thích điểm chính YOLO định dạng?
Sử dụng use_keypoints=True để chuyển đổi COCO Chú thích điểm chính cho ước tính tư thế đào tạo:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_keypoints=True, cls91to80=False)
Lưu ý rằng nếu cả hai use_segments và use_keypoints được đặt thành True, chỉ các keypoint sẽ được ghi vào tệp nhãn — các segments sẽ bị bỏ qua một cách âm thầm.