我可以在MacOS上使用Keras ImageDataGenerator()。flow_from_directory跳过文件吗?

时间:2018-12-27 12:30:59

标签: python keras

我已经下载了一个包含7个类别的10个图像的图像集,总共70张图像。但是,每个类文件夹中现在有20个文件:已为每个单独的.jpeg文件创建了._(点下划线)文件。如果运行os.listdir(),我只能看到它们,这意味着使用Finder无法看到它们。我可以尝试使用os命令移动它们,但是我不确定这会对系统造成什么影响。

是否可以以任何方式解决这些._文件?

['51.jpeg', '._.DS_Store', '._57.jpeg', '._56.jpeg', '.DS_Store', '50.jpeg', '._51.jpeg', '57.jpeg', '56.jpeg', '._50.jpeg', '._53.jpeg', '59.jpeg', '55.jpeg', '54.jpeg', '58.jpeg', '._52.jpeg', '._59.jpeg', '53.jpeg', '._55.jpeg', '._54.jpeg', '52.jpeg', '._58.jpeg']

编辑:为ImageDataGenerator添加了代码

def generator(set_type, TARGET_SIZE, BATCH_SIZE, CLASSES, RANDOM_SEED):
    '''
    set_type (str): "train", "test", "validation"
    returns: ImageDataGenerator().flow_from_directory
    '''
    data_dir = './' + set_type + '_data_keras'
    return ImageDataGenerator().flow_from_directory(data_dir,
                                                    target_size = TARGET_SIZE,
                                                    batch_size = BATCH_SIZE,
                                                    classes = CLASSES,
                                                    seed = RANDOM_SEED)


TARGET_SIZE = (224, 224)
BATCH_SIZE = 5
CLASSES = ['5', '10', '20', '50', '100', '200', '500']
RANDOM_SEED = 0

train_generator = generator('train', TARGET_SIZE, BATCH_SIZE,
                            CLASSES, RANDOM_SEED)
validation_generator = generator('validation', TARGET_SIZE, BATCH_SIZE,
                                 CLASSES, RANDOM_SEED)

flow_from_directory正在寻找要搜索CLASSES的目录,所以我正在寻找一种绕过._文件的方法

3 个答案:

答案 0 :(得分:1)

我来晚了一点,但对于仍在寻找答案的任何人: 您可以在数据框中获得有效的文件名及其标签,然后使用flow_from_dataframe函数而不是flow_from_directory。 此函数以dataframe, directory, x_col = image_names/paths, y_col=labels作为参数。其余功能与“ flow_from_directory”完全相同。 您可以在以下官方文档中找到有关示例的更多信息:https://keras.io/preprocessing/image/#flow_from_dataframe

希望这会有所帮助!

答案 1 :(得分:0)

当然,您可以过滤文件。我添加了三种不同的解决方案:

files = ['51.jpeg', '._.DS_Store', '._57.jpeg', '._56.jpeg', '.DS_Store',
         '50.jpeg', '._51.jpeg', '57.jpeg', '56.jpeg', '._50.jpeg', '._53.jpeg',
         '59.jpeg', '55.jpeg', '54.jpeg', '58.jpeg', '._52.jpeg', '._59.jpeg',
         '53.jpeg', '._55.jpeg', '._54.jpeg', '52.jpeg', '._58.jpeg']

通过字符串匹配进行过滤:

[f for f in files if str(f).strip().endswith('.jpeg') and not str(f).strip().startswith('._')]
# ['51.jpeg', '50.jpeg', '57.jpeg', '56.jpeg', '59.jpeg', '55.jpeg', '54.jpeg', '58.jpeg', '53.jpeg', '52.jpeg']

通过与filter匹配的字符串进行过滤:

list(filter(lambda f: str(f).strip().endswith('.jpeg') and not str(f).strip().startswith('._'), files))
# ['51.jpeg', '50.jpeg', '57.jpeg', '56.jpeg', '59.jpeg', '55.jpeg', '54.jpeg', '58.jpeg', '53.jpeg', '52.jpeg']

通过带有filter的正则表达式进行过滤:

import re
list(filter(lambda f: re.match(r"^(?!\.)[\w]+(\.jpeg)$", f), files))
# ['51.jpeg', '50.jpeg', '57.jpeg', '56.jpeg', '59.jpeg', '55.jpeg', '54.jpeg', '58.jpeg', '53.jpeg', '52.jpeg']

答案 2 :(得分:0)

我没有解决最初的问题,但确实找到了解决方法。我能够返回到.tar.gz文件,仅提取符合我所需条件的文件:

def download_images(url, file_name):
'''
Downloads and extracts file if it is not in current directory
'''
if file_name not in os.listdir():
    print('Downloading and extracting: ' + file_name)
    wget.download(url, file_name)
    tar = tarfile.open(file_name, mode = 'r:gz')
    for member in tar.getmembers():
        if '._' in member.name:
            continue
        else:
            tar.extract(member)
    tar.close()

如果有人知道原始帖子的答案,我将保留这个问题,但是现在这可以让我找到所需的位置。