데이터셋이란?
Object Detection에서 데이터셋은 모델이 학습하거나 성능을 평가하는 데 사용하는 이미지와 라벨의 쌍으로 구성된 자료 집합입니다. 어떤 데이터셋을 사용하고, 어떤 형식으로 구성하느냐가 모델 성능에 직접적인 영향을 미칩니다. 철도 드론 점검 시스템을 구축하려면 공개 데이터셋을 이해하고, 직접 데이터를 수집·어노테이션하는 방법을 알아야 합니다.
| 항목 | 내용 |
|---|---|
| 정의 | 이미지와 해당 이미지의 객체 위치·클래스 정보(라벨)가 쌍으로 구성된 자료 집합 |
| 구성 요소 | 이미지 파일 + 어노테이션 파일 + 클래스 정의 파일 |
| 대표 공개 데이터셋 | COCO, Pascal VOC, Open Images, VisDrone |
| YOLO 형식 특징 | 클래스당 .txt 파일, 정규화 좌표(0~1), 간단한 디렉토리 구조 |
| 철도 드론 특화 | VisDrone (드론 촬영), RailSem19 (철도 장면 분할) |
문서 탐색
데이터셋의 구조
Object Detection 데이터셋은 기본적으로 다음 세 가지 요소로 구성됩니다.
이미지 (Image): 카메라나 드론으로 촬영한 원본 사진 파일입니다. JPG, PNG, BMP, TIFF 등 다양한 형식이 사용되며, 드론 철도 점검에서는 주로 고해상도 JPG 또는 TIFF를 사용합니다.
라벨 (Label / Annotation): 각 이미지에 등장하는 객체의 위치와 클래스 정보입니다. 바운딩 박스 좌표와 클래스 ID로 표현됩니다.
클래스 정의 (Class Definition): 데이터셋에 포함된 객체 종류 목록입니다. YOLO 형식에서는 data.yaml 파일에 정의합니다.
# 이미지-라벨 쌍 예시
이미지: drone_001.jpg
라벨: drone_001.txt
# drone_001.txt 내용 (YOLO 형식)
0 0.512 0.348 0.124 0.098 ← 클래스0(균열) at (cx=0.512, cy=0.348, w=0.124, h=0.098)
1 0.780 0.621 0.045 0.032 ← 클래스1(볼트누락) at (cx=0.780, cy=0.621, w=0.045, h=0.032)
데이터셋은 일반적으로 학습(train), 검증(val), 테스트(test) 세 분할로 나뉩니다.
| 분할 | 목적 | 일반적 비율 |
|---|---|---|
| train | 모델 가중치 학습 | 70~80% |
| val | 학습 중 성능 모니터링, 하이퍼파라미터 조정 | 10~20% |
| test | 최종 성능 평가 (학습에 절대 사용 안 함) | 10~20% |
주요 공개 데이터셋
| 데이터셋 | 규모 | 클래스 수 | 기본 형식 | 주요 특징 |
|---|---|---|---|---|
| COCO 2017 | 이미지 12만장, 어노테이션 86만개 | 80개 | JSON | OD의 표준 벤치마크, 다양한 일상 객체 |
| Pascal VOC | 이미지 1.1만장 | 20개 | XML | 2007/2012 버전, 학습용으로 여전히 사용 |
| Open Images V7 | 이미지 900만장 | 600개 | CSV | 세계 최대 규모, 계층적 클래스 구조 |
| VisDrone 2019 | 이미지 1만장 | 10개 | TXT | 드론 촬영 전용, 소형 객체 다수 |
| DOTA v2.0 | 이미지 1.1만장 | 18개 | TXT | 위성/항공 이미지, 회전 바운딩 박스(OBB) |
| RailSem19 | 이미지 8,500장 | 19개 | JSON | 철도 장면 특화, 세그멘테이션 포함 |
| COCO8 | 이미지 8장 | 80개 | YAML | YOLO 파이프라인 테스트용 미니 데이터셋 |
철도 드론 점검 전용 대규모 공개 데이터셋은 아직 부족합니다. VisDrone + RailSem19를 참고 기준으로 삼고, 실제 현장 데이터를 직접 수집·어노테이션하는 것이 일반적입니다.
YOLO 형식 데이터셋 구조
YOLO(Ultralytics)가 기대하는 표준 디렉토리 구조입니다. 이 구조를 지키면 data.yaml의 경로 설정만으로 학습을 시작할 수 있습니다.
railway_dataset/
├── data.yaml ← 데이터셋 설정 파일 (필수)
├── images/
│ ├── train/
│ │ ├── drone_001.jpg
│ │ ├── drone_002.jpg
│ │ └── ...
│ ├── val/
│ │ ├── drone_101.jpg
│ │ └── ...
│ └── test/ ← 선택 사항
│ ├── drone_201.jpg
│ └── ...
└── labels/
├── train/
│ ├── drone_001.txt ← drone_001.jpg 에 대응하는 라벨
│ ├── drone_002.txt
│ └── ...
├── val/
│ ├── drone_101.txt
│ └── ...
└── test/
├── drone_201.txt
└── ...
자동 탐색 규칙: Ultralytics는 이미지 경로의 images 부분을 labels로 자동 치환하여 라벨 파일을 찾습니다.
images/train/drone_001.jpg
↓ 자동 치환
labels/train/drone_001.txt
이 규칙 덕분에 별도 경로 설정 없이 위 디렉토리 구조만 지키면 됩니다.
data.yaml 작성법
data.yaml은 데이터셋의 경로와 클래스 정보를 정의하는 설정 파일입니다.
# railway_dataset/data.yaml
# 데이터셋 루트 경로 (절대 경로 권장)
path: /home/user/railway_dataset
# 각 분할의 이미지 폴더 (path 기준 상대 경로)
train: images/train
val: images/val
test: images/test # 선택 사항
# 클래스 수
nc: 4
# 클래스 이름 목록 (인덱스 0부터 순서대로)
names:
0: crack # 균열
1: bolt_missing # 볼트 누락
2: rail_defect # 레일 결함
3: foreign_object # 이물질각 항목 설명:
| 항목 | 설명 | 예시 |
|---|---|---|
path | 데이터셋 루트 디렉토리 절대 경로 | /home/user/railway_dataset |
train | 학습 이미지 폴더 (path 기준) | images/train |
val | 검증 이미지 폴더 (path 기준) | images/val |
test | 테스트 이미지 폴더 (선택, path 기준) | images/test |
nc | 클래스 수 (names 리스트 길이와 일치해야 함) | 4 |
names | 클래스 이름 목록 (인덱스 0부터) | {0: crack, 1: bolt_missing, ...} |
data.yaml로 학습 시작:
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
model.train(data="railway_dataset/data.yaml", epochs=100, imgsz=640)어노테이션 형식 비교
| 형식 | 파일 타입 | 좌표 표현 | 특징 |
|---|---|---|---|
| YOLO | .txt (이미지 1개당 1파일) | 정규화 중심점+크기 (cx, cy, w, h), 0~1 | 가장 단순, YOLO 학습에 직접 사용 |
| COCO | .json (전체 데이터셋 1파일) | 절대 좌표 (x_min, y_min, w, h), 픽셀 단위 | 가장 범용적, 세그멘테이션·키포인트 포함 |
| Pascal VOC | .xml (이미지 1개당 1파일) | 절대 좌표 (xmin, ymin, xmax, ymax), 픽셀 단위 | XML 구조, 추가 메타데이터 포함 |
| Open Images | .csv (전체 데이터셋) | 정규화 (XMin, YMin, XMax, YMax), 0~1 | 대규모 데이터 관리에 편리 |
YOLO 형식 라벨 파일 예시 (drone_001.txt):
# 형식: 클래스ID cx cy w h (모두 정규화 좌표 0~1)
0 0.512 0.348 0.124 0.098
1 0.780 0.621 0.045 0.032
2 0.234 0.712 0.089 0.156
COCO 형식 예시 (JSON 일부):
{
"annotations": [
{
"id": 1,
"image_id": 101,
"category_id": 0,
"bbox": [328, 224, 79, 63],
"area": 4977,
"iscrowd": 0
}
]
}Pascal VOC 형식 예시 (XML 일부):
<annotation>
<filename>drone_001.jpg</filename>
<size>
<width>1920</width>
<height>1080</height>
</size>
<object>
<name>crack</name>
<bndbox>
<xmin>328</xmin>
<ymin>224</ymin>
<xmax>407</xmax>
<ymax>287</ymax>
</bndbox>
</object>
</annotation>COCO나 Pascal VOC 형식의 공개 데이터셋을 YOLO 형식으로 변환하려면
ultralytics내장 변환 도구나roboflow,fiftyone같은 라이브러리를 활용합니다.
COCO 80 클래스 — YOLO 기본 모델이 바로 탐지하는 물체
YOLO 기본 모델(yolo11n.pt 등)은 COCO 데이터셋으로 사전 학습되어 있어, 아래 80가지 물체는 추가 학습 없이 바로 탐지할 수 있습니다.
COCO에 있으면 vs 없으면
┌──────────────────────────────────────────────────────┐
│ 탐지하려는 물체가 COCO 80에 있는가? │
│ │
│ YES → yolo11n.pt 다운로드 → 바로 추론 → 끝! │
│ │
│ NO → 커스텀 데이터셋 + 라벨링 + Fine-tuning 필요 │
│ ├── AI Hub 공개 데이터셋 활용 (무료) │
│ ├── SAM 3 자동 라벨링 활용 │
│ └── 수동 라벨링 │
└──────────────────────────────────────────────────────┘
COCO 80 클래스 전체 목록
사람 (1개)
| ID | 영문 | 한글 |
|---|---|---|
| 0 | person | 사람 |
탈것 (8개)
| ID | 영문 | 한글 |
|---|---|---|
| 1 | bicycle | 자전거 |
| 2 | car | 자동차 |
| 3 | motorcycle | 오토바이 |
| 4 | airplane | 비행기 |
| 5 | bus | 버스 |
| 6 | train | 기차 |
| 7 | truck | 트럭 |
| 8 | boat | 보트 |
도로 시설 (4개)
| ID | 영문 | 한글 |
|---|---|---|
| 9 | traffic light | 신호등 |
| 10 | fire hydrant | 소화전 |
| 11 | stop sign | 정지 표지판 |
| 12 | parking meter | 주차 미터기 |
소지품 (6개)
| ID | 영문 | 한글 |
|---|---|---|
| 13 | bench | 벤치 |
| 24 | backpack | 배낭 |
| 25 | umbrella | 우산 |
| 26 | handbag | 핸드백 |
| 27 | tie | 넥타이 |
| 28 | suitcase | 여행가방 |
동물 (10개)
| ID | 영문 | 한글 |
|---|---|---|
| 14 | bird | 새 |
| 15 | cat | 고양이 |
| 16 | dog | 개 |
| 17 | horse | 말 |
| 18 | sheep | 양 |
| 19 | cow | 소 |
| 20 | elephant | 코끼리 |
| 21 | bear | 곰 |
| 22 | zebra | 얼룩말 |
| 23 | giraffe | 기린 |
스포츠 (10개)
| ID | 영문 | 한글 |
|---|---|---|
| 29 | frisbee | 프리스비 |
| 30 | skis | 스키 |
| 31 | snowboard | 스노보드 |
| 32 | sports ball | 공 |
| 33 | kite | 연 |
| 34 | baseball bat | 야구 배트 |
| 35 | baseball glove | 야구 글러브 |
| 36 | skateboard | 스케이트보드 |
| 37 | surfboard | 서핑보드 |
| 38 | tennis racket | 테니스 라켓 |
주방 (7개)
| ID | 영문 | 한글 |
|---|---|---|
| 39 | bottle | 병 |
| 40 | wine glass | 와인잔 |
| 41 | cup | 컵 |
| 42 | fork | 포크 |
| 43 | knife | 칼 |
| 44 | spoon | 숟가락 |
| 45 | bowl | 그릇 |
음식 (10개)
| ID | 영문 | 한글 |
|---|---|---|
| 46 | banana | 바나나 |
| 47 | apple | 사과 |
| 48 | sandwich | 샌드위치 |
| 49 | orange | 오렌지 |
| 50 | broccoli | 브로콜리 |
| 51 | carrot | 당근 |
| 52 | hot dog | 핫도그 |
| 53 | pizza | 피자 |
| 54 | donut | 도넛 |
| 55 | cake | 케이크 |
가구 (6개)
| ID | 영문 | 한글 |
|---|---|---|
| 56 | chair | 의자 |
| 57 | couch | 소파 |
| 58 | potted plant | 화분 |
| 59 | bed | 침대 |
| 60 | dining table | 식탁 |
| 61 | toilet | 변기 |
전자기기 (6개)
| ID | 영문 | 한글 |
|---|---|---|
| 62 | tv | TV |
| 63 | laptop | 노트북 |
| 64 | mouse | 마우스 |
| 65 | remote | 리모컨 |
| 66 | keyboard | 키보드 |
| 67 | cell phone | 휴대폰 |
가전/생활 (12개)
| ID | 영문 | 한글 |
|---|---|---|
| 68 | microwave | 전자레인지 |
| 69 | oven | 오븐 |
| 70 | toaster | 토스터 |
| 71 | sink | 싱크대 |
| 72 | refrigerator | 냉장고 |
| 73 | book | 책 |
| 74 | clock | 시계 |
| 75 | vase | 꽃병 |
| 76 | scissors | 가위 |
| 77 | teddy bear | 테디베어 |
| 78 | hair drier | 헤어드라이어 |
| 79 | toothbrush | 칫솔 |
COCO에 없는 대표적인 예시
COCO에 포함되지 않은 물체를 탐지하려면 커스텀 데이터셋 + Fine-tuning이 필요합니다.
| 분야 | 예시 |
|---|---|
| 철도 | rail(철로), 침목, 체결장치, 전차선 |
| 도로/시설 | 맨홀, 균열, 포트홀 |
| 산업 | 반도체, PCB 부품, 태양광 패널 |
| 드론 | 드론 자체, 특수 장비 |
우리 프로젝트의 “rail(철로)“은 COCO 80에 없기 때문에 직접 학습을 진행해야 합니다. 만약 “자동차를 찾아라”였다면 학습 없이 바로 추론이 가능했을 것입니다.