You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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输出格式处理结果:
    1. 遍历全部25200个锚框的预测值
    2. 对每个锚框,提取前4位数值做坐标转换,还原为对应原图尺寸的边界框坐标
    3. 提取第5位的框置信度,直接过滤掉置信度低于预设阈值(通常取0.25~0.5)的无效锚框
    4. 提取后9位的类别概率值,取概率最高的类别作为该锚框的检测类别
    5. 对所有保留的有效框做非极大值抑制(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:36:10