![](/img/trans.png)
[英]Can I generate uint8 label using ImageDataGenerator() and flow_from_directory() in Keras?
[英]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.