Ultralytics YOLO를 사용한 모델 내보내기#
소개#
모델 학습의 궁극적인 목표는 실제 애플리케이션에 모델을 배포하는 것입니다. Ultralytics YOLO26의 내보내기 모드는 학습된 모델을 다양한 형식으로 내보낼 수 있는 폭넓은 옵션을 제공하여 여러 플랫폼과 디바이스에 배포할 수 있도록 합니다. 이 종합 가이드에서는 모델 내보내기의 세부 사항을 살펴보고 호환성과 성능을 극대화하는 방법을 설명합니다.
예정된 내보내기 지원에 대해서는 미공개 YOLO27 프리뷰를 참조하세요.
시청: 배포를 위해 다양한 형식으로 Ultralytics YOLO26 내보내기 | ONNX, TensorRT, CoreML 🚀
YOLO26의 내보내기 모드를 선택해야 하는 이유#
- 다용성: ONNX, TensorRT, CoreML 등 다양한 형식으로 내보낼 수 있습니다.
- 성능: TensorRT를 사용하면 GPU 속도를 최대 5배 높이고, ONNX 또는 OpenVINO를 사용하면 CPU 속도를 3배 높일 수 있습니다.
- 호환성: 다양한 하드웨어 및 소프트웨어 환경에 모델을 범용적으로 배포할 수 있습니다.
- 간편한 사용: 모델을 빠르고 간편하게 내보낼 수 있는 CLI 및 Python API를 제공합니다.
사용 예시#
YOLO26n 모델을 ONNX 또는 TensorRT와 같은 다른 형식으로 내보냅니다. 내보내기 인수 전체 목록은 아래 인수 섹션을 참조하세요.
from ultralytics import YOLO
# 모델 로드
model = YOLO("yolo26n.pt") # 공식 모델을 불러옵니다
model = YOLO("path/to/best.pt") # 사용자 지정 학습 모델을 불러옵니다
# 모델을 내보냅니다
model.export(format="onnx")인수#
이 표에는 YOLO 모델을 다양한 형식으로 내보낼 때 사용할 수 있는 구성과 옵션이 자세히 나와 있습니다. 이러한 설정은 여러 플랫폼 및 환경에서 내보낸 모델의 성능, 크기, 호환성을 최적화하는 데 중요합니다. 올바르게 구성하면 모델을 대상 애플리케이션에 맞춰 최적의 효율로 배포할 수 있습니다.
| 인수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
format | str | 'torchscript' | 내보낸 모델의 대상 형식입니다. 'onnx', 'torchscript', 'engine'(TensorRT) 등이 있습니다. 형식마다 서로 다른 배포 환경과의 호환성을 제공합니다. |
name | str | None | 지원이 필요한 형식의 하드웨어 타깃 이름: Hailo 아키텍처('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; 기본값은 'hailo8l'), Rockchip RKNN 칩(기본값은 'rk3588'), Huawei Ascend SoC(CANN --soc_version; 기본값은 'Ascend310B4'), Qualcomm QNN HTP 타깃(기본값은 '73'), 또는 AMD Xilinx Versal AI Edge Series Gen 2 디바이스(기본값은 've2-xc2ve3858', VEK385 평가 키트)입니다. 다른 모드에서 사용하는 project/name 실행 이름 쌍과는 별개입니다. |
imgsz | int 또는 tuple | 640 | 모델 입력에 사용할 이미지 크기입니다. 정사각형 이미지의 경우 정수(예: 640×640을 나타내는 640)를 사용하거나, 특정 크기의 경우 튜플 (height, width)을 사용할 수 있습니다. 지정하지 않으면 내보내기에 로드된 체크포인트에 기록된 학습 크기를 재사용합니다. 공식 YOLO26 체크포인트는 depth의 경우 768, classify의 경우 224, OBB의 경우 1024, 그 외 작업의 경우 640를 기록하며, 파인튜닝된 모델은 학습에 사용한 imgsz을 기록합니다. YAML에서 생성한 모델에는 기록된 학습 크기가 없으므로 640을 사용합니다. |
optimize | bool | False | DEEPX의 컴파일러 최적화 수준을 높여 컴파일 시간을 늘리는 대신 추론 지연 시간을 줄입니다. |
quantize | int 또는 str | None | 양자화 정밀도: 16 (FP16, 모델 크기를 줄이고 지원되는 하드웨어에서 추론 속도를 높일 수 있습니다) 또는 8 (INT8/PTQ, 정확도 손실을 최소화하면서 모델을 추가로 압축하며, 주로 엣지 디바이스에 사용되고 캘리브레이션에는 data/fraction 옵션이 필요합니다); 32/미설정은 FP32입니다. quantize=8로 학습된 체크포인트는 항상 INT8로 내보냅니다: onnx 및 engine는 캘리브레이션 없이 체크포인트가 보유한 범위를 사용해 내보내며, 다른 형식이나 정밀도는 거부됩니다. 'w8a8' 및 'w16a16'은 8 및 16의 별칭이며, 혼합 정밀도인 'w8a16'(16비트 활성화를 사용하는 INT8 가중치: CoreML, LiteRT, QNN)와 'w8a32'(동적 INT8: LiteRT)는 해당 형식에서만 허용됩니다. 더 이상 권장되지 않는 half/int8 플래그를 대체합니다 (half=True → 16, int8=True → 8; 기존 플래그는 사용 중단 경고와 함께 계속 허용됩니다). 대상 형식에서 지원하는 정밀도만 허용됩니다(아래를 참조하시기 바랍니다). |
dynamic | bool | False | TorchScript, ONNX, OpenVINO, TensorRT, CoreML 및 MNN 내보내기에서 동적 입력 크기를 허용하여 다양한 이미지 크기를 유연하게 처리할 수 있습니다. |
simplify | bool | True | 내보내기 형식을 참고하세요. ONNX 그래프를 생성하는 내보내기의 중간 ONNX 그래프를 onnxslim으로 단순화하여 추론 엔진의 성능과 호환성을 높일 수 있습니다. |
opset | int | None | ONNX 그래프를 생성하는 내보내기의 ONNX opset 버전을 지정합니다(내보내기 형식 참조). 다양한 ONNX 파서 및 런타임과의 호환성을 위한 설정입니다. 지정하지 않으면 지원되는 최신 버전을 사용합니다. |
workspace | float 또는 None | None | 메모리 사용량과 성능의 균형을 맞추기 위해 TensorRT 최적화에 사용할 최대 워크스페이스 크기를 GiB 단위로 설정합니다. 장치의 최대값까지 TensorRT가 자동으로 할당하도록 하려면 None을 사용하세요. |
nms | bool, 선택 사항 | None | None은 외부 NMS를 위한 원시 일대다 예측을 내보내고, True은 지원되는 경우 NMS를 내장하며, False는 사용 가능한 경우 NMS가 없는 헤드를 선택합니다. CoreML 내장 NMS는 고정된 형태의 detect, segment 및 pose를 지원합니다. 자세한 내용은 엔드투엔드 감지 가이드를 참조하세요. |
conf | float | None | 내보내기 시 NMS를 생성하는 다음 항목에서 사용하는 신뢰도 임계값입니다. nms=True 내보내기, Hailo의 비엔드투엔드 detect 내보내기, 내부적으로 nms=True을 강제하는 IMX의 detect, pose 및 segment 내보내기입니다. 설정하지 않은 경우 기본값은 0.25입니다. |
iou | float | 0.7 | 내보내기 시 NMS를 생성하는 다음 항목에서 사용하는 IoU 임계값입니다. nms=True 내보내기, Hailo의 비엔드투엔드 detect 내보내기, 내부적으로 nms=True를 강제하는 IMX의 detect, pose 및 segment 내보내기입니다. |
max_det | int | 300 | 내보낸 모델 출력에서 유지할 최대 감지 수입니다. CoreML 감지의 기본 NMS 파이프라인에는 감지 수 제한이 없으므로 이를 제외한 모든 형식의 nms=True 내보내기에 적용됩니다. 또한 NMS가 없는 엔드투엔드 감지 내보내기(YOLO26, YOLOv10, 사용 가능한 앵커 수로 제한됨)와 IMX의 detect, pose 및 segment 내보내기에도 적용됩니다. |
agnostic_nms | bool | False | 표준 nms=True 파이프라인을 통해 내보내기 시 NMS를 생성하는 모든 경우에 클래스 구분 없는 NMS를 활성화합니다. 여기에는 CoreML 자체 NMS 단계도 포함되며, 같은 클래스 내에서만 억제하는 대신 서로 다른 클래스에 걸친 겹치는 상자 중 점수가 낮은 상자를 억제합니다. 자체 NMS 구성을 생성하는 Hailo 또는 IMX에는 적용되지 않습니다. 해당 구성에는 클래스 구분 옵션이 없으므로 이 플래그와 관계없이 클래스 구분을 유지합니다. NMS가 없는 엔드투엔드 내보내기(YOLO26, YOLOv10)에도 적용됩니다. 이 경우 IoU 임계값에 따른 서로 다른 상자 간 억제가 아니라 동일한 감지가 여러 클래스 레이블로 나타나는 것(IoU=1.0 중복)만 방지합니다. |
batch | int | 1 | 내보낸 모델의 배치 추론 크기 또는 predict 모드에서 내보낸 모델이 동시에 처리할 최대 이미지 수를 지정합니다. 내보내기 인수에 batch이 없는 형식(Edge TPU, IMX500, DEEPX, Hailo, AMD Xilinx)은 배치 크기 1로 내보내며 다른 값은 거부합니다. |
device | str | None | 내보내기에 사용할 장치를 지정합니다. GPU(device=0), CPU(device=cpu), Apple silicon용 MPS(device=mps), Huawei Ascend NPU(device=npu 또는 device=npu:0), NVIDIA Jetson용 DLA(device=dla:0 또는 device=dla:1) 중에서 선택합니다. TensorRT 내보내기는 GPU를 자동으로 사용하지만 TensorRT 11.0은 DLA를 지원하지 않습니다. |
verbose | bool | False | format='engine' 내보내기 중 TensorRT 빌더 로그의 심각도 수준을 VERBOSE로 높입니다. 다른 내보내기 형식에서는 무시됩니다. |
data | str | None | INT8 양자화 보정에 필요한 데이터셋 YAML 경로입니다. 분류 작업에서는 데이터셋 디렉터리 또는 기본 제공 데이터셋 이름을 사용합니다. INT8이 활성화된 상태에서 지정하지 않으면 Ultralytics는 필요한 경우 작업별 보정 데이터셋을 선택하고, 그렇지 않으면 해당 모델 작업의 기본 데이터셋을 사용합니다. quantize=8로 학습된 체크포인트에는 자체 INT8 범위가 포함되어 있으므로 보정 데이터가 필요하지 않습니다. |
split | str | 'val' | data에서 INT8 양자화 보정 데이터 로더를 생성할 때 사용할 데이터셋 분할('train', 'val' 또는 'test')입니다. |
fraction | float, int 또는 list | 1.0 | INT8 보정에 사용할 데이터셋 하위 집합입니다. 비율, 이미지 수 또는 [train, val, test] 값을 지정할 수 있습니다. 1은 전체 분할을 의미하고, 1보다 큰 정수는 이미지 수를 의미합니다. 선택적 test 항목에서만 0/0.0를 지정해 없음을 나타낼 수 있습니다. 두 항목으로 이루어진 목록에서는 test가 전체로 유지됩니다. |
이러한 매개변수를 조정하면 배포 환경, 하드웨어 제약, 성능 목표 등 특정 요구사항에 맞게 내보내기 프로세스를 사용자 지정할 수 있습니다. 모델 크기, 속도, 정확도 간의 최적 균형을 이루려면 적절한 형식과 설정을 선택해야 합니다.
내보내기 형식#
사용 가능한 YOLO26 내보내기 형식은 아래 표에 나와 있습니다. format 인수를 사용해 원하는 형식으로 내보낼 수 있습니다(예: format='onnx' 또는 format='engine'). 내보낸 모델에서 바로 예측을 실행하거나 검증할 수도 있습니다(예: yolo predict model=yolo26n.onnx). 내보내기가 완료되면 해당 모델의 사용 예제가 표시됩니다. 로컬 환경을 설정하지 않고 Ultralytics Platform 브라우저에서 바로 모델을 내보낼 수도 있습니다.
| 형식 | format 인수 | 모델 | 메타데이터 | 인수 |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None은 외부 NMS를 위한 원시 출력을 기본값으로 사용합니다. 사용 가능한 NMS-free head를 선택하려면 nms=False을 설정합니다. 지원되지 않는 형식은 해당 형식의 기본 출력 경로로 대체됩니다. 위의 nms 항목은 nms=True을 사용해 NMS를 포함할 수 있는 형식을 나타냅니다.
대부분의 형식에는 ultralytics과 함께 설치되지 않는 패키지가 필요합니다. 필요한 패키지가 없으면 내보내기 과정에서 런타임에 uv 또는 pip를 사용해 설치하며, Linux에서는 IMX용 Java와 같은 시스템 패키지를 위해 apt도 사용합니다. Edge TPU 컴파일러는 apt 또는 sudo 없이 다운로드됩니다. 예를 들어 컨테이너 이미지, CI 작업, 프로덕션 서비스에서 환경을 변경되지 않도록 유지하려면 YOLO_AUTOINSTALL=False을 설정하세요. 그러면 내보내기 과정에서 누락된 패키지를 계속 확인하고 보고하지만 환경은 변경하지 않으며, 패키지가 설치될 때까지 실패합니다.
export YOLO_AUTOINSTALL=False양자화 옵션#
내보내기 정밀도를 지정하려면 quantize 인수를 사용합니다. 문자열 값은 대소문자를 구분하지 않으며, Ultralytics는 내보내기 전에 허용된 별칭을 표준 형식으로 변환합니다:
| 요청 값 | 표준 값 | 의미 |
|---|---|---|
8, "8", "int8", "w8a8" | 8 | INT8 가중치 및 활성화값 |
16, "16", "fp16", "w16a16" | 16 | FP16 가중치 및 활성화값 |
32, "32", "fp32", "w32a32" | 32 | FP32로 내보내며, 설정하지 않은 경우와 동일합니다. 단, CoreML NMS ML Programs는 기본적으로 FP16을 사용합니다. |
"w8a16" | "w8a16" | INT8 가중치와 16비트 활성화값(FP16, LiteRT에서는 INT16) |
"w8a32" | "w8a32" | INT8 가중치와 FP32 활성화값(LiteRT 동적 INT8, 보정 불필요) |
기존 half=True 및 int8=True 플래그는 지원 중단 경고와 함께 계속 허용되며, 각각 quantize=16 및 quantize=8으로 전달됩니다.
모든 내보내기 형식이 모든 정밀도를 지원하는 것은 아닙니다. 명시적인 quantize 요청은 해당 정밀도로 내보내거나 내보내기 전에 실패합니다:
| 형식 | FP32 (32/미설정) | FP16 (16) | INT8 (8) | W8A16 ("w8a16") | 참고 |
|---|---|---|---|---|---|
| PyTorch | ✅ | 해당 없음 | 해당 없음 | 해당 없음 | 기본 학습/체크포인트 형식입니다. |
| TorchScript | ✅ | ✅ GPU 전용 | ❌ | ❌ | FP16 TorchScript 내보내기에는 device=0이 필요하며, CPU 내보내기는 FP32입니다. |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8은 ONNX Runtime 정적 양자화와 보정 데이터를 사용합니다. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8은 NNCF 학습 후 양자화를 사용합니다. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8에는 대표성 있는 보정 데이터가 필요합니다. |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | CoreML INT8은 가중치 양자화이며, W8A16은 INT8 가중치와 FP16 활성화값을 사용합니다. ¹NMS ML Programs를 설정하지 않으면 기본값은 FP16이며, 세그먼트/포즈 nms=True 내보내기는 항상 FP16입니다. |
| Core AI | ✅ | ✅ | ❌ | ❌ | 기본값은 FP32이며, quantize=16을 사용하면 .aimodel FP16 에셋을 사용할 수 있습니다. INT8 경로는 없습니다. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | INT8 내보내기에는 TensorFlow 보정을 사용합니다. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | 내보내기 시 정밀도 변환을 수행하지 않습니다. |
| Edge TPU | ❌ | ❌ | ✅ 자동 | ❌ | Edge TPU에는 INT8이 필요하며, 설정하지 않으면 자동으로 활성화됩니다. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | 정적 INT8(8)과 "w8a16"(int8 가중치 + int16 활성화값)은 보정 데이터를 사용합니다. 또한 "w8a32" 동적 INT8도 지원하며, 보정이 필요하지 않습니다. quantize=16은 별도의 내보내기 형식이 아닙니다. FP32 모델은 GPU delegate를 통해 런타임에 FP16으로 실행됩니다. |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | 내보내기 시 정밀도 변환을 수행하지 않습니다. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8은 MNN 변환을 통한 가중치 양자화입니다. |
| NCNN | ✅ | ✅ | ❌ | ❌ | 모바일/임베디드 런타임 형식입니다. |
| IMX500 | ❌ | ❌ | ✅ 자동 | ❌ | IMX500에는 양자화가 필요하며, 설정하지 않으면 INT8이 자동으로 활성화됩니다. |
| RKNN | ❌ | ✅ 칩에 따라 다름 | ✅ | ❌ | RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B는 FP16 또는 INT8을 지원하며, RV1103/RV1106 변형은 INT8만 지원합니다. |
| ExecuTorch | ✅ | ❌ | ❌ | ❌ | 내보내기 시 정밀도 변환을 수행하지 않습니다. |
| Axelera | ❌ | ❌ | ✅ 자동 | ❌ | Axelera 내보내기에는 INT8이 필요하며, 설정하지 않으면 자동으로 활성화됩니다. |
| DEEPX | ❌ | ❌ | ✅ 자동 | ❌ | DEEPX 내보내기에는 INT8이 필요하며, 설정하지 않으면 자동으로 활성화됩니다. |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ 자동 | QNN HTP 내보내기는 16비트 활성화값을 사용하는 INT8 가중치로 고정됩니다. |
| Hailo | ❌ | ❌ | ✅ 자동 | ❌ | Hailo 내보내기에는 INT8이 필요하며, 설정하지 않으면 자동으로 활성화됩니다. |
| Huawei Ascend | ❌ | ✅ 자동 | ❌ | ❌ | Ascend AI Core 컨볼루션은 FP16/INT8 입력만 허용하므로 ATC는 FP16으로 컴파일합니다. 설정하지 않으면 자동으로 활성화됩니다. |
| AMD Xilinx | ❌ | ❌ | ✅ 자동 | ❌ | AMD Xilinx 내보내기에는 Vitis AI INT8(VINT8)이 필요하며, 설정되지 않은 경우 자동으로 활성화됩니다. |
INT8 및 W8A16 내보내기의 경우, 대상 통합에서 기본값 또는 자동 활성화 동작을 문서화하지 않은 한 data을 사용해 대표성 있는 보정 데이터를 제공하세요(예: data="coco8.yaml"). LiteRT "w8a32"(동적 INT8) 방식에는 보정 데이터가 필요하지 않습니다.
양자화 인식 학습#
위의 INT8 내보내기는 학습 후 양자화(PTQ)입니다. data에 대해 한 번의 보정 과정으로 범위를 측정합니다. 반면 양자화 인식 학습(QAT)은 가짜 양자화를 학습 과정에 포함해 미세 조정함으로써 INT8을 견딜 수 있는 가중치를 학습하며, 보정만으로 잃는 정확도를 회복합니다. 사전 학습된 체크포인트를 미세 조정하려면 train에 quantize=8을 전달한 다음, 평소처럼 내보내세요:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco.yaml",
quantize=8,
epochs=5,
batch=64,
optimizer="AdamW",
lr0=0.00001,
lrf=0.1,
warmup_epochs=0.5,
cos_lr=True,
mosaic=0.0,
)
model.export(format="engine", quantize=8) # 범위는 체크포인트에 포함되므로 보정 데이터가 필요하지 않습니다사전 학습된 체크포인트를 미세 조정할 때는 학습률을 낮게 설정하세요. QAT는 처음에 정확도를 낮출 수 있으며, 학습 후 양자화 대비 효과는 모델, 데이터셋, 학습 예산에 따라 달라집니다. 내보낸 모델을 원본 체크포인트 및 학습 후 양자화된 내보내기 결과와 모두 비교해 검증하세요. 학습 중 가짜 양자화로 측정한 점수만으로는 배포 정확도를 확인할 수 없습니다.
QAT의 효과는 내보내기 백엔드 자체의 보정이 모델을 얼마나 잘 처리하는지에 따라 달라집니다. 아래 값은 COCO val2017에서 측정한 mAP50-95입니다. TensorRT 10.16 엔진의 imgsz=640 및 배치 크기 1을 사용했으며, 각 QAT 체크포인트는 epochs=20 patience=3로 학습했습니다:
| 모델 | FP32 엔진 | PTQ INT8 엔진 | QAT INT8 엔진 |
|---|---|---|---|
yolo26n | 0.4032 | 0.3934 | 0.3935 |
yolo26s | 0.4794 | 0.4412 | 0.4711 |
yolo26m | 0.5269 | 0.4696 | 0.5137 |
yolo26l | 0.5440 | 0.4889 | 0.5307 |
yolo26x | 0.5701 | 0.5138 | 0.5527 |
전체 모델 크기 범위에서 QAT는 FP32 대비 mAP50-95가 0.008~0.017 감소하는 반면, 학습 후 양자화는 yolo26n에서 0.010, 더 큰 모델에서 0.038~0.057 감소합니다. 따라서 보정이 이미 잘 작동하는 가장 작은 모델에서는 QAT의 이점이 거의 없으며, 나머지 모델에서는 0.030~0.044의 이점을 제공합니다. 다른 데이터셋, 내보내기 형식 또는 TensorRT 버전에서는 결과가 달라질 수 있으므로 직접 측정하세요.
QAT 모델에는 compile=False이 필요합니다. ModelOpt의 양자화 모듈은 torch.compile을 지원하지 않습니다.
헤드의 마지막 출력 컨볼루션은 INT8 정확도 저하를 줄이기 위해 의도적으로 부동소수점으로 유지합니다. TensorRT는 양자화되지 않은 레이어에 FP16 혼합 정밀도를 사용합니다. QAT는 NVIDIA TensorRT Model Optimizer를 통해 실행되며, 이 도구는 처음 사용할 때 자동으로 설치됩니다. 결과 체크포인트를 로드하려면 해당 도구가 설치되어 있어야 합니다. 범위는 체크포인트에 포함되며, onnx 및 engine 내보내기는 범위를 Q/DQ 노드로 출력합니다. 다른 형식은 대신 보정 데이터를 사용하며 QAT 체크포인트를 거부합니다.
다음 단계#
내보낸 모델의 실행 방법은 배포 대상의 통합 가이드를 참조하세요. ONNX, TensorRT, CoreML 등의 가이드는 전체 통합 목록에서 확인할 수 있습니다.
자주 묻는 질문#
Ultralytics를 사용하면 YOLO26 모델을 ONNX 형식으로 간편하게 내보낼 수 있습니다. 모델 내보내기에는 Python 및 CLI 방법을 모두 사용할 수 있습니다.
예제from ultralytics import YOLO # 모델 로드 model = YOLO("yolo26n.pt") # 공식 모델을 불러옵니다 model = YOLO("path/to/best.pt") # 사용자 지정 학습 모델을 불러옵니다 # 모델을 내보냅니다 model.export(format="onnx")다양한 입력 크기 처리와 같은 고급 옵션을 포함해 자세한 절차를 알아보려면 ONNX 통합 가이드를 참조하세요.
모델 내보내기에 TensorRT를 사용하면 성능이 크게 향상됩니다. TensorRT로 내보낸 YOLO26 모델은 최대 5배의 GPU 속도 향상을 달성할 수 있어 실시간 추론 애플리케이션에 적합합니다.
- 다용도성: 특정 하드웨어 구성에 맞게 모델을 최적화합니다.
- 속도: 고급 최적화를 통해 추론 속도를 높입니다.
- 호환성: NVIDIA 하드웨어와 원활하게 통합됩니다.
TensorRT 통합에 대한 자세한 내용은 TensorRT 통합 가이드를 참조하세요.
INT8 양자화는 모델을 압축하고 추론 속도를 높이는 효과적인 방법이며, 특히 엣지 디바이스에서 유용합니다. INT8 양자화를 활성화하는 방법은 다음과 같습니다:
예제from ultralytics import YOLO model = YOLO("yolo26n.pt") # 모델 로드 model.export(format="onnx", quantize=8, data="coco8.yaml")INT8 양자화는 ONNX, TensorRT, OpenVINO, CoreML, Rockchip RKNN, AMD Xilinx와 같은 형식에 적용할 수 있습니다. 최적의 양자화 결과를 얻으려면
data매개변수를 사용해 대표성을 갖춘 데이터셋을 제공하세요. 허용되는quantize값과 지원 형식은 양자화 옵션을 참조하세요.동적 입력 크기를 사용하면 내보낸 모델이 다양한 이미지 크기를 처리할 수 있어 유연성이 높아지고, 여러 사용 사례에 맞춰 처리 효율성을 최적화할 수 있습니다. ONNX 또는 TensorRT와 같은 형식으로 내보낼 때 동적 입력 크기를 활성화하면 모델이 서로 다른 입력 형태에 원활하게 대응할 수 있습니다.
이 기능을 활성화하려면 내보내기 중
dynamic=True플래그를 사용하세요:예제from ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)동적 입력 크기 설정은 비디오 처리나 다양한 소스의 이미지 처리처럼 입력 크기가 달라질 수 있는 애플리케이션에서 특히 유용합니다.
PyTorch 모델과 동적 내보내기는 기본적으로 최소 직사각형 패딩을 사용하지만, 정적 내보내기는 전체
imgsz크기로 패딩하므로 신뢰도 임계값에 가까운 감지 결과가 달라질 수 있습니다. 정적 내보내기와 일치시키려면 네이티브 추론에rect=False를 사용하거나, 지원되는 경우dynamic=True을 사용해 내보내세요.모델 성능을 최적화하려면 내보내기 인수를 이해하고 구성하는 것이 중요합니다:
format:내보낸 모델의 대상 형식입니다(예:onnx,torchscript,saved_model).imgsz:모델 입력에 사용할 이미지 크기입니다(예:640또는(height, width)).quantize:양자화 정밀도입니다. 예를 들어8/"int8",16/"fp16",32/"fp32"또는 지원 형식에서 사용하는 혼합 가중치/활성화 방식인"w8a16"및"w8a32"(LiteRT 동적 INT8)이 있습니다. 양자화 옵션을 참조하세요.dynamic:ONNX, OpenVINO, TensorRT처럼 동적 형태를 지원하는 형식에서 가변 입력 크기를 허용합니다.nms:외부 NMS용 원시 출력(None), 내장 NMS(True) 또는 NMS가 없는 헤드(False)를 선택합니다.device:내보내기 중 모델 추적에 사용할 디바이스입니다. 예를 들어 첫 번째 CUDA GPU에는cpu또는0를 사용합니다. FP16 TorchScript에는 GPU가 필요합니다.
특정 하드웨어 플랫폼에 배포할 때는 NVIDIA GPU용 TensorRT, Apple 디바이스용 CoreML, Google Coral 디바이스용 Edge TPU와 같은 특화된 내보내기 형식을 고려하세요.
YOLO 모델을 ONNX 또는 TensorRT와 같은 형식으로 내보내면 출력 텐서 구조는 모델 작업에 따라 달라집니다. 이러한 출력을 이해하는 것은 사용자 지정 추론 구현에 중요합니다.
nms=False을 사용해 내보낸 YOLO26 detection models(예:yolo26n.pt)의 경우, 지원되는 형식은[x1, y1, x2, y2, confidence, class_id]개의 값을 포함하는(batch_size, max_detections, 6)형태의 NMS가 필요 없는 출력을 생성합니다. 기본max_det=300를 사용하면 일반적으로(batch_size, 300, 6)형태입니다. 일부 제약이 있는 형식은 엔드투엔드 연산자를 지원하지 않을 경우 자동으로 기존 출력 레이아웃으로 대체됩니다.기본 설정(
nms=None)에서 YOLO26을 포함한 detection 모델은 원시 one-to-many 예측을 내보냅니다. 출력은 일반적으로(batch_size, 4 + num_classes, num_predictions)형태의 단일 텐서이며, 채널은 박스 좌표와 클래스별 점수를 나타내고num_predictions는 내보내기 입력 해상도에 따라 달라집니다(동적일 수 있음). 엔드투엔드 detection 가이드에서 엔드투엔드 출력을 유지하는 형식을 확인할 수 있습니다.segmentation 모델(예:
yolo26n-seg.pt)은 일반적으로 두 개의 출력을 생성합니다. 첫 번째 텐서는(batch_size, 4 + num_classes + mask_dim, num_predictions)형태(박스, 클래스 점수, 마스크 계수)이고, 두 번째 텐서는(batch_size, mask_dim, proto_h, proto_w)형태이며 계수와 함께 인스턴스 마스크를 생성하는 데 사용되는 마스크 프로토타입을 포함합니다. 크기는 내보내기 입력 해상도에 따라 달라집니다(동적일 수 있음).pose 모델(예:
yolo26n-pose.pt)의 출력 텐서는 일반적으로(batch_size, 4 + num_classes + keypoint_dims, num_predictions)형태입니다. 여기서keypoint_dims는 pose 사양(예: 키포인트 수와 신뢰도 포함 여부)에 따라 달라지고,num_predictions은 내보내기 입력 해상도에 따라 달라집니다(동적일 수 있음).ONNX 추론 예제에서는 각 모델 유형의 출력을 처리하는 방법을 보여줍니다.
Ultralytics는 현재 YOLO 모델 전용 C++ 추론 API를 제공하지 않습니다. C++ 배포의 경우 모델을 ONNX, TensorRT, TorchScript 또는 MNN과 같은 런타임 형식으로 내보낸 다음, 내보낸 아티팩트를 해당 런타임의 네이티브 C++ API로 로드하세요.
예를 들어
yolo export model=yolo26n.pt format=onnx으로 detection 모델을 내보내고.onnx파일을 ONNX Runtime C++로 실행하거나,format=engine로 내보내고 TensorRT C++ 애플리케이션에서 TensorRT 엔진을 실행할 수 있습니다. 사용자 지정 C++ 후처리를 사용할 때는 작업 및 내보내기 설정에 맞는 출력 텐서 레이아웃을 사용하세요. 기본 YOLO26 detection 내보내기는 외부 NMS가 필요한 원시 예측 텐서를 반환합니다. NMS가 필요 없는 detection을(batch, max_det, 6)형태로 내보내려면nms=False을 사용하거나, 지원되는 형식에서 NMS를 포함하려면nms=True를 사용하세요.quantize=16(FP16) 또는quantize=8(INT8)로 내보내면 모델 크기를 줄이고 성능을 개선하기 위해 대부분의 텐서가 낮은 정밀도로 변환됩니다. 하지만nms=False가 활성화되면 클래스 인덱스를 포함한 후처리가 내보낸 그래프에 직접 포함됩니다.output0텐서에는 클래스 인덱스가 포함되며, 내부적으로 부동 소수점 값으로 표현됩니다. FP16은 가수부 정밀도가 제한되어 있어 2048보다 큰 정수 값을 안정적으로 표현할 수 없습니다. 잠재적인 정밀도 손실이나 잘못된 클래스 ID를 방지하기 위해output0은 의도적으로 FP32로 유지됩니다.전체 FP16 출력이 필요한 경우 GPU에서
nms=None으로 내보내고 후처리를 외부에서 수행하세요. CPU에서 내보낸 FP16 ONNX는 내부 그래프만 변환하며 입력과 출력은 계속 FP32로 유지됩니다.