如何从 saved_model (SSD MobileNet) 创建一个 tflite 文件

How to create a tflite file from saved_model (SSD MobileNet)

我想创建一个基于重新训练的 ssd_mobilenet 模型的对象检测应用程序我已经像 youtube 上的那个人一样重新训练了。

我从Tensorflow Model Zoo中选择了型号ssd_mobilenet_v2_coco。在重新训练过程之后,我得到了具有以下结构的模型:

- saved_model
    - variables (empty folder)
    - saved_model.pb
- checkpoint
- frozen_inverence_graph.pb
- model.ckpt.data-00000-of-00001
- model.ckpt.index
- model.ckpt.meta
- pipeline.config

在同一个文件夹中,我有 python 脚本,代码如下:

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model("saved_model")
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

在运行这段代码之后,我得到了以下错误:

ValueError: None is only supported in the 1st dimension. Tensor 'image_tensor' has invalid shape '[None, None, None, 3]'.

模型中似乎缺少图像宽度和高度。当我像 youtube 视频中那样使用模型时,它正在工作。

经过大量研究和尝试,我尝试了其他方法,例如 运行 bazel/toco,但没有任何方法可以帮助我创建 tflite 文件。

documentation中所述,您可以在tf.lite.TFLiteConverter.from_saved_model中传递不同的参数。

For more complex SavedModels, the optional parameters that can be passed into TFLiteConverter.from_saved_model() are input_arrays, input_shapes, output_arrays, tag_set and signature_key. Details of each parameter are available by running help(tf.lite.TFLiteConverter).

您可以按照 here 所述传递此信息。您需要提供输入张量名称及其形状,还需要提供输出张量名称及其形状。对于 ssd_mobilenet_v2_coco,您需要像这样定义需要在哪个输入形状上使用网络:

tf.lite.TFLiteConverter.from_saved_model("saved_model", input_shapes={"image_tensor" : [1,300,300,3]})