콘텐츠로 건너뛰기

TT100K 데이터셋

칭화-텐센트 100K (TT100K)는 100,000개의 텐센트 스트리트 뷰 파노라마에서 생성된 대규모 교통 표지판 벤치마크 데이터셋입니다. 이 데이터셋은 실제 환경에서의 교통 표지판 detect 및 분류를 위해 특별히 설계되었으며, 연구원과 개발자에게 견고한 교통 표지판 인식 시스템을 구축하기 위한 포괄적인 리소스를 제공합니다.

이 데이터셋은 100,000개의 이미지30,000개 이상의 교통 표지판 인스턴스221개의 다양한 카테고리에 걸쳐 포함합니다. 이 이미지들은 조도, 기상 조건, 시야각 및 거리의 큰 변화를 포착하므로, 다양한 실제 시나리오에서 안정적으로 작동해야 하는 모델을 훈련하는 데 이상적입니다.

이 데이터셋은 특히 다음 용도로 유용합니다:

  • 자율 주행 시스템
  • 첨단 운전자 지원 시스템 (ADAS)
  • 교통 모니터링 애플리케이션
  • 도시 계획 및 교통 분석
  • 실제 환경에서의 컴퓨터 비전 연구

주요 기능

TT100K 데이터셋은 몇 가지 주요 장점을 제공합니다:

  • 규모: 100,000개의 고해상도 이미지 (2048×2048 픽셀)
  • 다양성: 중국 교통 표지판을 포함하는 221개의 교통 표지판 카테고리
  • 실제 환경 조건: 날씨, 조명 및 시야각의 큰 변화
  • 풍부한 주석: 각 표지판에는 클래스 레이블, 바운딩 박스 및 픽셀 마스크가 포함됩니다.
  • 포괄적인 범위: 금지, 경고, 의무 및 정보 표지판 포함
  • 훈련/테스트 분할: 일관된 평가를 위한 사전 정의된 분할

데이터 세트 구조

TT100K 데이터셋은 세 가지 하위 집합으로 나뉩니다:

  1. 훈련 세트: 다양한 유형의 교통 표지판을 detect하고 classify하기 위한 모델 훈련에 사용되는 교통 장면 이미지의 주요 컬렉션입니다.
  2. 검증 세트: 모델 개발 중 성능을 모니터링하고 하이퍼파라미터를 튜닝하는 데 사용되는 서브셋입니다.
  3. 테스트 세트: 실제 시나리오에서 교통 표지판을 detect하고 classify하는 최종 모델의 능력을 평가하는 데 사용되는 별도로 보관된 이미지 컬렉션입니다.

TT100K 데이터셋은 몇 가지 주요 그룹으로 구성된 221개의 교통 표지판 카테고리를 포함합니다:

속도 제한 표지판 (pl, pm)

  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/cfg/datasets/TT100K.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)

사용법

이미지 크기 640으로 100 epochs 동안 TT100K 데이터셋에서 YOLO26 모델을 훈련하려면 다음 코드 스니펫을 사용할 수 있습니다. 데이터셋은 처음 사용할 때 자동으로 다운로드되고 YOLO 형식으로 변환됩니다.

훈련 예제

from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.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=yolo26n.pt epochs=100 imgsz=640

샘플 이미지 및 주석

TT100K 데이터셋의 일반적인 예시는 다음과 같습니다:

  1. 도시 환경: 다양한 거리에 여러 교통 표지판이 있는 거리 풍경
  2. 고속도로 장면: 속도 제한 및 방향 지시를 포함한 고속도로 표지판
  3. 복잡한 교차로: 다양한 방향으로 근접하게 위치한 다수의 표지판
  4. 까다로운 조건: 다양한 조명(주간/야간), 날씨(비/안개) 및 시야각 조건의 표지판

이 데이터셋에는 다음이 포함됩니다:

  1. 클로즈업 표지판: 이미지 영역의 상당 부분을 차지하는 크고 명확하게 보이는 표지판
  2. 원거리 표지판: 정밀한 detect 능력이 필요한 작은 표지판
  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 데이터셋에 대한 자세한 정보는 공식 데이터셋 웹사이트를 방문하십시오.

FAQ

TT100K 데이터셋은 무엇에 사용됩니까?

칭화-텐센트 100K (TT100K) 데이터셋은 실제 환경에서 교통 표지판 detect 및 분류를 위해 특별히 설계되었습니다. 주로 다음 용도로 사용됩니다:

  1. 자율 주행 인지 시스템 훈련
  2. 첨단 운전자 지원 시스템(ADAS) 개발
  3. 다양한 조건에서 강건한 객체 detect 연구
  4. 교통 표지판 인식 알고리즘 벤치마킹
  5. 큰 이미지 내 작은 객체에 대한 모델 성능 테스트

100,000개의 다양한 거리 뷰 이미지와 221개의 교통 표지판 카테고리를 통해 실제 교통 표지판 detect를 위한 포괄적인 테스트베드를 제공합니다.

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 데이터셋을 사용하여 YOLO26n 모델을 어떻게 훈련할 수 있나요?

이미지 크기 640으로 100 epochs 동안 TT100K 데이터셋에서 YOLO26n 모델을 훈련하려면 아래 예제를 사용하세요.

훈련 예제

from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.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=yolo26n.pt epochs=100 imgsz=640

자세한 학습 구성은 학습 문서를 참조하세요.

다른 데이터셋과 비교할 때 TT100K가 어려운 이유는 무엇입니까?

TT100K는 몇 가지 고유한 과제를 제시합니다:

  1. 크기 변화: 표지판은 매우 작은 것(멀리 떨어진 고속도로 표지판)부터 큰 것(가까운 도심 표지판)까지 다양합니다.
  2. 실제 환경 조건: 조명, 날씨, 시야각의 극심한 변화
  3. 고해상도: 2048×2048 픽셀 이미지는 상당한 처리 능력을 요구합니다.
  4. 클래스 불균형: 일부 표지판 유형은 다른 유형보다 훨씬 더 흔합니다.
  5. 밀집된 장면: 단일 이미지에 여러 표지판이 나타날 수 있습니다.
  6. 부분 가려짐: 표지판이 차량, 식물 또는 구조물에 의해 부분적으로 가려질 수 있습니다.

이러한 과제들은 TT100K를 강력한 detect 알고리즘 개발을 위한 귀중한 벤치마크로 만듭니다.

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 이상)가 있다면
  • 매우 작은 표지판의 경우 타일링 전략을 고려하십시오.
  • 더 큰 배치 크기를 시뮬레이션하기 위해 그래디언트 누적을 사용하십시오.


5; 29 전에 생성됨 ✏️ 23 전에 업데이트됨
glenn-jocherPrashantDixit0

댓글