python - 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)
'''
欢迎任何想法或建议
解决方案
您可以通过削减其中一个变量来减少内存,因为您目前拥有 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 模型管道的。
在为我们的模型提供大量数据时,使用生成器是一种很好的做法。
推荐阅读
- python - 如何从迭代器/生成器中获取第一个元素并将其放回 Python 中?
- c - 动态 fscanf 成数组
- angular - 错误:无法匹配任何路由。URL 段:'' 角度 7
- javascript - XLSX 填充:“错误:找不到中央目录的结尾:这是一个 zip 文件吗?” - 在角
- javascript - 如何在 React App 中嵌入 Google 自定义搜索?
- c# - 尝试通过 csc 编译时出现错误 CS0246、CS1504 和 CS2015
- django - Django:来自模型、视图或从哪里的命令管理调用?
- android - Flutter:列表中的火库
- statistics - 翻转三面硬币
- docker - Docker:如何在 /var/lib/docker/overlay2/* 空间释放/限制卷/层?