我需要创建一个对象检测模型,用于树莓派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()
我想解析输出的方法是不一样的,我真的不知道如何解析它们。
谢谢你的时间。我花了很多时间去理解为什么它不起作用,我不得不承认我是在一堵墙前。
2条答案
按热度按时间yyyllmsg1#
这是因为原始模型中的Tensor名称与保存模型后的Tensor名称不同。TFLite在转换过程中使用保存模型中的名称。
相反,您应该使用TFLite中的SignatureDefs,它应该为访问输入和输出提供有意义的名称。
yruzcnhs2#
对于那些在使用tf2onnx时看到类似错误的人。
解决方案是使用TF2 + tf2onnx,即使saved_model是由TF1生成的。
这是因为TF1不知道如何正确处理StatefulPartitionedCalls。请参考这个github问题。