7,651
社区成员
发帖
与我相关
我的任务
分享高通 AI Edge Box 部署多路工业 OCR 识别,多摄像头同时触发推理时出现文字识别乱码、字符错位,如何解决多流张量数据冲突?
问题根因
多路视频流共用同一套 QNN 推理输入张量缓冲区,多线程并发写入时出现内存覆盖;不同分辨率、通道格式的图像数据交叉污染张量内存,OCR 模型读取错乱像素数据,最终输出乱码字符。
多流隔离完整解决方案
每路视频分配独立张量缓冲区
为每一路摄像头创建专属输入 / 输出张量内存,杜绝多流内存共用,Python 多线程隔离示例:
python
运行
class OCRStreamInstance:def __init__(self, stream_id):
self.stream_id = stream_id
# 每一路独立分配张量内存,互不干扰
self.input_tensor = qnn.create_tensor_buffer(size=(1,3,640,480))
self.output_tensor = qnn.create_tensor_buffer(size=(1,256,64))
self.session = qnn.create_session()def run_ocr(self, frame):# 仅向当前流专属张量写入数据
preprocess_and_copy(frame, self.input_tensor)
self.session.run(self.input_tensor, self.output_tensor)return parse_ocr_result(self.output_tensor)# 初始化8路独立识别实例
stream_list = [OCRStreamInstance(i) for i in range(8)]
多线程互斥锁 + 时序排队机制
若硬件算力有限无法创建多会话,采用单会话串行调度,加互斥锁隔离数据流写入操作:
python
运行
infer_lock = threading.Lock()def single_session_ocr(stream_id, frame):with infer_lock:# 锁定会话,单路完成推理后再处理下一路
preprocess_and_copy(frame, global_input_tensor)
res = global_session.run(global_input_tensor, global_output_tensor)return res
图像数据格式标准化校验
每一路图像送入张量前强制统一通道顺序、归一化参数、尺寸,避免不同摄像头输出格式差异污染张量:
python
运行
def standardize_frame(frame):# 统一转为RGB、固定尺寸、标准化均值方差
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.resize(frame, (640,480))
frame = (frame / 255.0 - 0.5) / 0.5return frame
张量内存写入完成校验
写入张量后增加数据校验逻辑,检测输入像素均值是否超出合理区间,异常则丢弃当前帧,避免脏数据推理。
参考资料
高通 QNN 多流并发开发文档《Multi-Stream Concurrent Inference Best Practices》
工业边缘 AI 技术文章《多路 OCR 并发推理内存冲突与乱码问题解决方案》