Ultralytics YOLO27: Bekleme listesine katıl.
Başla

Sahne Metni OBB Veri Kümesi

Sahne Metni OBB veri kümesi, COCO-Text ve HierText veri kümelerini Yönlendirilmiş Sınırlayıcı Kutu (OBB) eğitimi için tek sınıflı bir sözcük algılama veri kümesinde birleştirir. Doğal sahnelerden ve belgelerden alınmış; döndürülmüş, eğri, sıkışık düzende, el yazısı ve basılı metin içeren görüntüler barındırır.

Temel Özellikler#

  • Dönüştürme sonrasında 65.325 görüntü ve 1.288.991 okunaklı sözcük açıklaması.
  • Ultralytics YOLO OBB modelleriyle uyumlu, normalize edilmiş poligon etiketleri içeren tek bir text sınıfı.
  • COCO-Text çeşitli doğal sahneler sunar; HierText ise doğal sahnelerden ve belgelerden alınmış yoğun metinler içerir.
  • Veri kümesi YAML dosyası aracılığıyla kaynakların otomatik indirilmesi, açıklamaların dönüştürülmesi ve görüntülerin platformlar arası bağlanması.
  • Dört noktadan fazla içeren kaynak poligonlar korunur ve OBB veri hattı tarafından minimum alanlı dikdörtgenlere dönüştürülür.

Veri Kümesi Yapısı#

Dönüştürülen veri kümesi aşağıdaki bölümlere ayrılır. Sayımlar yalnızca en az bir piksel kontur alanına sahip okunaklı sözcükleri içerir; kaynak dosyaları bulunmayan görüntüler hariç tutulur.

BölümCOCO-Text görüntüleri / sözcükleriHierText görüntüleri / sözcükleriBirleşik görüntüler / sözcükler
Eğit43,686 / 65,9198,281 / 862,57751,967 / 928,496
Doğrula4,927 / 7,2111,724 / 178,3826,651 / 185,593
Test5,073 / 7,7141,634 / 167,1886,707 / 174,902
Toplam53,686 / 80,84411,639 / 1,208,14765,325 / 1,288,991

COCO-Text, resmî eğitim bölümünü kullanır. Resmî doğrulama görüntüleri, görüntü kimliği kullanılarak belirlenimci biçimde yaklaşık olarak dengeli doğrulama ve test alt kümelerine ayrılır. HierText, resmî eğitim, doğrulama ve test bölümlerini korur; validation ise val olarak yeniden adlandırılır.

Korunmuş sözcük içermeyen görüntüler, boş etiket dosyalarıyla veri kümesinde kalır ve arka plan görüntüsü olarak kullanılır. Dönüştürülen dizinler şu yapıyı kullanır:

datasets/
└── scene-text-yolo/
    ├── coco-text/
    │   ├── train/
    │   │   ├── images/
    │   │   └── labels/
    │   ├── val/
    │   └── test/
    └── hiertext/
        ├── train/
        ├── val/
        └── test/

Her etiket satırı, ardından normalize edilmiş poligon koordinatlarının geldiği 0 sınıfını içerir. Dosya sistemi destekliyorsa görüntüler sabit bağlantıyla bağlanır; desteklemiyorsa kopyalanır.

Veri Kümesi YAML Dosyası#

scene-text-obb.yaml yapılandırması, dönüştürülmüş her iki veri kümesine de başvurur. İlk kullanımda dönüştürme öncesinde COCO 2017 görüntülerini, COCO-Text açıklamalarını, HierText açıklamalarını ve HierText görüntülerini indirir.

scene-text-obb.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# Scene Text OBB dataset combining COCO-Text and HierText legible word annotations
# COCO-Text: https://bgshih.github.io/cocotext/ (annotations: CC BY 4.0; COCO image terms apply)
# HierText: https://github.com/google-research-datasets/hiertext (CC BY-SA 4.0; Open Images terms apply)
# Documentation: https://docs.ultralytics.com/datasets/obb/scene-text
# Example usage: yolo obb train data=scene-text-obb.yaml model=yolo26n-obb.pt imgsz=640
# parent
# ├── ultralytics
# └── datasets
#     ├── coco
#     ├── coco-text
#     ├── hiertext
#     └── scene-text-yolo

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: scene-text-yolo # dataset root dir
train:
  - coco-text/train/images # 43686 images, 65919 words
  - hiertext/train/images # 8281 images, 862577 words
val:
  - coco-text/val/images # 4927 images, 7211 words
  - hiertext/val/images # 1724 images, 178382 words
test:
  - coco-text/test/images # 5073 images, 7714 words
  - hiertext/test/images # 1634 images, 167188 words

names:
  0: text

# Download COCO 2017 images and both annotation sources, then convert legible words to YOLO OBB format (~24 GB)
download: |
  import gzip
  import hashlib
  import json
  import os
  import shutil
  from pathlib import Path
  from tempfile import TemporaryDirectory

  import cv2
  import numpy as np

  from ultralytics.data.utils import check_det_dataset
  from ultralytics.utils import TQDM
  from ultralytics.utils.downloads import download

  def polygon_label(vertices, width, height):
      polygon = np.asarray(vertices, dtype=np.float32).reshape(-1, 2)
      if len(polygon) < 3 or cv2.contourArea(polygon) < 1:
          return ""
      polygon[:, 0] = polygon[:, 0].clip(0, width - 1)
      polygon[:, 1] = polygon[:, 1].clip(0, height - 1)
      polygon /= np.array([width, height], dtype=np.float32)
      return "0 " + " ".join(f"{x:.7f} {y:.7f}" for x, y in polygon)

  def link_image(source, destination):
      destination.parent.mkdir(parents=True, exist_ok=True)
      try:
          os.link(source, destination)
      except OSError:
          shutil.copy2(source, destination)

  def write_labels(label_dir, stem, labels):
      label_dir.mkdir(parents=True, exist_ok=True)
      (label_dir / f"{stem}.txt").write_text("\n".join(labels) + ("\n" if labels else ""), encoding="utf-8")

  def convert_coco_text(parent, destination):
      source_dir = parent / "coco-text"
      annotations = source_dir / "cocotext.v2.json"
      if not annotations.is_file():
          download(
              "https://github.com/bgshih/cocotext/releases/download/dl/cocotext.v2.zip",
              dir=source_dir,
              delete=True,
          )
      coco = check_det_dataset("coco.yaml")
      images = Path(coco["path"]) / "images"
      data = json.loads(annotations.read_text(encoding="utf-8"))
      for image_id, image in TQDM(data["imgs"].items(), desc="Converting COCO-Text"):
          split = (
              "train"
              if image["set"] == "train"
              else ("val" if hashlib.sha256(str(image["id"]).encode()).digest()[0] < 128 else "test")
          )
          filename = image["file_name"].replace("COCO_train2014_", "", 1)
          source = images / "train2017" / filename
          if not source.exists():
              source = images / "val2017" / filename
          if not source.exists():
              continue
          image_dir = destination / split / "images"
          link_image(source, image_dir / filename)
          im = cv2.imread(str(source))
          if im is None:
              raise ValueError(f"Unreadable image: {source}")
          height, width = im.shape[:2]
          labels = []
          for ann_id in data["imgToAnns"].get(image_id, []):
              ann = data["anns"][str(ann_id)]
              if ann["legibility"] == "legible" and (label := polygon_label(ann["mask"], width, height)):
                  labels.append(label)
          write_labels(destination / split / "labels", Path(filename).stem, labels)

  def convert_hiertext(parent, destination):
      source = parent / "hiertext" / "source"
      splits = {"train": "train", "validation": "val", "test": "test"}
      base = "https://raw.githubusercontent.com/google-research-datasets/hiertext/main"
      if not all((source / "gt" / f"{split}.jsonl.gz").is_file() for split in splits):
          download([f"{base}/gt/{split}.jsonl.gz" for split in splits], dir=source / "gt", unzip=False, threads=3)
      if not all((source / split).is_dir() for split in splits):
          download(
              [f"https://open-images-dataset.s3.amazonaws.com/ocr/{split}.tgz" for split in splits],
              dir=source,
              delete=True,
              threads=3,
          )
      for source_split, split in splits.items():
          with gzip.open(source / "gt" / f"{source_split}.jsonl.gz", "rt", encoding="utf-8") as f:
              rows = json.load(f)["annotations"]
          for row in TQDM(rows, desc=f"Converting HierText {source_split}"):
              image_id = row["image_id"]
              source_image = source / source_split / f"{image_id}.jpg"
              if not source_image.exists():
                  continue
              image = destination / split / "images" / f"{image_id}.jpg"
              link_image(source_image, image)
              im = cv2.imread(str(image))
              if im is None:
                  raise ValueError(f"Unreadable image: {source_image}")
              height, width = im.shape[:2]
              labels = []
              for paragraph in row["paragraphs"]:
                  for line in paragraph["lines"]:
                      for word in line["words"]:
                          if word["legible"] and (label := polygon_label(word["vertices"], width, height)):
                              labels.append(label)
              write_labels(destination / split / "labels", image_id, labels)

  final = Path(yaml["path"])
  parent = final.parent
  parent.mkdir(parents=True, exist_ok=True)
  with TemporaryDirectory(dir=parent, prefix=".scene-text-") as tmp:
      destination = Path(tmp)
      convert_coco_text(parent, destination / "coco-text")
      convert_hiertext(parent, destination / "hiertext")
      destination.rename(final)
İndirme boyutu ve lisanslama

Kaynakların indirilmesi yaklaşık 24 GB alan gerektirir. Geçici COCO arşivleri de dahil olmak üzere ilk indirme ve çıkarma sırasında en az 50 GB boş depolama alanı ayır. Sabit bağlantılar kullanılamıyorsa kopyalanan görüntüler ek depolama alanı gerektirir. Dönüştürülmüş verileri kullanmadan veya yeniden dağıtmadan önce lisans koşullarını incele.

Kullanım#

Aşağıdaki komutlarla 640 piksel görüntü boyutunda bir YOLO26 OBB modeli eğit. Ultralytics datasets_dir altındaki mevcut COCO ve HierText kaynak dosyaları yeniden kullanılır.

Eğitim Örneği
from ultralytics import YOLO

model = YOLO("yolo26n-obb.pt")
results = model.train(data="scene-text-obb.yaml", epochs=100, imgsz=640)

Uygulamalar#

Bu veri kümesini belge işleme, makbuz anlama, tabela çevirisi, endüstriyel denetim ve OCR hatları için sözcük düzeyinde metin algılayıcıları eğitmekte kullan. Algılama, OCR'nin yalnızca bir aşamasıdır: Metin dökümü gerektiğinde algılayıcıyı bir metin tanıyıcıyla birlikte kullan.

Lisanslama#

Birleştirilmiş veri kümesi, koşulsuz tek bir lisans yerine kaynağa özgü koşullara tabidir:

  • COCO-Text açıklamaları: CC BY 4.0. Altta yatan COCO görüntü koşulları geçerliliğini korur.
  • HierText açıklamaları: CC BY-SA 4.0. Yeniden dağıtılan uyarlamalar, kaynak belirtmeyi, değişiklik bildirimi eklemeyi ve aynı ya da uyumlu bir lisansla lisanslamayı gerektirir.
  • HierText görüntüleri: Open Images'tan alınmıştır. Open Images koşulları, görüntülerin CC BY 2.0 lisanslı olduğunu belirtir ve kullanıcılara her görüntünün lisansını ayrı ayrı doğrulamalarını söyler.

Bu açıklama lisansları, koşullarına uyulması kaydıyla ticari kullanıma izin verir; ancak veri kümesi kamu malı değildir. Verileri yeniden dağıtırken kaynak atıflarını koru ve geçerli görüntü koşullarını incele.

Atıflar ve Teşekkürler#

Bu veri kümesini çalışmalarında kullanırsan her iki kaynak veri kümesine de atıfta bulun:

Atıf
@article{veit2016cocotext,
  title={COCO-Text: Dataset and Benchmark for Text Detection and Recognition in Natural Images},
  author={Veit, Andreas and Matera, Tomas and Neumann, Lukas and Matas, Jiri and Belongie, Serge},
  journal={arXiv preprint arXiv:1601.07140},
  year={2016}
}

@inproceedings{long2022towards,
  title={Towards End-to-End Unified Scene Text Detection and Layout Analysis},
  author={Long, Shangbang and Qin, Siyang and Panteleev, Dmitry and Bissacco, Alessandro and Fujii, Yasuhisa and Raptis, Michalis},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  year={2022}
}

Bu veri kümelerini oluşturup bakımını yaptıkları için COCO-Text ve HierText ekiplerine teşekkür ederiz.

Sık Sorulan Sorular#

  • Hayır. Dönüştürme, OBB eğitimi için tek sınıflı sözcük algılama poligonları oluşturur. Hattın metin dökümlerine de ihtiyaç duyuyorsa orijinal COCO-Text ve HierText açıklamalarını kullan.

  • COCO-Text, eğitim ve doğrulama açıklamaları sağlar. Bu yapılandırma, resmî eğitim bölümünü korur ve resmî doğrulama görüntülerini belirlenimci biçimde doğrulama ve test alt kümelerine ayırır. HierText resmî bölümlerini korur.

  • Evet. İndirmeyi standart coco/ düzeninde, Ultralytics datasets_dir dizininin altına yerleştir; images/train2017, images/val2017 ve COCO bölüm metin dosyaları da buna dahil olmalı. İndirme betiği COCO'yu yeniden indirmek yerine mevcut dosyaları kullanır.

Katkıda Bulunanlar

Yorumlar

Bir soru sor, sonuçlarını paylaş veya başka birine yardım et.