Ultralytics YOLO를 사용한 모델 내보내기#
소개#
모델 학습의 궁극적인 목표는 실제 환경에 배포하는 것입니다. Ultralytics YOLO26의 내보내기 모드(Export mode)는 학습된 모델을 다양한 형식으로 변환할 수 있는 폭넓은 옵션을 제공하여, 여러 플랫폼과 장치에 배포할 수 있도록 지원합니다. 본 종합 가이드에서는 모델 내보내기의 세부적인 과정을 안내하며, 최대의 호환성과 성능을 달성하는 방법을 소개합니다.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
YOLO26의 내보내기 모드를 선택해야 하는 이유는 무엇입니까?#
- 범용성: ONNX, TensorRT, CoreML 등을 포함한 다양한 포맷으로 내보낼 수 있습니다.
- 성능: TensorRT를 사용하면 최대 5배의 GPU 속도 향상을, ONNX 또는 OpenVINO를 사용하면 최대 3배의 CPU 속도 향상을 얻을 수 있습니다.
- 호환성: 수많은 하드웨어 및 소프트웨어 환경에서 모델을 범용적으로 배포할 수 있습니다.
- 사용 편의성: CLI 및 Python API를 통해 빠르고 간편하게 모델을 내보낼 수 있습니다.
내보내기 모드의 주요 기능#
주요 기능은 다음과 같습니다:
- 원클릭 내보내기: 다양한 형식으로 내보내기 위한 간단한 명령어를 제공합니다.
- 배치 내보내기: 배치 추론이 가능한 모델을 내보냅니다.
- 최적화된 추론: 내보낸 모델은 더 빠른 추론 시간을 위해 최적화됩니다.
- 튜토리얼 비디오: 원활한 내보내기 경험을 위한 상세 가이드와 튜토리얼을 제공합니다.
사용 예제#
YOLO26n 모델을 ONNX 또는 TensorRT와 같은 다른 형식으로 내보냅니다. 내보내기 인수에 대한 전체 목록은 아래의 인수 섹션을 참조하십시오.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom-trained model
# Export the model
model.export(format="onnx")인수#
이 표는 YOLO 모델을 다양한 형식으로 내보낼 때 사용할 수 있는 구성과 옵션을 상세히 설명합니다. 이러한 설정은 내보낸 모델의 성능, 크기 및 다양한 플랫폼과 환경 간의 호환성을 최적화하는 데 매우 중요합니다. 적절한 구성을 통해 모델이 의도된 애플리케이션에 최적의 효율성으로 배포될 준비를 갖추게 됩니다.
| 인수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
format | str | 'torchscript' | 'onnx', 'torchscript', 'engine'(TensorRT) 등과 같은 내보낸 모델의 대상 형식. 각 형식은 다양한 deployment environments와의 호환성을 가능하게 합니다. |
name | str | None | 하드웨어 타겟을 요구하는 포맷을 위한 하드웨어 타겟 이름: Hailo 아키텍처('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; 기본값은 'hailo8l'), Rockchip RKNN 칩(기본값은 'rk3588'), Huawei Ascend SoC(CANN --soc_version; 기본값은 'Ascend310B4'), 또는 Qualcomm QNN HTP 타겟(기본값은 '73'). 다른 모드에서 사용하는 project/name 실행 이름 쌍과는 다릅니다. |
imgsz | int 또는 tuple | 640 | 모델 입력을 위한 원하는 이미지 크기. 정사각형 이미지의 경우 정수(예: 640×640의 경우 640)이거나 특정 치수를 위한 튜플 (height, width)일 수 있습니다. |
keras | bool | False | TensorFlow SavedModel용 Keras 형식으로의 내보내기를 활성화하여 TensorFlow 서빙 및 API와의 호환성을 제공합니다. |
optimize | bool | False | DEEPX에 대한 더 높은 컴파일러 최적화를 활성화하여 컴파일 시간은 늘리면서 추론 지연 시간은 줄입니다. |
quantize | int 또는 str | None | 양자화 정밀도: 16(FP16, 모델 크기를 줄이고 지원되는 하드웨어에서 추론을 가속화할 수 있음) 또는 8(INT8/PTQ, 최소한의 accuracy 손실로 모델을 더욱 압축하며 주로 edge devices용임; 보정 data/fraction 필요); 32/미설정은 FP32입니다. 혼합 가중치/활성화 정밀도를 지원하는 내보내기 형식은 'w8a8'/'w16a16'/'w8a16'/'w8a32' 표기법도 허용합니다. 지원 중단된 half/int8 플래그(half=True → 16, int8=True → 8, 경고와 함께 여전히 허용됨)를 대체합니다. 대상 형식에서 지원하는 정밀도만 허용됩니다(아래 참조). |
dynamic | bool | False | TorchScript, ONNX, OpenVINO, TensorRT 및 CoreML 내보내기에 대해 동적 입력 크기를 허용하여, 다양한 이미지 차원을 처리하는 데 유연성을 높입니다. |
simplify | bool | True | 이를 구축하는 내보내기를 위해 onnxslim(참조: Export Formats)을 사용하여 중간 ONNX 그래프를 단순화하며, 잠재적으로 성능과 추론 엔진과의 호환성을 향상시킵니다. |
opset | int | None | 다양한 ONNX 파서 및 런타임과의 호환성을 위해 ONNX 그래프를 구축하는 내보내기를 위한 ONNX opset 버전을 지정합니다(참조: Export Formats). 설정하지 않으면 지원되는 최신 버전을 사용합니다. |
workspace | float 또는 None | None | TensorRT 최적화를 위해 GiB 단위의 최대 작업 공간 크기를 설정하여 메모리 사용량과 성능의 균형을 맞춥니다. 장치 최대치까지 TensorRT에 의한 자동 할당에는 None을 사용하십시오. |
nms | bool | False | 지원되는 경우 내보낸 모델에 Non-Maximum Suppression (NMS)을 추가하여(Export Formats 참조) 감지 후처리 효율성을 향상시킵니다. end2end 모델에는 사용할 수 없습니다. CoreML의 경우 감지 모델에만 지원됩니다. |
conf | float | None | 내보내기 시점 NMS가 생성되는 모든 곳에서 사용되는 신뢰도 임계값: nms=True 내보내기, Hailo의 엔드투엔드 방식이 아닌 detect 내보내기, 그리고 내부적으로 nms=True을 강제하는 IMX의 detect, pose, segment 내보내기. 설정하지 않은 경우 기본값은 0.25이며, IMX 내보내기의 경우는 기본값이 0.001입니다. |
iou | float | 0.7 | 내보내기 시점 NMS가 생성되는 모든 곳에서 사용되는 IoU 임계값: nms=True 내보내기, Hailo의 엔드투엔드 방식이 아닌 detect 내보내기, 그리고 내부적으로 nms=True를 강제하는 IMX의 detect, pose, segment 내보내기. |
max_det | int | 300 | 내보낸 모델의 출력에 유지되는 최대 감지 수. NMS 파이프라인에 감지 제한이 없는 CoreML을 제외한 모든 포맷의 nms=True 내보내기, NMS가 필요 없는 엔드투엔드 detect 내보내기(YOLO26, YOLOv10, 사용 가능한 앵커 수로 제한됨), 그리고 IMX의 detect, pose, segment 내보내기에 적용됩니다. |
agnostic_nms | bool | False | CoreML 자체의 NMS 단계를 포함하여, 표준 nms=True 파이프라인을 통해 내보내기 시점의 NMS가 생성되는 모든 곳에서 클래스 구분 없는 NMS를 활성화하여, 동일 클래스 내에서뿐만 아니라 서로 다른 클래스 간에도 점수가 더 낮은 겹치는 박스를 억제합니다. 클래스 구분 없는 옵션이 없고 이 플래그와 무관하게 항상 클래스를 인식하는 Hailo 또는 IMX 자체 생성 NMS 설정에서는 지원되지 않습니다. 또한 NMS가 필요 없는 엔드투엔드 내보내기(YOLO26, YOLOv10)에도 적용되지만, 여기서는 서로 다른 박스 간의 IoU 임계값 억제가 아니라 동일한 감지 결과가 여러 클래스 레이블로 나타나는 것만 방지합니다(IoU=1.0 중복). |
batch | int | 1 | 내보낸 모델 배치 추론 크기 또는 내보낸 모델이 predict 모드에서 동시에 처리할 최대 이미지 수를 지정합니다. Edge TPU 내보내기의 경우 이는 자동으로 1로 설정됩니다. |
device | str | None | 내보내기를 위한 장치를 지정합니다: GPU(device=0), CPU(device=cpu), Apple 실리콘용 MPS(device=mps), 화웨이 어센드 NPU(device=npu 또는 device=npu:0), 또는 NVIDIA Jetson용 DLA(device=dla:0 또는 device=dla:1). TensorRT 내보내기는 자동으로 GPU를 사용하지만, TensorRT 11.0은 DLA를 지원하지 않습니다. |
verbose | bool | True | format='engine' 내보내기 시 TensorRT 빌더 로그 수준을 VERBOSE로 높입니다. 다른 내보내기 포맷은 이를 무시합니다. |
data | str | None | INT8 양자화 캘리브레이션에 필수적인 dataset YAML의 경로입니다. 분류(Classification)의 경우 데이터셋 디렉토리 또는 내장 데이터셋 이름을 대신 사용합니다. INT8이 활성화된 상태에서 지정되지 않은 경우, Ultralytics는 필요한 경우 태스크별 캘리브레이션 데이터셋을 선택하거나 모델 태스크의 기본 데이터셋으로 대체합니다. |
split | str | 'val' | data에서 INT8 양자화 캘리브레이션 데이터로더를 구축하는 데 사용되는 데이터셋 분할('train', 'val' 또는 'test')입니다. |
fraction | float | 1.0 | INT8 양자화 보정에 사용할 데이터셋의 비율을 지정합니다. 전체 데이터셋의 하위 집합으로 보정할 수 있게 하여 실험이나 리소스가 제한된 경우에 유용합니다. INT8을 활성화하고 지정하지 않으면 전체 데이터셋이 사용됩니다. |
end2end | bool | None | NMS 프리 추론을 지원하는 YOLO 모델(YOLO26, YOLOv10)의 엔드투엔드 모드를 재정의합니다. 이를 False으로 설정하면 전통적인 NMS 기반 후처리 파이프라인과 호환되도록 이러한 모델을 내보낼 수 있습니다. 자세한 내용은 End-to-End Detection guide를 참조하십시오. |
이러한 파라미터를 조정하면 배포 환경, 하드웨어 제약, 성능 목표 등 특정 요구 사항에 맞게 내보내기 과정을 사용자 정의할 수 있습니다. 모델 크기, 속도, 정확도 간의 최적의 균형을 달성하려면 적절한 포맷과 설정을 선택하는 것이 필수적입니다.
내보내기 형식#
사용 가능한 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 |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, 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 |
| 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 |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
양자화(Quantization) 옵션#
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" | 16비트 활성화 함수를 사용하는 INT8 가중치 (FP16; LiteRT에서는 INT16) |
"w8a32" | "w8a32" | FP32 활성화 함수를 사용하는 INT8 가중치 (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으로 설정됩니다. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | INT8 내보내기는 TensorFlow 보정을 사용합니다. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | 내보내기 시 정밀도 변환이 없습니다. |
| Edge TPU | ❌ | ❌ | ✅ 자동 | ❌ | Edge TPU는 INT8이 필요하며, 설정하지 않으면 자동으로 활성화됩니다. |
| 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 가중치로 고정됩니다. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | 정적 INT8(8) 및 "w8a16"(int8 가중치 + int16 활성화)은 캘리브레이션 데이터를 사용하며, "w8a32" 동적 INT8(캘리브레이션 없음)도 지원합니다. quantize=16은 별도의 내보내기가 아니며, FP32 모델이 GPU 딜리게이트를 통해 런타임에 FP16으로 실행됩니다. |
| Huawei Ascend | ❌ | ✅ 자동 | ❌ | ❌ | Ascend AI Core 컨볼루션은 FP16/INT8 입력만 지원하므로, ATC는 FP16으로 컴파일하며, 설정하지 않은 경우 자동으로 활성화됩니다. |
INT8 및 W8A16 내보내기의 경우, 대상 통합에 기본 또는 자동 활성화 동작이 문서화되어 있지 않다면 data과 함께 data="coco8.yaml" 같은 대표 캘리브레이션 데이터를 제공하십시오. LiteRT "w8a32"(동적 INT8) 방식은 캘리브레이션 데이터가 필요 없습니다.
다음 단계#
내보낸 모델을 실행하는 방법에 대한 배포 대상의 통합 가이드(ONNX, TensorRT, CoreML 등은 전체 통합 목록에 있음)를 확인하십시오.
FAQ#
YOLO26 모델을 ONNX 형식으로 내보내려면 어떻게 해야 합니까?#
YOLO26 모델을 ONNX 형식으로 내보내는 것은 Ultralytics를 사용하면 매우 간단합니다. 모델 내보내기를 위해 Python 및 CLI 방법을 모두 제공합니다.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom-trained model
# Export the model
model.export(format="onnx")다양한 입력 크기 처리와 같은 고급 옵션을 포함한 프로세스에 대한 자세한 내용은 ONNX 통합 가이드를 참조하십시오.
모델 내보내기에 TensorRT를 사용하면 어떤 이점이 있습니까?#
모델 내보내기에 TensorRT를 사용하면 성능이 크게 향상됩니다. TensorRT로 내보낸 YOLO26 모델은 최대 5배의 GPU 속도 향상을 달성할 수 있어 실시간 추론 애플리케이션에 이상적입니다.
- 다양성: 특정 하드웨어 설정에 맞게 모델을 최적화합니다.
- 속도: 고급 최적화를 통해 더 빠른 추론을 달성합니다.
- 호환성: NVIDIA 하드웨어와 원활하게 통합됩니다.
TensorRT 통합에 대해 자세히 알아보려면 TensorRT 통합 가이드를 참조하십시오.
YOLO26 모델을 내보낼 때 INT8 양자화를 활성화하려면 어떻게 해야 합니까?#
INT8 양자화는 모델을 압축하고 추론 속도를 높이는 아주 좋은 방법이며, 특히 엣지 장치에서 효과적입니다. 다음은 INT8 양자화를 활성화하는 방법입니다:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # Load a model
model.export(format="onnx", quantize=8, data="coco8.yaml")ONNX, TensorRT, OpenVINO, CoreML, Rockchip RKNN 등의 형식에 INT8 양자화를 적용할 수 있습니다. 최적의 양자화 결과를 얻으려면 data 파라미터를 사용하여 대표 dataset을 제공하십시오. 허용되는 quantize 값과 지원되는 형식에 대해서는 Quantization Options을 참조하십시오.
모델을 내보낼 때 동적 입력 크기가 중요한 이유는 무엇입니까?#
동적 입력 크기를 사용하면 내보낸 모델이 다양한 이미지 크기를 처리할 수 있어, 유연성을 제공하고 다양한 사용 사례에 대한 처리 효율성을 최적화할 수 있습니다. ONNX 또는 TensorRT 같은 포맷으로 내보낼 때 동적 입력 크기를 활성화하면 모델이 서로 다른 입력 모양에 원활하게 적응할 수 있습니다.
이 기능을 활성화하려면 내보낼 때 dynamic=True 플래그를 사용하십시오.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.export(format="onnx", dynamic=True)동적 입력 크기 조정은 비디오 처리나 다른 소스의 이미지를 처리할 때처럼 입력 치수가 달라질 수 있는 애플리케이션에 특히 유용합니다.
모델 성능 최적화를 위해 고려해야 할 주요 내보내기 인수는 무엇입니까?#
모델 성능을 최적화하려면 내보내기 인수를 이해하고 구성하는 것이 중요합니다:
format:내보낸 모델의 대상 포맷입니다(예:onnx,torchscript,tensorflow).imgsz:모델 입력에 사용할 원하는 이미지 크기입니다(예:640또는(height, width)).quantize:양자화 정밀도로, 지원되는 포맷에서8/"int8",16/"fp16",32/"fp32", 또는 혼합 가중치/활성화 방식인"w8a16"및"w8a32"(LiteRT 동적 INT8) 등을 지정할 수 있습니다. 양자화 옵션을 참조하십시오.optimize:DEEPX 내보내기에 대해 더 높은 컴파일러 최적화를 활성화합니다.
특정 하드웨어 플랫폼에 배포하는 경우, NVIDIA GPU용 TensorRT, Apple 디바이스용 CoreML, 또는 Google Coral 디바이스용 Edge TPU와 같은 특수 내보내기 포맷을 사용하는 것을 고려하십시오.
내보낸 YOLO 모델에서 출력 텐서는 무엇을 나타냅니까?#
YOLO 모델을 ONNX 또는 TensorRT와 같은 형식으로 내보내면, 출력 텐서 구조는 모델 작업에 따라 달라집니다. 이러한 출력을 이해하는 것은 사용자 지정 추론 구현에 중요합니다.
YOLO26 detection models(예: yolo26n.pt)의 경우, 이를 지원하는 형식에서는 엔드투엔드 내보내기가 기본적으로 활성화되므로 출력이 [x1, y1, x2, y2, confidence, class_id] 값을 가진 (batch_size, max_detections, 6) 형태로 구성됩니다. 기본값인 max_det=300을 사용할 경우 이는 일반적으로 (batch_size, 300, 6)가 됩니다. 일부 제약이 있는 형식은 엔드투엔드 연산자를 지원하지 않을 때 자동으로 기존 출력 레이아웃으로 대체됩니다.
엔드투엔드가 아닌 검출 모델이나 end2end=False(으)로 내보낸 YOLO26 모델의 경우, 출력은 일반적으로 채널이 상자 좌표와 클래스별 점수를 나타내는 단일 텐서((batch_size, 4 + num_classes, num_predictions) 형태)이며, num_predictions는 내보내기 입력 해상도에 따라 달라집니다(동적일 수 있음).
분할 모델(예: yolo26n-seg.pt)의 경우, 일반적으로 두 개의 출력을 얻게 됩니다. 첫 번째 텐서는 (batch_size, 4 + num_classes + mask_dim, num_predictions) 형태(상자, 클래스 점수 및 마스크 계수)를 가지며, 두 번째 텐서는 계수와 함께 사용되어 인스턴스 마스크를 생성하는 마스크 프로토타입을 포함하는 (batch_size, mask_dim, proto_h, proto_w) 형태를 가집니다. 크기는 내보내기 입력 해상도에 따라 다릅니다(동적일 수 있음).
포즈 모델(예: yolo26n-pose.pt)의 경우, 출력 텐서는 일반적으로 (batch_size, 4 + num_classes + keypoint_dims, num_predictions) 형태이며, 여기서 keypoint_dims는 포즈 사양(예: 키포인트 수 및 신뢰도 포함 여부)에 따라 다르고, num_predictions은 내보내기 입력 해상도에 따라 다릅니다(동적일 수 있음).
ONNX 추론 예시의 예시들은 각 모델 유형에 대해 이러한 출력을 처리하는 방법을 보여줍니다.
공식 Ultralytics C++ 추론 API가 있습니까?#
Ultralytics는 현재 YOLO 모델을 위한 전용 C++ 추론 API를 제공하지 않습니다. C++ 배포의 경우, 모델을 ONNX, TensorRT, TorchScript 또는 MNN과 같은 런타임 포맷으로 내보낸 다음, 해당 런타임의 네이티브 C++ API로 내보낸 아티팩트를 로드하십시오.
예를 들어, yolo export model=yolo26n.pt format=onnx(으)로 검출 모델을 내보내고 ONNX Runtime C++로 .onnx 파일을 실행하거나, format=engine(으)로 내보내고 TensorRT C++ 응용 프로그램에서 TensorRT 엔진을 실행하십시오. 사용자 정의 C++ 후처리를 사용하는 경우 태스크 및 내보내기 설정에 맞게 출력 텐서 레이아웃을 일치시키십시오. YOLO26 엔드투엔드 검출 내보내기는 일반적으로 (batch, max_det, 6)을 반환하는 반면, 엔드투엔드가 아닌 내보내기는 외부 후처리가 필요한 원시 예측 텐서를 반환합니다.
end2end=True을 사용하여 양자화된 모델을 내보낼 때 output0이 FP32인 이유는 무엇입니까?#
quantize=16(FP16) 또는 quantize=8(INT8)로 내보낼 때, 모델 크기를 줄이고 성능을 향상시키기 위해 대부분의 텐서가 낮은 정밀도로 변환됩니다. 그러나 end2end=True가 활성화되면 후처리(클래스 인덱스 포함)가 내보낸 그래프에 직접 임베딩됩니다.
output0 텐서에는 클래스 인덱스가 포함되어 있으며, 이들은 내부적으로 부동 소수점 값으로 표현됩니다. FP16은 제한된 가수(mantissa) 정밀도로 인해 2048을 초과하는 정수 값을 안정적으로 표현할 수 없습니다. 잠재적인 정밀도 손실이나 잘못된 클래스 ID를 방지하기 위해 output0은 의도적으로 FP32로 유지됩니다.
이 동작은 예상된 결과이며 클래스 인덱스 정확도를 유지해야 하는 낮은 정밀도 또는 양자화된 내보내기에도 적용됩니다.
전체 FP16 출력이 필요한 경우 end2end=False(으)로 내보내고 후처리를 외부에서 수행하십시오.