【问题标题】:What layers to use when comparing 2 arrays of 2 image比较 2 个图像的 2 个数组时使用哪些层
【发布时间】:2020-01-22 01:05:27
【问题描述】:

我有 2 个图像数组,一个是降级的图片,另一个是相同的图片但处于干净状态。他们的shape=(576, 720, 3),因为这些图像是720*576,并且有3 通道(RGB)。我目前正在尝试使用退化的图片数组作为输入来训练我的模型,并将干净的图片数组作为输出。它工作得非常好,但是我确实知道要添加到我的模型中的层,也不知道如何提高我目前的准确性。

这是我当前的模型(不好,我基本上只是在这里随机放置层):

model = models.Sequential()

model.add(layers.Conv2D(32, 5, activation='relu', padding='same', input_shape=(576, 720, 3)))
model.add(layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(layers.Conv2D(64, 3, activation='relu', padding='same'))
model.add(layers.AveragePooling2D(pool_size=(2, 2)))

model.add(layers.Conv2D(3, 3, activation='relu', padding='same'))
model.add(layers.UpSampling2D((4, 4)))

我是这样编译的:

model.compile(optimizer='rmsprop', loss='mean_absolute_error', metrics=["accuracy"])

我目前有 5000 对退化/干净的图像,我设法达到约 75% 的准确率和约 20 的损失,但无法改进模型。

我想了解我在这里做什么,因为除了图像分类,我在互联网上找不到任何东西,这不是我正在做的事情。我想知道哪个层有用,为什么。我知道 Conv2D 很有用,因为我想找到图像中的缺陷并纠正它们,而且我知道 LSTM 在处理视频时很有用,但除此之外,我不知道要设置的正确层序列,也不知道正确的图层。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你可以尝试一些著名的pixel2pixel模型,比如U-nets。
  • 我见过很多人使用生成模型(例如自动编码器)来去除图像中的噪声。它首先使用 conv 层对图像进行下采样,然后使用 conv-transpose 进行上采样。在比较两个图像的情况下,许多人认为连体网络是一个不错的选择。它有两个相同的特征提取层并行接受图像进行检查和一个损失层来确定提取的特征的相似性。还有很多其他方法。

标签: tensorflow keras deep-learning neural-network conv-neural-network


【解决方案1】:

我有一个类似的项目。
正如@meowongac 在他的评论中所说,Unet 的结果非常好,而且很容易构建。

查看this repo 来实现它。请注意,有更漂亮的方法来编写它,特别是如果您想将过滤器的数量/conv 块的数量作为参数。如果您想了解为什么 Unet 在您的情况下很好,请阅读 its paper。简而言之,它使用一条路径在收缩路径上获取小特征,然后使用扩展路径来获取空间化。

在我的项目中,Unet 运行良好,但我想要一个更好的模型,我遇到了 the DenseUNET repo,它添加了 Dense 层以优于 Unet,事实就是如此。

编辑:我也尝试了segnet,它显示了很好的结果,但不如 Unet,它更容易实现。

您也不应该查看准确性,因为您使用的是回归范式。它只对概率在 0 到 1 之间的分类有用

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多