首页 > 解决方案 > cv.imread 的内存问题

问题描述

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

''' #Images (512x512x3) X_data = [] files = glob.glob ('C:\Users\77901677\Projects\images1\*.png') for myFile in files: image = cv2.imread (myFile) X_data.附加(图像)

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)

'''

欢迎任何想法或建议

标签: pythonnumpytensorflowkeras

解决方案


您可以通过削减其中一个变量来减少内存,因为您目前拥有 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 序列生成器,它将在训练阶段将您的文件批量加载(类似于此产量生成器)到您的模型。我在这里推荐这篇文章,它演示了它的简单实现,它是我用于我的 keras/tf 模型管道的。

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


推荐阅读