【问题标题】:MemoryError when trying to normalize an array of images尝试标准化图像数组时出现内存错误
【发布时间】:2021-06-06 18:36:57
【问题描述】:

我有一个包含 110k 图像的文件夹,每个图像的形状为 (256, 256, 3)。我正在一一阅读,转换为一个 numpy 数组并存储在一个列表中。之后,我将列表转换为 numpy 数组。 numpy 数组的形状为 (110000, 256, 256, 3)。然后,当我尝试使用 images = images / float(255) 标准化图像时,会显示此错误:

 File "loading_images.py", line 25, in <module>
    images = images / float(255)
MemoryError: Unable to allocate 161. GiB for an array with shape (110000, 256, 256, 3) and data type float64

还有其他方法吗?

我当前的代码是这样的:

files = glob.glob(dir + "*.png")
images = []
for f in files
    im = cv2.imread(f)
    img_arr = np.asarray(im)
    images.append(img_arr)

images = np.asarray(images)
images = images / float(255)
 

【问题讨论】:

  • 你可以使用 dask: stackoverflow.com/questions/56620786/… 。 Dask 的有趣之处在于您可以加载大量数据,并且仅在需要时才实际读取这些值!
  • 谢谢!我从 keras 搜索并找到了 ImageDataGenerator。它可以加载大量数据并对其进行规范化。

标签: python image numpy dataset normalize


【解决方案1】:

认为您的问题是 cv2 给出了一个 int8(如果我错了,请纠正我),而您正试图将这些值转换为 float64

import numpy as np 
print(np.float64(255).itemsize)
print(np.int8(255).itemsize)

这意味着在类型转换之后,您剩下大约 8 倍的字节数。你有 110000×256×256×3=21GB 的图像数据开始,这可能刚好在你的 RAM 限制之内。转换为浮点数后,您将获得 8x21 = 168GB 的​​数据,这超出了我认识的任何人的 RAM 限制哈哈。

但这不是解决办法,您真的需要同时加载所有图像吗?

【讨论】:

  • 我想是的,因为我试图将它们用作 ResNet-50 的输入。 (test_im, test_lab) = load_test_images(path_test_images) (train_im, train_lab) = load_train_images(path_train_images)
  • 嗯,很遗憾,我没有这方面的经验,但无法想象它们只需要浮点数作为输入,你确定你不能只加载由整数描述的图像吗?到目前为止,我使用的任何图像库都只使用良好的旧整数:P ResNet-50 是否有机会将文件作为输入?那么您可能会按顺序将图像保存为浮点数组。
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多