tf.image.resize_bilinear() - 当 align_corners=False 时

5

我正在使用Tensorflow 1.4.0。

Tensorflow的tf.image.resize_bilinear()函数有一个叫做'align_corners'的参数,我对当我们将其设置为False时的行为感到困惑。在官方文档中,它说:

align_corners:可选布尔值。默认为False。如果为true,则输入和输出张量的4个角像素的中心对齐,保留角像素处的值。默认为false。

当我在下面这个程序中使用align_corners=True调用tf.image.resize_bilinear()时:

import tensorflow as tf
sess = tf.Session()
x = tf.Variable(tf.Variable([[[[1],[2]],[[3],[4]]]]))
pooling_output_size = [4, 4]
pool_output = tf.image.resize_bilinear(x, pooling_output_size,align_corners=True)
sess.run(tf.global_variables_initializer())
print pool_output.eval(session=sess)

它输出

[[[[1.       ]
   [1.3333334]
   [1.6666667]
   [2.       ]]

  [[1.6666667]
   [2.       ]
   [2.3333335]
   [2.6666667]]

  [[2.3333335]
   [2.6666665]
   [3.       ]
   [3.3333335]]

  [[3.       ]
   [3.3333333]
   [3.6666667]
   [4.       ]]]]

哪些角落被正确地对齐。

然而,当我将align_corners设置为False时,我得到了以下奇怪的输出。

[[[[1. ]
   [1.5]
   [2. ]
   [2. ]]

  [[2. ]
   [2.5]
   [3. ]
   [3. ]]

  [[3. ]
   [3.5]
   [4. ]
   [4. ]]

  [[3. ]
   [3.5]
   [4. ]
   [4. ]]]]

有人知道为什么Tensorflow会使用这种奇怪的实现方法吗?我在任何地方都没有找到解释。

实际上,PyTorch的双线性上采样也有align_corner参数,当你将其设为True时,它能很好地工作。但如果你将其设置为False,则它会执行不同于Tensorflow的行为。我现在完全困惑于它们的实现(也许只用align_corners=True就可以了)。


嗯...发现了这篇文章,它似乎解释了什么是对齐角落以及为什么要始终启用对齐角落 https://hackernoon.com/how-tensorflows-tf-image-resize-stole-60-days-of-my-life-aba5eb093f35 - Diana
@Diana 是的,我也看了这篇文章,但是在Tensorflow中当align_corners=False时的实现方式更加奇怪。似乎在左上角部分应用双线性插值,在右下角部分应用最近邻插值,在左下角和右上角部分应用线性上采样。我真的不明白为什么会这样。最有趣的是,我发现在cityscapes上使用align_corners=False将会获得更好的PSPNet准确度... - Depu
1个回答

2

2
我和我的朋友们讨论了这个问题,我们发现如果我们想要手动对齐图像(遵循DeepLab的4个对齐规则),我们应该使用align_corner = True。但是,如果我们不关心对齐,align_corner = False可以保证左上角的像素完美对齐。另外,附言:你提供的链接无法访问。 - Depu

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