학습 실행
| 항목 | 내용 |
|---|---|
| 기본 방식 | 사전 학습 .pt 모델 불러와 Fine-tuning |
| CLI 방식 | yolo detect train 명령어로 터미널에서 실행 |
| 학습 재개 | resume=True로 중단된 학습 이어가기 |
| Backbone 고정 | freeze=10으로 초반 레이어 동결 |
| 결과 위치 | runs/detect/<name>/ 폴더에 자동 저장 |
문서 탐색
Step 1: 사전 학습 모델로 Fine-tuning
가장 기본적인 학습 방법입니다. COCO로 사전 학습된 .pt 파일을 불러와 커스텀 데이터셋에 맞게 조정합니다.
from ultralytics import YOLO
# 1. 사전 학습 모델 로드 (없으면 자동 다운로드)
model = YOLO("yolov8n.pt") # n=nano, s=small, m=medium, l=large, x=extra-large
# 2. 학습 실행
results = model.train(
data="railway_dataset/data.yaml", # 데이터셋 설정 파일
epochs=100, # 학습 반복 횟수
imgsz=640, # 입력 이미지 크기
batch=16, # 배치 크기
lr0=0.01, # 초기 학습률
optimizer="SGD", # 최적화 알고리즘
patience=30, # Early stopping 대기 에포크
project="runs/railway", # 결과 저장 상위 폴더
name="finetune_v1", # 실험 이름
save=True, # 체크포인트 저장
exist_ok=False # 같은 이름 폴더 있으면 오류 (True면 덮어쓰기)
)
print("최고 성능 모델:", results.save_dir / "weights/best.pt")모델 크기별 특성 비교
| 모델 | 파라미터 수 | 추론 속도 | mAP | 권장 상황 |
|---|---|---|---|---|
| yolov8n | 3.2M | 매우 빠름 | 낮음 | 시작 실험, 엣지 디바이스 |
| yolov8s | 11.2M | 빠름 | 보통 | 균형 잡힌 성능 |
| yolov8m | 25.9M | 보통 | 높음 | 충분한 GPU 환경 |
| yolov8l | 43.7M | 느림 | 매우 높음 | 서버 환경, 최고 성능 필요 시 |
| yolov8x | 68.2M | 가장 느림 | 최고 | 연구, 벤치마크 |
처음에는 반드시 yolov8n 또는 yolov8s 부터 시작하세요. 빠른 실험 주기가 최종 성능보다 중요합니다.
Step 2: CLI로 학습
Python 코드 없이 터미널에서 직접 실행할 수 있습니다. 서버나 배치 스크립트 환경에서 유용합니다.
# 기본 학습
yolo detect train \
data=railway_dataset/data.yaml \
model=yolov8n.pt \
epochs=100 \
imgsz=640 \
batch=16 \
project=runs/railway \
name=cli_train_v1
# 한 줄로 실행
yolo detect train data=railway_dataset/data.yaml model=yolov8n.pt epochs=100 imgsz=640
# 추가 파라미터 포함
yolo detect train \
data=railway_dataset/data.yaml \
model=yolov8s.pt \
epochs=200 \
imgsz=640 \
batch=-1 \
lr0=0.01 \
patience=30 \
degrees=15 \
flipud=0.3 \
scale=0.7 \
name=drone_railway_v2CLI와 Python API는 동일한 결과를 냅니다. 환경에 따라 편한 방식을 선택하세요.
Step 3: 학습 재개
학습이 중간에 중단되었을 때(전원 차단, 서버 오류 등) resume=True로 이어서 학습할 수 있습니다.
from ultralytics import YOLO
# 마지막으로 저장된 last.pt 불러와 재개
model = YOLO("runs/railway/finetune_v1/weights/last.pt")
results = model.train(
resume=True # 이전 학습 설정과 에포크를 자동으로 이어받음
)# CLI로 재개
yolo detect train resume=True model=runs/railway/finetune_v1/weights/last.ptresume=True를 사용하면 last.pt에 저장된 이전 학습의 모든 설정(epochs, lr, data 등)이 자동으로 복원됩니다. data나 epochs 등을 별도로 지정하지 않아도 됩니다.
Step 4: Backbone Freeze 학습
데이터가 적거나(수백~수천 장) 빠른 초기 수렴이 필요할 때 Backbone 레이어를 동결하고 Head만 먼저 학습합니다.
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
# Phase 1: Backbone 동결 후 Head만 학습 (빠른 초기 수렴)
results_phase1 = model.train(
data="railway_dataset/data.yaml",
epochs=30,
imgsz=640,
batch=16,
freeze=10, # 처음 10개 레이어 동결 (Backbone)
lr0=0.001, # Freeze 학습은 낮은 학습률 권장
project="runs/railway",
name="freeze_phase1"
)
# Phase 2: 전체 Fine-tuning (더 정밀한 학습)
model2 = YOLO("runs/railway/freeze_phase1/weights/best.pt")
results_phase2 = model2.train(
data="railway_dataset/data.yaml",
epochs=70,
imgsz=640,
batch=16,
freeze=None, # 전체 레이어 학습
lr0=0.0001, # 낮은 학습률로 세밀하게 조정
project="runs/railway",
name="finetune_phase2"
)학습 출력 파일 설명
학습이 완료되면 runs/railway/<name>/ 폴더에 다음 파일들이 생성됩니다.
| 파일 | 설명 | 활용 방법 |
|---|---|---|
results.csv | 에포크별 loss, mAP 수치 기록 | 학습 곡선 분석, Excel 시각화 |
results.png | loss와 mAP 그래프 이미지 | 학습 진행 상황 한눈에 확인 |
train_batch*.jpg | 학습 배치 시각화 (증강 적용 후) | 증강 설정이 올바른지 확인 |
val_batch*_pred.jpg | 검증 배치에 대한 모델 예측 결과 | 모델이 어떤 객체를 탐지하는지 확인 |
confusion_matrix.png | 클래스별 혼동 행렬 | 클래스 간 혼동 패턴 파악 |
weights/best.pt | 검증 mAP 기준 최고 성능 모델 | 실제 배포에 사용 |
weights/last.pt | 마지막 에포크 모델 | 학습 재개(resume)에 사용 |
실전 팁
처음 시작할 때
- yolov8n부터 시작하세요. 빠른 실험으로 데이터셋 품질과 파이프라인을 먼저 검증합니다.
- 성능이 어느 정도 확인된 후 yolov8s, yolov8m으로 모델 크기를 키웁니다.
빠른 데이터셋 검증
# 전체 데이터의 10%만 사용해 파이프라인 빠르게 테스트
model.train(
data="railway_dataset/data.yaml",
epochs=5,
fraction=0.1, # 데이터의 10%만 사용
imgsz=640
)이미지 크기 설정
# 일반 객체 탐지 (기본)
imgsz=640
# 드론 이미지의 소형 객체 (균열, 체결구)
imgsz=1280 # 더 많은 메모리 필요, 배치 크기를 절반으로 줄여야 함배치 크기 자동 설정
# batch=-1: GPU 메모리에 맞게 최적 배치 크기 자동 탐색
model.train(
data="railway_dataset/data.yaml",
epochs=100,
batch=-1 # 자동 설정 (약 60% GPU 메모리 활용 기준)
)학습 중 모니터링
# 학습 중 실시간 GPU 사용률 확인
watch -n 1 nvidia-smi
# TensorBoard로 loss 곡선 실시간 확인 (별도 터미널)
tensorboard --logdir runs/railway