如何在不耗尽内存的情况下将14,000个图像数据集加载到变量中?

问题描述

我正在尝试创建一个函数,以将14,000张图像的大图像数据集加载到变量中,但遇到内存(RAM)问题。

我要制作的是类似cifar100.load_data函数,但对我来说不起作用。

我定义的函数如下:

    def load_data():
        trn_x_names=os.listdir('data/train_x')
        trn_y_names=os.listdir('data/train_y')
    
        trn_x_list=[] 
        trn_y_list=[]
    
        for image in trn_x_names[0:]:
            img=cv2.imread('data/train_x/%s'%image)
            img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
            trn_x_list.append(img)
        
        for image in trn_y_names[0:]:
            img=cv2.imread('data/train_y/%s'%image)
            img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
            trn_y_list.append(img)
        
        x_train= np.array(trn_x_list)
        y_train= np.array(trn_y_list)
        return x_train,y_train

我首先一张一张地加载所有图像,将它们添加到相应的列表中,最后将这些列表更改为numpy数组,并将其分配给某些变量并返回它们。但是在途中,我遇到了RAM问题,因为它消耗了我100%的RAM。

解决方法

您需要分批读取图像,而不是将整个数据集加载到内存中。如果您正在使用tensorflow,请使用ImageDataGenerator.flowfrom目录。文档为here.。如果您的数据未组织到子目录中,则需要创建一个python生成器,以分批读取数据。您可以看到如何构建这样的生成器here.。将批次大小设置为一个值30,该值将不会占用您的内存。