Tensorflow Lite - ValueError:无法设置张量:维度不匹配

Tensorflow Lite - ValueError:无法设置张量:维度不匹配

问题描述:

这可能是一个愚蠢的问题,但我是机器学习和 Tensorflow 的新手.我正在尝试使用 Tensorflow Lite 在 Raspberry Pi 上运行对象检测 API.我试图在这个例子的帮助下修改我的代码

This is probably going to be a stupid question but I am new to machine learning and Tensorflow. I am trying to run object detection API on Raspberry Pi using Tensorflow Lite. I am trying to modify my code with the help of this example

https://github.com/freedomtan/tensorflow/blob/deeplab_tflite_python/tensorflow/contrib/lite/examples/python/object_detection.py

这段代码将检测图像中的对象.但是我想通过 Pi 相机实时检测对象而不是图像.我试图修改此代码以从相机而不是图像读取输入.这是我的一段代码 -

This piece of code will detect object from a image. But instead of a image I want to detect object on real time through Pi camera. I tried to modified this code to read input from camera instead of image. Here is my piece of code -

import numpy as np
from tensorflow.contrib.lite.python import interpreter as interpreter_wrapper
import cv2

cap = cv2.VideoCapture(0)
ret, image_np = cap.read()

PATH_TO_MODEL = "ssd_mobilenet_v1_coco.tflite"

interpreter = tf.contrib.lite.Interpreter(model_path=PATH_TO_MODEL)
interpreter.allocate_tensors()

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

while True:
  # NxHxWxC, H:1, W:2
  height = input_details[0]['shape'][1]
  width = input_details[0]['shape'][2]
  ret, image_np = cap.read()

  image_np_expanded = np.expand_dims(image_np, axis=0)
  #if floating_model:
  image_np_expanded = (np.float32(image_np_expanded) - input_mean) / input_std

  #HERE I AM GETTING ERROR
  interpreter.set_tensor(input_details[0]['index'], image_np_expanded)

  if cv2.waitKey(25) & 0xFF == ord('q'):
    cv2.destroyAllWindows()
    break

但我收到此错误 -

Traceback (most recent call last):
  File "New_object_detection.py", line 257, in <module>
    interpreter.set_tensor(input_details[0]['index'], image_np_expanded)
  File "/home/saurabh/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/interpreter.py", line 151, in set_tensor
    self._interpreter.SetTensor(tensor_index, value)
  File "/home/saurabh/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/interpreter_wrapper/tensorflow_wrap_interpreter_wrapper.py", line 133, in SetTensor
    return _tensorflow_wrap_interpreter_wrapper.InterpreterWrapper_SetTensor(self, i, value)
ValueError: Cannot set tensor: Dimension mismatch

谁能告诉我如何解决这个错误或建议一个相同的教程?

Can anyone please tell me how to fix this error or suggest a tutorial for the same?

许多基于图像的机器学习模型都是使用固定大小的输入进行训练的.原始图像可能具有不同的尺寸,但会调整为固定尺寸(例如 224x224x3).

Many image-based machine learning models are trained with fixed-sized inputs. The original image may come with different dimensions, but get resized to a fixed size (e.g. 224x224x3).

因此,您需要在将输入提供给模型之前调整图像大小.它可能工作得很好,因为训练数据也从各种大小调整大小.

Therefore, you need to resize the image before feeding the input to the model. It may work well because the fact that the training data are also resized from various sizes.

正如上面的评论已经指出的,cv.resize 可以做到这一点.

As the comment above already pointed out, cv.resize can do the trick.