【问题标题】:Python - load lots of images without using all available ramPython - 在不使用所有可用内存的情况下加载大量图像
【发布时间】:2016-09-02 02:26:34
【问题描述】:

我有大约 1.5 GB 的图像需要处理。问题是当我尝试将它们加载为 np 数组时,我似乎用完了我所有的 ram (8 GB)。

这是我加载图片的方法:

def load_image( infilename ) :
    img = Image.open( infilename )
    img.load()
    data = np.asarray( img, dtype="int32" )
    img.close()
    del img
    return data

我认为关闭和删除 img 会有所帮助,但事实并非如此。这和垃圾回收有关系吗?

循环遍历文件名列表中所有图像的代码:

for i in range(len(files)):
    imgArray = imgs.load_image(files[i])
    images.append(imgArray)
    shapes.append(np.shape(imgArray))

有没有更好的办法?

【问题讨论】:

  • JPEG 等图像类型是经过压缩的,因此当您打开它们时,它们会在内存中解压缩为全尺寸。您可能必须一次处理一个。
  • 另外,如果原始图像是 8 位的,那么将它们转换为 32 位浮点数将使您的内存需求翻两番
  • 如果您能解释在加载图像后您将如何处理这些图像,也许我们可以提供更多帮助。您可能不需要所有图像同时存在于内存中吗?
  • @Yasser,我不需要它们,同时我将调整大小然后裁剪然后保存。但问题是我需要它们的尺寸宽度和高度的平均值来标准化所有它们。
  • @Kevin 每个图像保存一个 (width, height) 值的元组需要更少的 RAM,而不是整个图像数组...

标签: python image numpy python-imaging-library


【解决方案1】:

您也许可以使用手动垃圾回收来清除循环之间的一些内存:

def memclear():
    import gc   #garbage collector
    cleared = gc.collect()

    print(cleared)

在每个循环结束时调用:memclear(),所以:

for i in range(len(files)):
    imgArray = imgs.load_image(files[i])
    images.append(imgArray)
    shapes.append(np.shape(imgArray))
    memclear()

希望这可以解决它。我假设这被否决了,因为它手动调用垃圾清理,这通常是不受欢迎的,但不幸的是,有时它似乎是必要的。

【讨论】:

  • 我确实尝试过这样的事情,但不确定它是否会导致过多的开销。
【解决方案2】:

使用 PIL 一个一个地加载图像文件以获取它们的大小元组,收集关于平均值的统计信息以及其他的统计信息,然后在 numpy 或 PIL 中再次打开它们以进行实际处理,这可能是值得的。您可能还想考虑对统计部分进行采样,这样您就不需要加载所有这些部分,而且无论如何它应该花费那么长时间,PIL 相对有效。

【讨论】:

  • 我实际上只取了 5% 的图像样本来计算平均值,然后从那里一次加载 100 张图像并处理它们,直到它遍历所有图像。感谢您的想法!
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2011-08-26
  • 2012-11-23
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多