是什么原因导致我的Python程序使用OpenCV用完了内存



我编写了一个程序,使用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创建存储在磁盘上的数组
  • 通过转换为灰度和/或减少分辨率来降低图像的质量。
  • 在少量图像上训练模型。

最新更新