Ultralytics YOLO27:

사용자 지정 데이터셋으로 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개의 가중치 텐서 중 606개가 전이되며, 이름이 일치하는 호환 가능한 분류 행도 전이됩니다.

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

클래스 이름 별칭을 사용한 클래스 전이#

Ultralytics는 대소문자와 앞뒤 공백을 무시하고 데이터셋 간에 클래스 이름이 일치하는 분류 헤드 행을 전이합니다. 같은 클래스의 이름이 서로 다른 경우, 불러온 체크포인트에서 소스 클래스 이름을 메모리상에서 변경합니다. 이렇게 하면 공유 개념에 해당하는 사전 학습 분류 가중치가 일치하지 않는 것으로 처리되어 무작위 초기화되는 일을 방지할 수 있습니다.

이 Objects365 v2-to-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회 초과(대규모 데이터셋): MuSGD(Muon과 SGD를 결합한 하이브리드 옵티마이저), lr=0.01

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

  • 학습이 불안정한 경우(손실이 급증하거나 발산함): 더 안정적으로 수렴하도록 optimizer=AdamW, lr0=0.001을 사용해 보세요
  • 소규모 데이터셋으로 대형 모델을 파인튜닝하는 경우: 사전 학습된 특징을 보존하는 데 낮은 학습률의 옵티마이저를 명시적으로 설정하면 도움이 될 수 있습니다(예: optimizer=AdamW, lr0=0.001).
자동 옵티마이저가 수동 lr0 설정을 덮어씁니다

optimizer=auto인 경우 lr0과 momentum 값은 무시됩니다. 학습률을 수동으로 제어하려면 옵티마이저를 명시적으로 설정하세요: 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: 워밍업은 초기 에폭 동안 학습률을 예정된 값까지 점진적으로 높여 초기 배치가 사전 학습된 특징을 교란할 가능성을 줄입니다. 파인튜닝 중에는 0이 아닌 값을 유지하세요. 다만 기본값인 3에폭을 전부 사용할 필요는 없습니다. Objects365 가중치에서 여러 에폭에 걸쳐 이어서 학습한 공식 YOLO26 COCO 파인튜닝을 위한 진화적 탐색에서는 모든 모델 크기에서 약 1에폭이 적절한 것으로 나타났습니다.

학습 매개변수 전체 목록은 학습 구성 참조 문서를 참조하세요. 레이어별 학습률, 그래디언트 클리핑, 사용자 지정 검증 지표 등 매개변수로 설정할 수 없는 동작이 필요하면 트레이너를 서브클래싱하세요.

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을 사용해 보세요.

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

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

  • 데이터셋 병합: 파인튜닝 중 기존 클래스의 예제를 새 클래스의 예제와 함께 포함하세요. 망각을 방지할 수 있는 유일하게 신뢰할 만한 방법입니다.
  • 백본과 넥 동결: 백본과 넥을 모두 동결해 감지 헤드만 학습하면 매우 낮은 학습률로 짧게 파인튜닝할 때 도움이 됩니다.
  • 에폭 수 줄이기: 새 데이터만으로 모델을 오래 학습할수록 망각이 심해집니다.

자주 묻는 질문#

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

  • 사전 학습된 .pt 파일을 불러오고 사용자 지정 data.yaml의 경로를 지정해 .train()을 호출하세요. Ultralytics가 가중치 전이, 감지 헤드 재초기화, 옵티마이저 선택을 자동으로 처리합니다. 전체 코드 예제는 기본 파인튜닝 섹션을 참조하세요.

  • 가장 흔한 원인은 유효하지 않은 이미지 경로, 누락되거나 비어 있는 라벨 파일, YAML의 nc과 실제 라벨 파일 간의 불일치, 또는 너무 높은 신뢰도 임계값입니다. 전체 문제 해결 체크리스트는 일반적인 문제를 참조하세요.

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

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

댓글