Я загружаю изображение, используя тензор потока 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'
Я думаю, вы не можете выиграть в обоих случаях!