데이터셋이란?

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개JSONOD의 표준 벤치마크, 다양한 일상 객체
Pascal VOC이미지 1.1만장20개XML2007/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개YAMLYOLO 파이프라인 테스트용 미니 데이터셋

철도 드론 점검 전용 대규모 공개 데이터셋은 아직 부족합니다. 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에 있는 물체 (자동차, 사람 등)모델 다운로드 → 바로 추론
COCO 80에 없는 물체 (철로, 침목 등)데이터셋 준비 → 라벨링학습 → 추론

COCO 80 클래스 전체 목록

사람 (1개)

ID영문한글
0person사람

탈것 (8개)

ID영문한글
1bicycle자전거
2car자동차
3motorcycle오토바이
4airplane비행기
5bus버스
6train기차
7truck트럭
8boat보트

도로 시설 (4개)

ID영문한글
9traffic light신호등
10fire hydrant소화전
11stop sign정지 표지판
12parking meter주차 미터기

소지품 (6개)

ID영문한글
13bench벤치
24backpack배낭
25umbrella우산
26handbag핸드백
27tie넥타이
28suitcase여행가방

동물 (10개)

ID영문한글
14bird
15cat고양이
16dog
17horse
18sheep
19cow
20elephant코끼리
21bear
22zebra얼룩말
23giraffe기린

스포츠 (10개)

ID영문한글
29frisbee프리스비
30skis스키
31snowboard스노보드
32sports ball
33kite
34baseball bat야구 배트
35baseball glove야구 글러브
36skateboard스케이트보드
37surfboard서핑보드
38tennis racket테니스 라켓

주방 (7개)

ID영문한글
39bottle
40wine glass와인잔
41cup
42fork포크
43knife
44spoon숟가락
45bowl그릇

음식 (10개)

ID영문한글
46banana바나나
47apple사과
48sandwich샌드위치
49orange오렌지
50broccoli브로콜리
51carrot당근
52hot dog핫도그
53pizza피자
54donut도넛
55cake케이크

가구 (6개)

ID영문한글
56chair의자
57couch소파
58potted plant화분
59bed침대
60dining table식탁
61toilet변기

전자기기 (6개)

ID영문한글
62tvTV
63laptop노트북
64mouse마우스
65remote리모컨
66keyboard키보드
67cell phone휴대폰

가전/생활 (12개)

ID영문한글
68microwave전자레인지
69oven오븐
70toaster토스터
71sink싱크대
72refrigerator냉장고
73book
74clock시계
75vase꽃병
76scissors가위
77teddy bear테디베어
78hair drier헤어드라이어
79toothbrush칫솔

COCO에 없는 대표적인 예시

COCO에 포함되지 않은 물체를 탐지하려면 커스텀 데이터셋 + Fine-tuning이 필요합니다.

분야예시
철도rail(철로), 침목, 체결장치, 전차선
도로/시설맨홀, 균열, 포트홀
산업반도체, PCB 부품, 태양광 패널
드론드론 자체, 특수 장비

우리 프로젝트의 “rail(철로)“은 COCO 80에 없기 때문에 직접 학습을 진행해야 합니다. 만약 “자동차를 찾아라”였다면 학습 없이 바로 추론이 가능했을 것입니다.


문서 탐색


참고 자료