繁体   English   中英

Keras:将所有图像保存在一个目录中

[英]Keras: keep all images in a single directory

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

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

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

然后,您只能使用id(或图像名称)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)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM