Python Keras在训练后合并成批的单个图像

Python Keras在训练后合并成批的单个图像,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我使用自动编码器去噪高分辨率的灰度图像。每个图像被分成特定大小的子批次,即52 x 52,模型在每个批次上工作,然后结果是将每个图像中的去噪批次连接回原始批次。以下是结果后的图像示例: 连接后,您可以看到较小的图像批次。如何克服这种行为 我考虑过做进一步的处理,比如给边缘添加模糊来将它们混合在一起,但是我认为这不是最佳解决方案 连接代码: num_hor_patch = 19 num_ver_patch = 26 print("Building the Images Batche

我使用自动编码器去噪高分辨率的灰度图像。每个图像被分成特定大小的子批次,即
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

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

  • 去噪自动编码器,获得52x52图像
  • 尺寸为HxW的图像,其中W>>52和H>>52
问题是如何使用自动编码器去噪图像

您当前的解决方案是:

  • 将图像分割为不重叠的平铺
  • 对于每个磁贴,使用自动编码器进行去噪
  • 将得到的去噪图块连接起来以形成原始图像
  • 此解决方案会导致瓷砖之间的接缝非常不一致

    我认为您需要使用重叠平铺和非非重叠平铺

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

    每个像素的最终值将是该像素所属的所有分幅的值的平均值

    新的解决方案:

  • 将图像分割为重叠的平铺(平铺越多,结果越闷)
  • 对于每个磁贴,使用自动编码器进行去噪
  • 对于最终图像中的每个像素,从像素所属的所有平铺中获取平均值

  • 从图像中可以看出,您正在处理的是~400x800分辨率的图像。对于这一点,V100 GPU的16GB-32GB内存应该足以满足具有适当型号容量的适当批量大小!即使没有,您也可以使用混合精度甚至fp16将内存利用率降低2到4倍

    如果您的分辨率太高,无法玩这些把戏,那么理想情况下,您需要通过在GPU上分割图像块(空间分区),并在向前和向后传递期间在计算图中的这些域之间交换张量来实现模型并行方法。这将使修补程序保持一致,但可能会导致严重的性能瓶颈

    您可以看看这个UNET体系结构,它必须从Conv3D转换到Conv2D,并从分割转换到去噪任务


    你好!为什么不将整个图像立即传递到自动编码器并获得结果?这也会缩短你的推理时间。此外,坚持你目前的方法,你也可以遵循这一点。谢谢你的评论@RishabP。不幸的是,这些图像无法放入可用的内存中。如果您推荐了另一种解决方案使之成为可能,请用它回答问题!你能告诉我,你如何确保从重叠的瓷砖中获取像素的平均值会导致沿着图像边界的平滑过渡?你能提供一个大小为200x200的图像的非常简单的例子吗?我不能确定它是否会窒息,但它认为,因为每个像素都将参与几个瓷砖,它将更接近它的黑鬼,很抱歉,我不能提供一个例子。我将尝试后一种解决方案。我正在处理最小1000x1000灰度的图像。我只裁剪了一部分,以明确您可能需要在GCP中使用TPU内核来实现此体系结构。他们没有很好地解释如何在GPU上运行它。