【问题标题】:Keras Combining Batches Of Single Image After TrainingKeras在训练后组合单张图像的批次
【发布时间】:2020-11-02 22:14:29
【问题描述】:

我正在使用自动编码器对高分辨率灰度图像进行去噪。每个图像被分成特定大小的子批次,即52 x 52,模型对这些批次中的每一个都起作用,然后结果是将每个图像中的去噪批次连接回原始批次。以下是结果后的图像示例:

您可以在串联后看到较小的图像批次。如何克服这种行为?

我考虑过进一步处理,例如在边缘添加模糊以将它们混合在一起,但我认为这不是最佳解决方案。

连接代码:


num_hor_patch = 19
num_ver_patch = 26

print("Building the Images Batches")
for i in range(num_image):
    reconstruct = []
    for j in range(num_hor_patch):
        from_vertical_patches = predictions[start_pos:(start_pos+num_ver_patch)]
        horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
        start_pos += num_ver_patch
        reconstruct.append(horizontal_patch)

    restored_image = np.concatenate(np.array(reconstruct), axis=0)
    output.append(restored_image)

start_pos = 0
test_data = np.array([np.reshape(test_data[i], (52, 52)) for i in range(test_data.shape[0])])
for i in range(num_image):
    reconstruct = []
    for j in range(num_hor_patch):
        from_vertical_patches = test_data[start_pos:(start_pos+num_ver_patch)]
        horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
        start_pos += num_ver_patch
        reconstruct.append(horizontal_patch)

    restored_image = np.concatenate(np.array(reconstruct), axis=0)
    input.append(restored_image)

start_pos = 0
test_noisy_data = np.array([np.reshape(test_noisy_data[i], (52, 52)) for i in range(test_noisy_data.shape[0])])
for i in range(num_image):
    reconstruct = []
    for j in range(num_hor_patch):
        from_vertical_patches = test_noisy_data[start_pos:(start_pos+num_ver_patch)]
        horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
        start_pos += num_ver_patch
        reconstruct.append(horizontal_patch)

    restored_image = np.concatenate(np.array(reconstruct), axis=0)
    noisy.append(restored_image)

print("Exporting the Model")
output_model['output'] = output
output_model['original'] = input
output_model['noisy'] = noisy

【问题讨论】:

  • 您好!为什么你不一次将整个图像传递到自动编码器并得到结果?它也应该改善你的推理时间。此外,坚持您当前的方法,您也可以遵循此link
  • 感谢您的评论@RishabP。不幸的是,图像不适合可用的内存。如果您建议有其他解决方案可以实现,请用它来回答问题!

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

如果我错了,请纠正我,但您有以下问题:

  • 去噪自动编码器获得 52x52 图像
  • 尺寸为 HxW 的图像,其中 W >> 52 和 H >> 52

问题是如何使用自动编码器对图像进行去噪?

您当前的解决方案是:

  1. 将图像划分为非重叠图块
  2. 使用自动编码器对每个瓦片进行降噪
  3. 连接得到的去噪图块以形成原始图像

此解决方案在瓷砖之间的接缝处产生非常不一致的结果。

我认为您需要使用重叠图块而不是非重叠图块。

这意味着每个像素都是多个图块的一部分,而不仅仅是一个图块。 因此将有几个去噪值,一个来自他所属的每个图块。

每个像素的最终值将是该像素所属的所有图块的值的平均值。

新的解决方案:

  1. 将图像划分为重叠图块(更多图块会扼杀结果)
  2. 使用自动编码器对每个瓦片进行降噪
  3. 对于最终图像中的每个像素,取该像素所属的所有图块的平均值。

【讨论】:

  • 你能告诉你如何确保从重叠的图块中获取像素的平均值会导致沿着图像边界平滑过渡吗?您能否提供一个关于 200x200 大小的图像的非常简单的示例。
  • 我无法确定它是否会让人窒息,但它认为因为每个像素都会参与多个图块,所以它会更紧密地连接到它的邻居,抱歉,但我无法提供示例。
【解决方案2】:

从图像看来,您正在处理大约 400x800 分辨率的图像。为此,V100 GPU 的 16GB-32GB 内存应该足以满足具有不错模型容量的批量大小!即使没有,您也可以使用混合精度甚至 fp16 将内存利用率降低 2 到 4 倍。

如果您的分辨率太高而无法发挥这些技巧,那么理想情况下,您需要通过在 GPU 上拆分图像块(空间分区)来实现模型并行化方法,并在计算图中的这些域之间交换张量。向后传球。这将使补丁保持一致,但可能会导致严重的性能瓶颈!

您可以看看这个 UNET 架构,您必须将其从 Conv3D 转换为 Conv2D,并从分段切换到去噪任务。

https://github.com/tensorflow/mesh/blob/master/mesh_tensorflow/experimental/unet.py

【讨论】:

  • 将尝试后一种解决方案。我正在处理最小 1000x1000 灰度的图像。我只裁剪了一部分以使其清晰
  • 对于此架构,您可能必须在 GCP 中使用 TPU 内核。他们没有很好地解释如何在 GPU 上运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 2018-10-07
  • 1970-01-01
相关资源
最近更新 更多