opencv tensorflow lite模型的输出类似于StatefulPartitionedCall:n,这是不期望的

vx6bjr1n  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(138)

我需要创建一个对象检测模型,用于树莓派4和相机。为此,我基于ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8模型使用迁移学习创建了一个深度学习模型。此模型的文档可在此处找到:model documentation ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8
我正在使用tensorflow 2. 5. 0,输出模型(saved_model类型)运行良好,当我想用图像测试它到我的jupyter书中时,准确性真的很好。
当我尝试将我的tensorflow模型(.pb)转换为tensorflow lite时,问题出现了。转换工作正常,但输出与.pb模型不同,而且我没有找到任何关于此.tflite模型的8个输出的文档。
正如您在上面的文档中所看到的,有8个输出包含num_detections,detection_boxes,detection_classes等...使用tensorflow模型可以很好地工作。但是当我尝试解释tensorflow lite模型的输出时,输出如下所示:

[{'dtype': <class 'numpy.float32'>,
  'index': 428,
  'name': 'StatefulPartitionedCall:7',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([    1, 51150,     4]),
  'shape_signature': array([    1, 51150,     4]),
  'sparsity_parameters': {}},
 {'dtype': <class 'numpy.float32'>,
  'index': 586,
  'name': 'StatefulPartitionedCall:4',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([1, 1]),
  'shape_signature': array([ 1, -1]),
  'sparsity_parameters': {}},
 {'dtype': <class 'numpy.float32'>,
  'index': 411,
  'name': 'StatefulPartitionedCall:6',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([    1, 51150,     4]),
  'shape_signature': array([    1, 51150,     4]),
  'sparsity_parameters': {}},
 {'dtype': <class 'numpy.float32'>,
  'index': 569,
  'name': 'StatefulPartitionedCall:5',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([1]),
  'shape_signature': array([1]),
  'sparsity_parameters': {}},
 {'dtype': <class 'numpy.float32'>,
  'index': 657,
  'name': 'StatefulPartitionedCall:1',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([1, 1, 1]),
  'shape_signature': array([ 1, -1, -1]),
  'sparsity_parameters': {}},
 {'dtype': <class 'numpy.float32'>,
  'index': 639,
  'name': 'StatefulPartitionedCall:2',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([1, 1]),
  'shape_signature': array([ 1, -1]),
  'sparsity_parameters': {}},
 {'dtype': <class 'numpy.float32'>,
  'index': 622,
  'name': 'StatefulPartitionedCall:3',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([1, 1, 1]),
  'shape_signature': array([ 1, -1, -1]),
  'sparsity_parameters': {}},
 {'dtype': <class 'numpy.float32'>,
  'index': 604,
  'name': 'StatefulPartitionedCall:0',
  'quantization': (0.0, 0),
  'quantization_parameters': {'quantized_dimension': 0,
                              'scales': array([], dtype=float32),
                              'zero_points': array([], dtype=int32)},
  'shape': array([1, 1]),
  'shape_signature': array([ 1, -1]),
  'sparsity_parameters': {}}]

什么是“StatefulPartitionedCall:n”键?如何在文档中使用它?
作为参考,我使用这个github来启动我的模型:github在原生模型中可以正常工作,但在我的模型中不行:

Traceback (most recent call last):
  File "TFLite_detection_webcam.py", line 219, in <module>
    if ((scores[i] > min_conf_threshold) and (scores[i] <= 1.0)):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我想解析输出的方法是不一样的,我真的不知道如何解析它们。
谢谢你的时间。我花了很多时间去理解为什么它不起作用,我不得不承认我是在一堵墙前。

yyyllmsg

yyyllmsg1#

这是因为原始模型中的Tensor名称与保存模型后的Tensor名称不同。TFLite在转换过程中使用保存模型中的名称。
相反,您应该使用TFLite中的SignatureDefs,它应该为访问输入和输出提供有意义的名称。

yruzcnhs

yruzcnhs2#

对于那些在使用tf2onnx时看到类似错误的人。
解决方案是使用TF2 + tf2onnx,即使saved_model是由TF1生成的。
这是因为TF1不知道如何正确处理StatefulPartitionedCalls。请参考这个github问题。

相关问题