COCO Ek Açıklamaları YOLO Formatına Nasıl Dönüştürülür
Ultralytics YOLO modellerini eğitmek, ek açıklamaların YOLO formatında olmasını gerektirir, ancak birçok popüler ek açıklama aracı bunun yerine COCO JSON formatında dışa aktarır. Bu kılavuz, COCO ek açıklamalarınızı YOLO formatına nasıl dönüştüreceğinizi ve nesne algılama, örnek segmentasyon ve poz tahmini modellerini eğitmeye nasıl başlayacağınızı gösterir.
Neden COCO'dan YOLO'ya Dönüştürme?
COCO JSON formatı tüm ek açıklamaları tek bir dosyada saklarken, YOLO her görüntü için normalize edilmiş koordinatlara sahip bir metin dosyası kullanır. Dönüştürme gereklidir çünkü:
- YOLO modelleri gerektirir
.txtetiket dosyaları her görüntü için bir dosya ile, içerenclass x_center y_center width heightnormalize edilmiş koordinatlarda. - COCO JSON piksel koordinatları kullanır içinde
[x_min, y_min, width, height]tüm görüntüler için tek bir JSON dosyası içeren format. - Sınıf Kimlikleri farklıdır — COCO rastgele kullanır
category_iddeğerler kullanırken, YOLO sıfır tabanlı sınıf kimlikleri gerektirir.
| Özellik | COCO JSON | YOLO TXT |
|---|---|---|
| Yapı | Tüm görüntüler için tek JSON dosyası | Bir .txt görüntü başına dosya |
| Bbox formatı | [x_min, y_min, width, height] piksel cinsinden | class x_center y_center width height normalize edilmiş (0-1) |
| Sınıf Kimlikleri | category_id (herhangi bir sayıdan başlayabilir) | Sıfır tabanlı (0'dan başlar) |
| Segmentasyon | Poligon dizileri segmentation alanında | Sınıf Kimliğinden sonra poligon koordinatları |
| Anahtar Noktalar | [x, y, visibility, ...] piksel cinsinden | [x, y, visibility, ...] normalize edilmiş |
Hızlı Başlangıç
COCO ek açıklamalarını dönüştürmenin ve eğitime başlamanın en hızlı yolu:
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
)
Dönüştürmeden sonra, dizin yapınızı düzenleyin, bir dataset.yaml oluşturun ve eğitime başlayın. Aşağıdaki tam adım adım kılavuza bakın.
Özel veri kümeleri: her zaman şunu kullanın cls91to80=False
cls91to80=True varsayılan olarak tasarlanmıştır sadece standart COCO veri kümesi 91 bitişik olmayan kategori kimliğini 80 bitişik sınıf kimliğine eşleyen 80 nesne sınıfı ile. Herhangi bir özel veri kümesi için, zorundasınız ayarlayın cls91to80=False — aksi takdirde sınıf kimlikleriniz sessizce yanlış eşlenecek ve modeliniz yanlış sınıfları öğrenecektir.
Adım Adım Dönüşüm Kılavuzu
1. COCO Veri Setinizi Hazırlayın
Ek açıklama araçlarından dışa aktarılan tipik bir COCO formatlı veri kümesi aşağıdaki yapıya sahiptir:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ ├── img_002.jpg
│ │ └── ...
│ └── val/
│ ├── img_100.jpg
│ └── ...
└── annotations/
├── instances_train.json
└── instances_val.json
Her JSON dosyası şunları takip eder: COCO veri formatı üç zorunlu alan içeren belirtimi — images, annotationsve 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. Ek Açıklamaları Dönüştürün
Şunu kullanın: convert_coco() COCO JSON ek açıklamalarınızı YOLO'ya dönüştürme işlevi .txt biçimi:
COCO'yu YOLO formatına dönüştür
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. Dizin Yapısını Düzenleyin
Dönüştürmeden sonra, etiket dosyaları görüntülerinizin yanına yerleştirilmelidir. YOLO bir labels/ dizinini yansıtan bir images/ dizin:
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))
Nihai veri kümesi yapınız şöyle görünmelidir:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ └── ...
│ └── val/
│ └── ...
├── labels/
│ ├── train/
│ │ ├── img_001.txt
│ │ └── ...
│ └── val/
│ └── ...
└── dataset.yaml
4. dataset.yaml Oluşturun
Bir tane oluşturun dataset.yaml COCO kategorilerinizi YOLO sınıf adlarına eşleyen bir yapılandırma dosyası. Bu dosya, YOLO'ya verilerinizin nerede olduğunu ve hangi sınıfları detect edeceğini söyler:
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)
Ortaya çıkan YAML dosyası:
path: /absolute/path/to/my_dataset
train: images/train
val: images/val
names:
0: helmet
1: vest
Veri kümesi YAML formatı hakkında daha fazla ayrıntı için veri kümesi yapılandırma kılavuzuna bakın.
5. YOLO Modelinizi Eğitin
Dönüştürülmüş veri kümeniz hazır olduğunda, bir YOLO modeli eğitin:
Dönüştürülmüş COCO verileri üzerinde eğitim yapın
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
Eğitim ipuçları ve en iyi uygulamalar için model eğitim kılavuzuna bakın.
6. Dönüşümünüzü Doğrulayın
Eğitimden önce, sınıf kimliklerinin ve koordinatların doğru olduğunu doğrulamak için birkaç etiket dosyasını kontrol edin:
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}"
İpucu
Negatif sınıf kimlikleri görüyorsanız, COCO JSON'unuz muhtemelen şunu kullanır: category_id 0'dan başlayarak. Tümüne 1 ekleyin category_id çalıştırmadan önce JSON'unuzdaki değerleri convert_coco(), çünkü sınıf kimliklerini şu şekilde eşler category_id - 1.
Sık Karşılaşılan Sorunları Giderme
Dönüşüm Sonrası Yanlış Sınıf Kimlikleri
Modeliniz eğitim alıyor ancak yanlış nesne sınıflarını detect ediyorsa, muhtemelen şunu kullanıyorsunuz cls91to80=True (varsayılan) özel bir veri kümesinde. Bu, sizin category_id değerlerini COCO 91'den 80'e arama tablosu aracılığıyla eşler, ki bu yalnızca standart için doğrudur COCO veri kümesi.
Çözüm: Her zaman şunu kullanın cls91to80=False özel veri kümeleri için.
Eğitim Sırasında Etiket Bulunamadı
Eğer eğitim sırasında şu görülüyorsa WARNING: No labels found veya 0 images, N backgrounds, etiket dosyalarınız beklenen dizinde değil. convert_coco() etiketleri ayrı bir çıktı dizinine kaydeder (örn., save_dir/labels/train/), ancak YOLO şunu bekler labels/ paralel olarak images/ veri kümesi dizininizin içinde.
Çözüm: Etiket dosyalarını beklenen dizin yapısına. Emin olun ki labels/train/ şunun kardeşidir images/train/.
Dönüşüm Sırasında KeyError
Eğer alırsanız KeyError: 'bbox' veya benzer hatalar alıyorsanız convert_coco(), sizin labels_dir muhtemelen örnek olmayan JSON dosyaları (örn., captions_train2017.json) içeriyor ve bunlar farklı bir açıklama yapısına sahip.
Çözüm: Yalnızca örnek açıklama JSON dosyalarını (örn., instances_train2017.json) şuraya yerleştirin labels_dir.
Dönüşüm Sonrası Boş Etiket Dosyaları
Dönüşüm tamamlandı ancak .txt dosyaları boş veya eksikse, tüm açıklamalar iscrowd: 1 (yaygın olarak SAM-oluşturulan maskelerle), veya sınırlayıcı kutular sıfır genişliğe veya yüksekliğe sahip.
Çözüm: JSON ek açıklamalarınızı şunun için inceleyin: iscrowd değerleri. SAM maskeleri kullanıyorsanız, JSON'u ayarlamak için ön işlemden geçirin. iscrowd: 0.
Dönüştürülen Etiketlerde Sınıf Kimliği Boşlukları
Etiket dosyalarındaki sınıf kimlikleri bitişik değilse (örn. 0, 1, 2 yerine 0, 4, 9), ek açıklama aracınız bitişik olmayan category_id değerler kullanır.
Çözüm: Şunlardaki sınıf kimliklerini doğrulayın: .txt dosyaları şununla eşleşir: names sözlüğü içinde dataset.yaml. Gerekirse kimlikleri bitişik değerlere yeniden eşleyin.
Tüm API ayrıntıları ve parametre açıklamaları için şuraya bakın: convert_coco API referansı.
SSS
COCO JSON ek açıklamalarını YOLO formatına nasıl dönüştürürüm?
Şunu kullanın: convert_coco() Ultralytics'tan COCO JSON ek açıklamalarını YOLO'ya dönüştürmek için işlev .txt biçimi. Ayarlayın cls91to80=False özel veri kümeleri için:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="path/to/annotations/", save_dir="output/", cls91to80=False)
Dönüştürmeden sonra, etiket dosyalarınızı yeniden düzenleyin, böylece labels/ şunu yansıtır: images/ dizini, ardından bir dataset.yaml dosyası oluşturun. Şuraya bakın: adım adım kılavuz eksiksiz iş akışı için.
COCO dönüşümünden sonra YOLO eğitimi neden "Etiket bulunamadı" gösteriyor?
Bu durum şundan dolayı oluşur: convert_coco() etiketleri şunun içindeki bir alt dizine kaydeder: save_dir/labels/ (örneğin, save_dir/labels/train/) doğrudan veri kümenizin içine değil. labels/train/ ile birlikte images/train/. YOLO, etiketlerin görüntülere paralel olmasını bekler — örneğin, images/train/img.jpg gereksinimler labels/train/img.txt. Dönüştürülmüş etiketlerinizi bu yapıya uyacak şekilde taşıyın. Bkz. dizin yapısını düzeltme.
Ne işe yarar cls91to80 ne yapar convert_coco()?
cls91to80 parametresi, COCO category_id değerlerinin YOLO sınıf kimliklerine eşlendiğini kontrol eder. Ne zaman True (varsayılan), standart için tasarlanmış bir arama tablosu kullanır COCO veri kümesi, 80 sınıfı ve bitişik olmayan kimlikleri (1-90) olan. İçin özel veri kümeleri, her zaman ayarlayın cls91to80=False — bu, her birinden 1 çıkarır category_id sıfır tabanlı sınıf kimlikleri oluşturmak için.
Dönüştürmeden doğrudan COCO JSON üzerinde YOLO eğitebilir miyim?
Mevcut YOLO eğitim hattı ile değil — ek açıklamalar YOLO .txt formatında, her görüntü için bir dosya ile. Kullanın convert_coco() COCO JSON'unuzu önce dönüştürmek için, ardından bu kılavuzu düzenlemek ve eğitmek için. Desteklenen formatlar hakkında daha fazla bilgi için bkz. veri kümesi formatları.
COCO segmentasyon ek açıklamalarını YOLO formatına dönüştürebilir miyim?
Evet, kullanın use_segments=True çağırırken convert_coco() dönüştürülmüş YOLO etiketlerine poligon segment maskelerini dahil etmek için. Bu, ile uyumlu etiket dosyaları üretir YOLO segmentasyon modelleri:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_segments=True, cls91to80=False)
COCO anahtar nokta ek açıklamalarını YOLO formatına nasıl dönüştürürüm?
Kullanım use_keypoints=True COCO anahtar nokta ek açıklamalarını dönüştürmek için poz tahmini eğitim için:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_keypoints=True, cls91to80=False)
Şunu unutmayın ki eğer her ikisi de use_segments ve use_keypoints ayarlanmışsa True, etiket dosyalarına yalnızca anahtar noktalar yazılacak — segment'ler sessizce göz ardı edilecektir.