我使用 TF2 API 训练了 EfficientDet-d0 模型来检测自定义图像。这很好用。已保存检查点、pipeline.config 和 save_model.pb 文件,并且可以使用这些文件重新加载模型。问题是我无法将此模型转换为 tflite 格式以便在 RaspberryPi 上使用它。尝试在 Google Colab 笔记本中使用 TF 文档 (https://www.tensorflow.org/lite/guide/inference#load_and_run_a_model_in_python) 进行转换:https://colab.research.google.com/drive/1cnJF85aPz5VMyEJ0gzsdB3zjvXaRCG_r ?usp=分享
转换本身似乎有效,但是当我设置解释器时出现问题,因为所有值均为 0 并且输入形状为 [1 1 1 3]:
interpreter = tf.lite.Interpreter(TFLITE_FILE_PATH)
print(interpreter.get_input_details())
[{'name': 'serving_default_input_tensor:0', 'index': 0, 'shape': array([1, 1, 1, 3], dtype=int32), 'shape_signature': array([ 1, - 1, -1, 3], dtype=int32), 'dtype':
, '量化': (0.0, 0), '量化参数': {'scales': array([], dtype=float32), 'zero_points ': array([], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
input_shape = input_details[0]['shape']
print(input_shape)
[1 1 1 3]
当我尝试设置张量时,出现以下错误
input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
ValueError:无法设置张量:获得 FLOAT32 类型的值,但输入 0 的预期类型为 UINT8,名称:serving_default_input_tensor:0
有人知道我如何正确转换模型或者我做错了什么?非常感谢!
如错误所示,输入张量应由“uint8”数据类型的数字组成。 因此,在构造 input_data 时,将其转换为所需的数据类型,如下所示:
input_data = np.random.choice(range(256), size=input_shape).astype(np.uint8)
我特意选择了
range(256)
,因为对于 RGB 格式的图像,像素值位于 [0, 255] 范围内。
Efficientdet 保存的模型不支持直接转换为 tflite,如果您尝试这样做,那么 TensorFlow 将出错, 唯一的方法是使用模型制作库训练高效的det-lite模型,WhatsApp:+8801770293055以获得专业支持,谢谢!