将图像转换为数组时出现内存错误

数据挖掘 Python 深度学习 喀拉斯 美国有线电视新闻网 计算机视觉
2022-03-02 23:55:20

我正在研究面部识别用例。我有 57k jpg 图像并将它们转换为数组。执行程序时,出现内存错误。

我正在使用的功能:

def image_array(l):
    features = []
    for pgm in l:
        pic = image.load_img(pgm, target_size=(224, 224))
        x = image.img_to_array(pic)
        x = np.expand_dims(x, axis=0)
        x = preprocess_input(x)
        features.append(x)
    npfeatures = np.array(features)
    img_dt = np.rollaxis(npfeatures, 1, 0)
    return img_dt[0]

此函数的输入是一个列表,如下所示:

l =['/home/user/image1.jpg','/home/user/image2.jpg','/home/user/image3.jpg'......]

我得到的错误:

Traceback (most recent call last):
  File "FR.py", line 145, in <module>
    vec_image1 = image_array(final_df['image1'].values.tolist())
  File "FR.py", line 140, in image_array
    npfeatures = np.array(features)
MemoryError

我用于上述功能的导入是:

> from keras.preprocessing import image 
> from keras.applications.vgg16 import preprocess_input
1个回答

您实际上可以计算在内存中保存 57,000 张图像需要多少内存(很多!)。您还持有它们两次:一次在features列表中,然后在npfeatures. 第二部分将制作整个features列表的完整副本。因此,为什么它在那里内存不足。

以下是一些可以帮助您了解方法的局限性并可能获得可行方法的开始步骤:

1.你不需要这一行x = np.expand_dims(x, axis=0)::

他们在 Keras 文档中这样做了,因为您需要单个图像来为批量大小提供额外的维度。您不需要这样做,因为您将许多图像附加到列表 ( features) 中,并且该列表的长度是相同的,即批量大小(图像的数量)。

2.自己做缩放

在 f VGG16(我相信是 19)的情况下,该preprocess_input方法只是在 -1 和 +1 之间缩放像素值。你可以自己做的更轻一些。您可以像这样对 numpy 数组进行缩放:

x = (x / 127.5 - 1)

...现在删除行preprocess_input

3. 把它分解成更小的部分:

然后,您可以将它们直接输入您的模型(如果可能的话),或者将它们保存npfeatures到磁盘,一次一个块。

4. 尝试在运行此脚本时查看您的机器有多少内存:

在 之后添加一个简单的行features.append(x),如下所示:

print("Loaded {} images"format(len(features)))

如果您在 Linux 机器或 Mac OSX 上运行它,请尝试在终端中使用htop 之类的工具。还有系统监视器......对于Windows也是如此。您应该能够看到内存消耗一直在增长,直到您的脚本崩溃为止。现在您知道在一个周期内您可以制作多少张图像 - 崩溃前最后打印的数字。