当前位置: 首页 > 知识库问答 >
问题:

Tensorflow 2 SSD MobileNet型号在转换为tflite时损坏

拓拔松
2023-03-14

我一直试图按照这个过程在Google Coral Edge TPU:Edge TPU模型工作流上运行一个对象检测器(SSD MobileNet)

我已经成功地用对象检测API训练和评估了我的模型。我有检查点格式和tf SavedModel格式的模型。根据文档,下一步是转换为。使用训练后量化的tflite格式。

我试图效仿这个例子。export_tflite_graph_tf2.py脚本和运行后的转换代码没有错误,但当我尝试实际使用模型运行推断时,我看到了一些奇怪的行为。

  1. 我无法使用export_tflite_graph_tf2.py生成的saved_model。运行以下代码时,出现错误:
print('loading model...')
model = tf.saved_model.load(tflite_base)
print('model loaded!')
results = model(image_np)

类型错误:“_UserObject”对象不可调用 --

因此,在将其转换为tflite之前,我无法判断脚本是否破坏了我的模型。为什么模型不能这样调用?我甚至验证了tf.saved_model返回的类型。load()在saved_model经过export_tflite_graph_tf2.py脚本之前和之后传递时是相同的。我能想到的唯一可能的解释是,脚本以某种方式改变了对象,从而导致它崩溃。

def representative_data_gen():
  dataset_list = tf.data.Dataset.list_files(images_dir + '/*')
  for i in range(100):
    image = next(iter(dataset_list))
    image = tf.io.read_file(image)
    # supports PNG as well
    image = tf.io.decode_image(image, channels=3)
    image = tf.image.resize(image, [IMAGE_SIZE, IMAGE_SIZE])
    image = tf.cast(image / 255., tf.float32) 
    image = tf.expand_dims(image, 0)
    if i == 0:
      print(image.dtype)
    yield [image]

# This enables quantization
# This sets the representative dataset for quantization
converter = tf.lite.TFLiteConverter.from_saved_model(base_saved_model)
# converter = tf.lite.TFLiteConverter.from_keras(model)

converter.optimizations = [tf.lite.Optimize.DEFAULT] # issue here?
converter.representative_dataset = representative_data_gen
converter.target_spec.supported_ops = [
  # tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
  # tf.lite.OpsSet.SELECT_TF_OPS, # enable TensorFlow ops.
  tf.lite.OpsSet.TFLITE_BUILTINS_INT8 # This ensures that if any ops can't be quantized, the converter throws an error
]

# This ensures that if any ops can't be quantized, the converter throws an error
# For full integer quantization, though supported types defaults to int8 only, we explicitly declare it for clarity.
converter.target_spec.supported_types = [tf.int8]
converter.target_spec.supported_ops += [tf.lite.OpsSet.TFLITE_BUILTINS]
# These set the input and output tensors to uint8 (added in r2.3)
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
tflite_model_quantized = converter.convert()

所有运行都没有错误,但当我尝试在模型中实际运行图像时,它会返回垃圾。我尝试删除量化,以查看这是否是问题所在,但即使没有量化,它也会返回看似随机的边界框,这些框在转换之前与模型的性能完全无关。输出张量的形状看起来很好,只是内容都不对。

将此模型转换为量化 tflite 形式的正确方法是什么?我应该注意的是,我不能使用tflite_convert实用程序,因为我需要量化模型,并且根据源代码,它似乎quantize_weights标志已被弃用?我从TF1和TF2中看到了很多关于这个转换过程的相互冲突的资源,所以我很困惑。

注意:我使用的是模型动物园中重新训练的SSD MobileNet。我没有在训练工作流程中对架构进行任何更改。我已经确认,即使在直接从目标检测模型动物园中提取的基本模型上,错误也会持续存在。

共有1个答案

白灿
2023-03-14

我在训练后量化方面遇到了非常相似的问题,并在GitHub上询问了这个问题

我可以设法从TFLite模型中得到结果,但它们还不够好。这是我如何做的笔记本。也许这能帮助你向前迈进一步。

 类似资料:
  • 我目前在转换张量流时遇到问题。pb模型到TFlite格式。我目前正在遵循谷歌代码实验室的指示,错误说 Traceback(最近调用的最后一次):文件/usr/local/bin/tflite_convert,第5行,在tensorflow.lite.python.tflite_convert导入主重要错误:没有模块命名lite.python.tflite_convert 我正在使用谷歌提供的命令

  • 我已经使用tensorflow后端训练了一个DNN,我想在FireBase中托管它。训练好的模型被保存为.meta文件,我尝试使用下面的代码将模型转换为tflite,但我遇到了一些错误。那么我如何将这个模型转换成Tensorflow Lite呢?

  • 我是Tensorflow的初学者,请原谅我这个简单的问题,但我在哪里都找不到这个答案。我正致力于将mobilenet分段模型(http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_trainval_2018_01_29.tar.gz)转换为Tensorflow-lite,用于移动推理,已经用了一个多星期了,但没有成功。我无法正确定义

  • 我想在Tensorflow中将整数量化的tflite模型转换为冻结图(.pb)。我通读并尝试了许多有关StackOverflow的解决方案,但没有一个有效。具体来说,toco不起作用(输出格式不能是TENSORFLOW\u GRAPHDEF)。 我的最终目标是通过tf2onnx获得量化的ONNX模型,但tf2onnx不支持tflite作为输入(只支持保存的_模型、检查点和图形_定义)。但是,在使用

  • 我使用Deeplab官方Github页面上的python脚本,用自己的数据集训练了一个语义分割模型。培训和测试都进行得很好。 然后我使用以下命令使用export_model.py将模型导出到冻结图: 这也成功了。现在我想使用convert_to_tflite.py将我的冻结图形转换为tflite。这个脚本有2个我不理解的输入参数:“input_tensor_name”和“output_tensor

  • 我已经使用Keras来微调MobileNet v1。现在我有,我需要将其转换为TensorFlow Lite,以便在Android应用程序中使用。 我使用TFLite转换脚本。我可以在没有量化的情况下进行转换,但我需要更高的性能,所以我需要进行量化。 如果我运行此脚本: 它失败了: F tensorflow/contrib/lite/toco/tooling\u util。cc:1634]Arra