import tensorflow as tf from pathlib import Path def build_dataset( directory, image_size=(224, 224), batch_size=32, validation_split=None, subset=None, seed=123, shuffle=True, ): return tf.keras.preprocessing.image_dataset_from_directory( directory, labels='inferred', label_mode='int', batch_size=batch_size, image_size=image_size, shuffle=shuffle, validation_split=validation_split, subset=subset, seed=seed, ) def get_datasets( root_dir, image_size=(224, 224), batch_size=32, validation_split=0.15, seed=123, ): root = Path(root_dir) train_dir = root / 'train' val_dir = root / 'val' test_dir = root / 'test' if not root.exists(): raise FileNotFoundError(f'Dataset root directory not found: {root_dir}') if val_dir.exists() and test_dir.exists(): train_ds = build_dataset(train_dir, image_size=image_size, batch_size=batch_size, shuffle=True) val_ds = build_dataset(val_dir, image_size=image_size, batch_size=batch_size, shuffle=False) test_ds = build_dataset(test_dir, image_size=image_size, batch_size=batch_size, shuffle=False) elif train_dir.exists(): train_ds = build_dataset( train_dir, image_size=image_size, batch_size=batch_size, validation_split=validation_split, subset='training', seed=seed, ) val_ds = build_dataset( train_dir, image_size=image_size, batch_size=batch_size, validation_split=validation_split, subset='validation', seed=seed, shuffle=False, ) test_ds = None else: raise FileNotFoundError( 'Could not find expected train/val/test directories. Create `dataset/train` and optionally `dataset/val` and `dataset/test`.' ) return train_ds, val_ds, test_ds def get_augmentation_layer(image_size=(224, 224)): return tf.keras.Sequential( [ tf.keras.layers.RandomFlip('horizontal'), tf.keras.layers.RandomRotation(0.12), tf.keras.layers.RandomZoom(0.15), tf.keras.layers.RandomContrast(0.1), tf.keras.layers.Rescaling(1.0 / 255), tf.keras.layers.Resizing(image_size[0], image_size[1]), ], name='data_augmentation', ) def prepare_dataset(dataset, cache=True, prefetch=True): if dataset is None: return None ds = dataset if cache: ds = ds.cache() if prefetch: ds = ds.prefetch(buffer_size=tf.data.AUTOTUNE) return ds