我已经下载了一个包含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
的目录,所以我正在寻找一种绕过._
文件的方法
答案 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()
如果有人知道原始帖子的答案,我将保留这个问题,但是现在这可以让我找到所需的位置。