可以成功动态更换yolo模型并重启服务生效

This commit is contained in:
2025-09-12 18:28:43 +08:00
parent 4be7f7bf14
commit 206652d6bb
6 changed files with 499 additions and 123 deletions

View File

@ -1,43 +1,35 @@
import os
import numpy as np
from ultralytics import YOLO
from service.model_service import get_current_yolo_model # 从模型管理模块获取模型
# 全局模型变量
_yolo_model = None
from service.model_service import get_current_yolo_model # 带版本校验的模型获取
def load_model(model_path=None):
"""加载YOLO模型优先使用模型管理模块的默认模型)"""
global _yolo_model
"""加载YOLO模型优先使用带版本校验的默认模型)"""
if model_path is None:
_yolo_model = get_current_yolo_model()
return _yolo_model is not None
# 调用带版本校验的模型获取函数(自动判断是否需要重新加载)
return get_current_yolo_model()
try:
_yolo_model = YOLO(model_path)
return True
# 加载指定路径模型(用于特殊场景)
return YOLO(model_path)
except Exception as e:
print(f"YOLO模型加载失败指定路径{str(e)}")
return False
return None
def detect(frame, conf_threshold=0.2):
"""执行目标检测,返回(是否成功, 结果字符串)"""
global _yolo_model
# 确保模型已加载
if not _yolo_model:
if not load_model():
return (False, "模型未初始化")
def detect(frame, conf_threshold=0.7):
"""执行目标检测(仅模型版本变化时重新加载,平时复用缓存)"""
# 获取模型(内部已做版本校验,未变化则直接返回缓存)
current_model = load_model()
if not current_model:
return (False, "未加载到最新YOLO模型")
if frame is None:
return (False, "无效输入帧")
try:
# 执行检测frame应为numpy数组
results = _yolo_model(frame, conf=conf_threshold, verbose=False)
# 用当前模型执行检测(复用缓存,无额外加载耗时
results = current_model(frame, conf=conf_threshold, verbose=False)
has_results = len(results[0].boxes) > 0 if results else False
if not has_results:
@ -49,11 +41,17 @@ def detect(frame, conf_threshold=0.2):
cls = int(box.cls[0])
conf = float(box.conf[0])
bbox = [round(x, 2) for x in box.xyxy[0].tolist()] # 保留两位小数
class_name = _yolo_model.names[cls] if hasattr(_yolo_model, 'names') else f"类别{cls}"
# 从当前模型中获取类别名(确保与模型匹配)
class_name = current_model.names[cls] if hasattr(current_model, 'names') else f"类别{cls}"
result_parts.append(f"{class_name}(置信度:{conf:.2f},位置:{bbox}")
# 打印当前使用的模型路径和版本(用于验证)
# model_path = getattr(current_model, "model_path", "未知路径")
# from service.model_service import _current_model_version
# print(f"[YOLO检测] 使用模型:{model_path}(版本:{_current_model_version[:10]}...")
return (True, "; ".join(result_parts))
except Exception as e:
print(f"检测过程出错:{str(e)}")
print(f"YOLO检测过程出错:{str(e)}")
return (False, f"检测错误:{str(e)}")