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

Flutter调用TFLite版SSD MobileNet v2报张量形状不匹配问题

问题根因

这个报错由转换命令参数错误直接导致,核心问题有两个:

  1. 参数混用:--saved_model_dir参数仅适配SavedModel格式的模型目录,如果传入的是单个冻结pb文件路径,会导致转换器读取模型结构错误,输出张量的顺序、形状完全偏离预期
  2. 缺少兼容参数:SSD MobileNet V2的TFLite转换依赖内置的TFLite_Detection_PostProcess自定义检测后处理op,原命令未开启旧模型兼容转换逻辑,转出来的模型输出顺序和端侧预设不匹配——Java端代码默认索引为1的输出是形状为[1,10,4]的检测框坐标张量,但实际拿到的是形状[1,10]的检测类别张量,因此抛出形状不匹配错误。
修正方案
  • 先确认原始模型格式,选择对应转换命令:
    如果是从Object Detection API导出的单个.pb冻结图文件,使用如下命令,注意第一个入参替换为原始pb的存放路径,不要和输出tflite路径混淆:
command = "tflite_convert \
--graph_def_file={} \
--output_file={} \
--input_shapes=1,300,300,3 \
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--inference_type=FLOAT \
--input_data_type=FLOAT \
--allow_custom_ops \
--enable_v1_converter".format(FROZEN_PB_PATH, TFLITE_MODEL)

如果是SavedModel格式的模型目录(目录下包含saved_model.pb和variables子文件夹),使用适配命令即可,不需要手动指定输入输出数组,让转换器自动识别服务签名:

command = "tflite_convert \
--saved_model_dir={} \
--output_file={} \
--inference_type=FLOAT \
--allow_custom_ops \
--signature_key=serving_default".format(SAVED_MODEL_DIR, TFLITE_MODEL)
  • 转换版本限制:不要用TensorFlow 2.9及以上版本转旧版Object Detection API导出的SSD MobileNet V2模型,高版本对旧检测后处理op的兼容存在已知问题,推荐用TF2.5~TF2.8区间的版本执行转换。
结果校验

转完的tflite模型可以直接用Netron打开查看结构,确认四个输出张量的形状、顺序符合端侧预期:

  • 索引0输出(检测框):形状为[1, 10, 4],对应每个检测框的4个坐标值
  • 索引1输出(检测类别):形状为[1, 10],对应每个检测结果的类别ID
  • 索引2输出(检测分数):形状为[1, 10],对应每个检测结果的置信度
  • 索引3输出(有效检测数):形状为[1],对应当前帧有效检测结果的总数
    如果输出顺序和上述不一致,要么调整转换参数固定输出顺序,要么修改Java端读取输出张量的索引对应关系即可。

内容的提问来源于stack exchange,提问作者irtisam ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:15:29