首页 > 解决方案 > 从路径加载大量图像并将其转换为大小为 (n,224,224,3) 的数组

问题描述

我目前正在加载图像,从中创建一个数组并将其附加到一个列表中。可悲的是,对于我要加载的图像数量(20k),这似乎耗尽了我所有的 RAM。

代码:

def convert_image_to_array(files,relpath):
    images_as_array=[]
    len_files = len(files)
    i = 0
    print("---ConvImg2Arr---")
    print("---STARTING---")
    for file in files:
        images_as_array.append(img_to_array(load_img(relpath+file, target_size=(soll_img_shape, soll_img_shape)))/255)
        if i == int(len_files*0.2):
            print("20% done")
        if i == int(len_files*0.5):
            print("50% done")
        if i == int(len_files*0.8):
            print("80% done")

        i +=1
    print("---DONE---")
    return images_as_array

使用来自 train_test_split 的 X_train 调用它:

x_train =  convert_image_to_array_opt(X_train,rel_path)

加载所有这些图像的更有效方法是什么?

编辑:

使用 Keras 的 .flow_from_directory() 解决了我的问题,但我仍然想知道如何按照我尝试的方式完成。

标签: pythonlistnumpykeras

解决方案


假设该方法load_img不是瓶颈,convert_image_to_array_opt将所有图像(20k)加载到内存中。但是,flow_from_directory方法一次只加载一个图像池(典型的批量大小为 32、64、... 1024)

重新设计的一种可能方法是convert_image_to_array_opt将批量大小作为参数并加载和仅yield加载bath_size图像(连同标签)的 numpy 数组。并且在训练时枚举convert_image_to_array_opt返回 batch_size X 和 y 的方法,您可以在这些方法上进行训练。


推荐阅读