import cv2
from PIL import Image, ImageEnhance
import torchvision.transforms as transforms
import torch
from torch.utils.data import DataLoader, Dataset
import os
# Custom dataset using PIL and torchvision transforms
class CustomImageDataset(Dataset):
def __init__(self, image_paths, labels, transform=None):
self.image_paths = image_paths
self.labels = labels
self.transform = transform
def __len__(self):
return len(self.image_paths)
def __getitem__(self, idx):
# Load image with PIL
image = Image.open(self.image_paths[idx]).convert('RGB')
label = self.labels[idx]
if self.transform:
image = self.transform(image)
return image, label
# Define augmentation and preprocessing pipeline
train_transforms = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
val_transforms = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
# Example usage (paths and labels should be your dataset)
train_image_paths = ["path/to/train/image1.jpg", "path/to/train/image2.jpg"]
train_labels = [0, 1]
val_image_paths = ["path/to/val/image1.jpg", "path/to/val/image2.jpg"]
val_labels = [0, 1]
train_dataset = CustomImageDataset(train_image_paths, train_labels, transform=train_transforms)
val_dataset = CustomImageDataset(val_image_paths, val_labels, transform=val_transforms)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)
# Model training code remains the same but now uses augmented data
# This will reduce overfitting and improve validation accuracy