Dato che il dataset CelebA a nostra disposizione, oltre che le immagini, metteva a disposizione una serie di metadati per ogni immagine, abbiamo deciso di provare a combinare queste informazioni con le feature estratte dalle reti neurali utilizzate nell'esperimento di feature extraction.
In questa sezione andremo a descrivere le integrazioni fatte all'esperimento di feature extraction, per informazioni sul resto del codice rifarsi a quella sezione.
- I metadati
- Attivare la combinazione dei metadati
- Estrazione e caricamento dei metadati
- Concatenazione delle features
- Normalizzazione delle features
- Risultati - senza normalizzazione
- Risultati - con normalizzazione
- Analisi degli errori
- Conclusioni
File di riferimento:
alex_res_vgg.mlx
Questi metadati consistono in feature binarie ad alto livello quali:
- 5_o_Clock_Shadow
- Arched_Eyebrows
- Attractive
- Bags_Under_Eyes
- Bald
- Bangs
- Big_Lips
- Big_Nose
- Black_Hair
- Blond_Hair
- Blurry
- Brown_Hair
- Bushy_Eyebrows
- Chubby
- Double_Chin
- Eyeglasses
- Goatee
- Gray_Hair
- Heavy_Makeup
- High_Cheekbones
- Mouth_Slightly_Open
- Mustache
- Narrow_Eyes
- No_Beard
- Oval_Face
- Pale_Skin
- Pointy_Nose
- Receding_Hairline
- Rosy_Cheeks
- Sideburns
- Smiling
- Straight_Hair
- Wavy_Hair
- Wearing_Earrings
- Wearing_Hat
- Wearing_Lipstick
- Wearing_Necklace
- Wearing_Necktie
- Young
Oltre a queste 39 feature ad alto livello in questo file era presente anche la feature Male che indica se l'immagine rappresenta un uomo o una donna e che è stata utilizzata come label in tutti gli esperimenti.
La combinazione dei metadati è stata implementata come opzionale nel file alex_res_vgg.mlx
e può essere attivata settando le variabilie concatenationMetadata
a 1.
È inoltre presente il flag normalizationMetadata
che se impostato ad 1 effettua la normalizzazione delle feature dopo la concatenazione.
% === CONCATENAZIONE === %
concatenationMetadata = 1;
normalizationMetadata = 1;
I metadati sono stati estratti dal file originale fornito da CelebA list_attr_celeba.txt
, che è un file con una riga per ogni immagine. Ogni riga contiene il nome dell'immagine e le informazioni relative ai metadati.
Per l'estrazione è stato scritto lo script in C feature.c
che legge i file list_eval_partition.txt
(contenente la ripartizione delle immagini tra train, validation e test set) e list_attr_celeba.txt
(contenente le feature di alto livello) e scrive nel file un file contente le feature per ogni ripartizione, mettendo prima tutte le feature delle immagini di classe 0 (Female) e poi quelle delle immagini di classe 1 (Male).
I file sono stati organizzati in questo modo in maniera tale da poter caricare singolarmente le feature per ogni ripartizione del dataset e l'ordinamento interno è stato scelto per avere una corrispondeza tra le feature e il caricamento che effettua MATLAB delle immagini.
Questi dati vengono poi caricati in MATLAB e salvati in una variabile dopo essere stati interpretati come una matrice come mostrato nel codice seguente:
featTrainMatrix = readmatrix ('dataset/TrainSet_features.txt','Delimiter', ' ');
featTestMatrix = readmatrix('dataset/TestSet_features.txt','Delimitert', ' ');
Le feature una volta caricate vengono concatenate con le feature estratte dalle reti neurali riga per riga.
featuresTrain1 = [featuresTrain1, featTrainMatrix];
featuresTest1 = [featuresTest1, featTestMatrix];
Se il flag normalizationMetadata
è impostato a 1, le feature vengono normalizzate secondo centro e deviazione standard, utilizzando la funzione normalize
di MATLAB; questa funzione viene utilizzata per portare i dati ad avere media 0 e varianza 1 (cioè una distribuzione normale standard), in modo da rendere i dati comparabili e gestibili dal modello di apprendimento.
Il parametro C
rappresenta il vettore di media dei dati di featuresTrain1
, e il parametro S
rappresenta il vettore di deviazione standard dei dati di featuresTrain1
. In pratica, i dati di featuresTrain1
e featuresTest1
vengono trasformati in modo tale che ogni feature abbia media 0 e varianza 1. Questo viene fatto in modo che tutte le feature abbiano la stessa scala, e il modello di apprendimento automatico possa lavorare in modo più efficiente.
[featuresTrain1, C, S] = normalize(featuresTrain1);
featuresTest1 = normalize(featuresTest1, 'center', C, 'scale', S);
Dai risultati possiamo norare come la combinazione dei metadati abbia portato ad un aumento sostanziale dell'accuracy per tutte le reti neurali utilizzate del 3% circa per ogni rete, passando da un aumento del 3.71% per ResNet-18 ad un aumento del 2.15% di ResNet-50, quest'ultima che raggiunge però un accuracy del 96.91% che è il massimo raggiunto da tutte le reti neurali utilizzate.
AlexNet (1GPU) | ResNet-18 (2GPU) | ResNet-50 (1GPU) | VGG16 (1GPU) | |
---|---|---|---|---|
Accuracy | 96.36% | 96.35% | 96.91% | 96.51% |
Rateo | 19236/19962 | 19234/19962 | 19346/19962 | 19265/19962 |
Time | 369.4852s | 177.8919s | 283.0541s | 552.8084s |
Di seguito possiamo analizzare i risultati ottenuti per ogni rete andando a vedere la matrice di confusione e qualche esempio di classificazione.
AlexNet conf w/o norm
|
Resnet-18 conf w/o norm
| ||||||||||||||||||
Resnet-50 conf w/o norm
|
VGG16 conf w/o norm
|
Dai risultati di quest'ultimo esperimento possiamo notare come la normalizzazione delle feature non abbia portato grande beneficio rispetto alla semplice concatenazione dei metadati.
L'accuracy massima rimane quella di ResNet-50 che raggiunge il 96.97% mentre la rete che ha avuto il miglioramento più significativo è stata VGG16 che ha raggiunto un accuracy del 96.64%.
AlexNet (1GPU) | ResNet-18 (2GPU) | ResNet-50 (1GPU) | VGG16 (1GPU) | |
---|---|---|---|---|
Accuracy | 96.37% | 96.35% | 96.97% | 96.64% |
Rateo | 19238/19962 | 19233/19962 | 19358/19962 | 19292/19962 |
Time | 383.4852s | 191.9109s | 282.0613s | 710.436s |
Di seguito possiamo analizzare i risultati ottenuti per ogni rete andando a vedere la matrice di confusione:
AlexNet conf w/ norm
|
Resnet-18 conf w/ norm
| ||||||||||||||||||
Resnet-50 conf w/ norm
|
VGG16 conf w/ norm
|
È importante andare a vedere quali possono essere gli errori commessi da questi esperimenti. Prenderemo come esempio gli errori di alexnet con concatenazione dei metadati (gli errori sono simili in tutti gli altri esperimenti con concatenazione):
Come possiamo notare l'errore più comune è dato dalla presenza di capelli lunghi nei soggetti maschili che vengono classificati come donne, altri motivi di errore possono essere riconducibili a presenze di scritte o alla ricostruzione dell'immagine durante il preprocessing che ha portato ad avere i visi centrati. Altri visibili cause di errore sono la presenza di cappelli che provocano dell'occlusione. Altro fattore che non ha aiutato è l'illuminazione non regolare.
Per trarre le conclusioni finali riassumiamo i risultati ottenuti per ogni rete confrontando gli esperimenti con e senza metadati e/o normalizzazione:
AlexNet FE | AlexNet FE w/ metadata | AlexNet w/ metadata & norm | |
---|---|---|---|
Accuracy | 93.29% | 96.36% | 96.37% |
Delta | / | +3.07% | +3.08% |
ResNet-18 FE | ResNet-18 FE w/ metadata | ResNet-18 w/ metadata & norm | |
---|---|---|---|
Accuracy | 92.71% | 96.35% | 96.35% |
Delta | / | +3.64% | +3.64% |
ResNet-50 FE | ResNet-50 FE w/ metadata | ResNet-50 w/ metadata & norm | |
---|---|---|---|
Accuracy | 94.76% | 96.91% | 96.97% |
Delta | / | +2.15% | +2.21% |
VGG16 FE | VGG16 FE w/ metadata | VGG16 w/ metadata & norm | |
---|---|---|---|
Accuracy | 93.37% | 96.51% | 96.64% |
Delta | / | +3.14% | +3.27% |
La concatenazione dei metadati ha portato un miglioramento dell'accuracy per tutte le reti, con un aumento medio di circa il 3%, il che è un ottimo risultato, inoltre la normalizzazione delle feature non ha portato grandi miglioramenti aggiuntivi.
Considerando che la concatenazione dei metadati non è un operazione pesante e che la normalizzazione delle feature anchessa non è un operazione esigente, possiamo concludere che la concatenazione dei metadati è un'operazione che può essere utilizzata per migliorare le prestazioni gratis (dove questi dati sono presenti) di una rete neurale e che la normalizzazione, sebbene non sia indispensabile, può portare un ulteriore miglioramento dell'accuracy con un limitato costo computazionale.