커스텀 데이터셋에서 YOLO 파인튜닝하는 방법
파인튜닝(Fine-tuning)은 랜덤 초기화 대신 학습된 가중치에서 시작하여 새로운 클래스를 인식하도록 사전 학습된 모델을 적응시킵니다. 수백 에폭 동안 처음부터 학습하는 대신, 파인튜닝은 사전 학습된 COCO 특징을 활용하여 훨씬 짧은 시간 내에 커스텀 데이터에 수렴합니다.
이 가이드는 기본 사용법부터 레이어 동결 및 2단계 학습과 같은 고급 기법까지 커스텀 데이터셋에서 YOLO26을 파인튜닝하는 방법을 다룹니다.
파인튜닝 vs 처음부터 학습
사전 학습된 모델은 이미 수백만 개의 이미지에서 엣지 감지, 텍스처 인식, 형태 이해와 같은 일반적인 시각적 특징을 학습했습니다. 파인튜닝을 통한 전이 학습(Transfer learning)은 그 지식을 재사용하고 모델에게 새로운 클래스가 어떻게 보이는지만 가르쳐, 수렴이 더 빠르고 데이터가 덜 필요한 이유입니다. 처음부터 학습하면 그 모든 것을 버리고 모델이 픽셀 수준 패턴부터 모든 것을 학습해야 하므로 훨씬 더 많은 리소스가 필요합니다.
| 파인튜닝 | 처음부터 학습 | |
|---|---|---|
| 초기 가중치 | COCO로 사전 학습 (80 클래스) | 랜덤 초기화 |
| 명령어 | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| 수렴 | 빠름 - 백본이 이미 학습됨 | 느림 - 모든 레이어가 제로부터 학습 |
| 데이터 요구 사항 | 낮음 - 사전 학습된 특징이 적은 데이터를 보완 | 높음 - 모델이 데이터셋만으로 모든 특징을 학습해야 함 |
| 사용 시기 | 자연 이미지의 커스텀 클래스 | COCO와 근본적으로 다른 도메인 (의료, 위성, 레이더) |
.pt 파일을 YOLO("yolo26n.pt")로 로드하면, 사전 학습된 가중치가 모델에 저장됩니다. 그 후 .train(data="custom.yaml")을 호출하면 자동으로 호환 가능한 모든 가중치를 새 모델 아키텍처로 전이하고, 일치하지 않는 레이어(예: 클래스 수가 다를 때 감지 헤드)를 재초기화하여 학습을 시작합니다. 수동 가중치 로드, 레이어 조작 또는 커스텀 전이 학습 코드가 필요하지 않습니다.
사전 학습된 가중치 전이 방식
사전 학습된 모델이 다른 클래스 수를 가진 데이터셋에서 파인튜닝될 때(예: COCO의 80 클래스에서 5개의 커스텀 클래스로), Ultralytics는 형태 인식 가중치 전이를 수행합니다:
- 백본과 넥은 완전히 전이됩니다 - 이 레이어들은 일반적인 시각적 특징을 추출하며, 그 형태는 클래스 수와 무관합니다.
- 감지 헤드는 부분적으로 재초기화됩니다 - 분류 출력 레이어(
cv3,one2one_cv3)는 클래스 수(80 vs 5)에 연결된 형태를 가지므로 전이할 수 없어 랜덤 초기화됩니다. 헤드의 박스 회귀 레이어(cv2,one2one_cv2)는 클래스 수에 관계없이 고정된 형태를 가지므로 정상적으로 전이됩니다. - 클래스 수를 변경할 때 대부분의 가중치가 전이됩니다 - 감지 헤드의 분류 전용 레이어만 재초기화되며, 백본, 넥, 박스 회귀 브랜치는 그대로 유지됩니다.
사전 학습된 모델과 동일한 클래스 수를 가진 데이터셋(예: 다른 80-클래스 데이터셋에서 COCO 사전 학습 가중치 파인튜닝)의 경우, 감지 헤드를 포함하여 100%의 가중치가 전이됩니다.
기본 파인튜닝 예제
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # 사전 학습된 모델 로드
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)모델 크기 선택
더 큰 모델은 더 많은 용량을 가지지만 업데이트할 매개변수도 많아, 학습 데이터가 제한적일 때 과적합 위험이 증가할 수 있습니다. 더 작은 모델(YOLO26n 또는 YOLO26s)로 시작하고 검증 지표가 정체될 때만 스케일을 늘리는 것이 실용적인 접근 방법입니다. 최적의 모델 크기는 작업의 복잡성, 클래스 수, 데이터셋의 다양성 및 배포에 사용 가능한 하드웨어에 따라 달라집니다. 사용 가능한 크기 및 성능 벤치마크는 전체 YOLO26 모델 페이지를 참조하세요.
옵티마이저 및 학습률 선택
기본 optimizer=auto 설정은 총 학습 반복 횟수에 따라 옵티마이저와 학습률을 선택합니다:
- 반복 < 10,000회 (소규모 데이터셋 또는 적은 에폭): 자동 계산된 낮은 학습률의 AdamW
- 반복 > 10,000회 (대규모 데이터셋): lr=0.01의 MuSGD (Muon+SGD 하이브리드 옵티마이저)
대부분의 파인튜닝 작업에서 기본 설정은 수동 조정 없이도 잘 작동합니다. 다음 경우에는 옵티마이저를 명시적으로 설정하는 것을 고려하세요:
- 학습이 불안정할 때 (손실 급등 또는 발산): 더 안정적인 수렴을 위해
optimizer=AdamW, lr0=0.001시도 - 소규모 데이터셋에서 대형 모델 파인튜닝:
lr0=0.001과 같은 낮은 학습률이 사전 학습된 특징을 보존하는 데 도움이 됩니다
optimizer=auto일 때, lr0 및 momentum 값은 무시됩니다. 학습률을 수동으로 제어하려면 옵티마이저를 명시적으로 설정하세요: optimizer=SGD, lr0=0.005.
레이어 동결
동결(Freezing)은 학습 중 특정 레이어가 업데이트되는 것을 방지합니다. 이는 학습을 가속화하고 모델 용량에 비해 데이터셋이 작을 때 과적합을 줄입니다.
freeze 매개변수는 정수 또는 목록을 허용합니다. 정수 freeze=10은 처음 10개 레이어(0~9, YOLO26의 백본에 해당)를 동결합니다. 목록에는 부분 백본 동결을 위한 freeze=[0, 3, 5]와 같은 레이어 인덱스, 또는 레이어 내 특정 브랜치에 대한 세밀한 제어를 위한 freeze=["23.cv2"]와 같은 모듈 이름 문자열이 포함될 수 있습니다.
model.train(data="custom.yaml", epochs=50, freeze=10)올바른 동결 깊이는 목표 도메인이 사전 학습 데이터와 얼마나 유사한지, 그리고 학습 데이터가 얼마나 있는지에 따라 달라집니다:
| 시나리오 | 권장 사항 | 이유 |
|---|---|---|
| 대규모 데이터셋, 유사한 도메인 | freeze=None (기본값) | 과적합 없이 모든 레이어를 적응시킬 충분한 데이터 |
| 소규모 데이터셋, 유사한 도메인 | freeze=10 | 백본 특징 보존, 학습 가능한 매개변수 감소 |
| 매우 소규모 데이터셋 | freeze=23 | 감지 헤드만 학습하여 과적합 위험 최소화 |
| COCO와 멀리 떨어진 도메인 | freeze=None | 백본 특징이 잘 전이되지 않아 재학습이 필요할 수 있음 |
동결 깊이는 하이퍼파라미터로 처리될 수도 있습니다. 몇 가지 값(0, 5, 10)을 시도하고 검증 mAP를 비교하는 것이 특정 데이터셋에 대한 최적 설정을 찾는 실용적인 방법입니다.
파인튜닝의 주요 하이퍼파라미터
파인튜닝은 일반적으로 처음부터 학습하는 것보다 하이퍼파라미터 조정이 적게 필요합니다. 가장 중요한 매개변수는 다음과 같습니다:
epochs: 파인튜닝은 처음부터 학습하는 것보다 더 빨리 수렴합니다. 적당한 값으로 시작하고 검증 지표가 정체될 때 일찍 중단하기 위해patience를 사용하세요.patience: 기본값 100은 긴 학습 실행을 위해 설계되었습니다. 이를 10-20으로 줄이면 이미 수렴한 실행에 시간을 낭비하지 않아도 됩니다.warmup_epochs: 기본 워밍업(3 에폭)은 학습률을 제로에서 서서히 증가시켜, 초기 반복에서 대규모 그래디언트 업데이트로 인한 사전 학습된 특징의 손상을 방지합니다. 파인튜닝 시에도 기본값을 유지하는 것이 권장됩니다.
전체 학습 매개변수 목록은 학습 구성 참조를 참조하세요.
2단계 파인튜닝
2단계 파인튜닝은 학습을 두 단계로 나눕니다. 첫 번째 단계는 백본을 동결하고 넥과 헤드만 학습하여, 사전 학습된 특징을 방해하지 않고 감지 레이어가 새로운 클래스에 적응하도록 합니다. 두 번째 단계는 모든 레이어를 동결 해제하고 낮은 학습률로 전체 모델을 학습하여 목표 도메인을 위한 백본을 정제합니다.
이 접근 방식은 목표 도메인이 COCO(의료 이미지, 항공 이미지, 현미경)와 크게 다를 때 특히 유용합니다. 이 경우 백본이 적응이 필요할 수 있지만 모든 것을 한꺼번에 학습하면 불안정성이 발생합니다. 콜백 기반 접근 방식으로 자동 동결 해제를 사용하려면 백본 동결 및 동결 해제를 참조하세요.
from ultralytics import YOLO
# 1단계: 백본 동결, 헤드와 넥 학습
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# 2단계: 모두 동결 해제, 낮은 lr로 파인튜닝
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)일반적인 문제점
모델이 예측을 생성하지 않음
- 불충분한 학습 데이터: 매우 적은 샘플로 학습하는 것이 가장 일반적인 원인입니다 - 너무 적은 데이터에서는 모델이 학습하거나 일반화할 수 없습니다. 다른 원인을 조사하기 전에 클래스당 충분한 다양한 예시가 있는지 확인하세요.
- 데이터셋 경로 확인:
data.yaml의 잘못된 경로는 자동으로 레이블을 0으로 만듭니다. 레이블이 올바르게 로드되는지 확인하기 위해 학습 전에yolo detect val model=yolo26n.pt data=your_data.yaml을 실행하세요. - 신뢰도 임계값 낮추기: 예측이 존재하지만 필터링된 경우, 추론 중에
conf=0.1을 시도하세요. - 클래스 수 확인:
data.yaml의nc가 레이블 파일의 실제 클래스 수와 일치하는지 확인하세요.
검증 mAP가 일찍 정체됨
- 더 많은 데이터 추가: 파인튜닝은 특히 다양한 각도, 조명, 배경을 가진 다양한 예시와 같은 추가 학습 데이터로 크게 이점을 얻습니다.
- 클래스 균형 확인: 대표성이 낮은 클래스는 낮은 AP를 가집니다.
cls_pw를 사용하여 역빈도 클래스 가중치를 적용하세요 (중간 불균형의 경우cls_pw=0.25로 시작하고, 심각한 불균형의 경우1.0으로 증가). - 증강 감소: 매우 소규모 데이터셋의 경우, 과도한 증강이 도움보다 해가 될 수 있습니다.
mosaic=0.5또는mosaic=0.0을 시도하세요. - 해상도 증가: 소형 객체가 있는 데이터셋의 경우, 세부 정보를 보존하기 위해
imgsz=1280을 시도하세요.
파인튜닝 후 원래 클래스의 성능 저하
이는 파국적 망각(catastrophic forgetting)으로 알려진 현상입니다 - 모델이 새로운 데이터에서만 파인튜닝될 때 이전에 학습된 지식을 잃습니다. 망각은 새 데이터와 함께 원래 데이터셋 이미지를 포함하지 않고는 대부분 피할 수 없습니다. 이를 완화하려면:
- 데이터셋 병합: 파인튜닝 중 새로운 클래스와 함께 원래 클래스의 예시를 포함하세요. 이것이 망각을 방지하는 유일한 신뢰할 수 있는 방법입니다.
- 백본과 넥 동결: 백본과 넥 모두를 동결하여 감지 헤드만 학습되도록 하면, 매우 낮은 학습률로 짧은 파인튜닝 실행에 도움이 됩니다.
- 더 적은 에폭으로 학습: 모델이 새 데이터에서만 학습하는 시간이 길어질수록, 망각이 더 많이 증가합니다.
자주 묻는 질문
YOLO를 파인튜닝하려면 몇 장의 이미지가 필요한가요?
고정된 최솟값은 없습니다 - 결과는 작업의 복잡성, 클래스 수, 도메인이 COCO와 얼마나 유사한지에 따라 달라집니다. 원시 수량보다 다양한 이미지(다양한 조명, 각도, 배경)가 더 중요합니다. 현재 가진 것으로 시작하고 검증 지표가 불충분한 경우 확장하세요.
커스텀 데이터셋에서 YOLO26을 어떻게 파인튜닝하나요?
사전 학습된 .pt 파일을 로드하고 커스텀 data.yaml의 경로와 함께 .train()을 호출하세요. Ultralytics는 가중치 전이, 감지 헤드 재초기화 및 옵티마이저 선택을 자동으로 처리합니다. 전체 코드 예제는 기본 파인튜닝 섹션을 참조하세요.
파인튜닝된 YOLO 모델이 아무것도 감지하지 못하는 이유는 무엇인가요?
가장 일반적인 원인은 data.yaml의 잘못된 경로(자동으로 레이블을 0으로 만듦), YAML의 nc와 실제 레이블 파일 간의 불일치, 또는 너무 높은 신뢰도 임계값입니다. 전체 문제 해결 체크리스트는 일반적인 문제점을 참조하세요.
파인튜닝을 위해 어떤 YOLO 레이어를 동결해야 하나요?
데이터셋 크기와 도메인 유사성에 따라 다릅니다. COCO와 유사한 도메인의 소규모 데이터셋의 경우, 백본 동결(freeze=10)이 과적합을 방지합니다. COCO와 매우 다른 도메인의 경우, 모든 레이어를 동결하지 않는 것(freeze=None)이 백본의 적응을 허용합니다. 자세한 권장 사항은 레이어 동결을 참조하세요.
새로운 클래스에서 YOLO 파인튜닝 시 파국적 망각을 어떻게 방지하나요?
새로운 클래스와 함께 학습 데이터에 원래 클래스의 예시를 포함하세요. 그것이 가능하지 않다면, 더 많은 레이어를 동결하고(freeze=10 이상) 낮은 학습률을 사용하면 사전 학습된 지식을 보존하는 데 도움이 됩니다. 자세한 내용은 파인튜닝 후 원래 클래스의 성능 저하를 참조하세요.