2017-08-10 40 views
0

我在TensorFlow上实现了全卷积网络。它使用编解码器结构。 训练时,我总是使用相同的图像尺寸(224x224,使用随机裁剪),一切都很好。Dynamic Tensor Aligment/Cropping

在干涉阶段,我想一次预测一张图像,因为我想使用全图像(未被截取)。例如,这种图像的大小为[406,256]。这是问题。 在编码器 - 解码器架构中,我添加了两个测试器(z = x + y)。训练时,两张张量的大小匹配。预测我的单张图像时,尺寸不匹配(张量尺寸:[1,47,47,64] vs [1,46,46,64])。我认为这是Conv和Pool层完成一些舍入的原因。

我应该在我的架构中更改哪些图片以适合我想要的任何图片大小?我应该改变舍入参数吗?或者添加张量的“裁剪”?

链接到执行架构: https://gist.github.com/melgor/0e43cadf742fe3336148ab64dd63138f (问题发生在管线166)

+0

只是调整你的输入到'[224,224]' –

+0

我不想调整输入的大小,因为那样我就会失去一些空间信息。我的模型是通过正确的“纵横比”(没有图像调整大小)学习的。在干扰时,我也希望拥有正确的“长宽比”。 此外,我可以将图像分割成几个矩形区域,然后合并它。但我希望这个模型能够在不同的输入分辨率下快速合理地工作,并且能够在Mobile上工作 – melgor89

回答

0

我发现变量输入大小的解决方案:)

我们真正需要的是一个“作物层” ,那裁剪一个张量以匹配其他。我在这里找到了非常类似的图层:http://tf-unet.readthedocs.io/en/latest/_modules/tf_unet/layers.html (crop_and_concat)。

我刚使它`crop_and_add”,它是工作:

def crop_and_add(x1,x2): 
    x1_shape = tf.shape(x1) 
    x2_shape = tf.shape(x2) 
    # offsets for the top left corner of the crop 
    offsets = [0, (x1_shape[1] - x2_shape[1]) // 2, (x1_shape[2] - x2_shape[2]) // 2, 0] 
    size = [-1, x2_shape[1], x2_shape[2], -1] 
    x1_crop = tf.slice(x1, offsets, size) 
    return x1_crop + x2 

在模型中的所有另外我代替上述层(因此合并编码器和解码器的数据)。

此外,输入到模型需要被定义为:

image = tf.placeholder(tf.float32, shape=[1, None, None, 3], name="input_image") 

因此,我们知道,我们将通过单一的图像和图像有3个渠道。但我们不知道宽度和高度。它的作品非常好! (作为AWS P2在K80上的40 FPS,图像大小为224x {} - 镜像侧的图像有224)

仅供参考,我也试图运行ENET(比LinkNet快两倍),但在TensorFlow中, 。我认为这是因为PReLu(TF的速度很慢)。此外,它不支持UnPool图层的图像大小,它需要按整数列表(而非占位符)预定义输出大小。因此,在TF中速度和性能的情况下LinkNet看起来更好。