Explorar el Código

fix(初始化顺序): 调整SDK和检测器的初始化顺序以避免内存冲突

将SDK初始化移到检测器之后,防止大华SDK的内存映射覆盖PyTorch运行时
wenhongquan hace 4 días
padre
commit
51e1f42266
Se han modificado 2 ficheros con 28 adiciones y 24 borrados
  1. 2 2
      dual_camera_system/config/detection.py
  2. 26 22
      dual_camera_system/main.py

+ 2 - 2
dual_camera_system/config/detection.py

@@ -15,9 +15,9 @@ SAFETY_DETECTION_CONFIG = {
     # - YOLO: .pt 文件, 使用 ultralytics
     # - RKNN: .rknn 文件, 使用 rknnlite (RK3588 平台)
     # - ONNX: .onnx 文件, 使用 onnxruntime
-    'model_path': '/home/admin/dsh/testrk3588/yolo11n_rk3588.pt',
+    'model_path': '/home/admin/dsh/testrk3588/yolo11n_rk3588.rknn',
     
-    'model_type': 'yolo',           # 模型类型: 'auto', 'yolo', 'rknn', 'onnx'
+    'model_type': 'rknn',           # 模型类型: 'auto', 'yolo', 'rknn', 'onnx'
     'use_gpu': False,                # RKNN 使用 NPU,不依赖 GPU
     'conf_threshold': 0.5,           # 一般物品置信度阈值 (安全帽、反光衣)
     'person_threshold': 0.8,         # 人员检测置信度阈值

+ 26 - 22
dual_camera_system/main.py

@@ -112,28 +112,9 @@ class DualCameraSystem:
         """
         logger.info("初始化双摄像头联动系统...")
         
-        # 初始化SDK
-        sdk_path = os.path.join(
-            self.config.get('sdk_path', SDK_PATH['lib_path']),
-            self.config.get('netsdk', SDK_PATH['netsdk'])
-        )
-        
-        try:
-            self.sdk = DahuaSDK(sdk_path)
-            if not self.sdk.init():
-                logger.error("SDK初始化失败")
-                return False
-            logger.info("SDK初始化成功")
-        except Exception as e:
-            logger.error(f"SDK加载失败: {e}")
-            return False
-        
-        # 初始化摄像头
-        panorama_config = self.config.get('panorama_camera', PANORAMA_CAMERA)
-        self.panorama_camera = PanoramaCamera(self.sdk, panorama_config)
-        
-        ptz_config = self.config.get('ptz_camera', PTZ_CAMERA)
-        self.ptz_camera = PTZCamera(self.sdk, ptz_config)
+        # 先初始化检测器(YOLO/PyTorch),再加载大华SDK
+        # 大华SDK与PyTorch共享进程空间时可能导致内存冲突,
+        # 先加载PyTorch可避免SDK的内存映射覆盖PyTorch运行时
         
         # 初始化检测器 (YOLO11)
         try:
@@ -158,6 +139,29 @@ class DualCameraSystem:
         except Exception as e:
             logger.warning(f"编号检测器初始化失败: {e}")
         
+        # 初始化SDK(在检测器之后,避免SDK内存映射与PyTorch冲突)
+        sdk_path = os.path.join(
+            self.config.get('sdk_path', SDK_PATH['lib_path']),
+            self.config.get('netsdk', SDK_PATH['netsdk'])
+        )
+        
+        try:
+            self.sdk = DahuaSDK(sdk_path)
+            if not self.sdk.init():
+                logger.error("SDK初始化失败")
+                return False
+            logger.info("SDK初始化成功")
+        except Exception as e:
+            logger.error(f"SDK加载失败: {e}")
+            return False
+        
+        # 初始化摄像头
+        panorama_config = self.config.get('panorama_camera', PANORAMA_CAMERA)
+        self.panorama_camera = PanoramaCamera(self.sdk, panorama_config)
+        
+        ptz_config = self.config.get('ptz_camera', PTZ_CAMERA)
+        self.ptz_camera = PTZCamera(self.sdk, ptz_config)
+        
         # 初始化联动控制器
         self.coordinator = Coordinator(
             self.panorama_camera,