Мой проект написан на python 3.6, и я использую opencv и fast.ai .
Я пытаюсь определить, может ли Umat превзойти мат для некоторого анализа живого видео.У меня есть код, который работает для обнаружения объектов в кадре видео, а затем получить ограничивающий прямоугольник.Я обрезаю изображение и затем передаю его в нейронную сеть.
Время, необходимое для обработки каждого кадра видео на моем процессоре, составляет около 23 миллисекунд.
Я хотел бы попробовать использоватьУмат, чтобы увидеть, можно ли это сделать быстрее.Однако, прежде чем изображение может быть передано в нейронную сеть, его необходимо преобразовать обратно в то, что понимает Фастай.Следующий код работает с обычными матовыми изображениями.Если бы я передал frame
вместо uframe
на cv2.Umat()
, код работает отлично.
# get a frame of video and make a Umat out of it.
frame = video.read()
uframe = cv2.UMat(frame)
# Do stuff to uframe; grayscale, background subtraction, get object coordinates.
# crop the image.
cropped_image = cv2.UMat(uframe, [[x1:x2],[y1:y2]])
# color space conversion for fastai compatibility
swapped_image = cv2.cvtColor(cropped_image, cv2.COLOR_BGR2RGB)
# convert to fastai Image class
fastai_image = Image(pil2tensor(swapped_image, dtype=np.float32).div_(255))
# Send fastai_image image to neural network.
Однако, когда я запускаю код, как показано выше, (передавая Uframe
в cv2.Umat()
), код завершается с ошибкой fastai_image = Image(pil2tensor()
, за исключением:
ValueError: axes don't match array
Я знаю, что эта ошибка связана с тем, как хранятся данные оси, но я не уверен, что с этим делать.Я хотел бы либо преобразовать изображение обратно в мат, либо, возможно, изменить данные оси Umat.Кто-нибудь знает наиболее эффективный способ сделать это?