데이터셋 예제

항목내용
빠른 테스트COCO8 내장 데이터셋 (별도 다운로드 불필요)
커스텀 데이터셋폴더 구조 생성 → 이미지 배치 → 라벨 작성 → data.yaml
외부 데이터셋Roboflow Universe에서 다운로드
드론 이미지 증강회전·축척 강화, 상하 반전 추가
철도 적용 포인트고도 변화에 따른 scale 증강, 침목 방향성을 위한 회전 증강

문서 탐색


예제 1: COCO8로 빠른 테스트

COCO8은 Ultralytics가 제공하는 8장짜리 초소형 데이터셋입니다. 학습 파이프라인 동작 여부를 빠르게 확인할 때 사용합니다. data.yaml 파일을 직접 만들 필요 없이 이름만 지정하면 자동으로 내려받습니다.

from ultralytics import YOLO
 
# 사전 학습된 YOLOv8n 모델 로드
model = YOLO("yolov8n.pt")
 
# COCO8으로 3 에포크 빠른 테스트
results = model.train(
    data="coco8.yaml",   # Ultralytics 내장 데이터셋, 자동 다운로드
    epochs=3,
    imgsz=640,
    batch=8,
    project="runs/test",
    name="coco8_quicktest"
)
 
print("학습 완료:", results.save_dir)

실행 후 runs/test/coco8_quicktest/ 폴더에 결과가 저장됩니다. 오류 없이 완료된다면 커스텀 데이터셋으로 전환할 준비가 된 것입니다.


예제 2: 커스텀 데이터셋 만들기

철도 드론 이미지로 커스텀 데이터셋을 구성하는 전체 흐름입니다.

단계 1: 폴더 구조 생성

railway_dataset/
├── images/
│   ├── train/    ← 학습 이미지 (.jpg, .png)
│   ├── val/      ← 검증 이미지
│   └── test/     ← 테스트 이미지 (선택)
├── labels/
│   ├── train/    ← 학습 라벨 (.txt, YOLO 형식)
│   ├── val/
│   └── test/
└── data.yaml     ← 데이터셋 설정 파일

단계 2: 이미지 배치

드론으로 촬영한 .jpg 또는 .png 이미지를 images/train/images/val/에 나눠 배치합니다.

단계 3: 라벨 txt 작성

이미지와 동일한 이름의 .txt 파일을 labels/train/에 저장합니다.

# labels/train/drone_001.txt
# class_id  x_center  y_center  width   height
0           0.4980    0.3120    0.2100  0.0540  ← 균열(crack)
1           0.7230    0.6540    0.0380  0.0420  ← 체결구(fastener)
2           0.2100    0.5000    0.3500  0.0700  ← 침목(sleeper)

단계 4: data.yaml 작성

# data.yaml
 
# 데이터셋 루트 경로 (절대 경로 또는 상대 경로)
path: ./railway_dataset
 
# 이미지 폴더 경로 (path 기준 상대 경로)
train: images/train
val:   images/val
test:  images/test   # 없으면 생략 가능
 
# 클래스 수
nc: 3
 
# 클래스 이름 (라벨 txt의 class_id 순서와 일치)
names:
  0: crack       # 균열
  1: fastener    # 체결구
  2: sleeper     # 침목

전체 코드: 폴더 생성부터 학습까지

import os
from pathlib import Path
from ultralytics import YOLO
 
# 1. 폴더 구조 생성
base = Path("railway_dataset")
for split in ["train", "val", "test"]:
    (base / "images" / split).mkdir(parents=True, exist_ok=True)
    (base / "labels" / split).mkdir(parents=True, exist_ok=True)
 
# 2. data.yaml 생성
yaml_content = """path: ./railway_dataset
train: images/train
val:   images/val
nc: 3
names:
  0: crack
  1: fastener
  2: sleeper
"""
(base / "data.yaml").write_text(yaml_content, encoding="utf-8")
print("폴더 구조 및 data.yaml 생성 완료")
 
# 3. 이미지와 라벨을 배치한 뒤 학습 실행
model = YOLO("yolov8n.pt")
results = model.train(
    data=str(base / "data.yaml"),
    epochs=100,
    imgsz=640,
    batch=16,
    project="runs/railway",
    name="custom_v1"
)

예제 3: Roboflow에서 데이터셋 다운로드

Roboflow Universe에는 철도, 드론 관련 공개 데이터셋이 다수 있습니다. API를 통해 바로 다운로드할 수 있습니다.

# pip install roboflow
from roboflow import Roboflow
 
# Roboflow API 키 입력 (roboflow.com에서 발급)
rf = Roboflow(api_key="YOUR_API_KEY")
 
# 프로젝트와 버전 지정
project = rf.workspace("your-workspace").project("railway-inspection")
version = project.version(1)
 
# YOLO 형식으로 다운로드
dataset = version.download("yolov8")
 
print("다운로드 경로:", dataset.location)
# → ./railway-inspection-1/ 폴더에 data.yaml과 이미지/라벨 저장
 
# 바로 학습에 사용
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.train(
    data=f"{dataset.location}/data.yaml",
    epochs=50,
    imgsz=640
)

데이터 증강 기법

증강(Augmentation)은 기존 이미지를 변형해 데이터셋을 인위적으로 늘리고 모델의 일반화 성능을 높이는 기법입니다.

색상 공간 증강

파라미터기본값설명
hsv_h0.015색조(Hue) 무작위 변화 비율
hsv_s0.7채도(Saturation) 무작위 변화 비율
hsv_v0.4명도(Value) 무작위 변화 비율

드론 이미지는 시간대·날씨에 따라 색상이 크게 달라지므로 hsv_shsv_v 값을 높게 유지하는 것이 유리합니다.

기하학적 증강

파라미터기본값설명
degrees0.0이미지 회전 각도 범위 (±degrees)
translate0.1이미지 이동 비율 (이미지 크기 대비)
scale0.5이미지 축척 변화 범위 (±50%)
fliplr0.5좌우 반전 확률
flipud0.0상하 반전 확률 (기본 비활성)

고급 혼합 증강

기법파라미터기본값설명
Mosaicmosaic1.04장 이미지를 하나로 합성. 소형 객체 탐지에 매우 효과적
Mixupmixup0.0두 이미지를 반투명하게 혼합. 경계 모호한 케이스 학습
CutMixcopy_paste0.0한 이미지의 객체를 다른 이미지에 붙여넣기
Copy-Pastecopy_paste0.0객체를 잘라내어 다른 위치에 복사·붙여넣기

드론 이미지 증강 추천 설정

드론으로 촬영한 철도 이미지의 특성에 맞게 증강 파라미터를 조정합니다.

from ultralytics import YOLO
 
model = YOLO("yolov8n.pt")
 
model.train(
    data="railway_dataset/data.yaml",
    epochs=100,
    imgsz=640,
 
    # 드론 이미지 맞춤 증강 설정
    degrees=15.0,     # ±15도 회전: 드론 기울기, 선로 곡선 구간 대응
    flipud=0.3,       # 상하 반전 30%: 드론은 위에서 아래로 촬영하므로 방향 다양화
    scale=0.7,        # ±70% 축척: 드론 고도 변화에 따른 객체 크기 다양화
    mosaic=1.0,       # Mosaic 100%: 소형 체결구, 균열 등 작은 객체 탐지 강화
    hsv_v=0.5,        # 명도 변화 강화: 맑음/흐림/그늘 환경 대응
    hsv_s=0.7,        # 채도 변화: 녹슨 레일, 콘크리트 색상 다양성 대응
    mixup=0.1,        # Mixup 10%: 다양한 배경 패턴 학습
    copy_paste=0.1,   # 소형 객체 증강: 균열, 체결구를 다른 배경에 붙여넣기
 
    project="runs/railway",
    name="drone_augmented_v1"
)

조정 이유 요약

  • degrees=15.0: 드론이 수평을 정확히 유지하지 못하거나 선로가 곡선인 경우를 반영합니다.
  • flipud=0.3: 드론은 항상 위에서 촬영하므로 상하 반전이 실제 상황에서는 발생하지 않지만, 데이터 다양성 확보를 위해 적당히 적용합니다.
  • scale=0.7: 50m 고도와 100m 고도의 이미지는 객체 크기가 크게 다르므로 넓은 축척 범위를 설정합니다.
  • mosaic=1.0: 침목 위의 체결구처럼 작은 객체를 다양한 맥락에서 학습시킵니다.

문서 탐색


참고 자료