YOLO12 모델 변환 가이드: ONNX, TensorRT, OpenVINO 변환 방법

환경 설정 및 필수 패키지 설치

YOLO12 모델 변환을 시작하기 전에 필요한 환경을 구성해야 합니다. 다음과 같이 필수 Python 패키지를 설치합니다:

pip install ultralytics onnx onnxruntime onnxsim
pip install tensorrt
pip install openvino openvino-dev

TensorRT GPU 변환을 위해서는 CUDA 11.8과 cuDNN 8.6 버전을 권장합니다. OpenVINO의 경우 Intel 공식 사이트에서 패키지를 다운로드하거나 개발 버전을 설치할 수 있습니다:

pip install openvino-dev[onnx]==2023.0.0

주요 변환 포맷 개요

YOLO12 모델 변환에 사용되는 주요 포맷별 특징:

  • ONNX: 개방형 신경망 교환 포맷으로 다양한 프레임워크 간 호환성 제공
  • TensorRT: NVIDIA GPU 전용 추론 엔진으로 최적화된 성능 제공
  • OpenVINO: Intel CPU 및 엣지 디바이스에 특화된 추론 툴킷

YOLO12는 어텐션 메커니즘을 사용하므로 변환 시 호환성 문제에 주의해야 합니다.

단계별 변환 방법

ONNX 포맷 변환

ONNX는 가장 기본적인 변환 대상이며 다른 포맷으로의 중간 단계로 사용됩니다:

from ultralytics import YOLO

detector = YOLO('yolo12n.pt')

detector.export(
    format='onnx',
    imgsz=640,
    opset=17,
    simplify=True,
    dynamic=True,
    batch=1
)

주요 주의사항:

  • opset 17 이상 버전 사용 권장
  • 다양한 입력 크기 지원을 위해 dynamic=True 설정
  • 간혹 onnxsim 실패 시 simplify 옵션 제거

TensorRT 엔진 변환

TensorRT 변환은 NVIDIA GPU에서显著的한 성능 향상을 제공합니다:

detector.export(
    format='engine',
    imgsz=640,
    half=True,
    device=0,
    workspace=4
)

trtexec 명령어를 사용한 변환:

trtexec --onnx=yolo12n.onnx --saveEngine=yolo12n.engine --fp16 --workspace=4096

변환 시 고려사항:

  • FP16: 속도와 정확도 균형, INT8: 최고 속도 but 정확도 일부 손실
  • 복잡한 모델은 4-8GB 작업 공간 필요
  • TensorRT, CUDA, cuDNN 버전 호환성 확인

OpenVINO 포맷 변환

OpenVINO는 Intel CPU 환경에서 우수한 성능을 발휘합니다:

detector.export(
    format='openvino',
    imgsz=640,
    half=False,
    device='CPU'
)

모델 최적화기를 사용한 변환:

mo --input_model yolo12n.onnx --output_dir openvino_model --data_type FP32

종합 변환 예제

import time
from ultralytics import YOLO

def transform_model(model_path, output_path):
    detector = YOLO(model_path)
    start = time.time()
    
    print("ONNX 변환 중...")
    detector.export(format='onnx', imgsz=640, opset=17, simplify=True)
    onnx_duration = time.time() - start
    
    print("TensorRT 변환 중...")
    detector.export(format='engine', imgsz=640, half=True, device=0)
    trt_duration = time.time() - start - onnx_duration
    
    print("OpenVINO 변환 중...")
    detector.export(format='openvino', imgsz=640, half=False, device='CPU')
    ov_duration = time.time() - start - onnx_duration - trt_duration
    
    print(f"변환 완료: ONNX({onnx_duration:.1f}s), TensorRT({trt_duration:.1f}s), OpenVINO({ov_duration:.1f}s)")

transform_model('yolo12n.pt', './converted_models')

성능 비교 분석

포맷추론 속도 (ms)메모리 사용 (MB)정확도 (mAP)적용 시나리오
ONNX15.234540.6%크로스 플랫폼 배포
TensorRT-FP166.828540.5%NVIDIA GPU 환경
TensorRT-INT84.221039.8%초고속 추론 요구
OpenVINO22.131040.6%Intel CPU 환경

테스트 환경: NVIDIA T4 GPU, Intel Xeon CPU, YOLO12n 모델, 640x640 입력 크기

결과 분석:

  • 최고 속도: TensorRT INT8 (실시간 추론에 적합)
  • 최고 정확도: ONNX 또는 OpenVINO FP32
  • 다중 플랫폼: ONNX가 가장 범용적
  • CPU 환경: OpenVINO가 Intel CPU에서 최적화됨

문제 해결 및 최적화

일반적인 변환 오류 해결

ONNX 변환 시 지원되지 않는 연산자:

detector.export(format='onnx', opset=18)  # 더 높은 opset 버전 시도

TensorRT 변환 시 메모리 부족:

trtexec --onnx=yolo12n.onnx --saveEngine=yolo12n.engine --workspace=2048

OpenVINO 변환 후 정확도 저하:

detector.export(format='openvino', half=False)  # FP32 정밀도 사용

성능 최적화 기법

TensorRT 혼합 정밀도 설정:

detector.export(format='engine', half=True, int8=False)  # FP16
detector.export(format='engine', half=False, int8=True)  # INT8

OpenVINO 성능 모드 활성화:

from openvino.runtime import Core

core = Core()
model = core.read_model("yolo12n.xml")
compiled_model = core.compile_model(model, "CPU", {"PERFORMANCE_HINT": "THROUGHPUT"})

프레임워크 선택 가이드

요구사항에 따른 권장 포맷:

  • 극한 속도: NVIDIA 하드웨어 → TensorRT INT8, 높은 정확도 → TensorRT FP16
  • 다중 플랫폼: 다양한 하드웨어 → ONNX, Intel CPU → OpenVINO
  • 제한된 자원: 엣지 디바이스 → OpenVINO + 양자화, 모바일 → ONNX + 모바일 추론 프레임워크
  • 프로덕션 환경: ONNX와 하드웨어 특화 버전 동시 준비, 충분한 테스트 수행

실무 적용 팁

YOLO12 모델 변환은 이전 버전 대비 개선되었으며 ONNX 변환은 비교적 안정적입니다. TensorRT 변환 시 버전 호환성을 확인하고, OpenVINO는 Intel 장비에서 뛰어난 성능을 보입니다. 변환 후 반드시 정확도 검증을 수행하고, 문제 발생 시 최신 변환 도구나 커뮤니티 지원을 활용하세요.

ONNX 포맷으로 시작하여 하드웨어 플랫폼에 맞는 최적화 포맷을 선택하는 접근법을 권장합니다.

태그: YOLO12 onnx TensorRT OpenVINO 모델변환

8월 20일 22:15에 게시됨