Deep Learning per la Classificazione di Immagini
[Slide](C:\UNI\Magistrale\visione\12 - Deep learning for image classification.pdf)
Indice
Dal Cervello alle Reti Neurali
Corteccia Visiva e Ispirazione Biologica
Definizione
La corteccia visiva è la parte del cervello che elabora le informazioni visive. È organizzata in aree gerarchiche: le prime aree rilevano bordi e orientamenti, le successive riconoscono forme, le più alte identificano oggetti complessi.
In pratica: Neuroni vicini nella corteccia rispondono a regioni vicine dell’immagine (organizzazione retinotopica). I neuroni dei livelli iniziali si “accendono” solo per stimoli semplici (un bordo verticale), quelli dei livelli finali per stimoli complessi (un volto). Le CNN replicano proprio questa gerarchia.
Reti Neurali Tradizionali (MLP)
Definizione
Un Multi-Layer Perceptron (MLP) è una rete neurale completamente connessa: ogni neurone di uno strato è collegato a tutti i neuroni dello strato successivo.
Applicato alle immagini, un MLP riceve in input tutti i pixel come un vettore piatto. Il problema è che un’immagine ha ~150.000 valori: con un solo strato nascosto da 1000 neuroni si avrebbero già 150 milioni di parametri.
Limiti dell'MLP per le immagini
- Esplosione dei parametri: ogni pixel connesso a ogni neurone
- Nessuna invarianza spaziale: lo stesso oggetto in posizione diversa attiva neuroni completamente diversi
- Nessuna sfruttamento della struttura locale: pixel vicini sono trattati esattamente come pixel lontani
Convolutional Neural Network (CNN)
Connessioni Locali e Pesi Condivisi
Definizione
Una CNN è una rete neurale progettata per lavorare su dati strutturati in griglia (immagini). Sfrutta due principi fondamentali: connessioni locali (ogni neurone vede solo una regione dell’input) e condivisione dei pesi (lo stesso filtro viene applicato in tutta l’immagine).
In pratica: invece di avere un peso diverso per ogni coppia pixel-neurone, si impara un filtro (es. ) che viene fatto scorrere su tutta l’immagine. Questo riduce drasticamente i parametri e insegna alla rete a riconoscere lo stesso pattern ovunque si trovi nell’immagine.
Note
La condivisione dei pesi introduce l’invarianza alla traslazione: se la rete impara a riconoscere un bordo verticale, lo riconosce in alto a sinistra come in basso a destra.
Operazione di Convoluzione
La convoluzione scorre un filtro (kernel) di dimensione sull’immagine di input, calcolando il prodotto scalare tra il filtro e ogni regione locale. Il risultato è una feature map che indica dove e quanto fortemente quella caratteristica è presente.
Parametri importanti:
- Stride : di quanti pixel si sposta il filtro a ogni passo. Stride riduce le dimensioni dell’output.
- Padding : aggiunta di pixel (tipicamente zeri) ai bordi per controllare le dimensioni dell’output.
- Dimensione output:
Un layer convoluzionale applica filtri diversi, producendo feature map — ognuna cattura un tipo di caratteristica (bordi orizzontali, verticali, angoli, texture…).
Example
Con un’immagine , 16 filtri , stride 1 e padding 0:
- Output:
- Parametri per layer: (molto meno di un MLP)
Pooling
Definizione
Il pooling è un’operazione di sottocampionamento che riduce le dimensioni spaziali delle feature map mantenendo le informazioni più salienti.
I due tipi principali:
- Max pooling: prende il valore massimo in ogni regione — mantiene il segnale più forte (presenza di una feature)
- Average pooling: calcola la media — più morbido, usato in alcuni punti specifici (es. global average pooling)
In pratica: un max pooling con stride 2 dimezza larghezza e altezza. Se un neurone aveva rilevato un bordo verticale “da qualche parte” in una regione , il max pooling mantiene questa informazione indipendentemente da dove esattamente.
Vantaggi del pooling:
- Riduce il costo computazionale degli strati successivi
- Introduce invarianza a piccole traslazioni e deformazioni
- Riduce il rischio di overfitting
Parte Fully Connected
Dopo i layer convoluzionali e di pooling, le feature map vengono “appiattite” in un vettore e passate a uno o più layer fully connected (identici a un MLP). Questi strati combinano le feature estratte dai layer precedenti per produrre la classificazione finale.
L’ultimo layer ha tanti neuroni quante sono le classi, con attivazione softmax che produce una distribuzione di probabilità sulle classi.
[Conv → Pool] × N → Flatten → [FC] × M → Softmax → Classe
Addestrare una CNN
Procedura di Training
Il training di una CNN segue un ciclo iterativo:
-
Inizializzazione casuale: i pesi della rete sono inizializzati con valori casuali piccoli (es. da una distribuzione gaussiana). Inizializzare tutto a zero non funziona: tutti i neuroni calcolerebbero lo stesso gradiente e rimarrebbero simmetrici.
-
Forward propagation: l’immagine di input attraversa tutti i layer della rete fino a produrre una predizione.
-
Calcolo dello scostamento (loss): si misura quanto la predizione si discosta dall’etichetta corretta. La funzione di loss più comune per la classificazione è la cross-entropy:
-
Back propagation: si calcola il gradiente della loss rispetto a ogni peso della rete usando la regola della catena, propagando l’errore all’indietro attraverso i layer.
-
Aggiornamento dei pesi: si sposta ogni peso nella direzione opposta al gradiente (gradient descent):
-
Si ripete su tutti i batch del dataset (un’epoca), per molte epoche, fino a convergenza.
Mini-Batch Gradient Descent
Definizione
Il mini-batch gradient descent è una variante del gradient descent che aggiorna i pesi calcolando il gradiente su un sottoinsieme (mini-batch) del training set, tipicamente 32–512 esempi, anziché su un singolo esempio o sull’intero dataset.
Confronto con le varianti:
- Batch GD: gradiente esatto ma lento e costoso in memoria
- SGD (Stochastic): aggiornamento per ogni singolo esempio — veloce ma rumoroso
- Mini-batch: compromesso ottimale — sfrutta la parallelizzazione GPU, gradiente abbastanza stabile
In pratica: con batch size 64, si calcola il gradiente mediando sui 64 esempi del batch, poi si aggiornano i pesi. Si passa poi al batch successivo finché non si sono usati tutti gli esempi (un’epoca).
LeNet-5 — La Prima CNN di Successo
Definizione
LeNet-5 (LeCun et al., 1998) è la prima CNN dimostrata su larga scala, progettata per il riconoscimento di cifre scritte a mano (dataset MNIST).
Architettura:
- 3 layer convoluzionali (filtri )
- 2 layer di average pooling
- 2 layer fully connected
Innovazioni di LeNet-5:
- Ha dimostrato che l’apprendimento gerarchico di feature funziona
- Ha introdotto l’alternanza Conv → Pool
- Usava la funzione di attivazione tanh (poi sostituita da ReLU)
- Training con mini-batch gradient descent
Note
LeNet-5 rimase una curiosità per anni, limitata dalla mancanza di dati e di potenza computazionale. La rivoluzione arrivò con AlexNet nel 2012, quando le GPU e ImageNet resero possibile scalare l’idea.
Evoluzione delle Architetture
AlexNet
AlexNet (Krizhevsky et al., 2012) ha vinto ImageNet LSVRC 2012 con un margine enorme, segnando l’inizio dell’era del deep learning per la visione artificiale.
Architettura:
- 5 layer convoluzionali
- 3 layer di max pooling
- 3 layer fully connected
- ~60 milioni di parametri
Innovazioni chiave:
ReLU (Rectified Linear Unit)
Definizione
La ReLU è una funzione di attivazione definita come .
Sostituì le attivazioni sigmoidali e tanh. Il vantaggio principale è che non satura per valori positivi, eliminando il problema del vanishing gradient negli strati profondi. Semplice da calcolare e molto efficace in pratica.
Dropout
Definizione
Il dropout è una tecnica di regolarizzazione che, durante il training, “spegne” casualmente ogni neurone con probabilità (tipicamente 0.5).
In pratica: a ogni forward pass, metà dei neuroni di un layer FC vengono azzerati. La rete non può fare affidamento su singoli neuroni e impara rappresentazioni più robuste e distribuite. Al test time tutti i neuroni sono attivi ma i pesi vengono scalati di .
Note
Il dropout fu applicato principalmente agli strati fully connected di AlexNet, riducendo significativamente l’overfitting su ImageNet.
Data Augmentation
Definizione
La data augmentation aumenta artificialmente la dimensione del training set applicando trasformazioni casuali alle immagini: ritagli, flip orizzontale, variazioni di colore/luminosità.
In pratica: se la rete vede lo stesso gatto ritagliato in 10 modi diversi, impara che un gatto è un gatto indipendentemente da dove si trova e come è illuminato. Riduce l’overfitting senza raccogliere nuovi dati.
VGGNet
VGGNet (Simonyan & Zisserman, 2014) ha esplorato il ruolo della profondità usando esclusivamente filtri .
Architettura:
- 13 layer convoluzionali (tutti con filtri )
- 5 layer di max pooling
- 3 layer fully connected
Note
Due convolzioni in sequenza hanno lo stesso campo ricettivo di una convoluzione , ma con meno parametri e con una non-linearità in più. VGGNet ha dimostrato che reti più profonde con filtri piccoli battono reti meno profonde con filtri grandi.
Il limite di VGGNet è il numero enorme di parametri (~138M), concentrati nei layer fully connected, che lo rende costoso in memoria.
GoogLeNet
GoogLeNet (Szegedy et al., 2014) ha vinto ImageNet 2014 con un’architettura molto più efficiente di VGGNet pur avendo solo ~5 milioni di parametri.
Architettura:
- 3 layer convoluzionali iniziali
- 4 layer di max pooling
- 9 Inception module
- 1 global average pooling
- 1 layer fully connected
Convoluzione 1×1
Definizione
Una convoluzione applica un filtro di dimensione al volume di feature map. Non combina informazioni spaziali, ma combina le feature lungo la dimensione dei canali.
In pratica: è come un MLP applicato indipendentemente a ogni posizione spaziale. Permette di ridurre o aumentare il numero di canali (bottleneck), controllando i costi computazionali degli strati successivi.
Inception Module
Definizione
Un Inception module applica in parallelo convolzioni di diverse dimensioni (, , ) e un max pooling alla stessa feature map, concatenando poi i risultati lungo la dimensione dei canali.
In pratica: invece di scegliere a priori la scala dei filtri, l’Inception module lascia che la rete impari quale scala sia più utile per ciascuna feature. Le convoluzione prima delle convoluzione più grandi riducono i canali, contenendo il costo computazionale.
Global Average Pooling
Definizione
Il global average pooling sostituisce i layer fully connected finali calcolando la media di ogni feature map fino a ottenere un singolo valore per canale.
Se prima dei layer FC si ha un volume , il global average pooling produce direttamente un vettore di 1024 valori. Questo elimina milioni di parametri e riduce l’overfitting.
ResNet
ResNet (He et al., 2015) ha vinto ImageNet 2015 con un’architettura da 152 strati, risolvendo il problema del vanishing gradient nelle reti molto profonde.
Architettura:
- 1 layer convoluzionale iniziale
- 1 layer di max pooling
- 4 gruppi di residual block
- 1 global average pooling
- 1 layer fully connected
Residual Blocks (Skip Connection)
Definizione
Un residual block introduce una connessione residua (skip connection) che somma l’input del blocco al suo output: , dove è la trasformazione appresa dai layer del blocco.
Perché è importante
In reti molto profonde, il gradiente tende ad azzerarsi (vanishing) o esplodere nei primi strati. Le skip connection forniscono un percorso diretto per il gradiente che bypassa i layer convoluzionali, permettendo di addestrare reti con centinaia di strati.
In pratica: il blocco non deve imparare la trasformazione completa , ma solo il residuo . Se la trasformazione ottimale è l’identità, basta che i pesi vadano a zero — molto più semplice da imparare.
Batch Normalization
Definizione
La Batch Normalization normalizza l’output di ogni layer rispetto al mini-batch corrente: sottrae la media e divide per la deviazione standard del batch, poi applica due parametri apprendibili (, ) per riscalare e traslare.
Il problema che risolve è il cosiddetto internal covariate shift: durante il training, la distribuzione degli input a ogni layer cambia continuamente perché i pesi degli strati precedenti si aggiornano. Questo rallenta il training perché ogni layer deve continuamente adattarsi a input con distribuzione diversa.
Note
La Batch Normalization:
- Permette l’uso di learning rate più alti (training più veloce)
- Ha effetto regolarizzante (riduce la necessità di dropout)
- Va inserita tipicamente prima della funzione di attivazione
MobileNet
MobileNet (Howard et al., 2017) è progettata per dispositivi con risorse limitate (smartphone, sistemi embedded) mantenendo buone prestazioni.
Architettura:
- 27 layer convoluzionali (quasi tutti depthwise separable)
- 1 global average pooling
- 1 layer fully connected
Depthwise Separable Convolution
Definizione
La depthwise separable convolution fattorizza una convoluzione standard in due operazioni separate: una depthwise convolution e una pointwise convolution.
- Depthwise convolution: applica un filtro distinto a ciascun canale dell’input, indipendentemente dagli altri canali. Cattura correlazioni spaziali, non tra canali.
- Pointwise convolution: convoluzione che combina i risultati della depthwise. Cattura correlazioni tra canali, non spaziali.
In pratica: su un input con canali, una convoluzione standard ha costo (per filtri). La versione separabile ha costo , circa 8-9 volte meno per configurazioni tipiche.
Confronto tra Architetture CNN
Le principali architetture CNN possono essere lette come una sequenza di soluzioni a problemi diversi: riduzione dei parametri, aumento della profondità, controllo dell’overfitting, efficienza computazionale e addestrabilità di reti molto profonde.
| Rete | Architettura | Concetto nuovo | Differenza principale |
|---|---|---|---|
| LeNet-5 | Conv + average pooling + FC | Prima CNN di successo | Dimostra che l’alternanza Conv Pool funziona per apprendere feature gerarchiche |
| AlexNet | 5 conv, 3 max pooling, 3 FC | ReLU, dropout, data augmentation, uso GPU | Porta il deep learning su larga scala nella classificazione ImageNet |
| VGGNet | Molti layer , max pooling, FC | Profondità con filtri piccoli | Architettura semplice e profonda, ma con moltissimi parametri |
| GoogLeNet | Moduli Inception + global average pooling | Inception, convoluzioni , GAP | Molto più efficiente di VGG, riduce i parametri finali |
| ResNet | Residual block + skip connection | Connessioni residue | Permette di addestrare reti molto profonde, anche centinaia di layer |
| MobileNet | Depthwise separable convolution | Convoluzioni separabili | Pensata per mobile/embedded, riduce drasticamente il costo computazionale |
| ViT | Transformer su patch immagine | Self-attention globale | Non usa convoluzioni classiche, cattura relazioni globali ma richiede molti dati |
| Swin Transformer | Transformer gerarchico con finestre locali | Shifted windows | Riduce il costo dell’attention e recupera una struttura multi-scala simile alle CNN |
Lettura Comparativa delle Reti
LeNet-5 è importante perché introduce la struttura base delle CNN classiche: convoluzioni per estrarre feature locali, pooling per ridurre la dimensione spaziale e layer fully connected per la classificazione. Era progettata per cifre scritte a mano, quindi per un problema relativamente semplice rispetto a ImageNet.
AlexNet scala l’idea di LeNet a dataset grandi. Le novità principali sono la ReLU, che rende il training più efficace rispetto a tanh e sigmoid, il dropout per ridurre l’overfitting nei fully connected e la data augmentation per aumentare artificialmente la variabilità del training set.
VGGNet mostra che la profondità è un fattore chiave. Usa quasi solo convoluzioni : due convoluzioni consecutive hanno campo ricettivo simile a una , ma con meno parametri e una non linearità in più. Il limite è il costo in memoria, dovuto soprattutto ai layer fully connected.
GoogLeNet punta sull’efficienza. Gli Inception module applicano in parallelo filtri di dimensione diversa (, , ) e pooling, lasciando alla rete la scelta della scala più utile. Le convoluzioni funzionano da bottleneck sui canali e il global average pooling sostituisce gran parte dei fully connected finali.
ResNet risolve il problema dell’addestramento di reti molto profonde. Le skip connection permettono al gradiente di propagarsi più facilmente e fanno sì che ogni blocco impari un residuo invece della trasformazione completa. Il blocco produce quindi .
MobileNet cambia il tipo di convoluzione per ridurre il costo. Con la depthwise separable convolution separa il filtraggio spaziale dalla combinazione tra canali: prima un filtro per canale, poi una convoluzione per mescolare i canali. È quindi adatta a dispositivi con risorse limitate.
ViT cambia paradigma: invece di usare convoluzioni, divide l’immagine in patch fisse e tratta ogni patch come un token, in modo analogo alle parole in un Transformer testuale. La self-attention permette di mettere in relazione direttamente patch anche lontane tra loro, catturando dipendenze globali. Il limite è che non ha l’inductive bias spaziale delle CNN, quindi richiede molti dati per funzionare bene.
Swin Transformer rende i Transformer più adatti alla visione introducendo una struttura gerarchica. L’attention non è calcolata globalmente su tutte le patch, ma dentro finestre locali che vengono spostate tra i layer. In questo modo riduce il costo computazionale e produce feature multi-scala, utili anche per task come detection e segmentazione.
Transformer per la Visione
ViT — Vision Transformer
Definizione
ViT (Dosovitskiy et al., 2020) applica il meccanismo Transformer (originariamente pensato per il testo) alle immagini, dividendo l’immagine in patch fisse (es. pixel) e trattando ogni patch come un “token”.
In pratica: un’immagine viene divisa in patch, ognuna linearizzata e proiettata in un vettore. L’attention del Transformer può mettere in relazione ogni patch con ogni altra, catturando dipendenze globali che le CNN vedono solo attraverso molti strati.
Note
ViT richiede grandi quantità di dati per superare le CNN: le CNN hanno l’inductive bias spaziale (invarianza alla traslazione) integrato nella loro struttura, mentre ViT lo deve imparare dai dati. Con dataset enormi (JFT-300M), ViT batte le CNN.
Swin Transformer
Definizione
Swin (Liu et al., 2021) è un Transformer gerarchico che introduce una struttura a livelli analoga a quella delle CNN: patch più piccole nei layer iniziali, patch aggregate nei layer successivi.
A differenza di ViT, l’attention non è globale ma calcolata dentro finestre locali che si spostano tra i layer (Shifted Windows — da cui “Swin”). Questo riduce il costo computazionale da quadratico in numero di patch a lineare.
In pratica: Swin combina la gerarchia multi-scala delle CNN (utile per detection e segmentazione, dove servono feature a diversa risoluzione) con la potenza espressiva dei Transformer. È diventato backbone di riferimento per molti task di visione.
Pratiche di Training
Image Pre-processing
Prima di passare le immagini alla rete è necessario un pre-processing standardizzato:
- Resize: le CNN richiedono input di dimensione fissa (es. )
- Normalizzazione: si sottraggono la media e si divide per la deviazione standard del training set, canale per canale. Questo porta i valori dei pixel in un range simile per tutti i canali e accelera la convergenza
- Augmentation (solo in training): flip, crop casuale, variazioni di colore, rotazioni leggere
Note
Per reti pre-addestrate su ImageNet, si usano tipicamente la media e la deviazione standard di ImageNet (, ) anche su nuovi dataset, poiché le statistiche sono simili per la maggior parte delle immagini naturali.
Transfer Learning
Definizione
Il transfer learning consiste nell’utilizzare i pesi di una rete pre-addestrata su un task (es. classificazione su ImageNet) come punto di partenza per un task diverso, invece di inizializzare i pesi casualmente.
Strategie principali:
Feature extraction: si congela la parte convoluzionale della rete (pesi fissi) e si addestra solo un nuovo classificatore finale. I layer convoluzionali estraggono feature generali (bordi, texture, forme) che sono utili per quasi qualunque task visivo.
Fine-tuning: si parte dai pesi pre-addestrati e si continua il training sull’intero modello (o solo sugli strati finali) con un learning rate molto basso. Le feature vengono adattate al nuovo dominio.
Tip
Regola pratica: più il nuovo dataset è piccolo e simile a ImageNet, più conviene congelare i layer iniziali. Se il dataset è grande e/o molto diverso (es. immagini mediche), è utile il fine-tuning di tutti i layer.
In pratica: anche con poche centinaia di immagini, una ResNet pre-addestrata su ImageNet con feature extraction supera spesso una CNN addestrata da zero su migliaia di immagini.