Bộ dữ liệu OBB văn bản trong cảnh
Bộ dữ liệu OBB văn bản trong cảnh kết hợp COCO-Text và HierText thành bộ dữ liệu phát hiện từ một lớp để huấn luyện Hộp giới hạn định hướng (OBB). Bộ dữ liệu bao gồm ảnh cảnh tự nhiên và ảnh tài liệu có văn bản bị xoay, cong, dày đặc, viết tay và in.
Tính năng chính#
- 65.325 ảnh và 1.288.991 chú thích từ dễ đọc sau khi chuyển đổi.
- Một lớp
textvới nhãn đa giác được chuẩn hóa, tương thích với các model OBB của Ultralytics YOLO. - COCO-Text đóng góp các cảnh tự nhiên đa dạng; HierText đóng góp văn bản dày đặc từ cảnh tự nhiên và tài liệu.
- Tự động tải xuống nguồn, chuyển đổi chú thích và liên kết ảnh đa nền tảng thông qua YAML của bộ dữ liệu.
- Các đa giác nguồn có hơn bốn điểm được giữ nguyên và chuyển thành hình chữ nhật diện tích tối thiểu bởi pipeline dữ liệu OBB.
Cấu trúc dataset#
Bộ dữ liệu đã chuyển đổi có các phân vùng sau. Số liệu chỉ tính các từ dễ đọc có diện tích đường viền ít nhất một pixel; các ảnh không có tệp nguồn sẽ bị loại trừ.
| Tập dữ liệu | Số ảnh / từ của COCO-Text | Số ảnh / từ của HierText | Tổng số ảnh / từ |
|---|---|---|---|
| Huấn luyện | 43,686 / 65,919 | 8,281 / 862,577 | 51,967 / 928,496 |
| Đánh giá | 4,927 / 7,211 | 1,724 / 178,382 | 6,651 / 185,593 |
| Kiểm thử | 5,073 / 7,714 | 1,634 / 167,188 | 6,707 / 174,902 |
| Tổng cộng | 53,686 / 80,844 | 11,639 / 1,208,147 | 65,325 / 1,288,991 |
COCO-Text sử dụng phân vùng huấn luyện chính thức. Ảnh xác thực chính thức được phân chia một cách xác định thành các tập xác thực và kiểm thử có quy mô gần cân bằng, dựa trên ID ảnh. HierText giữ nguyên các phân vùng huấn luyện, xác thực và kiểm thử chính thức, với validation được đổi tên thành val.
Các ảnh không còn từ nào sau khi lọc vẫn được giữ trong bộ dữ liệu với tệp nhãn trống và dùng làm ảnh nền. Các thư mục đã chuyển đổi có cấu trúc sau:
datasets/
└── scene-text-yolo/
├── coco-text/
│ ├── train/
│ │ ├── images/
│ │ └── labels/
│ ├── val/
│ └── test/
└── hiertext/
├── train/
├── val/
└── test/Mỗi hàng nhãn gồm lớp 0, theo sau là tọa độ đa giác đã chuẩn hóa. Ảnh được liên kết cứng nếu hệ thống tệp hỗ trợ; nếu không, ảnh sẽ được sao chép.
YAML của dataset#
Cấu hình scene-text-obb.yaml tham chiếu đến cả hai bộ dữ liệu đã chuyển đổi. Trong lần sử dụng đầu tiên, cấu hình tải xuống ảnh COCO 2017, chú thích COCO-Text, chú thích HierText và ảnh HierText trước khi chuyển đổi.
# 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)Các nguồn cần tải xuống khoảng 24 GB dữ liệu. Hãy đảm bảo có ít nhất 50 GB dung lượng trống trong quá trình tải xuống và giải nén ban đầu, bao gồm cả các tệp lưu trữ COCO tạm thời. Nếu không thể dùng liên kết cứng, ảnh được sao chép sẽ cần thêm dung lượng lưu trữ. Hãy xem lại điều khoản cấp phép trước khi sử dụng hoặc phân phối lại dữ liệu đã chuyển đổi.
Cách sử dụng#
Huấn luyện model OBB YOLO26 với kích thước ảnh 640 pixel bằng các lệnh sau. Các tệp nguồn COCO và HierText hiện có trong datasets_dir của Ultralytics sẽ được sử dụng lại.
from ultralytics import YOLO
model = YOLO("yolo26n-obb.pt")
results = model.train(data="scene-text-obb.yaml", epochs=100, imgsz=640)Ứng dụng#
Sử dụng bộ dữ liệu này để huấn luyện các bộ phát hiện văn bản ở cấp từ cho xử lý tài liệu, đọc hiểu hóa đơn, dịch biển báo, kiểm tra công nghiệp và pipeline OCR. Phát hiện chỉ là một giai đoạn của OCR: hãy kết hợp bộ phát hiện với bộ nhận dạng văn bản khi cần phiên âm.
Cấp phép#
Bộ dữ liệu kết hợp sử dụng các điều khoản riêng theo từng nguồn thay vì một giấy phép chung không kèm điều kiện:
- Chú thích COCO-Text: CC BY 4.0. Các điều khoản hình ảnh COCO nền tảng vẫn được áp dụng.
- Chú thích HierText: CC BY-SA 4.0. Các bản chuyển thể được phân phối lại cần ghi công, thông báo thay đổi và được cấp phép theo cùng giấy phép hoặc giấy phép tương thích.
- Ảnh HierText: Có nguồn từ Open Images. Điều khoản Open Images liệt kê ảnh theo giấy phép CC BY 2.0 và hướng dẫn người dùng xác minh giấy phép của từng ảnh.
Các giấy phép chú thích này cho phép sử dụng thương mại theo các điều kiện tương ứng, nhưng bộ dữ liệu không thuộc phạm vi công cộng. Hãy giữ nguyên thông tin ghi công nguồn và xem xét các điều khoản áp dụng cho ảnh khi phân phối lại dữ liệu.
Trích dẫn và lời cảm ơn#
Nếu sử dụng bộ dữ liệu này trong công việc, hãy trích dẫn cả hai bộ dữ liệu nguồn:
@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}
}Xin cảm ơn các nhóm COCO-Text và HierText đã tạo và duy trì các bộ dữ liệu này.
Câu hỏi thường gặp#
Không. Quá trình chuyển đổi tạo ra các đa giác phát hiện từ một lớp để huấn luyện OBB. Nếu pipeline của bạn cũng cần bản chép văn bản, hãy sử dụng chú thích COCO-Text và HierText gốc.
COCO-Text cung cấp chú thích huấn luyện và xác thực. Cấu hình này giữ nguyên phân vùng huấn luyện chính thức và chia các ảnh xác thực chính thức thành các tập xác thực và kiểm thử theo cách xác định. HierText giữ nguyên các phân vùng chính thức.
Có. Đặt bản tải xuống đó trong
datasets_dircủa Ultralytics theo cấu trúc chuẩncoco/, bao gồmimages/train2017,images/val2017và các tệp văn bản phân vùng COCO. Tập lệnh tải xuống sẽ sử dụng lại dữ liệu đó thay vì tải lại COCO.
Bình luận
Đặt câu hỏi, chia sẻ kết quả hoặc giúp đỡ người khác.