AutoML Vision 如何处理尺寸小于 224x224 像素的图像?

How does AutoML Vision handle images with dimensions less than 224x224 pixels?

我用 80x80x3 图像样本训练了 AutoML Vision。培训已成功完成,我下载了 edge tflite 模型。在 python 中实现 tflite 模型时,根据这个 tutorial by tensorflow 我意识到 tflite 模型的输入大小是 224x224x3。

我的问题是:

为了获得更好的预测性能,我想按照 AutoML Vision 在训练期间处理图像的方式来处理新图像。

将输入形状为 (1, 80, 80, 3) 的 80x80 图像输入模型时,出现异常 "Cannot set tensor: Dimension mismatch",请参见下面的代码。

输入 224x224 图像无一例外。但是,我想使用 80x80x3 的图像,就像我在训练中使用的那样。或者像在 AutoML Vision 中训练时一样预处理 80x80x3 图像,例如将它们调整为 224x224x3 或 AutoML Vision 处理它的方式。

test_sample.shape

Out: (80, 80, 3)

test_sample = test_sample.reshape(1, 80, 80, 3)

Out: (1, 80, 80, 3)    

# Load TFLite model and allocate tensors. 
interpreter = tf.lite.Interpreter(model_path=model_path) 
interpreter.allocate_tensors() 

# Get input and output tensors. 
input_details = interpreter.get_input_details()

print(interpreter.get_input_details())

Out: [{'name': 'image', 'index': 0, 'shape': array([  1, 224, 224,   3], dtype=int32), 'dtype': <class 'numpy.uint8'>, 'quantization': (0.007874015718698502, 128)}]

output_details = interpreter.get_output_details() 

# Test model on input data. 
input_data = np.array(test_sample, dtype=np.uint8) 
interpreter.set_tensor(input_details[0]['index'], input_data) 

interpreter.invoke() 


Out: ValueError: Cannot set tensor: Dimension mismatch 
ValueError                                Traceback (most recent call last)
in engine
----> 1 interpreter.set_tensor(input_details[0]['index'], input_data)

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/lite/python/interpreter.py in set_tensor(self, tensor_index, value)
   173       ValueError: If the interpreter could not set the tensor.
   174     """
--> 175     self._interpreter.SetTensor(tensor_index, value)
   176 
   177   def resize_tensor_input(self, input_index, tensor_size):

/home/cdsw/.local/lib/python3.6/site-packages/tensorflow/lite/python/interpreter_wrapper/tensorflow_wrap_interpreter_wrapper.py in SetTensor(self, i, value)
   134 
   135     def SetTensor(self, i, value):
--> 136         return _tensorflow_wrap_interpreter_wrapper.InterpreterWrapper_SetTensor(self, i, value)
   137 
   138     def GetTensor(self, i):

ValueError: Cannot set tensor: Dimension mismatch

我推荐你使用这个实现

设置数据类型

# check the type of the input tensor
floating_model = input_details[0]['dtype'] == np.float32

根据所需的模型高度和宽度调整图片大小

height = input_details[0]['shape'][1]
width = input_details[0]['shape'][2]
img = Image.open(args.image).resize((width, height))

设置输入数据

input_data = np.expand_dims(img, axis=0)

这是完整的例子 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/examples/python/label_image.py

它会为您调整图像大小。我使用 netron 观察了这一点,以检查 tflite 和 tensorflow 模型。寻找输入并跟随输出通过解码器进行调整大小操作。