Ultralytics YOLO27: 대기자 명단에 등록해 주십시오.
Get Started

커스텀 데이터셋으로 YOLO를 미세 조정하는 방법#

미세 조정은 무작위 초기화 대신 학습된 가중치에서 시작해 사전 학습된 모델이 새로운 클래스를 인식하도록 조정하는 방법입니다. 수백 에포크 동안 처음부터 학습하는 대신, 사전 학습된 COCO 특징을 활용하면 훨씬 짧은 시간 안에 커스텀 데이터에 맞게 수렴할 수 있습니다.

이 가이드에서는 기본 사용법부터 레이어 동결 및 2단계 학습 같은 고급 기법까지, 커스텀 데이터셋으로 YOLO26을 미세 조정하는 방법을 설명합니다.

미세 조정과 처음부터 학습하기 비교#

사전 학습된 모델은 수백만 개의 이미지에서 에지 감지, 텍스처 인식, 형태 이해와 같은 일반적인 시각적 특징을 이미 학습했습니다. 미세 조정을 통한 전이 학습은 이 지식을 재사용하고 새로운 클래스의 형태만 모델에 학습시키므로 더 빠르게 수렴하고 더 적은 데이터가 필요합니다. 처음부터 학습하면 이러한 지식을 모두 버리고 픽셀 수준 패턴부터 모든 것을 학습하게 되므로 훨씬 많은 리소스가 필요합니다. 아키텍처만 정의하는 .yaml 파일과 체크포인트가 어떻게 다른지 알아보려면 모델 YAML 구성 가이드를 참조하세요.

미세 조정처음부터 학습하기
시작 가중치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개 가중치 텐서 중 696개가 전이되며, 이름이 일치하는 호환 분류 행도 함께 전이됩니다.

사전 학습 모델과 클래스 수가 같은 데이터셋(예: COCO로 사전 학습된 가중치를 다른 80개 클래스 데이터셋에 미세 조정하는 경우)에서는 탐지 헤드를 포함해 가중치의 100%가 전이됩니다.

클래스 별칭을 사용해 클래스 전이하기#

Ultralytics는 대소문자와 앞뒤 공백을 무시하고 데이터셋 간에 클래스 이름이 일치하는 분류 헤드 행을 전이합니다. 동일한 클래스의 이름이 서로 다르면 로드하기 전에 메모리에서 소스 체크포인트의 클래스 이름을 변경하세요. 이렇게 하면 일치하지 않는 것으로 간주되어 무작위로 초기화될 수 있는 공통 개념의 사전 학습 분류 가중치를 보존할 수 있습니다.

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

from ultralytics import YOLO

# 소스 Objects365 v2 이름(소문자) -> 대상 COCO 이름
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")
# Objects365 클래스 이름은 각 단어의 첫 글자가 대문자이므로 소문자 이름으로 일치시킵니다
model.model.names = {i: ALIASES.get(name.lower(), name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)

cls_remap 설정은 기본적으로 이름 기반 전이를 활성화합니다. 호환되는 행이 복사되면 학습 로그에 Remapped N/M cls head rows from pretrained weights by class name이 출력됩니다. 이 기능을 비활성화하려면 cls_remap=False를 설정하세요.

기본 미세 조정 예제#

예제
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # 사전 학습된 모델 불러오기
model.train(data="custom.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을 시도해 보세요.
  • 소규모 데이터셋으로 대형 모델을 미세 조정하는 경우: optimizer=AdamW, lr0=0.001처럼 학습률이 낮은 옵티마이저를 명시적으로 설정하면 사전 학습된 특징을 보존하는 데 도움이 됩니다.
자동 옵티마이저는 수동 lr0 설정을 덮어씁니다

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

레이어 동결#

동결은 학습 중 특정 레이어가 업데이트되지 않도록 합니다. 데이터셋이 모델 용량에 비해 작을 때 학습 속도를 높이고 과적합을 줄여줍니다.

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"]와 같은 모듈 이름 문자열을 사용할 수 있습니다(여기서는 탐지 헤드의 두 박스 회귀 분기를 모두 동결합니다).

예제
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
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: 워밍업은 처음 몇 epoch에 걸쳐 학습률이 스케줄에 따른 값에 도달하도록 완만하게 조정하여, 초기 배치가 사전 학습된 특징을 크게 바꾸지 않도록 합니다. 파인튜닝 시에는 0보다 큰 값을 유지하되, 기본값인 3 epoch를 모두 사용할 필요는 없습니다. 공식 YOLO26 COCO 파인튜닝의 기반이 된 진화적 탐색에서는 Objects365 가중치에서 여러 epoch 동안 학습을 이어간 결과, 모든 모델 크기에서 약 1 epoch가 적합한 것으로 나타났습니다.

전체 학습 파라미터 목록은 학습 설정 참조 문서를 확인하세요. 레이어별 학습률, 그래디언트 클리핑 또는 사용자 지정 검증 지표처럼 파라미터로 노출되지 않는 동작을 제어하려면 트레이너를 서브클래싱하세요.

2단계 파인튜닝#

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

이 방법은 대상 도메인이 COCO와 크게 다른 경우(의료 이미지, 항공 이미지, 현미경 이미지)에 특히 유용합니다. 이러한 도메인에서는 백본을 조정해야 할 수 있지만, 모든 레이어를 한 번에 학습하면 불안정해질 수 있습니다. 콜백 기반 방식으로 자동으로 고정을 해제하려면 백본 고정 및 고정 해제를 참조하세요.

2단계 파인튜닝
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, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)

흔히 발생하는 문제#

모델이 예측을 생성하지 않음#

  • 학습 데이터 부족: 샘플이 매우 적은 상태로 학습하는 것이 가장 흔한 원인입니다. 데이터가 너무 적으면 모델이 학습하거나 일반화할 수 없습니다. 다른 원인을 조사하기 전에 클래스별로 다양하고 충분한 예시가 있는지 확인하세요.

  • 데이터셋 경로 확인: 잘못된 이미지 경로는 데이터셋 오류를 발생시킵니다. 개별 레이블 파일이 없거나 비어 있는 경우에는 배경 이미지로 처리되어 스캔 중에 보고되며, 학습 분할에 레이블이 전혀 없으면 오류가 발생합니다. 학습 전에 데이터셋을 검증하세요:

    yolo detect val model=yolo26n.pt data=custom.yaml
  • 신뢰도 임계값 낮추기: 예측은 생성되지만 필터링되는 경우 추론 시 conf=0.1을 시도하세요.

  • 클래스 수 확인: data.yaml의 nc이 레이블 파일에 포함된 실제 클래스 수와 일치하는지 확인하세요.

검증 mAP가 일찍 정체됨#

  • 데이터 추가: 파인튜닝은 학습 데이터가 추가되면 큰 효과를 얻습니다. 특히 각도, 조명, 배경이 다양한 예시가 유용합니다.
  • 클래스 균형 확인: 데이터에 적게 포함된 클래스는 AP가 낮게 나타납니다. 예시를 추가하거나 검증 세트에서 cls_pw을 조정하세요.
  • 증강 줄이기: 데이터셋이 매우 작으면 강한 증강이 도움이 되기보다 성능을 저하시킬 수 있습니다. mosaic=0.5 또는 mosaic=0.0을 시도하세요.
  • 해상도 높이기: 작은 객체가 포함된 데이터셋에는 세부 정보를 보존하기 위해 imgsz=1280을 시도하세요.

파인튜닝 후 기존 클래스의 성능이 저하됨#

이를 파국적 망각이라고 합니다. 새 데이터만 사용해 파인튜닝하면 모델이 이전에 학습한 지식을 잃게 됩니다. 새 데이터와 함께 원본 데이터셋의 이미지를 포함하지 않으면 망각은 대부분 피하기 어렵습니다. 이를 완화하는 방법은 다음과 같습니다:

  • 데이터셋 병합: 파인튜닝 중 새 클래스와 함께 기존 클래스의 예시도 포함합니다. 망각을 방지하는 유일하게 신뢰할 수 있는 방법입니다.
  • 백본과 넥 고정: 백본과 넥을 모두 고정하여 탐지 헤드만 학습하면, 학습률을 매우 낮게 설정한 짧은 파인튜닝에서 도움이 됩니다.
  • epoch 수 줄이기: 모델이 새 데이터만으로 학습하는 시간이 길수록 망각이 심해집니다.

자주 묻는 질문#

  • 정해진 최소 개수는 없습니다. 결과는 작업의 복잡도, 클래스 수, 도메인과 COCO의 유사성에 따라 달라집니다. 이미지의 단순한 수량보다 조명, 각도, 배경이 다양한 이미지가 더 중요합니다. 보유한 데이터로 시작하고 검증 지표가 충분하지 않으면 데이터 규모를 늘리세요.

  • 사전 학습된 .pt 파일을 불러온 후 사용자 지정 data.yaml의 경로와 함께 .train()을 호출합니다. Ultralytics가 가중치 전이, 분류 레이어 재초기화 및 옵티마이저 선택을 자동으로 처리합니다. 전체 코드 예제는 기본 미세 조정 섹션을 참조하세요.

  • 가장 흔한 원인은 잘못된 이미지 경로, 누락되었거나 비어 있는 레이블 파일, YAML의 nc과 실제 레이블 파일 간의 불일치, 또는 너무 높은 신뢰도 임계값입니다. 전체 문제 해결 체크리스트는 흔히 발생하는 문제를 참조하세요.

  • 데이터셋 크기와 도메인 유사성에 따라 다릅니다. COCO와 유사한 도메인의 소규모 데이터셋에서는 백본(freeze=10)을 고정하면 과적합을 방지할 수 있습니다. COCO와 크게 다른 도메인에서는 모든 레이어의 고정을 해제(freeze=None)하여 백본이 적응하도록 할 수 있습니다. 자세한 권장 사항은 레이어 고정을 참조하세요.

  • 새 클래스와 함께 기존 클래스의 예시를 학습 데이터에 포함하세요. 이것이 불가능하면 더 많은 레이어(freeze=10 이상)를 고정하고 학습률을 낮추면 사전 학습된 지식을 보존하는 데 도움이 됩니다. 자세한 내용은 기존 클래스의 성능 저하를 참조하세요.

댓글