首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras训练后合并单幅图像的批次

Keras训练后合并单幅图像的批次
EN

Stack Overflow用户
提问于 2020-07-14 00:52:24
回答 2查看 219关注 0票数 4

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

你可以在拼接后看到更小的图像批次。如何克服这种行为?

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

拼接代码:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2020-07-30 10:30:58

从图像上看,您正在处理分辨率约为400x800的图像。为此,16 be 32 be的V100 GPU的内存应该足够一个像样的批量大小与一个像样的模型容量!即使不是这样,您也可以使用混合精度甚至fp16将内存利用率降低2到4倍。

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

你可以看看这个UNET架构,你必须从Conv3D转换到Conv2D,并从分割切换到去噪任务。

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

票数 1
EN

Stack Overflow用户

发布于 2020-07-24 03:17:26

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

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

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

您当前的解决方案是:

对于每个瓦片,将图像划分为不重叠的瓦片和非重叠瓦片使用autoencoder

  • Concatenate对得到的去噪瓦片进行去噪,以形成原始图像

这种解决方案在瓷砖之间的接缝中产生了非常不一致的结果。

我认为您需要使用重叠 tiles,而不是非重叠 tiles。

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

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

新的解决方案:

  1. 将图像分割为多个重叠的平铺( tiles )
  2. 对于每个平铺使用autoencoder
  3. For进行去噪最终图像中的每个像素取该像素所属的所有平铺的平均值。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62880561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档