데이터셋 예제
| 항목 | 내용 |
|---|---|
| 빠른 테스트 | 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_h | 0.015 | 색조(Hue) 무작위 변화 비율 |
hsv_s | 0.7 | 채도(Saturation) 무작위 변화 비율 |
hsv_v | 0.4 | 명도(Value) 무작위 변화 비율 |
드론 이미지는 시간대·날씨에 따라 색상이 크게 달라지므로 hsv_s와 hsv_v 값을 높게 유지하는 것이 유리합니다.
기하학적 증강
| 파라미터 | 기본값 | 설명 |
|---|---|---|
degrees | 0.0 | 이미지 회전 각도 범위 (±degrees) |
translate | 0.1 | 이미지 이동 비율 (이미지 크기 대비) |
scale | 0.5 | 이미지 축척 변화 범위 (±50%) |
fliplr | 0.5 | 좌우 반전 확률 |
flipud | 0.0 | 상하 반전 확률 (기본 비활성) |
고급 혼합 증강
| 기법 | 파라미터 | 기본값 | 설명 |
|---|---|---|---|
| Mosaic | mosaic | 1.0 | 4장 이미지를 하나로 합성. 소형 객체 탐지에 매우 효과적 |
| Mixup | mixup | 0.0 | 두 이미지를 반투명하게 혼합. 경계 모호한 케이스 학습 |
| CutMix | copy_paste | 0.0 | 한 이미지의 객체를 다른 이미지에 붙여넣기 |
| Copy-Paste | copy_paste | 0.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: 침목 위의 체결구처럼 작은 객체를 다양한 맥락에서 학습시킵니다.