using Check.Main.Common; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using YoloDotNet; using YoloDotNet.Models; namespace Check.Main.Infer { /// /// 静态全局YOLO模型管理器。 /// 负责在程序启动时加载所有模型,并在关闭时释放资源。 /// public static class YoloModelManager { // 使用 ConcurrentDictionary 保证线程安全 private static readonly ConcurrentDictionary _loadedModels = new ConcurrentDictionary(); /// /// 根据模型配置列表初始化所有YOLO模型实例。 /// 应在程序启动时调用一次。 /// /// 模型配置列表。 public static void Initialize(List modelSettings) { Shutdown(); // 先确保清理掉旧实例 if (modelSettings == null) return; ThreadSafeLogger.Log("开始加载YOLO模型..."); foreach (var setting in modelSettings) { bool gpuUse = false; if (setting.CheckDevice == DetectDevice.GPU) { gpuUse = true; } if (string.IsNullOrEmpty(setting.Path) || !File.Exists(setting.Path)) { ThreadSafeLogger.Log($"[警告] 模型 '{setting.Name}' (ID: {setting.Id}) 路径无效或文件不存在,已跳过加载。"); continue; } try { // 创建YOLO实例 var yolo = new Yolo(new YoloOptions { OnnxModel = setting.Path, // 您可以根据需要从配置中读取这些值 ModelType = (YoloDotNet.Enums.ModelType)setting.MType, Cuda = gpuUse, // 推荐使用GPU PrimeGpu = false }); if (_loadedModels.TryAdd(setting.Id, yolo)) { ThreadSafeLogger.Log($"成功加载模型 '{setting.Name}' (ID: {setting.Id})。"); } } catch (Exception ex) { ThreadSafeLogger.Log($"[错误] 加载模型 '{setting.Name}' (ID: {setting.Id}) 失败: {ex.Message}"); } } ThreadSafeLogger.Log($"YOLO模型加载完成,共成功加载 {_loadedModels.Count} 个模型。"); } /// /// 获取指定ID的已加载YOLO模型。 /// /// 模型编号。 /// Yolo实例,如果未找到则返回null。 public static Yolo GetModel(int modelId) { _loadedModels.TryGetValue(modelId, out var yolo); return yolo; } /// /// 释放所有已加载的YOLO模型资源。 /// 应在程序关闭时调用。 /// public static void Shutdown() { if (_loadedModels.Count > 0) { ThreadSafeLogger.Log("正在释放所有YOLO模型..."); foreach (var yolo in _loadedModels.Values) { yolo?.Dispose(); } _loadedModels.Clear(); ThreadSafeLogger.Log("所有YOLO模型已释放。"); } } } }