【问题标题】:Output of CNN should be imageCNN 的输出应该是图像
【发布时间】:2021-04-17 10:55:08
【问题描述】:

我是深度学习的新手,所以我有一个问题:

假设输入灰度图像的形状为 (128,128,1)。目标(输出)也是 (128,128,1) 大小的图像,例如用于分割、深度预测等。通常使用有效填充后,图像的大小会在几个卷积层后缩小。

什么是体面的(也许不是最难的)变体来保持大小或预测相同大小的图像?是通过相同的填充吗?是通过转置卷积还是上采样?我应该在最后使用 FCN 并将它们重塑为图像大小吗?我正在使用pytorch。我会很高兴有任何提示,因为我在互联网上没有找到太多信息。

最好的

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    TLDR;您想查看Deconv networks(卷积转置),它有助于使用卷积运算重新生成图像。您想构建一个编码器-解码器卷积架构,该架构使用卷积将图像压缩为潜在表示,然后从该压缩表示中解码图像。对于图像分割,一个流行的架构是U-net


    注意:我无法回答 pytorch,所以我将分享 Tensorflow 等价物。请忽略代码,但由于您正在寻找概念,我可以帮助您解决此问题。

    您正在尝试生成图像作为网络的输出。

    一系列卷积运算有助于Downsample 一张图片。由于您需要输出 2D 矩阵(灰度图像),因此您也需要 Upsample。这样的网络称为 Deconv 网络。

    第一系列层对输入进行卷积,将它们“展平”为通道向量。下一组层使用2D Conv TransposeDeconv 操作将通道改回二维矩阵(灰度图像)

    参考这张图片-

    这是一个示例代码,向您展示如何使用反卷积网络将 (10,3,1) 图像转换为 (12,10,1) 图像。

    您可以在 pytorch here 中找到 conv2dtranspose 层实现。

    from tensorflow.keras import layers, Model, utils
    
    inp = layers.Input((128,128,1))  ##
    x = layers.Conv2D(2, (3,3))(inp) ##  Convolution part
    x = layers.Conv2D(4, (3,3))(x)   ##
    x = layers.Conv2D(6, (3,3))(x)   ##
    
    ##########
    
    x = layers.Conv2DTranspose(6, (3,3))(x)
    x = layers.Conv2DTranspose(4, (3,3))(x)   ##   ##  Deconvolution part
    out = layers.Conv2DTranspose(1, (3,3))(x) ##
    
    model = Model(inp, out)
    utils.plot_model(model, show_shapes=True, show_layer_names=False)
    


    另外,如果您正在寻找该领域中久经考验的架构,请查看U-netU-Net: Convolutional Networks for Biomedical Image Segmentation。这是一个encoder-decoder (conv2d, conv2d-transpose) 架构,它使用称为skip connections 的概念来避免信息丢失并生成更好的图像分割掩码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-11
      • 2018-12-15
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多