【问题标题】:Memory issue with cv.imreadcv.imread 的内存问题
【发布时间】:2021-12-10 20:47:00
【问题描述】:

我尝试将大量 (54K) 512x512x3 .png 图像读入一个数组,然后创建一个数据集并提供给 Keras 模型。我正在使用下面的代码,但是我得到了指向我代码第四行的 cv2.OutofMemory 错误(在图像 50K 左右...)。我一直在阅读有关它的信息,并且:我使用的是 64 位版本,并且图像无法调整大小,因为它是固定的输入表示。有什么可以从内存管理方面做的事情来使它工作吗?

''' #图片 (512x512x3) X_data = [] 文件 = glob.glob ('C:\Users\77901677\Projects\images1\*.png') 对于文件中的 myFile: 图像 = cv2.imread (myFile) X_data.append(图片)

dataset_image = np.array(X_data)

# Annontations (multilabel) 512x512x2
Y_data = []
files = glob.glob ('C:\\Users\\77901677\\Projects\\annotations1\\*.png')
for myFile in files:
    mask = cv2.imread (myFile)
    # Gets rid of first channel which is empty
    mask = mask[:,:,1:]
    Y_data.append (mask)
dataset_mask = np.array(Y_data)

'''

欢迎任何想法或建议

【问题讨论】:

  • 又快又脏可能是在错误之前停止加载?丢弃约 10% 的数据不会对您造成太大影响……
  • 感谢@Julien 的回复。是的,这是一个很好的观点,如果没有更好的结果,肯定会这样做:)
  • 不要一次将所有图像加载到内存中。见machinelearningmastery.com/…
  • 嗨@Miki,这也是个好主意。但是,查看 image_dataset_from_directory 我不确定它的“标签”参数是否可以支持我的用例。我想做多标签语义分割,所以我的标签是 512x512x2,每个像素包含两个类。

标签: python numpy tensorflow keras


【解决方案1】:

您可以通过削减其中一个变量来减少内存,因为此时您有 2 倍的数组。

您可以为此使用yield,从而创建一个生成器,它一次只会加载一个文件,而不是将其全部存储在辅助变量中。

def myGenerator():
    files = glob.glob ('C:\\Users\\77901677\\Projects\\annotations1\\*.png')
    for myFile in files:
        mask = cv2.imread (myFile)
        # Gets rid of first channel which is empty
        yield mask[:,:,1:]

# initialise your numpy array here
yData = np.zeros(NxHxWxC)

# initialise the generator
mygenerator = myGenerator() # create a generator
for I, data in enumerate(myGenerator):
    yData[I,::] = data # load the data

但是,这对您来说不是最佳选择。如果您打算在下一步中训练模型,那么您肯定会遇到内存问题。在 keras 中,您还可以实现一个 Keras 序列生成器,它将在训练阶段将您的文件批量加载(类似于此产量生成器)到您的模型。我推荐这篇文章here,它演示了它的简单实现,这是我用于 keras/tf 模型管道的。

在为我们的模型提供大量数据时使用生成器是一种很好的做法。

【讨论】:

  • 谢谢迪尼斯,这真的很有用。
  • 我刚刚开始实现这一点,虽然该方法很有意义,但它适用于图像分类。从单个图像分类中调整它是一个挑战,标签为 1、2...等 >>> 标签 {'id-1': 0, 'id-2': 1, 'id-3': 2, 'id-4': 1} 对于我的情况(多)标签 512x512x2,这也需要一些预处理(我在上面的 for 循环中做了)。我现在正在努力将其塑造成一种可以传递给上面的字典并继续使用方法的格式。任何建议将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2011-02-24
  • 2015-04-29
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多