7,651
社区成员
发帖
与我相关
我的任务
分享AI Edge Box 多路 RTSP 视频流接入 QNN 推理,部分流随机出现推理结果错乱,如何排查是否是输入张量内存越界导致?
分步排查流程
日志排查:开启 QNN 调试日志QNN_LOG_LEVEL=DEBUG,查看报错日志是否出现tensor write overflow字段,出现即可判定内存越界;
输入校验:打印每一路视频送入张量的图像尺寸、字节长度,对比模型规定输入维度,确认是否存在缩放失败导致尺寸不匹配;
内存模式排查:多路流共用同一个输入 Tensor 缓冲区时,后写入的视频帧覆盖前一帧未推理完成的数据,造成结果错乱;
根治方案
每一路视频流分配独立的输入输出 Tensor 缓冲区,禁止多路流共用张量内存;推理未结束前锁定对应 buffer,推理完成再释放复用。
多路隔离代码片段
cpp
运行
// 给每一路摄像头分配独立张量
std::unordered_map<int, QnnTensor*> cam_tensor_map;
// 初始化,每个通道单独创建张量
void init_cam_tensor(int cam_id, QnnContext* ctx) {
QnnTensor* in_tensor = nullptr;
QnnContext_createInputTensor(ctx, &in_tensor);
cam_tensor_map[cam_id] = in_tensor;
}
// 单路推理上锁,防止覆盖
void single_stream_infer(int cam_id, cv::Mat frame) {
std::lock_guardstd::mutex lock(stream_mtx[cam_id]);
QnnTensor* tensor = cam_tensor_map[cam_id];
QnnTensor_writeData(tensor, frame.data, frame.total() * frame.elemSize());
QnnContext_execute(ctx);
}