Flutter调用tflite包运行自定义模型报张量形状不兼容错误
问题根因
崩溃由输出张量形状不匹配直接导致:你代码中为TensorFlow Lite解释器配置的Java层输出对象形状为[1, 9],但你集成的best-fp16.tflite实际输出张量形状为[1, 25200, 14],二者维度完全不匹配,张量拷贝时直接抛出IllegalArgumentException触发应用崩溃。
从输出形状判断,你的自定义模型属于YOLOv5/YOLOv8系列目标检测模型:单批次推理下会输出25200个预定义锚框的预测结果,每个锚框对应14维数值,和通用SSD、MobileNet检测模型的小维度输出逻辑完全不同,不能直接套用这类模型的集成代码。
修复步骤
- 修正输出张量形状配置
加载模型后不要硬编码输出形状,先读取模型自带的张量元数据确认输入输出参数,再对应配置接收结果的数组形状:
你当前模型的输出接收数组需要定义为形状// 模型加载完成后执行,打印张量信息做校验 final inputTensors = interpreter.getInputTensors(); final outputTensors = interpreter.getOutputTensors(); for (final tensor in inputTensors) { debugPrint('输入张量 | 名称:${tensor.name} 形状:${tensor.shape} 类型:${tensor.type}'); } for (final tensor in outputTensors) { debugPrint('输出张量 | 名称:${tensor.name} 形状:${tensor.shape} 类型:${tensor.type}'); }[1][25200][14]的浮点型数组,和模型输出完全对齐。注意输出最后一维14的含义是:4个边界框坐标参数 + 1个框置信度 + 9个类别概率,对应你训练时设置了9个检测类别,后续如果增减类别数,这个维度数值会同步变化。 - 重写检测结果解析逻辑
替换原有适配[1,9]形状的解析代码,按YOLO输出格式处理结果:- 遍历全部25200个锚框的预测值
- 对每个锚框,提取前4位数值做坐标转换,还原为对应原图尺寸的边界框坐标
- 提取第5位的框置信度,直接过滤掉置信度低于预设阈值(通常取0.25~0.5)的无效锚框
- 提取后9位的类别概率值,取概率最高的类别作为该锚框的检测类别
- 对所有保留的有效框做非极大值抑制(NMS),去除重叠的重复检测框,得到最终输出结果
- 校验输入预处理逻辑
同步检查输入张量配置,640x640输入的YOLO fp16模型输入形状一般为[1, 640, 640, 3],预处理时需要将选中的图片缩放到对应尺寸,像素值归一化到0~1区间,避免输入形状、数值范围不匹配触发其他推理异常。
注意事项
- 不要直接复用网上针对SSD、MobileNet等老检测模型写的tflite集成代码,这类模型输出结构和YOLO系列差异极大,硬套会直接触发形状不匹配错误
- 如果你是通过YOLO官方仓库导出tflite模型,导出时的
nms、end2end参数要和解析逻辑对齐:如果开启了端侧NMS导出,输出形状会变为固定检测数的结构,不再是25200锚框的原始输出 - fp16精度模型推理时注意张量类型匹配,不要套用uint8量化模型的类型配置,否则会触发类型不匹配报错
内容的提问来源于stack exchange,提问作者Ibrahim Mohamed Embaby
相关产品推荐
相关产品推荐

