YOLO 커스텀 학습 데이터 만들기

저장 데이터 사진


YOLO 기반 객체 탐지 모델을 실무 프로젝트에 도입해보면서 가장 먼저 부딪힌 벽은 바로 커스텀 학습 데이터였습니다. 공개된 데이터셋은 목적에 딱 맞지 않거나, 특정 클래스가 부족한 경우가 많았고, 결국 필요한 것은 직접 데이터를 수집하고 라벨링하여 학습에 적합한 형태로 준비하는 작업이었습니다. 이 과정에서 느낀 것은 모델 성능보다 데이터 준비가 훨씬 중요한 성공 요인이 된다는 점이었습니다. 본 글에서는 YOLO 시리즈에 맞는 커스텀 학습 데이터를 어떻게 만들고 구성해야 하는지에 대해 체계적으로 정리해보겠습니다.

커스텀 데이터셋 준비의 기본 개념

YOLO는 객체 탐지(Object Detection) 모델로, 이미지 내에 존재하는 객체의 위치와 클래스 정보를 동시에 예측합니다. 따라서 학습에는 이미지뿐 아니라, 각 객체의 위치 정보와 클래스 ID가 포함된 어노테이션(annotation)이 반드시 필요합니다. YOLO는 학습 시 객체의 경계 상자를 바탕으로 학습을 진행하므로, 라벨 포맷은 이미지마다 각 객체의 클래스와 바운딩 박스 좌표를 텍스트 형식으로 지정해야 합니다.

YOLO의 라벨 파일은 이미지 파일명과 동일한 이름의 `.txt` 파일로 저장되며, 각 줄은 하나의 객체를 나타냅니다. 포맷은 다음과 같습니다: `[class_id] [x_center] [y_center] [width] [height]` 여기서 모든 좌표 값은 이미지 크기를 기준으로 정규화된 값(0~1 범위)으로 저장됩니다. 예를 들어 중심 좌표가 이미지의 정 가운데이고, 객체의 폭과 높이가 전체 이미지의 절반이라면, 해당 라인은 `0 0.5 0.5 0.5 0.5`처럼 표시됩니다.

데이터셋을 준비할 때는 최소 수백 장 이상의 이미지가 필요하며, 클래스 수에 따라 샘플 수를 균형 있게 배분하는 것이 중요합니다. 또한 다양한 배경, 조명, 크기, 각도에서 객체가 등장하도록 구성하면 학습된 모델이 실제 상황에서도 잘 동작할 확률이 높아집니다. 특히 실무에서는 단순한 정면 이미지보다 다양한 조건에서의 이미지 수집이 성능에 큰 차이를 만듭니다.

효율적인 라벨링 도구와 방법

YOLO의 학습용 라벨은 수동으로 작성하기 어렵기 때문에, 라벨링 툴을 활용하는 것이 일반적입니다. 대표적으로는 `LabelImg`, `Roboflow`, `CVAT`, `Makesense.ai` 등의 도구가 있으며, 이들 대부분은 YOLO 포맷을 기본 또는 선택 옵션으로 지원합니다.

LabelImg는 오프라인 도구로 가볍고 직관적인 UI를 제공하여, 빠르게 라벨링 작업을 시작할 수 있습니다. 저장되는 라벨 포맷은 기본적으로 YOLO 형식이며, 필요 시 Pascal VOC나 COCO 포맷으로 변환도 가능합니다. 다만 복수 사용자 협업에는 다소 제약이 있습니다.

Roboflow는 웹 기반 플랫폼으로, 라벨링뿐 아니라 데이터 증강, 포맷 변환, 라벨 품질 검토, 프로젝트 협업까지 통합적으로 지원합니다. 특히 라벨이 완료된 후 다양한 버전의 YOLO 포맷으로 쉽게 다운로드할 수 있으며, 학습 스크립트까지 함께 제공되는 점에서 생산성을 크게 높일 수 있습니다. 무료 요금제도 제공되어 소규모 프로젝트에는 매우 유용합니다.

라벨링 시에는 객체의 테두리를 최대한 정확하게 둘러싸는 것이 중요합니다. 과하게 넓거나 좁은 박스는 학습 성능에 악영향을 줄 수 있으며, 동일한 기준으로 꾸준히 라벨링하는 것이 가장 중요합니다. 복잡한 이미지일수록 클래스 오라클(class oracle)을 사전에 정의하여 라벨러 간의 기준 차이를 줄이는 것도 좋은 방법입니다.

YOLO 학습을 위한 데이터 구조화와 검증

라벨링이 끝난 후에는 YOLO 학습을 위한 디렉토리 구조와 설정 파일을 구성해야 합니다. 일반적으로는 다음과 같은 폴더 구조를 따릅니다: `/images/train`, `/images/val`, `/labels/train`, `/labels/val` 이미지와 라벨 파일은 동일한 이름을 가지며, 경로만 다르면 됩니다. 예를 들어 `img001.jpg`에 대한 라벨은 `labels/train/img001.txt`에 위치해야 하며, 같은 폴더 내에 있어야 합니다.

클래스 목록은 `data.yaml` 파일에 정의되며, 다음과 같은 형식으로 작성됩니다: train: ./images/train val: ./images/val nc: 3 names: [‘person’, ‘car’, ‘bicycle’] 여기서 `nc`는 클래스 수, `names`는 각 클래스의 이름을 배열 형태로 명시합니다. 이 파일은 학습 시 YOLO 모델이 클래스 개수와 이름을 인식하는 데 필수적인 역할을 합니다.

전체 데이터가 구성된 후에는 반드시 검증 단계를 거쳐야 합니다. 라벨 파일이 누락되었거나, 클래스 ID가 잘못 기입된 경우에는 학습이 실패하거나 비정상적인 결과가 발생할 수 있습니다. 데이터셋을 시각화하여 이미지와 라벨이 잘 대응되는지 확인하는 과정은 반드시 거쳐야 할 필수 절차입니다. 이를 위해 Roboflow, CVAT, 또는 custom Python 스크립트를 사용할 수 있습니다.

또한 훈련 전에 클래스별 이미지 수와 객체 수를 통계적으로 분석하는 것도 중요합니다. 만약 특정 클래스에만 데이터가 집중되어 있다면, 학습 편향을 줄이기 위해 증강(Augmentation)을 통한 보완이 필요합니다. 특히 YOLO는 빠른 학습 속도를 제공하지만, 적은 데이터에서도 편향되기 쉬우므로 클래스 간 균형 유지가 핵심입니다.

결론 – YOLO 커스텀 학습의 출발점은 데이터

YOLO 모델을 실제 문제에 적용하기 위해서는 커스텀 학습 데이터 준비가 반드시 선행되어야 합니다. 적절한 이미지 수집, 정확한 라벨링, 구조화된 데이터 구성, 클래스 밸런스 조정 등 모든 단계가 모델 성능을 결정짓는 중요한 요인입니다.

제가 수행한 객체 탐지 프로젝트에서도, 처음에는 적은 데이터로 빠르게 학습을 시도했지만 성능이 만족스럽지 못했습니다. 이후 데이터를 추가로 확보하고, 라벨 기준을 통일하고, 데이터 불균형을 해결한 뒤에는 훨씬 안정적이고 정확한 탐지 결과를 얻을 수 있었습니다.

YOLO의 강력한 탐지 성능을 제대로 활용하기 위해서는, 커스텀 데이터셋 준비부터 신중하게 접근해야 합니다. 본 글을 통해 여러분이 직접 커스텀 데이터를 준비하고 실전 프로젝트를 성공적으로 수행하는 데 도움이 되었기를 바랍니다.

댓글

이 블로그의 인기 게시물

모델 평가 지표 정리 – 정확도, 정밀도, F1 Score까지

선형회귀와 로지스틱 회귀 – 가장 기초적인 예측 모델들

지도학습 vs 비지도학습 – 머신러닝의 대표 학습 방식 비교