Ultralytics YOLO27:

지식 증류#

빠른 시작#

distill_model 인수를 추가해 더 큰 교사 모델의 안내를 받아 더 작은 학생 모델을 학습시키세요.

예제
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")

지식 증류란 무엇인가요?#

지식 증류는 크고 정확한 교사 모델의 지식을 더 작은 학생 모델로 전달합니다. 학생 모델은 교사 모델의 내부 특성 표현을 모방하도록 학습하며, 처음부터 학습하는 것보다 더 높은 정확도를 얻는 경우가 많습니다.

지식 증류 워크플로 이미지

다음과 같은 경우 증류를 사용하세요.

  • 배포를 위해 더 작고 빠른 모델이 필요한 경우
  • 동일한 데이터로 학습한 고정확도 교사 모델이 있는 경우
  • 표준 학습보다 더 높은 정확도를 원하는 경우
참고

지식 증류는 detect, segment, pose, obb 작업에 구현되어 있습니다. 현재 정확도 향상 여부가 실험적으로 검증된 작업은 detect뿐입니다.

성능#

지식 증류를 적용하면 COCO의 전체 YOLO26 제품군에서 학생 모델의 mAP가 향상되며, 추론 비용은 추가되지 않습니다. 아래 표에서는 표준 YOLO26 모델(기준선)과 권장 교사 모델을 사용해 증류 학습한 동일 모델을 비교합니다.

모델크기
(픽셀)
mAPval
50-95

기준선
mAPval
50-95

증류 적용
mAPval
50-95 (e2e)

기준선
mAPval
50-95 (e2e)

증류 적용
YOLO26n-distill64040.941.540.140.9
YOLO26s-distill64048.649.247.848.6
YOLO26m-distill64053.153.952.553.3
YOLO26l-distill64055.056.054.455.5
YOLO26x-distill64057.557.956.957.4
  • mAPval 값은 COCO val2017 데이터셋에서 단일 모델, 단일 스케일로 측정한 결과입니다.
    yolo val detect model=yolo26n-distill.pt data=coco.yaml device=0로 증류 행을 재현하고, e2e 열을 확인하려면 nms=False를 추가하세요.
  • e2e 값은 NMS가 없는 추론 경로(nms=False)를 사용하며, e2e가 아닌 값은 기본 NMS 후처리(nms=None)를 사용합니다. 자세한 내용은 종단 간 탐지를 참조하세요.

사전 요구 사항#

시작하기 전에 다음 요구 사항을 충족하는지 확인하세요.

  • 학습된 교사 모델: 학생 모델과 동일한 YOLO 제품군의 .pt 체크포인트입니다.
  • 동일한 작업: 학생 모델과 같은 작업을 수행하고 관련 데이터로 학습한 교사 모델을 사용하세요.
  • GPU 리소스: 두 모델을 모두 메모리에 올릴 수 있어야 합니다. 교사 모델은 그래디언트나 옵티마이저 상태 없이 순전파만 실행합니다.
학생 모델권장 교사 모델
yolo26n.ptyolo26s.pt
yolo26s.ptyolo26m.pt
yolo26m.ptyolo26x.pt
yolo26l.ptyolo26x.pt

제품군 간 증류(예: YOLO11 교사 모델과 YOLO26 학생 모델)는 지원되지 않습니다.

주요 매개변수#

매개변수유형기본값설명
distill_modelstrNone교사 모델 파일의 경로입니다(예: yolo26x.pt). 이 값을 설정하면 지식 증류가 활성화됩니다.
disfloat6.0증류 손실 가중치입니다. 증류 손실이 전체 학습 손실에 반영되는 정도를 제어합니다.

작동 방식#

  1. 교사 모델은 eval 모드에서 고정된 상태를 유지하며 각 배치에 대해 추론을 실행합니다.
  2. 학생 모델은 표준 작업 손실과 증류 안내를 함께 사용해 학습됩니다.
  3. Detect 계열 헤드에 입력되는 세 개의 넥 레이어에서 두 모델의 특성을 추출합니다.
  4. 두 개의 1×1 컨볼루션과 ReLU로 구성된 프로젝터가 각 학생 특성 맵의 채널을 교사 모델에 맞춥니다.
  5. 점수 가중 L2 손실은 프로젝터를 거친 학생 특성과 교사 특성을 비교하며, 교사 모델의 분류 신뢰도를 가중치로 사용합니다.
  6. 증류 손실은 dis 가중치를 사용해 표준 손실과 결합됩니다.
flowchart TD
    A[Input Image Batch]:::start --> T[Teacher Model<br/>frozen, eval mode]:::extern
    A --> S[Student Model<br/>trainable]:::proc

    T --> |Detect head inputs| TF[Teacher Features]:::extern
    S --> |Detect head inputs| SF[Student Features]:::proc

    SF --> P[1×1 Conv Projector<br/>with ReLU]:::decide
    P --> AF[Aligned Student Features]:::proc

    TF --> SW[Score-weighted L2 Loss]:::proc
    AF --> SW

    S --> D[Detection Head]:::proc
    D --> DL[box_loss + cls_loss + l1_loss]:::proc

    SW --> |× dis| DIS[distillation loss]:::proc
    DL --> TOTAL[Total Loss]:::out
    DIS --> TOTAL

    TOTAL --> BP[Backpropagate<br/>Student + Projector only]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef extern fill:#607D8B,color:#fff

작업 지원#

증류 구현은 모델의 Detect 계열 헤드에 입력되는 세 개의 넥 레이어에서 특성을 추출합니다. segment, pose, obb 헤드는 동일한 Detect 아키텍처를 상속하므로, 증류는 이러한 작업과도 기술적으로 호환됩니다.

분류, 시맨틱 분할, 깊이 추정, RT-DETR은 호환되는 Detect 계열 헤드를 사용하지 않으므로 지원되지 않습니다.

경고

실험적으로 벤치마크하고 검증한 작업은 detect뿐입니다. segment, pose, obb에 증류를 실행할 수 있지만, 해당 작업의 정확도 향상은 아직 검증되지 않았습니다.

다른 작업에 대한 지식 증류
from ultralytics import YOLO

# Segment
model = YOLO("yolo26n-seg.pt")
model.train(data="coco8-seg.yaml", epochs=100, distill_model="yolo26s-seg.pt")

# Pose
model = YOLO("yolo26n-pose.pt")
model.train(data="coco8-pose.yaml", epochs=100, distill_model="yolo26s-pose.pt")

# OBB
model = YOLO("yolo26n-obb.pt")
model.train(data="dota8.yaml", epochs=100, distill_model="yolo26s-obb.pt")

학습#

기본 학습#

증류를 사용한 학습은 표준 학습과 동일합니다. 증류를 활성화하려면 distill_model 경로를 지정하세요.

지식 증류 학습
from ultralytics import YOLO

# 학생 모델 불러오기
student = YOLO("yolo26m.pt")

# 더 큰 교사 모델의 지식을 증류하며 학습하기
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26x.pt")

증류 손실 가중치 조정#

dis 매개변수(기본값: 6.0)는 증류 손실이 기여하는 정도를 제어합니다.

사용자 지정 증류 가중치
from ultralytics import YOLO

student = YOLO("yolo26n.pt")
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt", dis=10.0)

증류 학습 재개#

증류 학습은 체크포인트에서 이어서 학습할 수 있습니다. 체크포인트에 기록된 distill_model 경로를 사용해 교사 모델을 자동으로 다시 구성합니다.

증류 학습 재개
from ultralytics import YOLO

student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)

학습 출력#

증류를 활성화하면 학습 로그에 dis_loss 열이 추가됩니다.

      Epoch    GPU_mem   box_loss   cls_loss    l1_loss   dis_loss  Instances       Size
      1/80      46.2G      1.566      5.404    0.003249      6.658        231        640

내보낸 모델에는 학생 모델의 가중치만 포함되므로, 파일 크기와 추론 속도는 일반적으로 학습한 학생 모델과 동일합니다.

자주 묻는 질문#

    • 교사 모델과 학생 모델이 동일한 YOLO 세대인지 확인하세요.
    • distill_model 경로가 올바르고 파일을 불러올 수 있는지 확인하세요.
    • 손실 값이 매우 작으면 dis을 늘려 보세요.
    • 교사 모델이 동일한 데이터셋으로 학습되었는지 확인하세요.
  • distill_model 매개변수만 추가하면 됩니다. 나머지는 모두 동일하게 작동합니다. 학습 중 추가 증류 손실이 계산되지만, 저장된 모델은 오버헤드가 없는 표준 YOLO 모델입니다.

  • 예. 교사 모델이 각 배치마다 순전파를 추가로 수행하므로 시간 및 메모리 오버헤드는 교사 모델과 학생 모델의 조합에 따라 달라집니다. 교사 모델은 그래디언트나 옵티마이저 상태 없이 eval 모드로 실행됩니다.

  • 지식 증류는 Detect 계열 헤드에 입력되는 세 개의 넥 레이어에서 특성을 증류하므로 detect, segment, pose, obb 작업에서 작동합니다. classify, semantic, depth, RT-DETR은 지원되지 않습니다.

    정확도 개선이 실험적으로 검증된 작업은 detect뿐입니다. segment, pose, obb는 기술적으로 호환되지만 아직 벤치마크되지 않았습니다.

    teacher와 student는 동일한 YOLO 계열에 속해야 합니다(예: YOLOv8, YOLO11 또는 YOLO26). 계열 간 distillation(예: YOLO11 teacher와 YOLO26 student 조합)은 지원되지 않습니다.

댓글