intel-image-classifier / data_loader.py
Sara-Adjo's picture
Update data_loader.py
97da8a0 verified
Raw
History Blame Contribute Delete
4.17 kB
import os
import numpy as np
from pathlib import Path
import torch
from torch.utils.data import DataLoader, random_split
from torchvision import datasets, transforms
import tensorflow as tf
IMAGE_SIZE = (150, 150)
BATCH_SIZE = 32
VAL_SPLIT = 0.2
SEED = 42
CLASS_NAMES = ["buildings", "forest", "glacier", "mountain", "sea", "street"]
# PyTorch Data Pipeline
def get_pytorch_loaders(train_dir: str, test_dir: str):
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
train_transform = transforms.Compose([
transforms.Resize(IMAGE_SIZE),
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomRotation(degrees=15),
transforms.RandomResizedCrop(IMAGE_SIZE,scale=(0.8, 1.0)),
transforms.ColorJitter(brightness=0.2,contrast=0.2),
transforms.ToTensor(),
transforms.Normalize(mean, std),
])
eval_transform = transforms.Compose([
transforms.Resize(IMAGE_SIZE),
transforms.ToTensor(),
transforms.Normalize(mean, std),
])
full_train = datasets.ImageFolder(root=train_dir,transform=train_transform)
# Split into train / validation
n_val = int(len(full_train) * VAL_SPLIT)
n_train = len(full_train) - n_val
train_ds, val_ds = random_split(
full_train, [n_train, n_val],
generator=torch.Generator().manual_seed(SEED)
)
val_ds.dataset = datasets.ImageFolder(root=train_dir,transform=eval_transform)
test_ds = datasets.ImageFolder(root=test_dir, transform=eval_transform)
train_loader = DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True, num_workers=2, pin_memory=True)
val_loader = DataLoader(val_ds, batch_size=BATCH_SIZE, shuffle=False, num_workers=2, pin_memory=True)
test_loader = DataLoader(test_ds, batch_size=BATCH_SIZE, shuffle=False, num_workers=2, pin_memory=True)
print(f"[PyTorch] Train: {n_train} | Val: {n_val} | Test: {len(test_ds)}")
return train_loader, val_loader, test_loader, full_train.classes
# TensorFlow Data Pipeline
def get_tensorflow_datasets(train_dir: str, test_dir: str):
img_h, img_w = IMAGE_SIZE
raw_train = tf.keras.utils.image_dataset_from_directory(
train_dir,
validation_split=VAL_SPLIT,
subset="training",
seed=SEED,
image_size=IMAGE_SIZE,
batch_size=BATCH_SIZE,
label_mode="categorical",
)
raw_val = tf.keras.utils.image_dataset_from_directory(
train_dir,
validation_split=VAL_SPLIT,
subset="validation",
seed=SEED,
image_size=IMAGE_SIZE,
batch_size=BATCH_SIZE,
label_mode="categorical",
)
raw_test = tf.keras.utils.image_dataset_from_directory(
test_dir,
image_size=IMAGE_SIZE,
batch_size=BATCH_SIZE,
label_mode="categorical",
shuffle=False,
)
class_names = raw_train.class_names
normalization = tf.keras.layers.Rescaling(1.0 / 255)
augmentation = tf.keras.Sequential([
tf.keras.layers.RandomFlip("horizontal"),
tf.keras.layers.RandomRotation(0.1),
tf.keras.layers.RandomZoom(0.2),
tf.keras.layers.RandomContrast(0.1),
])
def preprocess_train(images, labels):
images = normalization(images)
images = augmentation(images, training=True)
return images, labels
def preprocess_eval(images, labels):
images = normalization(images)
return images, labels
AUTOTUNE = tf.data.AUTOTUNE
train_ds = (raw_train
.map(preprocess_train, num_parallel_calls=AUTOTUNE)
.cache()
.shuffle(1000)
.prefetch(AUTOTUNE))
val_ds = (raw_val
.map(preprocess_eval, num_parallel_calls=AUTOTUNE)
.cache()
.prefetch(AUTOTUNE))
test_ds = (raw_test
.map(preprocess_eval, num_parallel_calls=AUTOTUNE)
.prefetch(AUTOTUNE))
print(f"[TensorFlow] Classes: {class_names}")
return train_ds, val_ds, test_ds, class_names