将保存的 EfficientDet 模型 saved_model.pb 转换为 tflite 格式失败

Posted

技术标签:

【中文标题】将保存的 EfficientDet 模型 saved_model.pb 转换为 tflite 格式失败【英文标题】:Fail to convert saved EfficientDet model saved_model.pb to tflite format 【发布时间】:2021-11-18 03:11:33 【问题描述】:

我已经使用 TF2 API 训练了一个 EfficientDet-d0 模型,以便检测自定义图像。这工作得很好。已保存检查点、pipeline.config 和 save_model.pb 文件,并且可以使用这些文件重新加载模型。问题是我无法将此模型转换为 tflite 格式以便在 RaspberryPi 上使用它。尝试使用 Google Colab 笔记本中的 TF 文档 (https://www.tensorflow.org/lite/guide/inference#load_and_run_a_model_in_python) 进行转换:https://colab.research.google.com/drive/1cnJF85aPz5VMyEJ0gzsdB3zjvXaRCG_r?usp=sharing

转换本身似乎正在工作,但是当我设置解释器时出现问题,因为所有值都是 0 并且输入形状是 [1 1 1 3]:

interpreter = tf.lite.Interpreter(TFLITE_FILE_PATH)
print(interpreter.get_input_details())

['name': 'serving_default_input_tensor:0', 'index': 0, 'shape': array([1, 1, 1, 3], dtype=int32), 'shape_signature': array([ 1 , -1, -1, 3], dtype=int32), 'dtype': , 'quantization': (0.0, 0), 'quantization_parameters': 'scales': array([ ], dtype=float32), 'zero_points': array([], dtype=int32), 'quantized_dimension': 0, 'sparsity_parameters': ]

interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
input_shape = input_details[0]['shape']
print(input_shape)

[1 1 1 3]

当我尝试设置张量时,出现以下错误

input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)

ValueError:无法设置张量:得到 FLOAT32 类型的值,但输入 0 的预期类型为 UINT8,名称:serving_default_input_tensor:0

任何人都知道我如何正确转换模型或我做错了什么?非常感谢!

【问题讨论】:

你可以尝试在tflite转换时将输入形状设置为固定值吗? 嗨!您是否检查过类似的错误堆栈跟踪问题。 ***.com/a/59855962/11530462 【参考方案1】:

正如错误所暗示的,输入张量应由“uint8”数据类型的数字组成。因此在构造 input_data 时,将其转换为所需的数据类型,如下所示:

input_data = np.random.choice(range(256), size=input_shape).astype(np.uint8)

我特意选择了range(256),因为对于 RGB 格式的图像,像素值位于 [0, 255] 范围内。

【讨论】:

以上是关于将保存的 EfficientDet 模型 saved_model.pb 转换为 tflite 格式失败的主要内容,如果未能解决你的问题,请参考以下文章

小白学习tensorflow教程四使用 tfhub中的模型EfficientDet-Lite2 进行对象检测

PyTorch:模型save和load

PyTorch:模型save和load

pytorch保存模型遇到点问题

将模型保存在keras中是不是有先决条件?

EfficientDet