如何将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是否正常加载:
如果这一步报错,说明你的SavedModel本身损坏,需要重新训练或导出。import tensorflow as tf model = tf.saved_model.load(SAVED_MODEL_PATH) print(model.signatures.keys()) # 正常情况下会输出serving_default等签名 - 部署到Android时,将生成的
detect.tflite放到项目的assets目录下,同时尽量保证Android依赖的TensorFlow Lite版本与转换时的TensorFlow版本匹配,避免兼容性问题。
内容的提问来源于stack exchange,提问作者TechEnth




