多线程是加载一个复用推理模型还是用多个独立的推理模型
多线程 多相机并行推理必须每个线程独立拥有一个 cv::dnn::Net 对象不能多个线程共用同一个 Net 也就是线程数 Net 实例数量。cv::dnn::Net netCam5,netCam6,netCam7,netCam8,netCam11,netCam12; netCam5 readNetFromONNX(onnx_seg_path); netCam5.setPreferableBackend(DNN_BACKEND_OPENCV); netCam5.setPreferableTarget(DNN_TARGET_CPU); netCam6 readNetFromONNX(onnx_seg_path); netCam6.setPreferableBackend(DNN_BACKEND_OPENCV); netCam6.setPreferableTarget(DNN_TARGET_CPU); netCam7 readNetFromONNX(onnx_seg_path); netCam7.setPreferableBackend(DNN_BACKEND_OPENCV); netCam7.setPreferableTarget(DNN_TARGET_CPU); netCam8 readNetFromONNX(onnx_seg_path); netCam8.setPreferableBackend(DNN_BACKEND_OPENCV); netCam8.setPreferableTarget(DNN_TARGET_CPU);原因分析1. 底层原因OpenCV DNN 不管 CPU/CUDA 后端都适用cv::dnn::Net 不是线程安全。Net 内部包含计算图、中间张量缓存、推理上下文、GPU 显存上下文。多线程同时调用同一个 Net 的 setInput() / forward()会发生内存覆盖、张量错乱随机崩溃、偶发断言报错就是你之前遇到的各种 Reshape /assign 异常推理结果随机错乱、mask / 检测框忽对忽错简单一句话同一个 Net 不能被多个线程并发调用 forward。2.每个线程内部只操作自己专属的 Net无锁并发安全。优点不需要互斥锁并发性能最好逻辑简单稳定工业视觉首选。缺点CPU 推理每个 Net 会在内存里加载一份模型权重内存占用成倍增加。