如何将PoseNet ResNet50 tfjs模型转为tflite及转换报错求助
解决PoseNet ResNet50 TFJS模型转Keras SavedModel时的UnicodeDecodeError问题
首先,你遇到的UnicodeDecodeError是因为旧版TensorFlow.js Converter(1.7.2)的tensorflowjs_wizard工具在自动检测模型格式时,错误地将gzip压缩的权重文件(.bin格式)当成了UTF-8编码的JSON文件来读取——0x8b正是gzip文件的标志性字节。我们可以通过两种方式解决这个问题:
方法一:直接使用tensorflowjs_converter命令行工具(绕过向导)
向导的自动检测逻辑存在bug,直接用命令行指定输入输出格式就能避开这个问题:
- 确保你的模型文件夹(
./posenet_resnet50_float_1_default_1)里有重命名后的model.json和所有权重文件(group1-shard*of*.bin)。 - 运行以下命令将TFJS模型转换为Keras SavedModel:
tensorflowjs_converter --input_format tfjs_layers_model --output_format keras_saved_model ./posenet_resnet50_float_1_default_1/model.json ./output_keras_model
方法二:升级TensorFlow.js Converter
你的TFJS版本(1.7.2)比较旧,新版本修复了很多此类bug,先升级工具:
pip install tensorflowjs --upgrade
升级完成后,再尝试使用tensorflowjs_wizard或者上述命令行工具,应该就能正常检测和转换模型了。
后续转TFLite模型
成功得到Keras SavedModel后,用TensorFlow Lite转换器生成TFLite文件:
import tensorflow as tf # 加载SavedModel并转换 converter = tf.lite.TFLiteConverter.from_saved_model('./output_keras_model') # 开启优化(可选) converter.optimizations = [tf.lite.Optimize.DEFAULT] # 支持自定义操作(如果PoseNet包含TF原生不支持的操作) converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS] converter.allow_custom_ops = True # 转换并保存模型 tflite_model = converter.convert() with open('posenet_resnet50.tflite', 'wb') as f: f.write(tflite_model)
如果转换TFLite时遇到输入形状相关的错误,可以固定输入尺寸(比如适配iPhone XS的常用输入大小):
# 在转换前添加这行,替换input_1为你的模型实际输入层名称 converter.input_shapes = {'input_1': [1, 256, 256, 3]}
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

