사용자 지정 데이터셋에서 YOLO 미세 조정하는 방법#
미세 조정은 무작위 초기화 대신 학습된 가중치에서 시작하여 사전 학습된 모델이 새로운 클래스를 인식하도록 조정합니다. 수백 epoch 동안 처음부터 학습하는 대신, 미세 조정은 사전 학습된 COCO 특징을 활용하여 훨씬 짧은 시간 안에 사용자 지정 데이터에 수렴합니다.
이 가이드에서는 사용자 지정 데이터셋에서 YOLO26을 미세 조정하는 방법을 기본 사용법부터 레이어 동결과 2단계 학습 같은 고급 기법까지 다룹니다.
미세 조정과 처음부터 학습 비교#
사전 학습된 모델은 수백만 개의 이미지에서 에지 검출, 텍스처 인식, 형태 이해와 같은 일반적인 시각적 특징을 이미 학습했습니다. 미세 조정을 통한 전이 학습은 이러한 지식을 재사용하고 새로운 클래스가 어떻게 보이는지만 모델에 학습시키므로 더 빠르게 수렴하고 더 적은 데이터가 필요합니다. 처음부터 학습하면 이 모든 지식을 버리고 픽셀 수준의 패턴부터 모든 것을 학습하게 하므로 훨씬 더 많은 리소스가 필요합니다. 아키텍처만 포함된 .yaml 파일과 체크포인트의 차이를 알아보려면 모델 YAML 구성 가이드를 참조하십시오.
| 파인튜닝 | 처음부터 학습 | |
|---|---|---|
| 시작 가중치 | COCO에서 사전 학습(80개 클래스) | 무작위 초기화 |
| 명령어 | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| 수렴 | 더 빠름 - 백본이 이미 학습됨 | 더 느림 - 모든 레이어가 0부터 학습함 |
| 데이터 요구 사항 | 더 낮음 - 사전 학습된 특징이 적은 데이터를 보완함 | 더 높음 - 모델이 데이터셋만으로 모든 특징을 학습해야 함 |
| 사용 시점 | 자연 이미지의 사용자 지정 클래스 | COCO와 근본적으로 다른 도메인(의료, 위성, 레이더) |
.pt 파일을 YOLO("yolo26n.pt")과 함께 로드하면 사전 학습된 가중치가 모델에 저장됩니다. 그 후 .train(data="custom.yaml")를 호출하면 호환되는 모든 가중치가 새 모델 아키텍처로 자동 전이되고, 일치하지 않는 레이어(클래스 수가 다를 때의 detection head 등)는 다시 초기화된 다음 학습이 시작됩니다. 수동으로 가중치를 로드하거나 레이어를 조작하거나 사용자 지정 전이 학습 코드를 작성할 필요가 없습니다.
사전 학습된 가중치 전이 방식#
사전 학습된 모델을 클래스 수가 다른 데이터셋(예: COCO의 80개 클래스에서 사용자 지정 5개 클래스로 변경)에서 미세 조정하면 Ultralytics는 형태를 고려하여 가중치를 전이합니다.
- 백본과 neck은 완전히 전이됩니다 - 이 레이어들은 일반적인 시각적 특징을 추출하며, 형태가 클래스 수와 무관합니다.
- Detection head는 부분적으로 다시 초기화됩니다 - 분류 출력 레이어(
cv3,one2one_cv3)의 형태는 클래스 수(80 대 5)에 따라 달라집니다. 클래스 이름이 일치하는 호환 가능한 행은 일치하지 않는 행이 초기화되기 전에 다시 매핑됩니다. Detection head의 박스 회귀 레이어(cv2,one2one_cv2)는 클래스 수와 관계없이 형태가 고정되므로 정상적으로 전이됩니다. - 클래스 수를 변경할 때 대부분의 가중치가 전이됩니다. 예를 들어 COCO(80개 클래스)에서 5개 클래스 데이터셋으로 YOLO26n을 미세 조정하면 708개의 가중치 텐서 중 606개가 전이되며, 이름이 일치하는 호환 가능한 분류 행도 함께 전이됩니다.
사전 학습된 모델과 클래스 수가 같은 데이터셋(예: COCO에서 사전 학습된 가중치를 다른 80개 클래스 데이터셋에서 미세 조정하는 경우)에서는 detection head를 포함한 가중치의 100%가 전이됩니다.
이름 별칭을 사용한 클래스 전이#
Ultralytics는 대소문자와 앞뒤 공백을 무시하고 데이터셋 간 클래스 이름으로 일치하는 분류 head 행을 전이합니다. 동일한 클래스를 서로 다른 이름으로 사용하는 경우, 로드하기 전에 메모리에서 소스 체크포인트의 클래스 이름을 변경하십시오. 이렇게 하면 그렇지 않으면 일치하지 않는 것으로 처리되어 무작위 초기화될 공유 개념의 사전 학습된 분류 가중치를 보존할 수 있습니다.
이 Objects365 v2-to-COCO 예제에서는 로드된 체크포인트의 소스 클래스 이름을 변경하며, 이후 train()이 이를 사전 학습된 가중치로 전달합니다.
from ultralytics import YOLO
# Source Objects365 v2 name (lowercased) -> 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")
# Objects365 class names are Title-Cased, so match on the lowercased name
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") # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)모델 크기 선택#
더 큰 모델은 용량이 크지만 업데이트해야 할 파라미터도 많아 데이터가 제한된 경우 과적합 위험이 증가할 수 있습니다. 더 작은 모델(YOLO26n 또는 YOLO26s)로 시작하고 검증 지표가 정체될 때만 크기를 늘리는 것이 실용적인 접근 방식입니다. 최적의 모델 크기는 작업의 복잡성, 클래스 수, 데이터셋의 다양성, 배포에 사용할 수 있는 하드웨어에 따라 달라집니다. 사용 가능한 크기와 성능 벤치마크는 전체 YOLO26 모델 페이지를 참조하십시오.
Optimizer 및 Learning Rate 선택#
기본 optimizer=auto 설정은 전체 학습 반복 횟수에 따라 optimizer와 learning rate를 선택합니다.
- 10,000회 이하의 반복(소규모 데이터셋 또는 적은 epoch): 낮고 자동으로 계산된 learning rate를 사용하는 AdamW
- 10,000회 초과의 반복(대규모 데이터셋): lr=0.01을 사용하는 MuSGD(Muon+SGD 하이브리드 optimizer)
대부분의 미세 조정 작업에서는 수동 조정 없이도 기본 설정이 잘 작동합니다. 다음과 같은 경우 optimizer를 명시적으로 설정하는 것을 고려하십시오.
- 학습이 불안정한 경우(loss가 급증하거나 발산함): 더 안정적인 수렴을 위해
optimizer=AdamW, lr0=0.001을 시도하십시오. - 소규모 데이터셋에서 대형 모델을 미세 조정하는 경우:
optimizer=AdamW, lr0=0.001과 같이 learning rate가 더 낮은 명시적 optimizer를 사용하면 사전 학습된 특징을 보존하는 데 도움이 될 수 있습니다.
optimizer=auto인 경우 lr0 및 momentum 값은 무시됩니다. learning rate를 수동으로 제어하려면 optimizer를 명시적으로 설정하십시오: optimizer=SGD, lr0=0.005.
레이어 동결#
동결하면 학습 중 특정 레이어가 업데이트되지 않습니다. 이를 통해 학습 속도가 빨라지고 데이터셋이 모델 용량에 비해 작을 때 과적합이 줄어듭니다.
freeze 파라미터는 정수 또는 리스트를 허용합니다. 정수 freeze=10은 처음 10개 레이어(인덱스 09)를 동결하며, 이는 YOLO26 백본의 대부분을 포함합니다. 백본은 레이어 010에 걸쳐 있으므로 freeze=10는 마지막 C2PSA 블록(레이어 10)을 학습 가능한 상태로 둡니다. 전체 백본을 동결하려면 freeze=11을 사용하십시오. 리스트에는 부분적인 백본 동결을 위한 freeze=[0, 3, 5]와 같은 레이어 인덱스 또는 레이어 내 특정 분기를 세밀하게 제어하기 위한 freeze=["23.cv2", "23.one2one_cv2"]와 같은 모듈 이름 문자열을 포함할 수 있습니다(여기서는 detection head의 두 박스 회귀 분기 모두를 의미합니다).
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)적절한 동결 깊이는 대상 도메인이 사전 학습 데이터와 얼마나 유사한지, 그리고 사용할 수 있는 학습 데이터의 양에 따라 달라집니다.
| 시나리오 | 권장 사항 | 근거 |
|---|---|---|
| 대규모 데이터셋, 유사한 도메인 | freeze=None (기본값) | 과적합 없이 모든 레이어를 조정할 수 있을 만큼 데이터가 충분함 |
| 소규모 데이터셋, 유사한 도메인 | freeze=10 | 백본 특징을 보존하고 학습 가능한 파라미터를 줄임 |
| 매우 작은 데이터셋 | freeze=23 | Detection head만 학습하여 과적합 위험을 최소화함 |
| COCO와 매우 다른 도메인 | freeze=None | 백본 특징이 잘 전이되지 않을 수 있어 재학습이 필요함 |
동결 깊이는 하이퍼파라미터로도 취급할 수 있습니다. 몇 가지 값(0, 5, 10)을 시도하고 검증 mAP를 비교하면 특정 데이터셋에 가장 적합한 설정을 찾는 실용적인 방법이 됩니다.
미세 조정을 위한 주요 하이퍼파라미터#
미세 조정은 일반적으로 처음부터 학습하는 것보다 적은 수의 하이퍼파라미터 조정만 필요합니다. 가장 중요한 파라미터는 다음과 같습니다.
epochs: 미세 조정은 처음부터 학습하는 것보다 빠르게 수렴합니다. 적절한 값으로 시작하고patience을 사용하여 검증 지표가 정체되면 조기 종료하십시오.patience: 기본값 100은 장시간 학습을 위해 설계되었습니다. 이를 10~20으로 줄이면 이미 수렴한 학습을 계속하느라 시간을 낭비하는 일을 방지할 수 있습니다.warmup_epochs: Warmup은 처음 몇 epoch 동안 learning rate를 예약된 값까지 점진적으로 조정하므로 초기 batch가 사전 학습된 특징을 방해할 가능성이 줄어듭니다. 미세 조정 시에는 0이 아닌 값을 유지하되, 전체 3-epoch 기본값이 반드시 필요한 것은 아닙니다. 공식 YOLO26 COCO 미세 조정을 뒷받침하는 evolutionary search는 Objects365 가중치에서 여러 epoch를 이어 학습한 결과, 모든 모델 크기에서 약 1 epoch를 선택했습니다.
전체 학습 파라미터 목록은 학습 구성 참조 문서를 참조하십시오. 레이어별 learning rate, gradient clipping 또는 사용자 지정 검증 지표처럼 파라미터로 노출되지 않는 동작을 제어하려면 trainer를 서브클래싱하십시오.
2단계 미세 조정#
2단계 미세 조정은 학습을 두 단계로 나눕니다. 첫 번째 단계에서는 백본을 동결하고 neck과 head만 학습하여 사전 학습된 특징을 방해하지 않고 detection 레이어가 새로운 클래스에 맞게 조정되도록 합니다. 두 번째 단계에서는 모든 레이어의 동결을 해제하고 더 낮은 learning rate로 전체 모델을 학습하여 대상 도메인에 맞게 백본을 개선합니다.
이 접근 방식은 대상 도메인이 COCO와 크게 다른 경우(의료 이미지, 항공 이미지, 현미경 이미지)에 특히 유용합니다. 이러한 경우 백본을 조정해야 할 수 있지만 모든 항목을 한 번에 학습하면 불안정성이 발생할 수 있습니다. callback 기반 접근 방식으로 자동 동결 해제를 수행하려면 백본 동결 및 동결 해제를 참조하십시오.
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, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)일반적인 문제#
모델이 예측을 생성하지 않음#
-
학습 데이터 부족: 매우 적은 샘플로 학습하는 것은 가장 흔한 원인입니다. 데이터가 너무 적으면 모델이 학습하거나 일반화할 수 없습니다. 다른 원인을 조사하기 전에 클래스별로 충분하고 다양한 예제가 있는지 확인하십시오.
-
데이터셋 경로 확인: 잘못된 이미지 경로는 데이터셋 오류를 발생시킵니다. 개별적으로 누락되었거나 비어 있는 label 파일은 배경 이미지로 처리되고 스캔 중에 보고되며, label이 전혀 없는 학습 분할은 오류를 발생시킵니다. 학습 전에 데이터셋을 검증하십시오.
yolo detect val model=yolo26n.pt data=custom.yaml -
confidence threshold 낮추기: 예측은 존재하지만 필터링되는 경우 추론 중
conf=0.1을 시도하십시오. -
클래스 수 확인:
data.yaml의nc이 label 파일의 실제 클래스 수와 일치하는지 확인하십시오.
검증 mAP가 초기에 정체됨#
- 데이터 추가: 미세 조정은 추가 학습 데이터, 특히 다양한 각도, 조명, 배경을 포함하는 여러 예제에서 큰 이점을 얻습니다.
- 클래스 균형 확인: 충분히 표현되지 않은 클래스는 AP가 낮습니다. 예제를 더 추가하거나 검증 세트에서
cls_pw을 조정하십시오. - augmentation 줄이기: 매우 작은 데이터셋에서는 과도한 augmentation이 도움이 되기보다 오히려 성능을 저하시킬 수 있습니다.
mosaic=0.5또는mosaic=0.0을 시도하십시오. - 해상도 높이기: 작은 객체가 포함된 데이터셋에서는 세부 정보를 보존하기 위해
imgsz=1280을 시도하십시오.
미세 조정 후 기존 클래스의 성능이 저하됨#
이를 catastrophic forgetting이라고 합니다. 새로운 데이터만 사용해 미세 조정하면 모델이 이전에 학습한 지식을 잃게 됩니다. 새로운 데이터와 함께 원본 데이터셋의 이미지를 포함하지 않으면 망각은 대부분 피하기 어렵습니다. 이를 완화하려면 다음을 수행하십시오.
- 데이터셋 병합: 미세 조정 중 새로운 클래스와 함께 기존 클래스의 예제도 포함하십시오. 망각을 방지하는 유일하게 신뢰할 수 있는 방법입니다.
- 백본과 neck 동결: 백본과 neck을 모두 동결하여 detection head만 학습하도록 하면 매우 낮은 learning rate로 짧게 미세 조정할 때 도움이 됩니다.
- 더 적은 epoch로 학습: 모델이 새로운 데이터만 사용하여 오래 학습할수록 망각이 심해집니다.
FAQ#
고정된 최소 요구량은 없습니다. 결과는 작업의 복잡성, 클래스 수, 도메인이 COCO와 얼마나 유사한지에 따라 달라집니다. 다양한 이미지(여러 조명, 각도, 배경)를 확보하는 것이 단순한 이미지 수보다 중요합니다. 현재 보유한 데이터로 시작하고 검증 지표가 충분하지 않으면 규모를 늘리십시오.
가장 흔한 원인은 잘못된 이미지 경로, 누락되었거나 비어 있는 label 파일, YAML의
nc과 실제 label 파일 간의 불일치 또는 너무 높은 confidence threshold입니다. 전체 문제 해결 체크리스트는 일반적인 문제를 참조하십시오.데이터셋 크기와 도메인 유사성에 따라 달라집니다. COCO와 유사한 도메인의 소규모 데이터셋에서는 백본(
freeze=10)을 동결하면 과적합을 방지할 수 있습니다. COCO와 매우 다른 도메인에서는 모든 레이어의 동결을 해제한 상태(freeze=None)로 두면 백본이 적응할 수 있습니다. 자세한 권장 사항은 레이어 동결을 참조하십시오.새로운 클래스와 함께 기존 클래스의 예제를 학습 데이터에 포함하십시오. 이것이 불가능하다면 더 많은 레이어(
freeze=10이상)를 동결하고 더 낮은 learning rate를 사용하면 사전 학습된 지식을 보존하는 데 도움이 됩니다. 자세한 내용은 기존 클래스의 성능이 저하됨을 참조하십시오.