コンテンツにスキップ

TT100Kデータセット

清華-テンセント10万枚(TT100K)は、テンセントストリートビューのパノラマ画像10万枚から作成された大規模な交通標識ベンチマークデータセットである。本データセットは実環境における交通標識の検出と分類に特化して設計されており、研究者や開発者が堅牢な交通標識認識システムを構築するための包括的なリソースを提供する。

このデータセットには 221の異なるカテゴリにわたる30,000以上の交通標識インスタンス を含む100,000枚の画像が含まれています。これらの画像は、照度、気象条件、視角、距離における大きな変動を捉えており、多様な実世界シナリオで確実に動作する必要があるモデルの訓練に最適です。

このデータセットは特に以下の点で価値があります:

  • 自動運転システム
  • 先進運転支援システム(ADAS)
  • 交通監視アプリケーション
  • 都市計画と交通分析
  • 実環境におけるコンピュータビジョン研究

主な特徴

TT100Kデータセットにはいくつかの重要な利点があります:

  • スケール:10万枚の高解像度画像(2048×2048ピクセル)
  • 多様性:中国の交通標識を網羅する221種類の交通標識カテゴリー
  • 実環境条件:天候、照明、および視角における大きな変動
  • リッチアノテーション:各標識にはクラスラベル、境界ボックス、ピクセルマスクが含まれます
  • 包括的なカバー範囲:禁止標識、警告標識、義務標識、情報標識を含む
  • トレーニング/テスト分割:一貫した評価のための事前定義された分割

データセットの構造

TT100Kデータセットは3つのサブセットに分割されています:

  1. トレーニングセット:様々な種類の交通標識を検出し分類するためのモデルを訓練するために使用される、主要な交通シーン画像のコレクション。
  2. 検証セット:モデル開発中に性能を監視し、ハイパーパラメータを調整するために使用される部分集合。
  3. テストセット:最終モデルが実環境においてclassify 標識をdetect classify 能力を評価するために用いられる、事前に除外された画像の集合。

TT100Kデータセットには、いくつかの主要グループに分類された221種類の交通標識カテゴリが含まれています:

速度制限標識(午前、午後

  1. pl_: 制限速度(pl5、pl10、pl20、pl30、pl40、pl50、pl60、pl70、pl80、pl100、pl120)
  2. pm_: 最低速度制限(pm5、pm10、pm20、pm30、pm40、pm50、pm55)

禁止標識 (p, pn, pr_)

  1. p1-p28: 一般的な禁止標識(立入禁止、駐車禁止、停車禁止など)
  2. pn/pne: 立入禁止および駐車禁止の標識
  3. pr: 各種制限標識(pr10、pr20、pr30、pr40、pr50など)

警告サイン (w_)

  1. w1-w66: 様々な道路上の危険、状況、および状態を示す警告標識
  2. 横断歩道、急カーブ、滑りやすい路面、動物、工事現場などを含む。

高さ/幅制限標識(ph, pb

  1. ph_: 高さ制限標識(ph2、ph2.5、ph3、ph3.5、ph4、ph4.5、ph5など)
  2. pb_: 幅制限標識

指示代名詞(i, il, io, ip)

  1. i1-i15: 一般案内標識
  2. il_: 速度制限情報 (il60, il80, il100, il110)
  3. io: その他の情報表示板
  4. ip: 情報プレート

データセット YAML

YAML(Yet Another Markup Language)ファイルはデータセット構成を定義するために使用されます。データセットのパス、クラス、その他の関連情報を含みます。TT100Kデータセットの場合、 TT100K.yaml ファイルには自動ダウンロードおよび変換機能が含まれています。

ultralytics.yaml

# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# Tsinghua-Tencent 100K (TT100K) dataset https://cg.cs.tsinghua.edu.cn/traffic-sign/ by Tsinghua University
# Documentation: https://cg.cs.tsinghua.edu.cn/traffic-sign/tutorial.html
# Paper: Traffic-Sign Detection and Classification in the Wild (CVPR 2016)
# License: CC BY-NC 2.0 license for non-commercial use only
# Example usage: yolo train data=TT100K.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── TT100K ← downloads here (~18 GB)

# 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: TT100K # dataset root dir
train: images/train # train images (relative to 'path') 6105 images
val: images/val # val images (relative to 'path') 7641 images (original 'other' split)
test: images/test # test images (relative to 'path') 3071 images

# Classes (221 traffic sign categories, 45 with sufficient training instances)
names:
  0: pl5
  1: pl10
  2: pl15
  3: pl20
  4: pl25
  5: pl30
  6: pl40
  7: pl50
  8: pl60
  9: pl70
  10: pl80
  11: pl90
  12: pl100
  13: pl110
  14: pl120
  15: pm5
  16: pm10
  17: pm13
  18: pm15
  19: pm20
  20: pm25
  21: pm30
  22: pm35
  23: pm40
  24: pm46
  25: pm50
  26: pm55
  27: pm8
  28: pn
  29: pne
  30: ph4
  31: ph4.5
  32: ph5
  33: ps
  34: pg
  35: ph1.5
  36: ph2
  37: ph2.1
  38: ph2.2
  39: ph2.4
  40: ph2.5
  41: ph2.8
  42: ph2.9
  43: ph3
  44: ph3.2
  45: ph3.5
  46: ph3.8
  47: ph4.2
  48: ph4.3
  49: ph4.8
  50: ph5.3
  51: ph5.5
  52: pb
  53: pr10
  54: pr100
  55: pr20
  56: pr30
  57: pr40
  58: pr45
  59: pr50
  60: pr60
  61: pr70
  62: pr80
  63: pr90
  64: p1
  65: p2
  66: p3
  67: p4
  68: p5
  69: p6
  70: p7
  71: p8
  72: p9
  73: p10
  74: p11
  75: p12
  76: p13
  77: p14
  78: p15
  79: p16
  80: p17
  81: p18
  82: p19
  83: p20
  84: p21
  85: p22
  86: p23
  87: p24
  88: p25
  89: p26
  90: p27
  91: p28
  92: pa8
  93: pa10
  94: pa12
  95: pa13
  96: pa14
  97: pb5
  98: pc
  99: pg
  100: ph1
  101: ph1.3
  102: ph1.5
  103: ph2
  104: ph3
  105: ph4
  106: ph5
  107: pi
  108: pl0
  109: pl4
  110: pl5
  111: pl8
  112: pl10
  113: pl15
  114: pl20
  115: pl25
  116: pl30
  117: pl35
  118: pl40
  119: pl50
  120: pl60
  121: pl65
  122: pl70
  123: pl80
  124: pl90
  125: pl100
  126: pl110
  127: pl120
  128: pm2
  129: pm8
  130: pm10
  131: pm13
  132: pm15
  133: pm20
  134: pm25
  135: pm30
  136: pm35
  137: pm40
  138: pm46
  139: pm50
  140: pm55
  141: pn
  142: pne
  143: po
  144: pr10
  145: pr100
  146: pr20
  147: pr30
  148: pr40
  149: pr45
  150: pr50
  151: pr60
  152: pr70
  153: pr80
  154: ps
  155: w1
  156: w2
  157: w3
  158: w5
  159: w8
  160: w10
  161: w12
  162: w13
  163: w16
  164: w18
  165: w20
  166: w21
  167: w22
  168: w24
  169: w28
  170: w30
  171: w31
  172: w32
  173: w34
  174: w35
  175: w37
  176: w38
  177: w41
  178: w42
  179: w43
  180: w44
  181: w45
  182: w46
  183: w47
  184: w48
  185: w49
  186: w50
  187: w51
  188: w52
  189: w53
  190: w54
  191: w55
  192: w56
  193: w57
  194: w58
  195: w59
  196: w60
  197: w62
  198: w63
  199: w66
  200: i1
  201: i2
  202: i3
  203: i4
  204: i5
  205: i6
  206: i7
  207: i8
  208: i9
  209: i10
  210: i11
  211: i12
  212: i13
  213: i14
  214: i15
  215: il60
  216: il80
  217: il100
  218: il110
  219: io
  220: ip

# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
  import json
  import shutil
  from pathlib import Path

  from PIL import Image

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


  def tt100k2yolo(dir):
      """Convert TT100K annotations to YOLO format with images/{split} and labels/{split} structure."""
      data_dir = dir / "data"
      anno_file = data_dir / "annotations.json"

      print("Loading annotations...")
      with open(anno_file, encoding="utf-8") as f:
          data = json.load(f)

      # Build class name to index mapping from yaml
      names = yaml["names"]
      class_to_idx = {v: k for k, v in names.items()}

      # Create directories
      for split in ["train", "val", "test"]:
          (dir / "images" / split).mkdir(parents=True, exist_ok=True)
          (dir / "labels" / split).mkdir(parents=True, exist_ok=True)

      print("Converting annotations to YOLO format...")
      skipped = 0
      for img_id, img_data in TQDM(data["imgs"].items(), desc="Processing"):
          img_path_str = img_data["path"]
          if "train" in img_path_str:
              split = "train"
          elif "test" in img_path_str:
              split = "test"
          else:
              split = "val"

          # Source and destination paths
          src_img = data_dir / img_path_str
          if not src_img.exists():
              continue

          dst_img = dir / "images" / split / src_img.name

          # Get image dimensions
          try:
              with Image.open(src_img) as img:
                  img_width, img_height = img.size
          except Exception as e:
              print(f"Error reading {src_img}: {e}")
              continue

          # Copy image to destination
          shutil.copy2(src_img, dst_img)

          # Convert annotations
          label_file = dir / "labels" / split / f"{src_img.stem}.txt"
          lines = []

          for obj in img_data.get("objects", []):
              category = obj["category"]
              if category not in class_to_idx:
                  skipped += 1
                  continue

              bbox = obj["bbox"]
              xmin, ymin = bbox["xmin"], bbox["ymin"]
              xmax, ymax = bbox["xmax"], bbox["ymax"]

              # Convert to YOLO format (normalized center coordinates and dimensions)
              x_center = ((xmin + xmax) / 2.0) / img_width
              y_center = ((ymin + ymax) / 2.0) / img_height
              width = (xmax - xmin) / img_width
              height = (ymax - ymin) / img_height

              # Clip to valid range
              x_center = max(0, min(1, x_center))
              y_center = max(0, min(1, y_center))
              width = max(0, min(1, width))
              height = max(0, min(1, height))

              cls_idx = class_to_idx[category]
              lines.append(f"{cls_idx} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")

          # Write label file
          if lines:
              label_file.write_text("".join(lines), encoding="utf-8")

      if skipped:
          print(f"Skipped {skipped} annotations with unknown categories")
      print("Conversion complete!")


  # Download
  dir = Path(yaml["path"])  # dataset root dir
  urls = ["https://cg.cs.tsinghua.edu.cn/traffic-sign/data_model_code/data.zip"]
  download(urls, dir=dir, curl=True, threads=1)

  # Convert
  tt100k2yolo(dir)

使用法

TT100Kデータセットで画像サイズ640ピクセYOLO11 100エポック学習させるには、以下のコードスニペットを使用できます。データセットは初回使用時に自動的にダウンロードされ、YOLO に変換されます。

学習の例

from ultralytics import YOLO

# Load a model
model = YOLO("yolo11n.pt")  # load a pretrained model (recommended for training)

# Train the model - dataset will auto-download on first run
results = model.train(data="TT100K.yaml", epochs=100, imgsz=640)
# Start training from a pretrained *.pt model
# Dataset will auto-download and convert on first run
yolo detect train data=TT100K.yaml model=yolo11n.pt epochs=100 imgsz=640

サンプル画像とアノテーション

以下はTT100Kデータセットからの典型的な例です:

  1. 都市環境:様々な距離に複数の交通標識が設置された街路風景
  2. 高速道路の標識:速度制限や方向指示を含む高速道路標識
  3. 複雑な交差点:方向が異なる複数の標識が近接して設置されている
  4. 厳しい条件:異なる照明(昼/夜)、天候(雨/霧)、および視認角度下での標識

データセットには以下が含まれます:

  1. クローズアップサイン:画像領域の大部分を占める、大きく明瞭な視認性のあるサイン
  2. 遠方の標識:微細な検出能力を必要とする小型標識
  3. 部分的に遮られた標識:車両、樹木、その他の物体によって部分的に遮られている標識
  4. 画像ごとの複数の標識:複数の異なる種類の標識を含む画像

引用と謝辞

研究または開発作業においてTT100Kデータセットを使用される場合は、以下の論文を引用してください:

@InProceedings{Zhu_2016_CVPR,
    author = {Zhu, Zhe and Liang, Dun and Zhang, Songhai and Huang, Xiaolei and Li, Baoli and Hu, Shimin},
    title = {Traffic-Sign Detection and Classification in the Wild},
    booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
    month = {June},
    year = {2016}
}

清華大学とテンセントの共同プロジェクトにより、コンピュータビジョンおよび自動運転コミュニティ向けにこの貴重なリソースが構築・維持されていることに感謝いたします。TT100Kデータセットの詳細については、公式データセットウェブサイトをご覧ください。

よくある質問

TT100Kデータセットは何に使用されますか?

清華-テンセント10万枚(TT100K)データセットは、実環境における交通標識の検出と分類を目的に特別に設計されています。主に以下の用途に使用されます:

  1. 自動運転知覚システムの訓練
  2. 先進運転支援システム(ADAS)の開発
  3. 変動する条件下における頑健な物体検出の研究
  4. 交通標識認識アルゴリズムのベンチマーク
  5. 大規模画像内の小規模物体におけるモデル性能の検証

10万点に及ぶ多様なストリートビュー画像と221種類の交通標識カテゴリーを備え、実世界の交通標識検出のための包括的なテスト環境を提供します。

TT100Kにはいくつの交通標識カテゴリがありますか?

TT100Kデータセットには、以下の221種類の交通標識カテゴリが含まれています:

  1. 速度制限:pl5からpl120(禁止速度)およびpm5からpm55(最低速度)
  2. 禁止標識:28種類以上の一般的な禁止タイプ(p1-p28)に加え、制限(pr*、pn、pne)
  3. 警告サイン:60以上の警告カテゴリー(w1-w66)
  4. 高さ/幅制限:物理的制約に対するph およびpbシリーズ
  5. 案内・情報表示板:i1-i15、il*、io、ip

この包括的なカバー範囲には、中国の道路網で見られるほとんどの交通標識が含まれています。

TT100Kデータセットを使用してYOLO11nモデルを訓練するにはどうすればよいですか?

TT100Kデータセットで画像サイズ640ピクセルのYOLO11nモデルを100エポック学習するには、以下の例を使用してください。

学習の例

from ultralytics import YOLO

# Load a model
model = YOLO("yolo11n.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="TT100K.yaml", epochs=100, imgsz=640)
# Start training from a pretrained *.pt model
yolo detect train data=TT100K.yaml model=yolo11n.pt epochs=100 imgsz=640

詳細なトレーニング構成については、トレーニングドキュメントを参照してください。

他のデータセットと比較して、TT100Kが困難な理由は何か?

TT100Kにはいくつかの独特な課題がある:

  1. スケールの変化:標識の大きさは非常に小さいもの(遠方の高速道路標識)から大きいもの(近接した都市部の標識)まで様々である
  2. 実環境条件:照明、天候、および視角における極端な変動
  3. 高解像度:2048×2048ピクセルの画像にはかなりの処理能力が必要である
  4. クラス不均衡:一部の符号タイプは他のタイプよりもはるかに頻繁に現れる
  5. 密集したシーン:単一の画像に複数の標識が表示される場合があります
  6. 部分遮蔽:標識が車両、植生、または構造物によって部分的に遮られる可能性がある

これらの課題により、TT100Kは堅牢な検出アルゴリズムを開発するための貴重なベンチマークとなる。

TT100Kで大きな画像サイズをどのように処理すればよいですか?

TT100Kデータセットは2048×2048ピクセルの画像を使用しており、リソースを大量に消費する可能性があります。推奨される対策は以下の通りです:

トレーニング用:

# Option 1: Resize to standard YOLO size
model.train(data="TT100K.yaml", imgsz=640, batch=16)

# Option 2: Use larger size for better small object detection
model.train(data="TT100K.yaml", imgsz=1280, batch=4)

# Option 3: Multi-scale training
model.train(data="TT100K.yaml", imgsz=640, scale=0.5)  # trains at varying scales

推奨事項:

  • 始めに imgsz=640 初期実験のために
  • 使用 imgsz=1280 GPU 十分にある場合(24GB以上)
  • 非常に小さな標識のためのタイル配置戦略を検討する
  • 勾配の累積を用いてより大きなバッチサイズをシミュレートする


📅 1日前に作成 ✏️ 1日前に更新
glenn-jocherプラシャント・ディクシット0

コメント