TensorFlowLite 张量形状没有意义(输入:[1, 1, 1, 3])

问题描述 投票:0回答:1

我使用这个分步教程训练了一个对象检测模型,该模型检测一个类别:人。它的效果也很好,可以找到各种形状和大小的人,并且不再将我的画架标记为人。与我在某处找到的一些普通的 python tf 推理运行器配合得很好。

现在我想在手机上使用它。所以我使用默认的 模型转换器教程 来做到这一点,只是为了意识到我的模型中显然有一个名为“StridedSlice”运算符的东西无法转换为 tflite,所以我使用了 选择张量流模型运算符教程使用包含的这一运算符进行转换,并将所需的库添加到应用程序中,这基本上是 detector.tflite 附带的默认示例应用程序:

implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:2.8.0'

我尝试使用 detector.tflite 以确保这不会破坏任何东西,并且它仍然像魅力一样工作。

问题是:在 tflite 看来,我的模型现在采用 [1, 1, 1, 3] 张量作为输入,正如 Netron 所证实的那样(我发现这要感谢 Alex K. 的answer):

所以看来,由于某种原因,我的模型确实采用了 [1, 1, 1, 3] 输入张量,并提供了几个形状我不理解的输出张量,遗憾的是没有任何输出含义的描述。另外,我不能强迫它做任何事情,相反它会崩溃,并且正如正确的静态类型语言所期望的那样:

Cannot copy to a TensorFlowLite tensor (serving_default_input_tensor:0) with 3 bytes from a Java Buffer with 1228800 bytes.

因为当然我的缓冲区大小不是 (1 * 1 * 1 * 3) 因为这没有任何意义。相反,我的缓冲区使用输入大小 640,但不是因为我确定这是正确的大小,而是因为我猜测,而且我的 pipeline.config 也有这个。

image_resizer {
  fixed_shape_resizer {
    height: 640
    width: 640
  }
}

但出于某种原因,当使用普通的 python tf 推理运行器时,我可以将任何图像放入其中(相同的脚本适用于我的笔记本电脑的集成摄像头和实感 3D 摄像头,笔记本电脑的分辨率当然很差)。

那么我哪里做错了呢?转换为 tflite 时显然丢失了有关输入的信息?在应用程序中使用,我可能必须告诉它不要听所谓的 [1, 1, 1, 3] 输入形状?完全在其他地方吗?

java tensorflow object-detection tflite
1个回答
0
投票

我也遇到了这个问题,因为我也遵循了分步教程。经过调查,我设法将输入更改为 [1,320,320,4]。

要解决此问题,在分步教程的导出步骤中,您必须更改以下代码:

python .\exporter_main_v2.py --input_type image_tensor --pipeline_config_path .\models\my_ssd_resnet50_v1_fpn\pipeline.config --trained_checkpoint_dir .\models\my_ssd_resnet50_v1_fpn\ --output_directory .\exported-models\my_model

至:

python .\export_tflite_graph_tf2.py --pipeline_config_path .\models\my_ssd_resnet50_v1_fpn\pipeline.config --trained_checkpoint_dir .\models\my_ssd_resnet50_v1_fpn\ --output_directory .\exported-models\my_model

注意:export_tflite_graph_tf2 位于tensorflow\models 研究\物体检测

之后,您可以导出这个保存的模型。

您可以在 python 中使用以下脚本来验证保存的模型输入:

import tensorflow as tf

interpreter = tf.lite.Interpreter([Your tflite Model])
print(interpreter.get_input_details())

"""expected result: [{'name': 'serving_default_input:0', 'index': 0, 'shape': array([  1, 320, 320,   3]), 'shape_signature': array([  1, 320, 320,   3]), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0), 'quantization_parameters': {'scales': array([], dtype=float32), 'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]"""
© www.soinside.com 2019 - 2024. All rights reserved.