You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将TensorFlow目标检测模型转为TFLite?转换报错求助

解决SSD-MobileNet-V2-FPNLite转TFLite的路径错误问题

你遇到的这个错误核心原因非常明确:你传给tf.lite.TFLiteConverter.from_saved_model()的是单个saved_model.pb文件的路径,但这个方法需要的是包含该pb文件和variables文件夹的整个SavedModel目录路径。TensorFlow会在指定目录下自动查找saved_model.pb(或saved_model.pbtxt)和对应的变量文件夹,而不是直接读取单个pb文件。

步骤1:确认SavedModel的正确目录结构

先检查你的导出目录,标准的SavedModel结构应该是这样的:

fine_tuned_model/
└── saved_model/
    ├── saved_model.pb
    └── variables/
        ├── variables.data-00000-of-00001
        └── variables.index

如果你的目录里没有variables文件夹,说明你用export_tflite_graph_tf2.py导出SavedModel的过程可能存在问题,需要重新导出并确保参数设置正确。

步骤2:修正Python转换代码

把路径改为指向包含saved_model.pb的目录,而不是单个文件:

import tensorflow as tf
import os

# 注意:这里指向的是包含saved_model.pb的目录,不是单个pb文件
SAVED_MODEL_PATH = os.path.join(os.getcwd(), 'object_detection', 'fine_tuned_model', 'saved_model')

converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_PATH)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.experimental_new_converter = True
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS]

tflite_model = converter.convert()
with open("detect.tflite", "wb") as f:
    f.write(tflite_model)

步骤3:命令行工具的正确用法

如果你使用tflite_convert命令行工具,同样要指定目录路径而非单个pb文件:

tflite_convert \
  --saved_model_dir=/content/gdrive/My Drive/models/research/object_detection/fine_tuned_model/saved_model \
  --output_file=detect.tflite \
  --optimizations=DEFAULT \
  --target_spec.supported_ops=TFLITE_BUILTINS,SELECT_TF_OPS

额外排查与部署提示

  • 若转换仍失败,可以先验证SavedModel是否正常加载:
    import tensorflow as tf
    model = tf.saved_model.load(SAVED_MODEL_PATH)
    print(model.signatures.keys())  # 正常情况下会输出serving_default等签名
    
    如果这一步报错,说明你的SavedModel本身损坏,需要重新训练或导出。
  • 部署到Android时,将生成的detect.tflite放到项目的assets目录下,同时尽量保证Android依赖的TensorFlow Lite版本与转换时的TensorFlow版本匹配,避免兼容性问题。

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

火山引擎 最新活动