YOLO Vision 2026:

사용자 지정 데이터셋에서 YOLO를 파인튜닝하는 방법#

파인튜닝(Fine-tuning)은 무작위 초기화 대신 학습된 가중치에서 시작하여 사전 학습된 모델이 새로운 클래스를 인식하도록 적응시킵니다. 수백 에폭 동안 처음부터 학습하는 대신, 파인튜닝은 사전 학습된 COCO 기능을 활용하고 적은 시간 내에 커스텀 데이터로 수렴합니다.

본 가이드는 기본 사용법부터 layer freezingtwo-stage training과 같은 고급 기법에 이르기까지 커스텀 데이터셋에서 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는 형태 인식 가중치 전이를 수행합니다:

  1. 백본 및 넥 전이 완료 - 이 레이어들은 일반적인 시각적 특징을 추출하며, 그 형태는 클래스 수와 무관합니다.
  2. 디텍션 헤드가 부분적으로 재초기화됩니다 - 분류 출력 레이어(cv3, one2one_cv3)는 클래스 수(80개 대 5개)에 연결된 형태를 가지므로 전송할 수 없으며 무작위로 초기화됩니다. 헤드의 박스 회귀 레이어(cv2, one2one_cv2)는 클래스 수에 관계없이 고정된 형태를 가지므로 정상적으로 전송됩니다.
  3. 클래스 수를 변경할 때 대다수의 가중치는 전이됩니다. 예를 들어, COCO(80개 클래스)에서 YOLO26n을 5개 클래스 데이터셋으로 파인튜닝하면 708개의 가중치 텐서 중 606개가 전이됩니다. 오직 클래스 수에 의존하는 분류 레이어만 재초기화되고, 백본, 넥, 박스 회귀 분기는 그대로 유지됩니다.

사전 학습된 모델과 클래스 수가 동일한 데이터셋의 경우(예: COCO 사전 학습 가중치를 다른 80개 클래스 데이터셋에 파인튜닝할 때), 탐지 헤드를 포함하여 100%의 가중치가 전이됩니다.

이름 별칭으로 클래스 전이하기#

Ultralytics는 대소문자와 주변 공백을 무시하고 데이터셋 간의 클래스 이름을 기준으로 일치하는 분류 헤드 행을 전송합니다. 동등한 클래스가 다른 이름을 사용하는 경우, 로드하기 전에 메모리에서 소스 체크포인트 클래스의 이름을 변경하세요. 이렇게 하면 그렇지 않으면 일치하지 않는 것으로 처리되어 무작위로 초기화될 공유 개념에 대한 사전 학습된 분류 가중치가 보존됩니다.

Objects365 v2-to-COCO 예제는 로드된 체크포인트에서 소스 클래스 이름을 변경하며, train()은 이를 사전 학습된 가중치로 전달합니다:

from ultralytics import YOLO

# Source Objects365 v2 name -> target COCO name
ALIASES = {
    "wild bird": "bird",
    "handbag/satchel": "handbag",
    "luggage": "suitcase",
    "bowl/basin": "bowl",
    "orange/tangerine": "orange",
    "monitor/tv": "tv",
    "stuffed toy": "teddy bear",
    "hair dryer": "hair drier",
}

model = YOLO("path/to/yolo26s-objects365.pt")
model.model.names = {i: ALIASES.get(name, name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)

기본 파인튜닝 예제#

예시
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)

모델 크기 선택#

더 큰 모델은 용량이 더 크지만 업데이트해야 할 파라미터도 더 많으므로 학습 데이터가 제한될 때 과적합 위험이 증가할 수 있습니다. 더 작은 모델(YOLO26n 또는 YOLO26s)로 시작하고 검증 지표가 정체될 때만 스케일 업하는 것이 실용적인 접근 방식입니다. 최적의 모델 크기는 작업의 복잡성, 클래스 수, 데이터셋의 다양성, 배포에 사용할 수 있는 하드웨어에 따라 다릅니다. 사용 가능한 크기 및 성능 벤치마크는 전체 YOLO26 모델 페이지를 참조하세요.

옵티마이저 및 학습률 선택#

기본 optimizer=auto 설정은 총 학습 반복(iteration) 횟수에 따라 옵티마이저와 학습률을 선택합니다:

  • < 10,000 반복 (작은 데이터셋 또는 적은 에포크): 낮고 자동으로 계산된 학습률을 사용하는 AdamW
  • > 10,000회 반복 (대규모 데이터셋): lr=0.01인 MuSGD(하이브리드 Muon+SGD 옵티마이저)

대부분의 파인튜닝 작업에서 기본 설정은 수동 조정 없이도 잘 작동합니다. 다음과 같은 경우에 옵티마이저를 명시적으로 설정하는 것을 고려하십시오:

  • 학습이 불안정한 경우 (손실 급증 또는 발산): 더 안정적인 수렴을 위해 optimizer=AdamW, lr0=0.001을 시도해 보세요.
  • 소규모 데이터셋에서 대형 모델 파인튜닝: lr0=0.001과 같은 더 낮은 학습률은 사전 학습된 특징을 보존하는 데 도움이 됩니다.
자동 옵티마이저는 수동 lr0를 덮어씁니다

optimizer=auto인 경우 lr0momentum 값이 무시됩니다. 학습률을 수동으로 제어하려면 optimizer=SGD, lr0=0.005과 같이 옵티마이저를 명시적으로 설정하세요.

레이어 프리징#

프리징은 학습 중 특정 레이어가 업데이트되는 것을 방지합니다. 이렇게 하면 모델 용량에 비해 데이터셋이 작을 때 학습 속도가 빨라지고 과적합(overfitting)이 줄어듭니다.

freeze 파라미터는 정수 또는 리스트를 허용합니다. 정수 freeze=10은 처음 10개의 레이어(인덱스 0-9)를 프리징하며, 이는 YOLO26 백본의 대부분을 다룹니다. 백본은 레이어 0-10에 걸쳐 있으므로 freeze=10는 마지막 C2PSA 블록(레이어 10)을 학습 가능한 상태로 둡니다. 전체 백본을 프리징하려면 freeze=11을 사용하세요. 리스트에는 부분 백본 프리징을 위한 freeze=[0, 3, 5] 같은 레이어 인덱스나, 레이어 내 특정 브랜치(여기서는 디텍션 헤드의 양쪽 박스 회귀 브랜치)에 대한 세밀한 제어를 위한 freeze=["23.cv2", "23.one2one_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 에폭)은 학습률을 0에서 점진적으로 증가시키며, 이는 초기 반복에서 큰 그래디언트 업데이트가 사전 학습된 특징을 손상시키는 것을 방지합니다. 파인튜닝의 경우에도 기본값을 유지하는 것이 좋습니다.

전체 학습 파라미터 목록은 학습 설정 참조를 참조하세요.

2단계 파인튜닝#

2단계 파인튜닝은 학습을 두 단계로 나눕니다. 첫 번째 단계는 백본을 고정하고 넥과 헤드만 학습시켜, 사전 학습된 특징을 방해하지 않고 탐지 레이어가 새로운 클래스에 적응하도록 합니다. 두 번째 단계는 모든 레이어의 고정을 해제하고 더 낮은 학습률로 모델 전체를 학습시켜 대상 도메인에 맞게 백본을 개선합니다.

이 접근 방식은 타겟 도메인이 COCO와 크게 다른 경우(의료 이미지, 항공 이미지, 현미경 검사)에 특히 유용하며, 백본 적응이 필요할 수 있지만 한 번에 모든 것을 학습하면 불안정성이 발생합니다. 콜백 기반 접근 방식을 통한 자동 언프리징은 백본 프리징 및 언프리징을 참조하세요.

2단계 파인튜닝
from ultralytics import YOLO

# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Stage 2: unfreeze all, fine-tune with lower 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=custom.yaml을 실행하세요.
  • 낮은 신뢰도 임계값: 예측은 존재하지만 필터링되는 경우 추론 중에 conf=0.1을 시도해 보세요.
  • 클래스 수 확인: data.yamlnc이 라벨 파일의 실제 클래스 수와 일치하는지 확인하세요.

검증 mAP가 조기에 정체됨#

  • 데이터 추가: 파인튜닝은 추가 학습 데이터, 특히 다양한 각도, 조명, 배경을 포함하는 예제로부터 상당한 이점을 얻습니다.
  • 클래스 균형 확인: 과소 대표된 클래스는 낮은 AP를 가집니다. 역빈도 클래스 가중치를 적용하려면 cls_pw을 사용하세요(중요하지 않은 불균형은 cls_pw=0.25로 시작하고, 심각한 불균형은 1.0로 늘립니다).
  • 증강(augmentation) 줄이기: 매우 작은 데이터셋의 경우 과도한 증강이 도움이 되기보다 해로울 수 있습니다. mosaic=0.5 또는 mosaic=0.0을 시도해 보세요.
  • 해상도 높이기: 작은 객체가 있는 데이터셋의 경우 디테일을 보존하기 위해 imgsz=1280을 시도해 보세요.

파인튜닝 후 원래 클래스에 대한 성능 저하#

이를 치명적 망각(catastrophic forgetting)이라고 하며, 모델이 새로운 데이터로만 파인튜닝될 때 이전에 학습한 지식을 잃어버리는 현상입니다. 망각은 새로운 데이터와 함께 원래 데이터셋 이미지를 포함하지 않는 한 대부분 피할 수 없습니다. 이를 완화하려면:

  • 데이터셋 병합: 파인튜닝 중에 새로운 클래스와 함께 원래 클래스의 예제를 포함하십시오. 이것이 망각을 방지하는 유일한 확실한 방법입니다.
  • 백본 및 넥 고정: 백본과 넥을 모두 고정하여 탐지 헤드만 학습시키면 매우 낮은 학습률로 짧은 파인튜닝을 수행할 때 도움이 됩니다.
  • 적은 에포크 학습: 새로운 데이터로만 오래 학습할수록 망각이 증가합니다.

FAQ#

  • 정해진 최소 수량은 없습니다. 결과는 작업의 복잡성, 클래스 수, 그리고 도메인이 COCO와 얼마나 유사한지에 따라 달라집니다. 양보다 더 다양한 이미지(다양한 조명, 각도, 배경)가 중요합니다. 현재 가지고 있는 데이터로 시작하여 검증 지표가 불충분할 경우 데이터를 늘리십시오.

  • 사전 학습된 .pt 파일을 로드하고 커스텀 data.yaml의 경로와 함께 .train()을 호출합니다. Ultralytics는 weight transfer, 감지 헤드 재초기화 및 옵티마이저 선택을 자동으로 처리합니다. 전체 코드 예제는 Basic Fine-Tuning 섹션을 참조하세요.

  • 가장 일반적인 원인은 data.yaml의 잘못된 경로(조용히 0개의 레이블을 생성함), YAML의 nc과 실제 레이블 파일 간의 불일치, 또는 너무 높은 신뢰도 임계값입니다. 전체 문제 해결 체크리스트는 일반적인 문제점을 참조하세요.

  • 데이터셋 크기와 도메인 유사성에 따라 다릅니다. COCO와 유사한 도메인을 가진 소규모 데이터셋의 경우 백본을 프리징하면(freeze=10) 과적합을 방지할 수 있습니다. COCO와 매우 다른 도메인의 경우 모든 레이어를 언프리징 상태로 두면(freeze=None) 백본이 적응할 수 있습니다. 자세한 권장 사항은 레이어 프리징을 참조하세요.

  • 새로운 클래스와 함께 학습 데이터에 원래 클래스의 예제를 포함하세요. 그것이 불가능한 경우, 더 많은 레이어를 프리징하고(freeze=10 이상) 더 낮은 학습률을 사용하면 사전 학습된 지식을 보존하는 데 도움이 됩니다. 자세한 내용은 원래 클래스에서 성능 저하를 참조하세요.

댓글