Images Normalization

Spesso si usa normalizzare le immagini in input, per maggiore efficienza durante il training e per scongiurare pericoli di dead neurons ed altri effetti indesiderati.

Partendo dal presupposto che un'immagine è di una certa altezza x larghezza ed è disposta in 3 channels (RGB), può essere immagazzinata in un tensore che rappresenta i pixel scalati in un range [0.0, 1.0]

Per normalizzare un'immagine si sottrae dal pixel x la media dei pixel e poi si divide per la deviazione standard.
Per normalizzare le immagini si possono usare delle medie e varianze già disponibile e precalcolate a partire dal database ImageNET che contiene milioni e milioni di immagini varie.

le medie e le varianze dell'imagenet per i 3 channels sono:

  • mean = [0.485, 0.456, 0.406]
  • std = [0.229, 0.224, 0.225]

In alternativa si possono anche ricavare media e deviazione standard a partire dal proprio dataset di immagini, invece di usare i valori predefiniti.

Creiamo una funzione da applicare a tutte le immagini del dataset, allo scopo di normalizzarle:

# img. shape = tensor([3, 256, 256]) # immagine 256x256 pixel in 3 channels

def normalize(img):
    imagenet_mean = tensor([0.485, 0.456, 0.406])[:,None,None].to(img.device)
    imagenet_std = tensor([0.229, 0.224, 0.225])[:,None,None].to(img.device)
    return (img - imagenet_mean) / imagenet_std  # operazione di normalizzazione

Oppure, torchvision transforms mette a disposizione la funzione Normalize:

normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])