将打乱的图像以原始文件名批量保存到磁盘

saving the shuffled images in a batch to disk with original filename

我在一个目录中有一个数据集,我希望将其分成训练集和验证集,然后将每个集的所有图像保存到不同的目录

我正在尝试使用 tf.keras.preprocessing.image_dataset_from_directory() 和 tf.keras.preprocessing.image.save_img() 函数以及 tf.data.Dataset.file_paths 属性

代码看起来像这样:

train_dataset = image_dataset_from_directory(PATH_DS,
                                             shuffle=True,
                                             labels='inferred', 
                                             label_mode='categorical',
                                             class_names=class_names,
                                             batch_size=1,
                                             image_size=[1080, 1920],
                                             validation_split=0.15,
                                             subset="training",
                                             seed=456)
validation_dataset = image_dataset_from_directory(PATH_DS,
                                             shuffle=True,
                                             labels='inferred', 
                                             label_mode='categorical',
                                             class_names=class_names,
                                             batch_size=1,
                                             image_size=[1080, 1920],
                                             validation_split=0.15,
                                             subset="validation",
                                             seed=456)

filepaths_val = validation_dataset.file_paths
filepaths_train = train_dataset.file_paths

for idx, (batch, filepath) in enumerate(zip(train_dataset.as_numpy_iterator(), train_dataset.file_paths)):
    images, labels = batch

    tf.keras.preprocessing.image.save_img(os.path.join(PATH_WD, f"test/train/{class_names[np.argmax(labels[0])]}/{os.path.basename(filepath)}"), images[0], "channels_last", "png")

我需要打乱图像,因为它们的文件名使得字母数字排序会导致集合之间的数据泄漏

我 运行 遇到的问题似乎是数据集迭代器具有随机初始化。文件路径对象只是一个我可以切片的列表,我已经验证每个种子总是 returns 相同的文件路径。

但是,调用数据集总是 returns 不同的元素。我试过 Dataset.unbatch() 方法、as_numpy_iterator() 等。每次我第一次调用迭代器时,它 returns 一个不同的元素。

使用更简单、更快速的方法解决了这个问题

因为我已经有了数据集每个分割中的图像列表,所以我可以简单地使用 shutil 来复制或移动项目。

这种方法使我想用图像做的其他一些事情变得更加困难,但可以解决