YOLO Vision 2026:

지식 증류#

빠른 시작#

distill_model 인수를 추가하여 더 큰 teacher model의 지도를 받는 더 작은 student model을 학습합니다:

예시
from ultralytics import YOLO

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

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

지식 증류는 크고 정확한 teacher model의 지식을 더 작은 student model로 전달합니다. student는 teacher의 내부 feature representation을 모방하도록 학습하며, 처음부터 학습하는 것보다 더 높은 정확도를 달성하는 경우가 많습니다.

지식 증류 워크플로 이미지

다음과 같은 경우 증류를 사용합니다:

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

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

성능#

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

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

baseline
mAPval
50-95

증류
mAPval
50-95 (e2e)

baseline
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)를 사용합니다. 자세한 내용은 End-to-End Detection을 참조하십시오.

필수 조건#

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

  • 학습된 teacher model: student와 동일한 YOLO 제품군의 .pt checkpoint입니다.
  • 일치하는 작업: student와 동일한 작업에 사용할 teacher를 선택하고 관련 데이터로 학습합니다.
  • GPU 리소스: 두 모델을 모두 저장할 수 있는 충분한 메모리가 필요합니다. teacher는 gradient나 optimizer state 없이 forward-only로 실행됩니다.

권장 모델 조합#

Student권장 Teacher
yolo26n.ptyolo26s.pt
yolo26s.ptyolo26m.pt
yolo26m.ptyolo26x.pt
yolo26l.ptyolo26x.pt

제품군 간 증류(예: YOLO11 teacher와 YOLO26 student)는 지원되지 않습니다.

주요 매개변수#

매개변수유형기본값설명
distill_modelstrNoneteacher model 파일의 경로입니다(예: yolo26x.pt). 설정하면 지식 증류가 활성화됩니다.
disfloat6.0증류 loss 가중치입니다. 증류 loss가 전체 학습 loss에 기여하는 정도를 제어합니다.

작동 방식#

  1. teacher modeleval 모드에서 frozen 상태로 유지되며 각 batch에 대해 추론을 실행합니다.
  2. student model은 표준 task loss와 증류 지도를 함께 사용하여 학습합니다.
  3. 세 개의 neck layer에서 두 모델의 feature를 추출하며, 이 layer들은 Detect 제품군 head에 입력됩니다.
  4. 두 개의 1×1 convolution과 ReLU로 구성된 projector가 각 student feature map을 teacher의 channel에 맞춥니다.
  5. score-weighted L2 loss는 projector를 거친 student feature와 teacher feature를 비교하며, teacher의 classification confidence를 가중치로 사용합니다.
  6. 증류 loss는 dis 가중치를 사용하여 표준 loss와 결합됩니다.
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 제품군 head에 입력되는 세 개의 neck layer에서 feature를 추출합니다. segment, pose, obb head는 동일한 Detect architecture를 상속하므로, 증류는 이러한 작업과도 기술적으로 호환됩니다.

Classification, semantic segmentation, depth estimation, RT-DETR은 호환되는 Detect 제품군 head를 사용하지 않으므로 지원되지 않습니다.

경고

실험적으로 벤치마크하고 검증한 작업은 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

# Load a student model
student = YOLO("yolo26m.pt")

# Train with knowledge distillation from a larger teacher model
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26x.pt")

증류 Loss 가중치 조정#

dis 매개변수(기본값: 6.0)는 증류 loss의 기여도를 제어합니다:

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

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

증류 학습 재개#

증류 학습은 checkpoint에서 재개하는 기능을 지원합니다. teacher model은 checkpoint에 기록된 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

export된 모델에는 student weight만 포함되므로 파일 크기와 추론 속도는 일반적으로 학습한 student model과 동일합니다.

FAQ#

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

  • 예. teacher는 각 batch마다 forward pass를 추가하므로 시간 및 메모리 오버헤드는 teacher/student 조합에 따라 달라집니다. teacher는 gradient나 optimizer state 없이 eval 모드로 실행됩니다.

  • 지식 증류는 Detect 제품군 head에 입력되는 세 개의 neck layer에서 feature를 증류하므로 detect, segment, pose, obb 작업에서 작동합니다. Classify, semantic, depth, RT-DETR은 지원되지 않습니다.

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

    teacher와 student는 동일한 YOLO 제품군(예: YOLOv8, YOLO11 또는 YOLO26)에 속해야 합니다. 제품군 간 증류(예: YOLO11 teacher와 YOLO26 student)는 지원되지 않습니다.

댓글