Как использовать объект Tensor Flow 2.0 в открытом cv2 Python и почему это так круто? - PullRequest
2 голосов
/ 05 мая 2019

Я загружаю изображение, используя тензор потока API (2.0), например так:

def load(image_file):
  image = tf.io.read_file(image_file)
  image = tf.image.decode_jpeg(image)

Теперь, когда у меня есть этот объект, я хочу показать это изображение, я могу просто использовать matplotlib.pyplot, и этоработает.

plt.figure()
plt.imshow(re/255.0)
plt.show()

Однако попытка сделать это с OpenCV2 проблематична с самого начала, большинство примеров относятся к версии 1.0 с предложением .eval () для сеансового преобразования.Один из способов состоит в том, чтобы сначала преобразовать объект тензорного потока в numpy, вот функция, которая делает это из документации API:

TensorFlow
API r2.0
TensorFlow Core 2.0a
Python
tf.make_ndarray
Create a numpy ndarray from a tensor.

Я не понимаю, почему это не работает, и я получаю ряд ошибок, в то время как всеЯ хочу сделать что-то простое, а затем использовать некоторые открытые функции cv2, такие как remap, изменить размер и т. Д.\ def_function.py ", строка 426, в вызов self._initialize (args, kwds, add_initializers_to = initializer_map) Файл" C: \ Python \ Python37 \ lib \ site-packages \ensorflow \ python \ eager \def_function.py ", строка 370, в _initialize * args, ** kwds)) Файл" C: \ Python \ Python37 \ lib \ site-packages \ensorflow \ python \ eager \ function.py ", строка 1313, в _get_concrete_function_internal_garbage_collected graph_function, _, _ = self._maybe_define_function (args, kwargs) Файл "C: \ Python \ Python37 \ lib \ site-packages \ensorflow \ python \ eager \ function.py", строка 1580, в _maybe_define_function graph_function = self._create_graph_function (args, kwargs) Файл "C: \ Python \ Python37 \ lib \ site-packages \ensorflow \ python \ eager \ function.py", строка 1512, в _create_graph_function capture_by_value = self._capture_by_value), файл "C: \ Python"\ Python37 \ lib \ site-packages \ensorflow \ python \ framework \ func_graph.py ", строка 694, в func_graph_from_py_func func_outputs = python_func (* func_args, ** func_kwargs) Файл" C: \ Python \ Python37 \ lib \ site-packages\ tenorflow \ python \ eager \ def_function.py ", строка 317, в wrapped_fn, возвращает слабый_wrapped_fn (). упакованный (* args, ** kwds) файл" C: \ Python \ Python37 \ lib \ site- "packages \ tenorflow \ python \ framework \ func_graph.py ", строка 686, в обертке), args, kwargs) Файл" C: \ Python \ Python37 \ lib \ site-packages \ensorflow \ python \ autograph \ impl \ api.py "", строка 392, в файле convert_call result = convert_f (*ffective_args, ** kwargs) Файл" C: \ Users \ syeda \ AppData \ Local \ Temp \ tmpnahp3og4.py ", строка 32, в tf__random_deform im2 = ag __. convert_call ('make_ndarray ', tf, ag __. ConversionOptions (recursive = True, подробный= 0, strip_decorators = (tf.function, defun_9, ag __. Convert, ag __. Do_not_convert, ag __. Convert_call), force_conversion = False, необязательный_features = (), internal_convert_user_code = True), (real_image,), {}) Файл «C»: \ Python \ Python37 \ lib \ site-packages \ tenorflow \ python \ autograph \ impl \ api.py ", строка 267, в convert_call вернуть _call_unconverted (f, args, kwargs) Файл" C: \ Python \ Python37 \ lib \ "site-packages \ensorflow \ python \ autograph \ impl \ api.py ", строка 188, в _call_unconverted return f (* args, ** kwargs) Файл" C: \ Python \ Python37 \ lib \ site-packages \ensorflow \ python\ framework \ensor_util.py ", строка 596, в форме MakeNdarray = [d.size для d в tenor.tensor_shape.dim] AttributeError: у объекта 'Tensor' нет атрибута 'tennors_shape'

Обновление 05.05.2008: После поиска я обнаружил, что это как-то связано с выполнением графа Tensorflow.У меня есть функция

def load_image_train(image_file):
  input_image, real_image = load(image_file)
 print(type(real_image))
  print(real_image.shape)
  some_image = Open CV operations like filtering, jitter etc performed on real_image
return some_image

Это хорошо работает, когда вызывается с нетерпением с атрибутом .numpy (), однако, когда вызывается как следующий код и когда вы пытаетесь проверить, что такое real_image и его тип возвращает

класс'ensorflow.python.framework.ops.Tensor '(Нет, Нет, Нет)

Пожалуйста, совет.

# Input pipeline
train_dataset = tf.data.Dataset.list_files(PATH+'train/*.jpg')
train_dataset = train_dataset.shuffle(BUFFER_SIZE)
train_dataset = train_dataset.map(load_image_train,
                               num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_dataset = train_dataset.batch(1)

Обновление 05.05.2008: Я решил провести предварительную обработку данных, поэтому мне не нужно беспокоиться об использовании каких-либо функциональных возможностей opencv во время загрузки данных.Однако во время обучения я все еще хочу сделать некоторые операции openCV.Теперь, согласно предложению @giser_yugang, я попытался использовать py_function, я обертываю операции opencv в py_function и вызываю эту функцию в оболочке tf.function.Эту обертку я вызываю в поезде.Однако вывод, который я получаю из этой функции-оболочки, выглядит следующим образом:

class 'tensorflow.python.framework.ops.Tensor'
unknown

Тогда, если я пытаюсь использовать этот тензор в следующей операции шага поезда, я получаю

incompatible with the layer: its rank is undefined, but the layer requires a defined rank.

Если яне используйте эту обертку py_function в моем шаге поезда и попробуйте напрямую выполнить пустые операции, используя opencv. Я получаю еще одну ошибку

AttributeError: 'Tensor' object has no attribute 'numpy'

Я думаю, вы не можете выиграть в обоих случаях!

1 Ответ

1 голос
/ 09 мая 2019

Использовать OpenCV + Tensorflow 2.0 просто.

Допустим, у нас есть изображение "wink.jpg" (см. Изображение в приложении) в текущем каталоге, затем можно использовать Tensorflow 2.0 для чтения изображения JPEG и получить tf.Tensor с dtype = uint8, получить массив из него и используйте OpenCV для его визуализации (в формате BGR, как требуется OpenCV).

import tensorflow as tf
import cv2


def load(image_file):
    image = tf.io.read_file(image_file)
    image = tf.image.decode_jpeg(image)
    return image


wink = load("wink.jpg")
print(wink.shape, wink.dtype)

# Get a Numpy BGR image from a RGB tf.Tensor
image = cv2.cvtColor(wink.numpy(), cv2.COLOR_RGB2BGR)

cv2.imshow("image", image)
cv2.waitKey()

wink

Если у вас есть какие-то проблемы, связанные с архитектурой Graph, возможно, это потому, что вы:

  • Или используя tf.function для преобразования кода в график (в этом случае просто удалите аннотацию)
  • Или используя OpenCV внутри метода tf.data.Dataset (в этом случае просто не используйте OpenCV или не используйте tf.py_func там, где требуется OpenCV)
  • Или с использованием неверной версии Tensorflow, которая не является 2 с активным режимом по умолчанию (проверьте, все ли в порядке, запустив pip list |grep tf и pip list | grep tensor, и если вы видите что-то странное, например, установлено более 1 версии TF Предлагаю удалить среду запуска с новой установкой).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...