【问题标题】:How to merge multiple images from CNN prediction into one image?如何将来自 CNN 预测的多张图像合并为一张图像?
【发布时间】:2021-02-17 10:51:22
【问题描述】:

我在 Keras 中使用 CNN 构建模型,现在我想使用所有图像进行最终预测。 这是我的输入和标签的尺寸:

X_pred, y_pred=next(pred_generator)
X_pred.shape, y_pred.shape

结果:

((132, 64, 64, 3), (132, 64, 64, 1))

这是预测代码:

pred_64= model.predict(X_pred)
pred_64.shape

结果:

(132, 64, 64, 1)

很明显,有 132 个预测图像,大小为 64X64。 我想合并每 4 个图像以创建大小为 128X128 的单个图像。最后,通过合并从 model.predict 生成的每 4 个图像,我应该有 33 个图像。

这是一个关于图像以 128X128 尺寸保存时的顺序的示例。

添加交换轴代码后,​​图像将旋转如下:

pred_128 = pred_64.reshape(66, 128, 64, 1).swapaxes(1, 2).reshape(33, 128, 128, 1)

我添加了np.transpose,如下所示。它有助于纠正旋转,但图像 2 替换了图像 3,反之亦然。你能帮我解决这个问题吗?

pred_128 = pred_64.reshape(66, 128, 64, 1).swapaxes(1, 2).reshape(33, 128, 128, 1)
pred_128= np.transpose(pred_128, [0, 2, 1, 3])

【问题讨论】:

    标签: arrays numpy multidimensional-array transpose


    【解决方案1】:

    您可能认为重塑可以解决问题,但排序有点棘手。小心swapaxes 是可能的。以下行将解决问题:

    pred_128 = pred_64.reshape(66, 128, 64, 1).swapaxes(1, 2).reshape(33, 128, 128, 1)
    

    下面给出了一个例子来说明这一点。在这里,我首先创建一个数组a,其中包含四个不同的对角矩阵。然后我按照您希望看到打印结果的方式将它们放在一起。

    import numpy as np
    
    a = np.zeros((4, 2, 2, 1))
    for i in range(0, 4):
        a[i, :, :, 0] = np.eye(2) * (i+1)
    
    b = a.reshape(2, 4, 2, 1).swapaxes(1, 2).reshape(1, 4, 4, 1)
    print(b[0, :, :, 0])
    

    结果:

    [[1. 0. 2. 0.]
     [0. 1. 0. 2.]
     [3. 0. 4. 0.]
     [0. 3. 0. 4.]]
    

    【讨论】:

    • 这种方法不能正确地将每 4 个图像合并为一个。它只会将一张图像复制到 128X128 尺寸。请看问题。我添加了一个图像,说明图像的顺序应该如何在输出中。有没有其他方法可以解决?
    • 重塑,如果正确完成,应该可以工作。一个更强力的解决方案是遍历每四个输入图像并将它们连接在一起。参见例如np.concatenate
    • @Sam 要使重塑工作,您还需要在重塑每个维度之间交换轴,请参阅我的编辑。
    • @ Jan Willem,感谢您的回复。我想我们已经接近答案了。应用新代码后,图像被旋转。我将前 4 张原始图像和生成的图像放在问题中。请看一看。
    • @Sam 最后的转置效果如何? IE。使用pred_128 = pred_64.reshape(66, 128, 64, 1).swapaxes(1, 2).reshape(33, 128, 128, 1).T
    【解决方案2】:

    我仍然希望我们可以使用 reshapes 来解决问题,但同时这里有一个更暴力的解决方案:

    
    # Initializing counters
    i = 0  # Old image number
    j = 0  # New image number
    
    # Pre-allocate new images array
    pred_128 = np.zeros((33, 128, 128, 1))
    
    # Loop over new images
    while j < 33:
        pred_128 [j, :64, :64, 0] = pred_64[0+i, :, :, 0]  # Upper left
        pred_128 [j, :64, 64:, 0] = pred_64[1+i, :, :, 0]  # Upper right
        pred_128 [j, 64:, :64, 0] = pred_64[2+i, :, :, 0]  # Lower left
        pred_128 [j, 64:, 64:, 0] = pred_64[3+i, :, :, 0]  # Lower right
    
        # Add to counters
        i += 4
        j += 1
    
    

    【讨论】:

    • @ Jan Willem,您提供了巨大的帮助,它适用于我的图像。有没有办法通过问题中提到的重塑和转置来解决它?
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2022-07-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2016-09-20
    • 2014-07-18
    相关资源
    最近更新 更多