1. YOLOv8이란?
YOLO(You Only Look Once)는 실시간 객체 탐지를 위한 대표적인 딥러닝 모델입니다.
YOLOv8은 Ultralytic에서 출시한 버전으로, 다음과 같은 특징이 있습니다.
- Pytorch 기반 단일 .pt 파일 사용
- YOLOv5 대비 더 간단해진 API
- "bbox, segmentation", "pose detection", "classification" 지원
- ONNX, TensorRT 등으로 export 용이함
Ultralytics 공식 깃허브: https://github.com/ultralytics/ultralytics
GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀
Ultralytics YOLO11 🚀. Contribute to ultralytics/ultralytics development by creating an account on GitHub.
github.com
Ultralytics YOLOv8 공식 페이지: https://docs.ultralytics.com/models/yolov8/#performance-metrics
YOLOv8
Discover Ultralytics YOLOv8, an advancement in real-time object detection, optimizing performance with an array of pre-trained models for diverse tasks.
docs.ultralytics.com
YOLOv8은 다양한 사용 시나리오에 맞게 n, s, m, l, x로 구성되는 5가지 크기의 모델을 제공합니다. 이는 모델의 성능/속도 트레이드오프를 구분짓는 중요한 옵션입니다.
모델명 | 파라미터 수 | 속도(빠름 -> 느림) | 정확도(낮음 -> 높음) | 특징 및 추천 용도 |
yolov8n | 가장 작음 | 🟢 매우 빠름 | 🔴 낮음 | 임베디드/모바일, 실시간 성 높은 CCTV 화면 등 |
yolov8s | 소형 | 🟢 빠름 | 🟡 보통 | 기본적인 용도에 적합 |
yolov8m | 중간 | ⚪ 보통 | ⚪ 보통 | 성능과 속도의 균형형 |
yolov8l | 대형 | 🔴 느림 | 🟢 높음 | 정확도가 중요한 상황(ex. 검사/품질 분석) |
yolov8x | 가장 큼 | 🔴 매우 느림 | 🟢 매우 높음 | 연구, 서버용 고정밀 환경, 정확도 최우선 상황 |
참고: 모델이 커질수록 정확도는 높아지지만, 속도는 느려지고 메모리 요구량이 커지므로 GPU 자원에 따라 선택이 달라져야 합니다.
💡 Ultralytics 라이브러리에서는 다음과 같은 방식으로 YOLOv8 사전학습된 가중치를 제공합니다.
from ultralytics import YOLO
model = YOLO("yolov8s.pt") # 또는 yolov8n.pt, yolov8m.pt, yolov8l.pt, yolov8x.pt
위의 코드는 s를 사용하는 것이고 자신의 상황과 컴퓨팅 자원에 따라 다른 크기의 모델을 사용하시면 됩니다.
이렇게 model 객체를 생성해서 사전 학습된 v8 모델을 사용할 수 있는데 이 사전학습된 가중치 파일은 COCO데이터셋(80개 클래스)를 기반으로 학습된 모델입니다. 자신이 탐지하려는 객체가 COCO의 80개 클래스에 포함된다면 추가적인 학습 과정을 거치지 않고 그대로 사용하셔도 좋습니다.
- COCO 80개 클래스 종류: https://docs.ultralytics.com/ko/datasets/detect/coco/#dataset-yaml
COCO
객체 감지 및 세분화를 위한 COCO 데이터 세트를 살펴보세요. 구조, 사용법, 사전 학습된 모델 및 주요 기능에 대해 알아보세요.
docs.ultralytics.com
2. 학습을 위한 데이터 구조
YOLOv8에서 요구하는 데이터 구조는 다음과 같습니다. (bbox detection 기준)
dataset/
├── train/
│ ├── images/
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ └── ...
│ └── labels/
│ ├── image1.txt
│ ├── image2.txt
│ └── ...
├── val/
│ ├── images/
│ │ ├── image101.jpg
│ │ └── ...
│ └── labels/
│ ├── image101.txt
│ └── ...
└── data.yaml
루트 디렉토리: dataset
train, val: 각각의 폴더에 images/, labels/가 함께 존재
data.yaml 구조
train: dataset/train/images # 상대경로
val: dataset/val/images
nc: 6
names: ['person', 'bike', 'small', 'bus', 'big', 'plate']
train:과 val:에는 반드시 images/까지의 경로만 명시합니다.
YOLOv8은 자동으로 해당 경로에 맞는 labels/를 인식하여 매칭합니다.
저는 이러한 구조를 주로 사용합니다. 학습 및 검증 세트를 파일 단위로 복사/분리 관리할 때 편리하기 때문입니다. 또한 데이터 증강 후에 만들어지는 폴더를 train_aug라는 이름으로 구조에 포함 시키고 data.yaml 파일에 추가하기도 수월합니다.
3. YOLOv8 학습 스크립트 (v8_train.py)
제가 학습시 사용하는 훈련 스크립트입니다.
from ultralytics import YOLO
def train_yolo():
model = YOLO('yolov8s.pt') # 사용할 가중치 모델 선택
results = model.train(
data='C:/.../data.yaml', # 데이터셋 경로
epochs=150,
imgsz=640,
batch=32,
project='yolov8_project',
name='(훈련 후 생성될 가중치 파일이 저장될 폴더 이름)',
device=0,
verbose=True,
exist_ok=True,
augment=True, # 데이터 증강
augmentations='albumentations.yaml', # 추가 증강
iou=0.5
)
return results
if __name__ == '__main__':
results = train_yolo()
print("✅ 학습이 완료되었습니다.")
print(results)
4. 학습 결과 확인 방법
학습이 끝나면 기본값으로 되어있다면 runs/detect/[name] 폴더에 결과가 저장됩니다. 위 스크립트에서는 project, name 파라미터를 train() 함수에서 지정해주었기 때문에 "yolov8_project/(name에서 지정한 이름)"에 저장됩니다.
학습 후 결과물 폴더 내용
- results.png : 학습 loss 및 정확도 그래프
- confusion_matrix.png : 클래스별 오차 행렬
- labels.jpg : 라벨 분포 시각화
- weights/best.pt : 성능이 가장 좋은 모델
생성된 best.pt 파일이 학습에 사용된 데이터의 라벨링 내용을 담고 있는 가중치 파일이며 추론(inference)시 사용됩니다.
다음 포스팅에선 추론 코드, 증강 설정 예시, 오픈 데이터셋 준비 팁(roboflow, AI-Hub등)에 대해서 작성해 보겠습니다.