| import tensorflow as tf | |
| from keras.applications.mobilenet_v2 import preprocess_input | |
| class HAMDataGenerator: | |
| def __init__(self, train_df): | |
| self.size = [224, 224] | |
| self.batch_size = 16 | |
| self.classes = train_df.dx.cat.categories.astype(str).tolist() | |
| self.data_augmentation = tf.keras.Sequential( | |
| [ | |
| tf.keras.layers.RandomRotation(20 / 360), | |
| tf.keras.layers.RandomTranslation(0.2, 0.2), | |
| tf.keras.layers.RandomZoom(0.2), | |
| tf.keras.layers.RandomFlip("horizontal"), | |
| ], | |
| name="augmentation", | |
| ) | |
| def _load_and_preprocess(self, filename, label): | |
| image = tf.io.read_file(filename=filename) | |
| image = tf.io.decode_jpeg(image, channels=3) | |
| image = tf.image.resize(image, size=self.size) | |
| image = preprocess_input(image) | |
| label = tf.one_hot(label, depth=len(self.classes)) | |
| return image, label | |
| def _apply_augmentation(self, image, label): | |
| image = self.data_augmentation(image, training=True) | |
| return image, label | |
| def flow_from_dataframe(self, df, directory, x_col, y_col, shuffle=False): | |
| filepaths = [f"{directory}/{img}" for img in df[x_col]] | |
| labels = df[y_col].values | |
| label_to_index = {label: idx for idx, label in enumerate(self.classes)} | |
| label_indices = [label_to_index[label] for label in labels] | |
| ds = tf.data.Dataset.from_tensor_slices((filepaths, label_indices)) | |
| if shuffle: | |
| ds = ds.shuffle(buffer_size=len(filepaths)) | |
| ds = ds.map(self._load_and_preprocess) | |
| ds = ds.batch(batch_size=self.batch_size) | |
| return ds.map(self._apply_augmentation) | |