簡體   English   中英

我可以在 MacOS 上使用 Keras ImageDataGenerator().flow_from_directory 跳過文件嗎?

[英]Can I skip files using Keras ImageDataGenerator().flow_from_directory on MacOS?

我已經下載了一個圖像集,其中 7 個類別中的每個類別都有 10 張圖像,總共有 70 張圖像。 但是,現在每個類文件夾中都有 20 個文件:為每個 individual.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 ,所以我正在尋找一種繞過._文件的方法

我沒有解決最初的問題,但我確實找到了解決方法。 我能夠返回到 .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()

如果有人知道原始帖子的答案,我會保留這個問題,但現在這讓我到了我需要去的地方。

我在這里有點晚了,但對於仍在尋找答案的任何人:您可以在數據框中獲取有效的文件名及其標簽,然后使用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

希望這可以幫助!

當然,您可以過濾文件。 我添加了三種不同的解決方案:

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 匹配的字符串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 按正則表達式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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM