COCO YOLO に変換する方法
トレーニング Ultralytics YOLO モデルYOLO 注釈が必要ですが、多くの一般的な注釈ツールCOCO エクスポートします。このガイドでは、COCO YOLO に変換し、物体検出、インスタンスセグメンテーション、およびポーズ推定モデルのトレーニングを開始する方法について説明します。
なぜCOCO からYOLO COCO 換するのですか?
COCO 形式では、すべてのアノテーションが1つのファイルに保存されますが、 YOLO は、正規化された座標を含む画像ごとのテキストファイルを使用します。変換が必要な理由は以下の通りです:
- YOLO 以下が必要です
.txtラベルファイル 画像ごとに1つのファイルで、その中にはclass x_center y_center width height正規化座標系において。 - COCO JSONはピクセル座標を使用します で
[x_min, y_min, width, height]すべての画像に対して単一のJSONファイルを使用するフォーマット。 - クラスIDが異なります —COCO 任意の
category_id値であるのに対し、YOLO では0から始まるクラスIDYOLO 。
| 機能 | COCO JSON | YOLO |
|---|---|---|
| 構成 | すべての画像を1つのJSONファイルにまとめる | 一つ .txt 画像ごとに1つのファイル |
| Bbox形式 | [x_min, y_min, width, height] ピクセル単位で | class x_center y_center width height 正規化(0~1) |
| クラスID | category_id (任意の数値から開始可能) | 0から始まる(0を起点とする) |
| セグメンテーション | のポリゴン配列 segmentation フィールド | クラスIDに続くポリゴン座標 |
| キーポイント | [x, y, visibility, ...] ピクセル単位で | [x, y, visibility, ...] 正規化済み |
クイックスタート
COCO を変換してトレーニングを開始する最も手っ取り早い方法は:
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
)
変換後、ディレクトリ構造を整理し、dataset.yamlを作成し、トレーニングを開始します。詳細なステップバイステップガイドは以下を参照してください。
カスタムデータセット: 常に使用 cls91to80=False
The cls91to80=True デフォルトは設計されています のみ 標準的な用途には COCOデータセット 80のオブジェクトクラスを備えており、91個の非連続なカテゴリIDを80個の連続したクラスIDにマッピングします。任意のカスタムデータセットについては、 ~しなければならない セット cls91to80=False — そうしないと、クラスIDが黙って誤ってマッピングされ、モデルが誤ったクラスを学習してしまいます。
変換の手順ガイド
1. COCOデータセットの準備
アノテーションツールからエクスポートされた一般的なCOCO形式データセットは、以下の構造を持っています。
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ ├── img_002.jpg
│ │ └── ...
│ └── val/
│ ├── img_100.jpg
│ └── ...
└── annotations/
├── instances_train.json
└── instances_val.json
各JSONファイルは、 COCOデータ形式 3つの必須項目を含む仕様書 — images, annotations、および 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. アノテーションの変換
以下を使用します convert_coco() COCO アノテーションをYOLOに変換する関数 .txt フォーマット:
COCOを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. ディレクトリ構造の整理
変換後、ラベルファイルは画像と同じ場所に配置する必要があります。YOLOは labels/ をミラーリングするディレクトリ images/ ディレクトリ:
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))
最終的なデータセットの構造は、以下のようになります:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ └── ...
│ └── val/
│ └── ...
├── labels/
│ ├── train/
│ │ ├── img_001.txt
│ │ └── ...
│ └── val/
│ └── ...
└── dataset.yaml
4. dataset.yamlの作成
新規作成 dataset.yaml COCOカテゴリをYOLOクラス名にマッピングする設定ファイル。このファイルは、YOLOにデータがどこにあり、どのクラスを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)
生成されたYAMLファイル:
path: /absolute/path/to/my_dataset
train: images/train
val: images/val
names:
0: helmet
1: vest
データセットのyaml形式の詳細については、データセット設定ガイドを参照してください。
5. YOLOモデルのトレーニング
変換済みのデータセットが準備できたら、YOLO を学習させます:
変換されたCOCO を用いて学習する
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
トレーニングのヒントとベストプラクティスについては、モデルトレーニングガイドを参照してください。
6. 変換を確認する
トレーニング前に、いくつかのラベルファイルをスポットチェックし、クラスIDと座標が正しいことを確認してください。
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}"
ヒント
負のクラスIDが表示される場合は、COCO で以下が使用されている可能性があります category_id 0から開始し、すべてに1を加える category_id 実行する前に、JSON内の値を convert_coco()、クラスIDをとしてマッピングするため category_id - 1.
よくある問題のトラブルシューティング
変換後のクラスIDが間違っている
モデルが動作するものの、誤ったオブジェクトクラスを検出してしまう場合は、おそらく cls91to80=True (デフォルト) でカスタムデータセット上。これはあなたのをマッピングします category_id COCO ルックアップテーブルを通じて値を算出しますが、これは標準仕様の場合にのみ正しいものです COCOデータセット.
ソリューション: 常に使用する cls91to80=False カスタムデータセット向け。
トレーニング中にラベルが見つかりませんでした
トレーニングの結果が表れるなら WARNING: No labels found または 0 images, N backgrounds、ラベルファイルが期待されるディレクトリにありません。 convert_coco() ラベルを別の出力ディレクトリに保存します(例: save_dir/labels/train/) ですが、YOLOは期待します labels/ ~と並行して images/ データセットディレクトリ内。
ソリューション: ラベルファイルを期待される形式に移動します。 ディレクトリ構造。必ず labels/train/ は~の兄弟姉妹です images/train/.
変換中にKeyErrorが発生しました
もし KeyError: 'bbox' 実行時に次のようなエラーが発生する場合 convert_coco()、あなたの labels_dir おそらくインスタンスではないJSONファイルが含まれている(例: captions_train2017.json) 異なるアノテーション構造を持つもの。
ソリューション: インスタンスアノテーションJSONファイルのみを配置します(例: instances_train2017.json)内の labels_dir.
変換後の空のラベルファイル
変換が完了しても、 .txt ファイルが空であるか、または見つからない場合、すべてのアノテーションが iscrowd: 1 (一般的) SAM-生成されたマスク)、または バウンディングボックス 幅も高さもゼロである。
ソリューション: JSONアノテーションを確認します。 iscrowd 値。SAM を使用する場合は、JSONを前処理して iscrowd: 0.
変換されたラベルにおけるクラスIDのギャップ
ラベルファイル内のクラスIDが連続していない場合(例:0、1、2ではなく0、4、9)、アノテーションツールは連続していない category_id 価値観。
ソリューション: クラスIDを確認します。 .txt ファイルが一致します names 辞書内の dataset.yaml。必要に応じて、IDを連続した値に再マッピングしてください。
完全なAPIの詳細とパラメータの説明については、を参照してください。 convert_coco APIリファレンス.
よくある質問
COCO アノテーションをYOLO に変換するにはどうすればよいですか?
以下を使用します convert_coco() Ultralytics 関数Ultralytics COCO アノテーションをYOLOに変換Ultralytics .txt フォーマット。設定 cls91to80=False カスタムデータセット向け:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="path/to/annotations/", save_dir="output/", cls91to80=False)
変換後、ラベルファイルを再編成して labels/ ~を反映している images/ ディレクトリを作成し、次に dataset.yaml ファイル。詳細は ステップバイステップガイド 完全なワークフローには。
COCO した後、YOLO 「ラベルが見つかりません」と表示されるのはなぜですか?
これは、次のような理由によるものです。 convert_coco() ラベルを内部のサブディレクトリに保存します save_dir/labels/ (例: save_dir/labels/train/)に直接ではなく、 labels/train/ と並んで images/train/. YOLOは、ラベルが画像と並行して配置されることを想定しています — 例えば、 images/train/img.jpg 必要 labels/train/img.txt。変換されたラベルをこの構造に合うように移動してください。参照: ディレクトリ構造の修正.
「何」とは cls91to80 実行する convert_coco()?
The cls91to80 このパラメータは、COCO動作を制御します category_id 値YOLO IDにマッピングされます。 True (デフォルト) の場合、標準用に設計されたルックアップテーブルを使用します COCOデータセット、これは非連続なID(1-90)を持つ80のクラスを含みます。そのため、 カスタムデータセット、常に設定 cls91to80=False — これは単にそれぞれから1を引くだけです category_id インデックス0から始まるクラスIDを作成する。
変換せずにCOCO JSONでYOLOを直接トレーニングできますか?
現在のYOLO パイプラインでは不可能です。アノテーションはYOLO形式でなければなりません。 .txt 画像ごとに1つのファイルを使用するフォーマット。使用 convert_coco() まずCOCO を変換してから、以下の手順に従ってください ガイド 整理やトレーニングを行うため。対応形式の詳細については、以下を参照してください。 データセット形式.
COCO segmentationアノテーションをYOLO形式に変換できますか?
はい、使ってください use_segments=True 呼び出す際 convert_coco() 変換YOLO にポリゴン分割マスクを含める。これにより、 YOLO モデル:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_segments=True, cls91to80=False)
COCO 注釈をYOLO に変換するにはどうすればよいですか?
使用 use_keypoints=True COCO アノテーションを変換するには 姿勢推定 トレーニング:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_keypoints=True, cls91to80=False)
なお、両方が use_segments および use_keypoints に設定されています True、キーポイントのみがラベルファイルに書き込まれ、segmentは暗黙的に無視されます。