Ultralytics YOLO27: 대기자 명단에 등록하세요.
Get Started
Detection을 넘어: Segment, Pose, OBB 및 Classify·분류하고, 결합하고, 배포하기·레슨 10/10
강의중급

모든 작업 평가 및 배포

각 작업을 배포 크기에서 자체 메트릭으로 평가하고, 하나의 루프에서 모든 작업을 검증한 다음, 검증된 예측 결과와 함께 모든 작업을 ONNX로 내보냅니다.

각 작업에는 정답의 고유한 정의가 있습니다. 픽셀 중첩, 키포인트 유사도, 회전 바운딩 박스 IoU, top-1 정답 또는 깊이 비율 등이 이에 해당합니다. 검출 체크리스트를 그대로 재사용하는 팀은 박스 mAP를 기준으로 세그멘테이션 모델을 통과시키거나, 제품에 사용하지 않는 박스를 기준으로 포즈 모델을 통과시킨 채 배포하게 됩니다. 또한 기준을 통과한 모델도 내보낸 후에는 실패할 수 있습니다. 이 강의에서는 동일한 포즈 가중치가 입력 크기에 따라 한 번은 사람 5명을, 다른 한 번은 3명을 찾고, 깊이 모델의 거리는 거의 두 배로 차이 납니다.

학습 성과

각 작업 모델의 기준 메트릭과 imgsz을 포함한 릴리스 표를 작성하고, 올바른 작업으로 다시 로드되며 해당 도메인의 이미지에서 올바르게 예측하는, 검증된 ONNX 내보내기를 각 모델에 대해 준비합니다.

속성 과정
이미 사용법을 알고 계신다면, 간단히 요약해 드리겠습니다.
  1. 세그먼트는 마스크 mAP50-95, 시맨틱은 mIoU, 포즈는 포즈 mAP50-95, OBB는 OBB mAP50-95, 분류는 top-1, 깊이는 δ1을 기준으로 평가합니다.

  2. 작업의 키를 지정해 metrics.results_dict에서 주요 수치를 확인하고, 모든 수치 옆에 imgsz을 기록합니다.

  3. 검증에 사용한 크기에서 model.export(format="onnx", imgsz=...)으로 내보냅니다.

  4. 내보낸 모델을 YOLO("model.onnx")으로 다시 로드하고, 배포 전에 모델 자체 도메인의 이미지로 한 번 예측합니다.

실습형

작업별 기준 하나#

작업평가 기준results_dict 키Python 속성평가 기준
세그먼트마스크 mAP50-95metrics/mAP50-95(M)metrics.seg.map인스턴스별 픽셀 IoU
시맨틱mIoU (+ 클래스별 IoU)metrics/mIoUmetrics.miou클래스별 픽셀 IoU
포즈포즈 mAP50-95metrics/mAP50-95(P)metrics.pose.mapOKS
obbOBB mAP50-95metrics/mAP50-95(B)metrics.box.map회전 바운딩 박스 IoU
분류top-1 정확도metrics/accuracy_top1metrics.top1올바른 상위 클래스
깊이δ1 (+ AbsRel)metrics/delta1metrics.delta1실제 깊이의 1.25배 이내에 있는 픽셀의 비율

성능 메트릭 가이드에서 각 점수를 설명합니다. 세그멘테이션 및 포즈 실행 결과에는 박스 메트릭도 포함됩니다. 진단용으로 유지하세요. 박스와 마스크 간의 차이는 윤곽 품질 문제를 나타냅니다. 하지만 박스가 제품 자체는 아닙니다. 임계값 스윕 및 혼동 행렬과 같은 검출 관련 분석은 검증 및 진단에서 다룬 내용을 그대로 활용할 수 있습니다.

하나의 루프에서 모든 작업 검증#

Val 모드는 작업에 맞는 데이터셋과 함께 모든 작업의 가중치를 받을 수 있으므로, 하나의 루프에서 릴리스 표에 필요한 수치를 생성할 수 있습니다:

from ultralytics import YOLO

runs = {
    "yolo26n-seg.pt": ("coco8-seg.yaml", "metrics/mAP50-95(M)"),
    "yolo26n-sem.pt": ("cityscapes8.yaml", "metrics/mIoU"),
    "yolo26n-pose.pt": ("coco8-pose.yaml", "metrics/mAP50-95(P)"),
    "yolo26n-obb.pt": ("dota8.yaml", "metrics/mAP50-95(B)"),
    "yolo26n-depth.pt": ("depth8.yaml", "metrics/delta1"),
}
for weights, (data, key) in runs.items():
    metrics = YOLO(weights).val(data=data, device="cpu", plots=False, verbose=False)
    print(f"{weights:17s} {key:22s} {metrics.results_dict[key]:.3f}")
yolo26n-seg.pt    metrics/mAP50-95(M)    0.538
yolo26n-sem.pt    metrics/mIoU           0.610
yolo26n-pose.pt   metrics/mAP50-95(P)    0.419
yolo26n-obb.pt    metrics/mAP50-95(B)    0.857
yolo26n-depth.pt  metrics/delta1         0.377

imgsz을 명시하지 않으면 각 모델은 학습에 사용된 크기에서 검증됩니다. 세그멘테이션과 포즈는 640, 깊이는 768, 시맨틱과 OBB는 1024입니다. 이 사전 학습 모델의 수치는 강의 앞부분의 320픽셀 학습 실행 결과보다 높습니다. 이는 학습과 해상도 양쪽의 영향입니다. 검증 이미지 4개만 사용하므로 여기의 모든 수치는 스모크 테스트에 불과합니다. 예를 들어 깊이 작업 페이지에는 전체 NYU 벤치마크의 δ1이 보고되어 있습니다. 분류는 의도적으로 제외했습니다. 분류기 강의에서처럼 미세 조정한 분류기를 자체 폴더로 검증하세요.

해상도는 지표의 일부입니다

같은 가중치라도 imgsz에 따라 점수가 달라집니다. 모든 수치 옆에 imgsz을 기록하고, 배포할 크기로 검증하며, 크기가 다른 조건에서 측정한 수치를 절대 비교하지 마세요.

모든 작업 내보내기#

각 작업은 동일한 내보내기 모드 호출을 사용해 ONNX로 내보냅니다. 작업은 모델 메타데이터에 저장되므로 YOLO("model.onnx")가 올바른 후처리를 적용합니다. 런타임 선택, 동등성 검사, TensorRT 또는 OpenVINO 튜닝은 ONNX로 내보내기(및 동등성 검증)에서 다룹니다. 이 루프에서는 모든 작업이 왕복 과정 이후에도 정상 작동하는지 확인합니다:

from ultralytics import YOLO

for weights in ["yolo26n-seg.pt", "yolo26n-sem.pt", "yolo26n-pose.pt", "yolo26n-obb.pt", "yolo26n-cls.pt", "yolo26n-depth.pt"]:
    onnx_path = YOLO(weights).export(format="onnx", imgsz=320)
    onnx_model = YOLO(onnx_path)  # task comes from the ONNX metadata
    result = onnx_model("https://ultralytics.com/images/bus.jpg", imgsz=320, verbose=False)[0]
    print(f"{onnx_model.task:9s} {result.verbose()}")
segment   4 persons, 1 bus,
semantic
pose      3 persons,
obb       (no detections),
classify  minibus 0.38, police_van 0.21, trolleybus 0.05, amphibian 0.05, bullet_train 0.03,
depth     depth 4.67-26.91m,

모든 내보내기 결과가 올바른 작업으로 다시 로드되었습니다. 세 가지 결과는 추가로 살펴볼 필요가 있습니다:

  • 포즈 모델은 320픽셀에서 사람 3명을 찾았습니다. 640픽셀 PyTorch 실행에서는 5명을 찾았습니다.
  • 깊이 모델은 장면을 4.7~26.9m로 읽었습니다. 동일한 가중치를 기본 크기인 768픽셀로 사용했을 때는 2.1~14.9m로 읽었습니다.
  • OBB 모델은 거리 사진에서 아무것도 찾지 못했습니다. 이는 항공 이미지용 모델의 올바른 동작이며, 내보내기 오류가 아닙니다.

imgsz=320에서 실행한 PyTorch는 ONNX와 동일한 포즈 및 깊이 수치를 내므로, 둘 다 내보내기 오류가 아닙니다. 입력 크기가 결과를 바꾼 것입니다. 검증한 imgsz에서 내보내세요. 시맨틱 결과에는 객체별 요약 행이 없으므로 대신 result.semantic_mask를 확인하세요.

각 내보내기 모델을 해당 도메인에서 스모크 테스트합니다

내보내기가 잘못됐다고 판단하거나 배포하기 전에 학습에 사용한 이미지와 유사한 이미지에서 각 내보내기 모델로 한 번씩 예측합니다. COCO 모델은 거리 장면, OBB는 항공 타일, 깊이 모델은 적절한 스케일의 실내 또는 거리 장면을 사용합니다.

직접 후처리를 작성한다면, 내보내기 로그에서 확인할 수 있는 imgsz=320의 원시 ONNX 출력은 다음과 같습니다:

작업ONNX 출력 형태내용
세그먼트(1, 116, 2100) 및 (1, 32, 80, 80)박스 + 클래스 점수 80개 + 마스크 계수 32개; 마스크 프로토타입
시맨틱(1, 320, 320)클래스 맵, argmax가 이미 그래프에 적용됨
포즈(1, 56, 2100)박스 + 점수 1개 + 키포인트 값 17 × 3개
obb(1, 20, 2100)박스 + 클래스 점수 15개 + 각도 1개
분류(1, 1000)클래스 확률
깊이(1, 1, 320, 320)픽셀별 깊이(미터)

Ultralytics Platform에서 모델 페이지에는 작업별 메트릭(세그멘테이션 모델의 마스크 mAP)이 표시되며, 그 아래의 Export 탭에서는 동일한 형식으로 내보낼 수 있습니다:

세그멘테이션 모델의 Ultralytics Platform 모델 페이지. 마스크 mAP50, mAP50-95, 정밀도 및 재현율 카드 아래에 TorchScript, ONNX, OpenVINO, TensorRT, CoreML이 나열된 Export 탭이 표시됩니다

ONNX는 교환 지점입니다. 내보낸 파일 하나로 ONNX Runtime에서 실행하거나 다른 런타임용으로 변환할 수 있습니다.

교환 형식으로서의 ONNX: PyTorch, TensorFlow, Keras 및 기타 프레임워크의 모델을 ONNX로 내보내고 ONNX Runtime 또는 다른 프레임워크에서 로드합니다

배포 체크리스트#

  • 위 표의 기준 메트릭이 홀드아웃 세트에서 배포 imgsz 기준 목표를 충족합니다.
  • 내보낸 모델을 예상한 task으로 다시 로드할 수 있으며, 고정 이미지 세트에서 PyTorch 예측 결과와 일치합니다.
  • 작업별 코드 경로가 빈 결과를 처리합니다: masks is None, 키포인트 0개, OBB 0개.
  • 관측 가능성 및 드리프트에 설명된 대로, 다운스트림 수치(면적, 각도, 거리, 클래스 확률)를 기록하여 변화를 추적할 수 있습니다.

기준을 충족하지 못했을 때 "데이터로 돌아가기"는 보통 다음 세 가지 조치 중 하나를 의미합니다:

mAP 개선을 위한 세 가지 방법: 데이터 품질, 모델 최적화, 어노테이션 프로세스

먼저 데이터 품질과 어노테이션 프로세스를 개선하세요. 2강과 6강의 레이블 검사가 가장 저렴하게 시작할 수 있는 방법입니다. 데이터가 깨끗해진 후에만 모델을 변경하세요.

사용해 보기

이 과정에서 학습한 작업 중 두 가지를 선택하세요. 각 작업에 대해 배포 imgsz에서 기준 메트릭을 포함하는 릴리스 표 행을 작성하고, 학습된 best.pt을 해당 크기의 ONNX로 내보낸 다음 다시 로드하여 도메인 내 이미지 한 장에서 타당한 예측을 하는지 확인하세요.

완료 조건
다음 조건을 모두 충족하면 레슨을 완료한 것입니다.
  • 릴리스 표에 두 모델의 올바른 기준 메트릭, 메트릭 값, imgsz이 기록되어 있습니다.

  • 두 모델 모두 ONNX로 내보내고 예상한 task으로 다시 로드했습니다.

  • 각 내보내기 결과가 자체 도메인의 이미지에서 타당한 예측을 생성했습니다.

정답 보기
from ultralytics import YOLO

checks = {
    "runs/segment/train/weights/best.pt": ("coco8-seg.yaml", "metrics/mAP50-95(M)", "https://ultralytics.com/images/bus.jpg"),
    "runs/obb/train/weights/best.pt": ("dota8.yaml", "metrics/mAP50-95(B)", "https://ultralytics.com/images/boats.jpg"),
}
for weights, (data, key, image) in checks.items():
    model = YOLO(weights)
    gate = model.val(data=data, imgsz=320, plots=False, verbose=False).results_dict[key]
    onnx_model = YOLO(model.export(format="onnx", imgsz=320))
    result = onnx_model(image, imgsz=320, verbose=False)[0]
    print(f"{onnx_model.task:8s} {key} @320 = {gate:.3f} | ONNX: {result.verbose()}")

runs/... 경로를 학습 실행에서 출력된 폴더(Results saved to ...)에 맞게 조정합니다. 2강과 7강의 1에폭 실행을 사용하면 다음과 같습니다:

segment  metrics/mAP50-95(M) @320 = 0.377 | ONNX: 4 persons, 1 bus,
obb      metrics/mAP50-95(B) @320 = 0.832 | ONNX: 185 ships, 3 harbors,
모델게이팅 지표값imgszONNX
세그먼트마스크 mAP50-950.377320segment으로 다시 로드되며 버스 1대와 사람 4명을 찾습니다
obbOBB mAP50-950.832320obb으로 다시 로드되며 선박 185척과 항구 3곳을 찾습니다

각 검사는 자체 도메인의 이미지를 사용합니다. OBB 모델에는 거리 장면이 아닌 항공 항구 사진을 사용합니다. 두 행 모두 내보내기 검사를 통과했지만, 두 모델 모두 배포 준비가 된 것은 아닙니다. 검증 이미지 4개로 1에폭만 학습한 결과는 스모크 테스트이지 기준 평가가 아니기 때문입니다.

다음 단계

수료증을 받으려면 과정 시험을 치른 다음, Ultralytics YOLO in Production 과정에서 최적화된 런타임, 추적 및 모니터링을 사용해 이 모델들을 배포하세요.