我使用张量流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 转换建议。一种方法是首先将张量流对象转换为 numpy,这是 API 文档中执行此操作的函数:
TensorFlow
API r2.0
TensorFlow Core 2.0a
Python
tf.make_ndarray
Create a numpy ndarray from a tensor.
我不明白为什么这不起作用,我得到了一些错误,而我只想做一些简单的事情,然后使用一些开放的 cv2 函数,如重新映射、调整大小等:
文件“C:\Python\Python37\lib\site-packages\tensorflow\python\eager\def_function.py”,第 426 行,调用中 self._initialize(args, kwds, add_initializers_to=initializer_map) 文件“C:\Python\Python37\lib\site-packages\tensorflow\python\eager\def_function.py”,第 370 行,在 _initialize *args, **kwds) ) 文件“C:\Python\Python37\lib\site-packages\tensorflow\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\tensorflow\python\eager\function.py”,第 1580 行,在 _maybe_define_function graph_function = self._create_graph_function(args, kwargs) 文件“C:\Python\Python37\lib\site- packages\tensorflow\python\eager\function.py”,第 1512 行,在 _create_graph_function capture_by_value=self._capture_by_value),文件“C:\Python\Python37\lib\site-packages\tensorflow\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\tensorflow\python\eager\def_function.py",第 317 行,在 Wrapped_fn 返回weak_wrapped_fn()。包裹(*args, **kwds) 文件“C:\Python\Python37\lib\site-packages\tensorflow\python\framework\func_graph.py”,第 686 行,在 wrapper 中)、args、kwargs) 文件“C:\ Python\Python37\lib\site-packages\tensorflow\python\autograph\impl\api.py”,第 392 行,converted_call 结果 = convert_f(*effective_args, **kwargs) 文件“C:\Users\syeda\AppData\ Local\Temp\tmpnahp3og4.py",第 32 行,在 tf__random_deform im2 = ag__.converted_call('make_ndarray', tf, ag__.ConversionOptions(recursive=True, verbose=0, strip_decorators=(tf.function, defun_9, ag__.convert , ag__.do_not_convert, ag__.converted_call), force_conversion=False, optional_features=(), internal_convert_user_code=True), (real_image,), {}) 文件 "C:\Python\Python37\lib\site-packages\tensorflow\python \autograph\impl\api.py",第 267 行,在 convert_call 返回 _call_unconverted(f, args, kwargs) 文件“C:\Python\Python37\lib\site-packages\tensorflow\python\autograph\impl\api.py”,第 188 行,在 _call_unconverted 返回 f( *args, **kwargs) 文件“C:\Python\Python37\lib\site-packages\tensorflow\python\framework\tensor_util.py”,第 596 行,MakeNdarray shape = [d.size for d in tensor.tensor_shape .dim] AttributeError:“张量”对象没有属性“张量形状”在 MakeNdarray shape = [d.size for d in tensor.tensor_shape.dim] AttributeError: 'Tensor' object has no attribute 'tensor_shape'在 MakeNdarray shape = [d.size for d in tensor.tensor_shape.dim] AttributeError: 'Tensor' object has no attribute 'tensor_shape'
2018 年5 月 5 日更新:搜索更多后,我发现这与 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 是什么并且它的类型返回时
类'tensorflow.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)
2018 年 5 月 5 日更新:我决定对数据进行预处理,这样我就不必担心在数据加载期间使用任何 opencv 功能。但是在训练期间,我仍然想做一些 openCV 操作。现在根据@giser_yugang 的建议,我尝试使用py_function,我将opencv 操作包装在py_function 中,并在包装器tf.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 的 numpy 操作,我会得到另一个错误
AttributeError: 'Tensor' object has no attribute 'numpy'
我想这两种方式你都赢不了!