【问题标题】:Keras: keep all images in a single directoryKeras:将所有图像保存在一个目录中
【发布时间】:2017-11-21 11:02:47
【问题描述】:

我处理存储在单个目录中的许多图像(10M+)(每个类没有子文件夹),并使用 pandas DataFrame 来跟踪类标签。图像的数量不适合内存,所以我必须从磁盘读取小批量。到目前为止,我使用了 Keras .flow_from_directory(),但它需要我将图像移动到每个类(以及每个训练/验证拆分)的一个子文件夹中。它工作得很好,但是当我想使用不同的图像子集并以各种方式定义类时,它变得非常不切实际。有没有人有替代策略使用数据库(例如 pandas.DataFrame)来跟踪小批量的读取而不是将图像移动到子文件夹?

【问题讨论】:

    标签: python machine-learning keras deep-learning generator


    【解决方案1】:

    您需要一个自定义数据生成器。

    import numpy as np
    import cv2
    def batch_generator(ids):
        while True:
            for start in range(0, len(ids), batch_size):
                x_batch = []
                y_batch = []
                end = min(start + batch_size, len(ids))
                ids_batch = ids[start:end]
                for id in ids_batch:
                    img = cv2.imread(dpath+'train/{}.jpg'.format(id))
                    #img = cv2.resize(img, (224, 224), interpolation = cv2.INTER_AREA)
                    labelname=df_train.loc[df_train.id==id,'column_name'].values
                    labelnum=classes.index(labelname)
                    x_batch.append(img)
                    y_batch.append(labelnum)
                x_batch = np.array(x_batch, np.float32) 
                y_batch = to_categorical(y_batch,120) 
                yield x_batch, y_batch
    

    然后你可以只使用 ids(或图像名称)numpy 数组调用生成器,如下所示:

    model.fit_generator(generator=batch_generator(ids_train_split), \
                   steps_per_epoch= \ 
                   np.ceil(float(len(ids_train_split)) / float(batch_size)),\
                    epochs=epochs, verbose=1, callbacks=callbacks, \
                    validation_data=batch_generator(ids_valid_split), \
                    validation_steps=np.ceil(float(len(ids_valid_split)) / float(batch_size)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2023-03-19
      相关资源
      最近更新 更多