【问题标题】:How to reshape a 3D numpy array?如何重塑 3D numpy 数组?
【发布时间】:2017-11-11 02:01:06
【问题描述】:

我有一个 numpy 数组列表,它们实际上是我的 CNN 的输入图像。然而,我的每张图像的大小都不一致,我的 CNN 只拍摄尺寸为 224X224 的图像。如何将每个图像重塑为给定尺寸? print(train_images[key].reshape(224, 224,3))

给我一​​个输出

ValueError: total size of new array must be unchanged 如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 您选择了哪种形状更改是正确的 - 缩放、裁剪、填充?忘记此应用程序的np.reshape。

标签: python numpy deep-learning conv-neural-network


【解决方案1】:

标准方法是调整图像大小,使较小的一侧等于 224,然后将图像裁剪为 224x224。将图像大小调整为 224x224 可能会扭曲图像并导致错误的训练。例如,如果图像不是正方形,圆形可能会变成椭圆。保持原始纵横比很重要。

【讨论】:

  • 但是,将较小的尺寸调整为 224 不会影响图像的纵横比
  • 仔细阅读 - 我说resize the image such that the smaller side is equal to 224 不能只调整一侧的大小。
  • 嗯...对不起我的错。但是裁剪图像会导致信息丢失。不过感谢您的回答:)
  • 没错,裁剪图像会导致信息丢失,但人们通常会从图像中间附近裁剪,假设感兴趣的对象保持完整。此外,您可能会使用大量冗余信息制作多个作物。这实际上有助于提高您的训练准确性,并且是一种流行的数据增强方法。
【解决方案2】:

在重新整形时,新数组应该具有相同数量的值。您需要的是裁剪图片(如果它大于 224x224)和填充(如果它小于 224x224)或在这两种情况下调整大小。

裁剪只是使用正确的索引进行切片:

def crop(np_img, size):
    v_start = round((np_img.shape[0] - size[0]) / 2)
    h_start = round((np_img.shape[1] - size[1]) / 2)
    return np_img[v_start:v_start+size[1], h_start:h_start+size[0],:]

填充稍微复杂一些,这将创建一个所需形状的 zeros 数组并在里面插入图像的值:

def pad_image(np_img, size):
    v_start = round((size[0] - np_img.shape[0]) / 2)
    h_start = round((size[1] - np_img.shape[1]) / 2)

    result = np.zeros(size)
    result[v_start:v_start+np_img.shape[1], h_start:h_start+np_img.shape[0], :] = np_img

    return result

你也可以使用np.pad函数:

def pad_image(np_img, size):
    v_dif = size[0] - np_img.shape[0]
    h_dif = size[1] - np_img.shape[1]
    return np.lib.pad(np_img, ((v_dif, 0), (h_dif, 0), (0, 0)), 'constant', constant_values=(0))

您可能意识到两个函数的填充有点不同,我不想让问题过于复杂,只是在第二个函数的顶部和左侧填充。双方都在第一个,因为它更容易计算。

最后,为了调整大小,您最好使用另一个库。您可以使用scipy.misc.imresize,它非常简单。应该这样做:

imresize(np_img, size)

【讨论】:

  • 嘿,感谢@umoto 的解决方案,非常感谢。
【解决方案3】:

以下是我知道的几种实现方式:

  1. 由于您使用的是python,您可以使用cv2.resize(),将图像大小调整为224x224。这里的问题将是失真。
  2. 缩放图像以调整到所需尺寸之一(W=224 或 H=224)并剪掉多余的部分。这里有信息丢失。
  3. 如果您有较大的图像和边界框,请使用一些 delta 到边界框来保持纵横比,然后将大小调整为所需的大小。

当你重塑一个 numpy 数组时,尺寸的产生必须匹配。如果没有,它会像你一样抛出ValueError。 AFAIK,没有使用 reshape 来解决您的问题的解决方案。

【讨论】:

    猜你喜欢
    • 2016-02-10
    • 2021-08-06
    • 1970-01-01
    • 2018-03-17
    • 2017-09-18
    • 2020-04-22
    • 2016-05-22
    • 2021-10-14
    • 2019-07-10
    相关资源
    最近更新 更多