什么导致我的Python程序使用opencv耗尽内存?

时间:2017-11-24 13:16:30

标签: python image numpy opencv memory

我编写了一个使用Python的opencv读取图像的程序,并尝试加载3 GB图像,但程序已中止。 我的电脑上有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)

1 个答案:

答案 0 :(得分:0)

内存不足的原因:

  • 图像文件大小和内存中相应数组的大小不同。压缩图像,例如PNG和JPEG格式。相应的未压缩BMP图像的大小在此更相关。此外,ndarray包含一些元信息,使其更大一些。

  • float32转换为uint8会将大小乘以4.尽可能避免这种情况(我认为uint8会产生一些限制,例如无法规范化和居中数据)。

可能的补救措施:

  • 使用numpy.memmap创建存储在磁盘上的数组
  • 通过转换为灰度和/或降低分辨率来降低图像质量。
  • 在较少数量的图像上训练模型。