我编写了一个程序,使用Python的OpenCV读取图像,并试图加载3 GB图像,但该程序中止了。我的PC上有32 GB的内存,但是当我运行此程序时,它将用尽它。原因是什么?
未发出错误消息,并且PC异常沉重。我用Ubuntu的系统监视器确认了这一点,并且它用尽了内存和交换。
我将图像导入一个数组,以传递到Tensorflow深度学习程序。图像的大小为200 x 200颜色图像。
我使用64位版本的Python。
import os
import numpy as np
import cv2
IMG_SIZE = 200
def read_images(path):
dirnames = sorted(os.listdir(path))
files = [sorted(os.listdir(path+dirnames[i]))
for i in range(len(dirnames))]
i = 0
images = []
for fs in files:
tmp_images = []
for f in fs:
img = cv2.imread(path +dirnames[i] + "/" + f)
img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
img = img.flatten().astype(np.float32)/255.0
tmp_images.append(img)
i = i + 1
images.append(tmp_images)
return np.asarray(images)
耗尽内存的原因:
-
图像文件大小和内存中相应数组的大小不同。图像,例如PNG和JPEG格式被压缩。相应的未压缩BMP图像的大小在这里更相关。另外,
ndarray
具有一些使其更大的元信息。 -
从
uint8
转换为float32
将大小乘以4。尽可能避免这种情况(我识别uint8
施加了一些局限性,例如无法正常化和中心数据)。
可能的补救措施:
- 使用numpy.memmap创建存储在磁盘上的数组
- 通过转换为灰度和/或减少分辨率来降低图像的质量。
- 在少量图像上训练模型。