환경 설정 및 필수 패키지 설치
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) | 적용 시나리오 |
|---|---|---|---|---|
| ONNX | 15.2 | 345 | 40.6% | 크로스 플랫폼 배포 |
| TensorRT-FP16 | 6.8 | 285 | 40.5% | NVIDIA GPU 환경 |
| TensorRT-INT8 | 4.2 | 210 | 39.8% | 초고속 추론 요구 |
| OpenVINO | 22.1 | 310 | 40.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 포맷으로 시작하여 하드웨어 플랫폼에 맞는 최적화 포맷을 선택하는 접근법을 권장합니다.