TensorFlow将图像张量调整为动态形状

时间:2016-02-04 18:29:48

标签: python image shape tensorflow

我正在尝试使用TensorFlow读取图像分类问题的一些图像输入。

当然,我正在使用tf.image.decode_jpeg(...)执行此操作。我的图像尺寸可变,因此我无法为图像张量指定固定的形状。

但我需要根据实际尺寸来缩放图像。具体来说,我希望将短边缩放到固定值,将长边缩放到保留宽高比的方式。

我可以通过shape = tf.shape(image)获取某个图像的实际形状。我也能够为新的长边做计算,如

shape = tf.shape(image)
height = shape[0]
width = shape[1]
new_shorter_edge = 400
if height <= width:
    new_height = new_shorter_edge
    new_width = ((width / height) * new_shorter_edge)
else:
    new_width = new_shorter_edge
    new_height = ((height / width) * new_shorter_edge)

我现在的问题是我无法将new_heightnew_width传递给tf.image.resize_images(...),因为其中一个是张量,resize_images期望整数作为高度和宽度输入。< / p>

有没有办法“拉出”张量的整数,还是有其他方法可以用TensorFlow完成我的任务?

提前致谢。

修改

由于我还tf.image.resize_images shape = tf.shape(image) height = shape[0] width = shape[1] new_shorter_edge = tf.constant(400, dtype=tf.int32) height_smaller_than_width = tf.less_equal(height, width) new_height_and_width = tf.cond( height_smaller_than_width, lambda: (new_shorter_edge, _compute_longer_edge(height, width, new_shorter_edge)), lambda: (_compute_longer_edge(width, height, new_shorter_edge), new_shorter_edge) ) image = tf.expand_dims(image, 0) image = tf.image.resize_bilinear(image, tf.pack(new_height_and_width)) image = tf.squeeze(image, [0]) ,所以这里的代码对我有用:

for(i = 0; i < plantList.size(); i++)
{
    System.out.println(plantList.get(i));
}   

1 个答案:

答案 0 :(得分:6)

这样做的方法是使用(目前是实验性的,但在下一版本中可用)tf.cond() *运算符。此运算符能够测试在运行时计算的值,并根据该值执行两个分支之一。

shape = tf.shape(image)
height = shape[0]
width = shape[1]
new_shorter_edge = 400
height_smaller_than_width = tf.less_equal(height, width)

new_shorter_edge = tf.constant(400)
new_height, new_width = tf.cond(
    height_smaller_than_width,
    lambda: new_shorter_edge, (width / height) * new_shorter_edge,
    lambda: new_shorter_edge, (height / width) * new_shorter_edge)

现在,Tensornew_height的{​​{1}}值将在运行时获取相应的值。

*要在当前发布的版本中访问运算符,您需要导入以下内容:

new_width

...然后使用from tensorflow.python.ops import control_flow_ops 代替control_flow_ops.cond()