2026-05-24 21:18:34 +08:00
|
|
|
import asyncio
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
|
|
from .base import BaseInferenceEngine
|
|
|
|
|
|
|
|
|
|
_engine: Optional[BaseInferenceEngine] = None
|
|
|
|
|
# 懒初始化,确保在事件循环启动后创建
|
|
|
|
|
_inference_lock: Optional[asyncio.Lock] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_engine() -> BaseInferenceEngine:
|
|
|
|
|
if _engine is None:
|
|
|
|
|
raise RuntimeError("推理引擎未初始化,请先调用 init_engine()")
|
|
|
|
|
return _engine
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_inference_lock() -> asyncio.Lock:
|
|
|
|
|
global _inference_lock
|
|
|
|
|
if _inference_lock is None:
|
|
|
|
|
_inference_lock = asyncio.Lock()
|
|
|
|
|
return _inference_lock
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def init_engine(model_path: str, runtime: str = "ultralytics") -> BaseInferenceEngine:
|
|
|
|
|
global _engine
|
|
|
|
|
if runtime == "onnx":
|
|
|
|
|
from .onnx_adapter import OnnxRuntimeAdapter
|
|
|
|
|
_engine = OnnxRuntimeAdapter(model_path)
|
|
|
|
|
else:
|
|
|
|
|
from .ultralytics_adapter import UltralyticsAdapter
|
|
|
|
|
_engine = UltralyticsAdapter(model_path)
|
|
|
|
|
|
|
|
|
|
print(f"[mingxi-vision] 加载模型: {model_path}")
|
|
|
|
|
_engine.warmup()
|
|
|
|
|
print(f"[mingxi-vision] 引擎就绪: {_engine.__class__.__name__} · {_engine.model_version}")
|
|
|
|
|
return _engine
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def reload_engine(model_path: str, runtime: str = "ultralytics") -> BaseInferenceEngine:
|
|
|
|
|
"""热重载模型,调用方必须持有推理锁"""
|
|
|
|
|
global _engine
|
|
|
|
|
_engine = None # 释放旧引用,让 GC 回收显存
|
|
|
|
|
return init_engine(model_path, runtime)
|