Link to this section사용자 지정 데이터셋에서 YOLO를 파인튜닝하는 방법#
파인튜닝은 무작위 초기화 대신 학습된 가중치에서 시작하여 새로운 클래스를 인식하도록 사전 학습된 모델을 조정하는 과정입니다. 처음부터 수백 에포크 동안 학습하는 대신, 파인튜닝은 사전 학습된 COCO 특징을 활용하여 훨씬 짧은 시간 안에 사용자 지정 데이터로 수렴합니다.
This guide covers fine-tuning YOLO26 on custom datasets, from basic usage to advanced techniques like layer freezing and two-stage training.
Link to this section파인튜닝 vs 처음부터 학습#
사전 학습된 모델은 이미 수백만 장의 이미지로부터 엣지 감지, 질감 인식, 형태 이해와 같은 일반적인 시각적 특징을 학습했습니다. 파인튜닝을 통한 전이 학습은 이러한 지식을 재사용하여 모델에 새로운 클래스가 어떻게 보이는지만 가르치므로, 수렴 속도가 빠르고 더 적은 데이터가 필요합니다. 처음부터 학습하는 것은 이러한 모든 지식을 폐기하고 모델이 픽셀 수준의 패턴부터 모든 것을 배우도록 강제하므로 훨씬 더 많은 리소스가 필요합니다.
| 파인튜닝 | 처음부터 학습 | |
|---|---|---|
| 시작 가중치 | COCO 사전 학습 (80개 클래스) | 무작위 초기화 |
| 명령어 | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| 수렴 | 더 빠름 - 백본이 이미 학습됨 | 더 느림 - 모든 레이어가 처음부터 학습 |
| 데이터 요구 사항 | 더 낮음 - 사전 학습된 특징이 부족한 데이터를 보완함 | 더 높음 - 모델이 데이터셋만으로 모든 특징을 학습해야 함 |
| 사용 시기 | 자연 이미지로 구성된 사용자 지정 클래스 | COCO와 근본적으로 다른 도메인 (의료, 위성, 레이더) |
When a .pt file is loaded with YOLO("yolo26n.pt"), the pretrained weights are stored in the model. Calling .train(data="custom.yaml") after that automatically transfers all compatible weights to the new model architecture, reinitializes any layers that don't match (such as the detection head when the number of classes differs), and begins training. No manual weight loading, layer manipulation, or custom transfer learning code is required.
Link to this section사전 학습된 가중치 전이 작동 방식#
사전 학습된 모델을 클래스 수가 다른 데이터셋(예: COCO의 80개 클래스에서 5개의 사용자 지정 클래스로)에 대해 파인튜닝할 때, Ultralytics는 형태 인식 가중치 전이를 수행합니다:
- 백본 및 넥 전이 완료 - 이 레이어들은 일반적인 시각적 특징을 추출하며, 그 형태는 클래스 수와 무관합니다.
- 탐지 헤드 부분 재초기화 - 분류 출력 레이어(
cv3,one2one_cv3)는 클래스 수(80개 대 5개)에 따라 형태가 결정되므로 전이할 수 없으며 무작위로 초기화됩니다. 헤드의 박스 회귀 레이어(cv2,one2one_cv2)는 클래스 수와 관계없이 고정된 형태를 가지므로 정상적으로 전이됩니다. - 클래스 수를 변경할 때 대다수의 가중치는 전이됩니다. 예를 들어, COCO(80개 클래스)에서 YOLO26n을 5개 클래스 데이터셋으로 파인튜닝하면 708개의 가중치 텐서 중 606개가 전이됩니다. 오직 클래스 수에 의존하는 분류 레이어만 재초기화되고, 백본, 넥, 박스 회귀 분기는 그대로 유지됩니다.
사전 학습된 모델과 클래스 수가 동일한 데이터셋의 경우(예: COCO 사전 학습 가중치를 다른 80개 클래스 데이터셋에 파인튜닝할 때), 탐지 헤드를 포함하여 100%의 가중치가 전이됩니다.
Link to this section기본 파인튜닝 예제#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)Link to this section모델 크기 선택#
더 큰 모델은 더 많은 용량을 가지지만 업데이트해야 할 파라미터도 많아져, 학습 데이터가 제한적일 경우 과적합 위험이 증가할 수 있습니다. 작은 모델(YOLO26n 또는 YOLO26s)로 시작하여 검증 지표가 정체될 때만 모델 크기를 키우는 것이 실용적인 접근 방식입니다. 최적의 모델 크기는 작업의 복잡성, 클래스 수, 데이터셋의 다양성 및 배포 환경의 하드웨어에 따라 달라집니다. 사용 가능한 크기 및 성능 벤치마크는 YOLO26 모델 페이지를 참조하십시오.
Link to this section옵티마이저 및 학습률 선택#
기본 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와 같이 옵티마이저를 명시적으로 설정하십시오.
Link to this section레이어 프리징#
프리징은 학습 중에 특정 레이어가 업데이트되는 것을 방지합니다. 이는 모델 용량에 비해 데이터셋이 작을 때 학습 속도를 높이고 과적합을 줄여줍니다.
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를 비교하는 것이 특정 데이터셋에 대한 최적의 설정을 찾는 실용적인 방법입니다.
Link to this section파인튜닝을 위한 주요 하이퍼파라미터#
파인튜닝은 일반적으로 처음부터 학습할 때보다 적은 하이퍼파라미터 조정이 필요합니다. 가장 중요한 파라미터는 다음과 같습니다:
epochs: 파인튜닝은 처음부터 학습할 때보다 수렴이 빠릅니다. 적당한 값으로 시작하고, 검증 지표가 정체되면patience를 사용하여 조기 종료하십시오.patience: 기본값 100은 긴 학습 과정을 위해 설계되었습니다. 이를 10-20으로 줄이면 이미 수렴된 실행에 시간을 낭비하는 것을 방지할 수 있습니다.warmup_epochs: 기본 워밍업(3 에포크)은 학습률을 0에서 점진적으로 높여 초기 반복에서 큰 기울기 업데이트가 사전 학습된 특징을 손상시키는 것을 방지합니다. 파인튜닝에서도 기본값을 유지하는 것이 권장됩니다.
전체 학습 파라미터 목록은 학습 구성 참조를 확인하십시오.
Link to this section2단계 파인튜닝#
2단계 파인튜닝은 학습을 두 단계로 나눕니다. 첫 번째 단계는 백본을 고정하고 넥과 헤드만 학습시켜, 사전 학습된 특징을 방해하지 않고 탐지 레이어가 새로운 클래스에 적응하도록 합니다. 두 번째 단계는 모든 레이어의 고정을 해제하고 더 낮은 학습률로 모델 전체를 학습시켜 대상 도메인에 맞게 백본을 개선합니다.
이 접근 방식은 대상 도메인이 COCO와 상당히 다를 때(의료 이미지, 항공 이미지, 현미경 사진 등) 특히 유용합니다. 이런 경우 백본의 적응이 필요하지만 한꺼번에 모든 것을 학습하면 불안정해질 수 있습니다. 콜백 기반의 자동 고정 해제 접근 방식은 백본 프리징 및 프리징 해제를 참조하십시오.
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)Link to this section흔한 문제점#
Link to this section모델이 예측값을 생성하지 않음#
- 학습 데이터 부족: 매우 적은 샘플로 학습하는 것이 가장 흔한 원인입니다. 모델이 너무 적은 데이터로는 학습하거나 일반화할 수 없습니다. 다른 원인을 조사하기 전에 클래스당 충분히 다양한 예제가 있는지 확인하십시오.
- 데이터셋 경로 확인:
data.yaml의 잘못된 경로는 라벨을 생성하지 못하게 합니다. 학습 전yolo detect val model=yolo26n.pt data=custom.yaml을 실행하여 라벨이 올바르게 로드되는지 확인하십시오. - 낮은 신뢰도 임계값: 예측값이 존재하지만 필터링되는 경우, 추론 시
conf=0.1을 시도하십시오. - Verify class count: ensure
ncindata.yamlmatches the actual number of classes in the label files.
Link to this section검증 mAP가 조기에 정체됨#
- 데이터 추가: 파인튜닝은 추가 학습 데이터, 특히 다양한 각도, 조명, 배경을 포함하는 예제로부터 상당한 이점을 얻습니다.
- 클래스 균형 확인: 대표성이 낮은 클래스는 낮은 AP를 보입니다.
cls_pw를 사용하여 역 빈도 클래스 가중치를 적용하십시오(적당한 불균형은cls_pw=0.25부터 시작하고, 심각한 불균형은1.0까지 늘리십시오). - 데이터 증강 축소: 매우 작은 데이터셋의 경우, 과도한 증강은 도움이 되기보다 해가 될 수 있습니다.
mosaic=0.5또는mosaic=0.0을 시도하십시오. - 해상도 증가: 작은 객체가 있는 데이터셋의 경우 디테일을 보존하기 위해
imgsz=1280을 시도하십시오.
Link to this section파인튜닝 후 원래 클래스에 대한 성능 저하#
이를 치명적 망각(catastrophic forgetting)이라고 하며, 모델이 새로운 데이터로만 파인튜닝될 때 이전에 학습한 지식을 잃어버리는 현상입니다. 망각은 새로운 데이터와 함께 원래 데이터셋 이미지를 포함하지 않는 한 대부분 피할 수 없습니다. 이를 완화하려면:
- 데이터셋 병합: 파인튜닝 중에 새로운 클래스와 함께 원래 클래스의 예제를 포함하십시오. 이것이 망각을 방지하는 유일한 확실한 방법입니다.
- 백본 및 넥 고정: 백본과 넥을 모두 고정하여 탐지 헤드만 학습시키면 매우 낮은 학습률로 짧은 파인튜닝을 수행할 때 도움이 됩니다.
- 적은 에포크 학습: 새로운 데이터로만 오래 학습할수록 망각이 증가합니다.
Link to this sectionFAQ#
Link to this sectionYOLO를 파인튜닝하려면 몇 장의 이미지가 필요한가요?#
정해진 최소 수량은 없습니다. 결과는 작업의 복잡성, 클래스 수, 그리고 도메인이 COCO와 얼마나 유사한지에 따라 달라집니다. 양보다 더 다양한 이미지(다양한 조명, 각도, 배경)가 중요합니다. 현재 가지고 있는 데이터로 시작하여 검증 지표가 불충분할 경우 데이터를 늘리십시오.
Link to this section사용자 지정 데이터셋에서 어떻게 YOLO26을 파인튜닝하나요?#
Load a pretrained .pt file and call .train() with the path to a custom data.yaml. Ultralytics automatically handles weight transfer, detection head reinitialization, and optimizer selection. See the Basic Fine-Tuning section for the complete code example.
Link to this section파인튜닝된 YOLO 모델이 아무것도 감지하지 못하는 이유는 무엇인가요?#
가장 흔한 원인은 data.yaml의 잘못된 경로(라벨이 0으로 생성됨), YAML의 nc와 실제 라벨 파일 간의 불일치, 또는 너무 높은 신뢰도 임계값입니다. 전체 문제 해결 체크리스트는 흔한 문제점을 참조하십시오.
Link to this section파인튜닝을 위해 어떤 YOLO 레이어를 고정해야 하나요?#
데이터셋 크기와 도메인 유사성에 따라 다릅니다. COCO와 유사한 도메인의 작은 데이터셋이라면 백본 고정(freeze=10)을 통해 과적합을 방지하십시오. COCO와 매우 다른 도메인이라면 모든 레이어의 고정을 해제(freeze=None)하여 백본이 적응하도록 하십시오. 자세한 권장 사항은 레이어 프리징을 참조하십시오.
Link to this sectionYOLO를 새로운 클래스로 파인튜닝할 때 치명적 망각을 방지하려면 어떻게 해야 하나요?#
학습 데이터에 새로운 클래스와 함께 원래 클래스의 예제를 포함하십시오. 그것이 불가능하다면, 더 많은 레이어를 고정(freeze=10 이상)하고 더 낮은 학습률을 사용하면 사전 학습된 지식을 보존하는 데 도움이 됩니다. 자세한 내용은 원래 클래스에 대한 성능 저하를 참조하십시오.