TensorFlow随机调整图像尺寸

3

我正在尝试在图形构建期间按比例调整图像大小,当图像大小未知时:

H, W, _ = img.get_shape()
scale = tf.random_uniform([1], minval=1, maxval=1.5, dtype=tf.float32, seed=None, name=None)

从这些中,我需要神奇地计算出一个大小,它将转化为以下内容:

tf.image.resize_images(tf.expand_dims(img, 0), [H*scale, W*scale])

这将返回:

ValueError: 'size' must be a 1-D int32 Tensor

非常感谢您的帮助。谢谢。

2个回答

5

您的scale的形状为(1,),因此[H*scale, W*scale]的形状为(1, 2)。要解决这个问题,只需生成一个标量随机数而不是一个1元素向量:

scale = tf.random_uniform([], minval=1, maxval=1.5, dtype=tf.float32, seed=None, name=None)

请注意,此处的形状是一个空列表,表示您想要一个标量。
除此之外,您还需要修复“size”参数的数据类型,如下所示:
tf.image.resize_images(tf.expand_dims(img, 0), tf.cast([H*scale, W*scale], tf.int32))

啊,太好了,我真的想不出如何从 tf.random_uniform 中获取一个标量。 :) - David Parks
获取随机标量的好方法。谢谢。 - Gerry

4
你的问题在于你将python列表[H*scale, W*scale]与张量混合使用。默认情况下,tensorflow会将此类列表转换为适当的tensorflow常量。但是在这种情况下,你的列表包含张量,导致生成了一组不是1D的嵌套张量。
为了避免这种混乱,请停止使用python构造如列表,并将你的高度和宽度显式地转换为tensorflow构造,并在继续之前检查它们的形状。
x = tf.concat((scale*W, scale*H), axis=0)
print(x)
Tensor("concat_3:0", shape=(2,), dtype=float32)

这样做可以让我们看到,现在我们拥有了一个所需的1D张量。但它是float32(至少在我设置的简单测试用例中是这样),因此让我们将其转换为int:

x = tf.cast(x, tf.int32)

现在你已经准备好了。
tf.image.resize_images(tf.expand_dims(img, 0), size=x)

在那里不应该发生任何错误。


1
这解决了我的问题,谢谢。不过我还得添加一些东西,以防其他人有相同的问题,我获取 H 和 W 的方式没用。取而代之,请使用:H = tf.shape(img)[0],W = tf.shape(img)[1]。 - Gerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接