Parte IV — Localizzazione e deep learning · Capitolo 11

Deep learning per la classificazione di immagini

~55 min di lettura4 widget interattivi5 tavole

In questo capitolo

  1. Il problema della classificazione di immagini
  2. Perché le reti tradizionali non bastano
  3. La corteccia visiva: simple e complex cell
  4. Le tre idee delle CNN: locale, condiviso, pooling
  5. La convoluzione: filtri, stride e padding
  6. Pooling e la parte fully-connected
  7. LeNet-5: il modello base
  8. Addestrare una CNN: mini-batch gradient descent
  9. AlexNet: ReLU, dropout e data augmentation
  10. VGGNet e GoogLeNet: profondità, inception e kernel 1×1
  11. ResNet: residual block, skip connection e batch normalization
  12. MobileNet: depthwise separable convolution
  13. Il confronto su ImageNet, ViT e Swin
  14. Pre-processing e transfer learning
  15. Verifica le tue conoscenze

1. Il problema della classificazione di immagini

Data un'immagine di input, il processo di image classification (o image recognition) restituisce l'etichetta di una classe, scelta tra un insieme predefinito, e spesso una probabilità (o score) associata alla classe restituita. Di solito la classe restituita si riferisce all'oggetto predominante nell'immagine analizzata. Da ormai una quindicina d'anni questi problemi vengono affrontati sempre più spesso con l'uso di Convolutional Neural Network (CNN). Le applicazioni spaziano dall'organizzazione automatica di foto alla ricerca visiva, dalla realtà aumentata al riconoscimento biometrico.

Collegamento

Nei capitoli 4 e 5 abbiamo visto feature hand-crafted (colore, tessitura, forma) seguite da un classificatore. Con il deep learning il sistema apprende da solo quali feature estrarre: la stessa immagine, gli stessi dati, ma niente più descrittori progettati a mano.

2. Perché le reti tradizionali non bastano

Le reti neurali tradizionali (MLP — Multi-Layer Perceptron) presentano diversi svantaggi quando vengono usate per l'elaborazione delle immagini:

input: immagine 600×400 RGB 600 · 400 · 3 = 720.000 neuroni di input 5 neuroni (un layer) 720.000 · 5 = 3,6 milioni di pesi e connessioni inoltre: nessuna invarianza per traslazione · la relazione spaziale tra pixel adiacenti è persa
Tavola 11.1 — L'esplosione dei parametri nei MLP: un'immagine 600×400 RGB produce 720.000 input, e un solo layer fully-connected di 5 neuroni richiederebbe 3,6 milioni di pesi. Le CNN risolvono il problema con connessioni locali e pesi condivisi.

3. La corteccia visiva: simple e complex cell

Nel 1968, Hubel e Wiesel (due neuroscienziati) dimostrarono che l'apparato visivo dei mammiferi presenta un'architettura a strati: quando le informazioni sono trasmesse dagli occhi al cervello si formano rappresentazioni sempre più complesse mano a mano che le informazioni arrivano negli strati più profondi. Nella corteccia visiva umana, le rappresentazioni complesse generate da complex cell sono realizzate combinando tra loro le risposte ottenute da simple cell:

L'invarianza spaziale è ottenuta «sommando» il contributo di simple cell che rispondono tutte alla stessa orientazione ma con campi visivi diversi. Il concetto che cellule semplici possano essere «combinate» per creare cellule più complesse è alla base del sistema visivo umano ma anche delle Convolutional Neural Network usate negli odierni sistemi di computer vision.

4. Le tre idee delle CNN: locale, condiviso, pooling

Le Convolutional Neural Network (CNN) sono state introdotte a partire dal 1998. Le principali differenze rispetto a un Multi-Layer Perceptron sono:

  1. Processing locale: i neuroni sono connessi solo localmente ai neuroni del livello precedente → forte riduzione del numero di connessioni;
  2. Pesi condivisi: i pesi sono condivisi a gruppi; neuroni diversi dello stesso livello eseguono lo stesso tipo di elaborazione su porzioni diverse dell'input → forte riduzione del numero di pesi;
  3. Alternanza di livelli di feature extraction e pooling.

Sono esplicitamente progettate per processare immagini, per le quali elaborazione locale, pesi condivisi e pooling non solo semplificano il modello, ma lo rendono più efficace rispetto ai modelli fully-connected. Una CNN è una gerarchia di livelli: il livello di input è direttamente collegato ai pixel dell'immagine; i livelli intermedi usano connessioni locali e pesi condivisi per individuare feature discriminanti; gli ultimi livelli sono generalmente fully-connected e operano come un classificatore. Le connessioni locali e condivise fanno sì che porzioni diverse dell'immagine vengano processate nello stesso modo: un comportamento desiderato, perché regioni diverse del campo visivo contengono lo stesso tipo di informazioni (bordi, spigoli, porzioni di oggetti).

5. La convoluzione: filtri, stride e padding

La convoluzione è una delle più importanti operazioni di image processing (già incontrata nel capitolo 2), attraverso la quale si applicano filtri digitali. Un filtro viene fatto scorrere sulle diverse posizioni dell'input; per ogni posizione viene generato un valore di output eseguendo il prodotto scalare di Frobenius tra il filtro e la porzione di input coperta. Se consideriamo i pixel come neuroni, le immagini di input e di output come livelli successivi di una rete e i pesi del filtro come pesi delle connessioni, un neurone esegue di fatto una convoluzione: net = Σ_{i=1…9} in_i · w_i. L'obiettivo dell'operazione è estrarre feature dal volume di input mantenendo la relazione spaziale tra i neuroni.

L'input è un volume 3D di dimensione WI × HI × C (es. l'immagine RGB) e un insieme di K filtri (kernel) di dimensione F × F × C; l'output è un volume 3D di dimensione WO × HO × K composto da K feature map. I kernel presentano lo stesso numero di canali del volume di input: per i canali multipli si esegue la convoluzione tra ogni canale di input e il corrispondente canale del kernel e i risultati vengono sommati per ottenere un'unica feature map per kernel. Quando il filtro scorre sul volume si può usare un passo (Stride) maggiore di 1, riducendo la dimensione delle feature map; si può inoltre aggiungere un bordo di zeri al volume di input, il cui spessore è denotato dal parametro Padding:

W_out = (W_in − F + 2·Padding) / Stride + 1

Importante: una CNN apprende autonomamente i valori dei filtri durante l'addestramento. Solitamente il primo layer di convoluzione individua feature di basso livello (bordi, colore, orientamento del gradiente); i successivi livelli distinguono feature sempre più di alto livello.

Esplora la convoluzione: stride e padding

Input 5×5 (valori 0…24), kernel 3×3 selezionabile. Regola stride e padding e osserva come cambiano la dimensione e i valori della feature map di output (W_out è calcolata con la formula delle slide).

6. Pooling e la parte fully-connected

L'obiettivo del pooling è ridurre la dimensione della feature map mantenendo le informazioni più importanti. Il pooling: diminuisce il numero di parametri della rete (riducendo il rischio di overfitting e la potenza di calcolo necessaria); rende la rete robusta rispetto a piccole trasformazioni, distorsioni, traslazioni e cambiamenti di scala dell'input. L'operazione consiste nell'aggregare i valori di input facendo scorrere una finestra di dimensione prefissata e calcolando un singolo valore di output per ogni posizione. L'aggregazione opera generalmente nell'ambito di ciascuna feature map (il numero di feature map resta invariato); gli operatori più usati sono la media (Avg) e il massimo (Max). Come per la convoluzione, stride e padding modificano le dimensioni di output, ma in un livello di pooling non vi sono parametri addestrabili.

La parte fully-connected — lo scopo è usare le feature individuate dai livelli precedenti per classificare l'immagine in base al training set. Il volume di output della parte di estrazione delle feature viene linearizzato (vettore di m = W·H·C valori) e dato in input a un MLP. L'aggiunta di uno o più livelli fully-connected è anche un modo semplice per apprendere combinazioni non lineari delle feature estratte. La parte fully-connected usa Softmax come funzione di attivazione del livello di output, assicurando che la somma delle probabilità di output sia 1:

softmax(x)_i = e^{x_i} / Σ_k e^{x_k}

Softmax: dai logit alle probabilità

I valori del livello di output (logit) vengono trasformati da softmax in probabilità che sommano a 1. Sposta i cursori per vedere come il confronto esponenziale amplifica le differenze.

input conv pool conv pool feature extraction FC FC softmax classificatore (MLP + softmax)
Tavola 11.2 — La struttura gerarchica di una CNN: i livelli di convoluzione e pooling estraggono feature (con la relazione spaziale preservata), la parte finale fully-connected linearizza il volume e classifica con softmax.

7. LeNet-5: il modello base

Nel 1998, Lecun, Bottou, Bengio e Haffner introdussero una CNN per classificare cifre scritte a mano. Il modello, chiamato LeNet-5, è composto da:

È la prima rete che usa convolutional layer e pooling per l'estrazione di feature spaziali. Per introdurre non-linearità usa la funzione tanh nei layer C1, C3, C5 e F6; come ottimizzatore il mini-batch Gradient Descent (SGD). Ha circa 60K parametri. È stata addestrata sul database MNIST: 70K immagini (60K training, 10K test) di caratteri scritti a mano 32 × 32 in 10 classi, raggiungendo un'accuratezza del 99% sul test. Contributi: convolutional e pooling layer per l'estrazione di feature spaziali; LeNet-5 rappresenta il «modello base» per ogni CNN (conv + pooling intervallati per l'estrazione, uno o più livelli FC per la classificazione). Svantaggi: utilizzabile su immagini in scala di grigi (1 canale) di piccole dimensioni (32 × 32) e con un numero di classi limitato (10).

32×32 input C1 6 ker 5×5 S2 avg 2×2 C3 16 ker 5×5×6 S4 avg 2×2 C5 120 ker 5×5×16 F6 tanh Output 10 classi ~60K parametri · MNIST (70K immagini, 10 classi) · accuratezza 99% sul test
Tavola 11.3 — LeNet-5 (1998): tre layer convoluzionali (C1, C3, C5) con tanh, due average pooling 2×2 (S2, S4) e due livelli fully-connected (F6, Output). È il modello base di ogni CNN.

8. Addestrare una CNN: mini-batch gradient descent

Il processo di addestramento di una rete neurale si riassume in questi step:

  1. inizializzazione casuale dei pesi della rete;
  2. un'immagine viene data in input e tramite la forward-propagation si ottengono le probabilità di output per ogni classe;
  3. si calcola l'errore del livello di output come scostamento tra l'output prodotto e quello desiderato;
  4. con la back-propagation si calcolano i gradienti dell'errore rispetto a tutti i pesi e si usa la discesa del gradiente per aggiornare i parametri così da ridurre al minimo l'errore;
  5. si ripetono gli step 2–4 per tutte le immagini del training set.

Mini-batch Gradient Descent (o SGD) è l'approccio più utilizzato. A ogni epoca (la presentazione di tutti gli esempi del training set) gli n pattern sono ordinati casualmente e suddivisi in mini-batch di uguale dimensione (sizemb); i valori del gradiente sono accumulati in variabili temporanee e l'aggiornamento dei pesi avviene solo quando tutti i pattern di un mini-batch sono stati processati. Casi limite: sizemb = 1 → stochastic; sizemb = n → batch; 1 < sizemb < n → mini-batch. Un'iterazione è la presentazione degli esempi di un mini-batch e il conseguente aggiornamento dei pesi; un'epoca contiene quindi n/sizemb iterazioni.

Epoche e iterazioni nel mini-batch SGD

Con n = 1000 pattern e una dimensione di mini-batch variabile, osserva quante iterazioni servono per completare un'epoca e come cambia la frequenza degli aggiornamenti dei pesi.

9. AlexNet: ReLU, dropout e data augmentation

Nel 2012, Krizhevsky, Sutskever e Hinton proposero AlexNet, una CNN con architettura simile a LeNet composta da cinque convolutional layer, tre livelli di max pooling e tre livelli fully-connected. È la prima rete a usare ReLU per introdurre non-linearità (dopo ogni convolutional e fully-connected layer), aumentando la velocità di apprendimento. Usa inoltre Local Response Normalization (LRN) per limitare l'aumento incontrollato dell'output e migliorare la generalizzazione; overlapping max pooling invece dell'average; dropout (p = 0.5) nei primi due livelli fully-connected; SGD come ottimizzatore. Addestrata con 1,2M immagini in 1000 classi (ImageNet), con data augmentation sia in training sia in test; con circa 60M di parametri servirono quasi sei giorni su due GPU (GTX 580). AlexNet vinse con largo margine l'ImageNet LSVRC-2012 con un error rate del 15,3% (contro il 26,2% del secondo classificato). Contributi: ReLU, dropout, data augmentation, addestramento parallelo su più GPU. Svantaggio: elevato numero di parametri (~60M).

ReLU

La funzione di attivazione determina l'output del neurone in funzione del suo livello di eccitazione. Nelle reti profonde, per risolvere il problema del vanishing gradient, la funzione più usata è la ReLU (Rectified Linear Unit): f(net) = max(0, net). Vantaggi: la derivata vale 0 per valori negativi o nulli di net e 1 per valori positivi; è efficiente da calcolare rispetto a sigmoide o tanh. Svantaggi: è una funzione non limitata, che potrebbe far «esplodere» il valore di output del neurone; per valori negativi restituisce 0, disattivando i neuroni corrispondenti e riducendo la capacità di adattamento della rete.

Dropout

Il dropout (introdotto nel 2012) è un metodo di regolarizzazione per ridurre l'overfitting causato dall'alto numero di parametri rispetto agli esempi di training. Durante il training, per ogni immagine ogni neurone ha una probabilità p di essere ignorato nelle fasi di forward e backward: ogni input passa attraverso una diversa architettura della rete, aumentando la robustezza dei parametri appresi. In fase di test si usa l'intera rete ma l'output viene ridotto di un fattore p per tenere conto dei neuroni ignorati in training. Il dropout aumenta il numero di iterazioni necessarie per convergere, ma il tempo per un'epoca di addestramento si riduce.

Data augmentation

La data augmentation riduce l'overfitting e il problema della disponibilità limitata di dati: aumenta quantità, qualità e variabilità del training set aggiungendo copie modificate di dati già presenti o generando nuovi dati sintetici. Esempi: traslazione, rotazione, riscalatura, flipping, stretching, cropping, modifica di colori, luminosità e contrasto, aggiunta di rumore, cancellazioni casuali, mix di immagini.

10. VGGNet e GoogLeNet: profondità, inception e kernel 1×1

VGGNet (2014)

Il Visual Geometry Group propose VGGNet, architettura simile ad AlexNet composta da 13 convolutional layer (VGG-16), cinque livelli di max pooling e tre livelli fully-connected. A differenza di AlexNet applica in cascata kernel a dimensione costante 3 × 3, riducendo il numero di parametri; non usa LRN (aumenta memoria e tempi senza migliorare le prestazioni); usa dropout (p = 0.5) nei primi due livelli FC e SGD. Esistono versioni con diverso numero di layer convoluzionali: VGG-11 (8), VGG-13 (10), VGG-16 (13), VGG-19 (16), addestrate incrementalmente partendo da VGG-11. VGG-16 ha circa 138M di parametri (la maggior parte, ~120M, nei livelli FC) e richiese circa tre settimane su quattro GPU; arrivò seconda all'ImageNet LSVRC-2014 (error rate 7,3%). Contributi: dimostra che la profondità della rete è importante; kernel piccoli aiutano a mantenere basso il numero di parametri. Svantaggi: elevato numero di parametri; con l'aumentare della profondità la capacità di generalizzazione inizia a degradare (overfitting e vanishing gradient).

GoogLeNet (2014)

GoogLeNet è composta da tre convolutional layer, quattro livelli di max pooling, nove inception module, un livello di global average pooling e un livello fully-connected. Usa convoluzioni 1 × 1 per ridurre la complessità computazionale; gli inception module individuano i dettagli dell'immagine a risoluzioni diverse; il global average pooling riduce drasticamente i parametri della parte fully-connected. GoogLeNet ha «solo» 7M di parametri e vinse l'ImageNet LSVRC-2014 con error rate del 6,7%. Svantaggio: troppo complessa per dispositivi mobili/embedded.

Kernel 1×1: la riduzione di complessità

Un livello 5 × 5 su un volume 14 × 14 × 480 con 48 kernel costa 14·14·48·5·5·480 ≃ 112,9M connessioni e 48·5·5·480 ≃ 576K pesi. Applicando prima una convoluzione 1 × 1 (16 kernel 1 × 1 × 480) e poi la 5 × 5 (48 kernel 5 × 5 × 16) si ottengono 14·14·16·1·1·480 + 14·14·48·5·5·16 ≃ 5,3M connessioni e 16·1·1·480 + 48·5·5·16 ≃ 26,9K pesi — un risparmio di oltre 20 volte, a parità di dimensioni del volume di output.

Kernel 1×1: il collo di bottiglia che riduce il costo

Confronta le connessioni di una convoluzione 5×5 diretta contro la stessa operazione preceduta da una convoluzione 1×1 (collo di bottiglia). I valori di default riproducono l'esempio delle slide (112,9M → 5,3M).

input 28 × 28 × 256 conv 1×1 (64) conv 3×3 (128) conv 1×1 (16) conv 5×5 (32) max pool 3×3 conv 1×1 (32) conv 1×1 (96) (riduzione canali) concatenazione: output 28 × 28 × 256
Tavola 11.4 — L'inception module: quattro percorsi paralleli (convoluzioni 1×1, 3×3, 5×5 e max pooling con 1×1) con padding opportuno, i cui output vengono concatenati. I kernel 1×1 fungono da collo di bottiglia per ridurre la complessità.

11. ResNet: residual block, skip connection e batch normalization

Nel 2015, He, Zhang, Ren e Sun (Microsoft Research) proposero ResNet (Residual neural Network), composta da un convolutional layer, un max pooling, quattro residual block (B1–B4), un global average pooling e un livello fully-connected. Usa ReLU, SGD e batch normalization dopo ogni convolutional layer e prima dell'attivazione. Per addestrare reti molto profonde evitando il degrado delle prestazioni usa una sequenza di residual block e le skip connection; la riduzione delle dimensioni è ottenuta con stride = 2 in alcuni convolutional layer invece del pooling. Versioni: ResNet-18/34/50/101/152; ResNet-50 ha circa 25M di parametri. ResNet vinse l'ImageNet LSVRC-2015 battendo per la prima volta l'esperto umano (error rate 5,1%): ResNet-50 5,3%, ResNet-152 4,5%, combinazione di 6 modelli 3,6%. Contributi: skip connection (non i primi a usarle), residual block, CNN con più di 150 livelli senza compromettere la generalizzazione, tra i primi a usare batch normalization.

Residual block e skip connection

Ogni blocco è composto da un numero variabile di sotto-blocchi con convolutional layer a numero di kernel costante (64, 128, 256, 512) all'interno del medesimo blocco; le dimensioni spaziali (W e H) restano costanti. Ogni sotto-blocco contiene due convolutional layer e una skip connection che porta l'input del sotto-blocco fino all'output, dove viene sommato con l'output del secondo convolutional layer. Nelle skip connection «tratteggiate» (quando un layer con stride 2 riduce le dimensioni spaziali) si deve effettuare una preventiva riduzione delle dimensioni tramite un convolutional layer 1 × 1 con stride 2 prima di poter eseguire la somma.

Batch normalization

La Batch Normalization (BN) è un livello di normalizzazione addestrabile usato per il problema dell'Internal Covariate Shift (ICS), causato dai cambiamenti delle distribuzioni dei neuroni hidden. Se i sottoinsiemi (mini-batch) si trovano in regioni diverse dello spazio delle feature, l'addestramento «rimbalza» avanti e indietro tra le distribuzioni rallentando la convergenza. La BN attenua il problema normalizzando, per ogni mini-batch, l'output dei neuroni hidden prima della funzione di attivazione. I parametri di riscalatura γ e traslazione β sono introdotti per lasciar decidere alla rete se applicare la normalizzazione o meno (γ = √(σ²ℬ + ε), β = μℬ). In fase di prediction (immagini singole) non è possibile calcolare μ e σ²: alla fine del training si calcolano le statistiche di normalizzazione sull'intero dataset. La dimensione dei mini-batch assume maggiore importanza; BN è usata nella maggior parte delle CNN moderne, accelerando considerevolmente la convergenza, anche se non è dimostrato che riduca effettivamente l'ICS.

conv 3×3 + BN + ReLU (F: 64 · 128 · 256 · 512) conv 3×3 + BN + skip connection F(x) + x il blocco apprende il residuo F(x) invece della mappatura completa H(x) = F(x) + x skip tratteggiata: conv 1×1 stride 2
Tavola 11.5 — Il residual block di ResNet: due layer convoluzionali (con batch normalization) e una skip connection che somma l'input al risultato. La rete apprende il residuo F(x), evitando il degrado delle reti molto profonde.

12. MobileNet: depthwise separable convolution

Nel 2017 Google propose MobileNet, una rete progettata per funzionare su dispositivi mobile e/o embedded, composta da 27 convolutional layer, un global average pooling e un livello fully-connected. Usa depthwise separable convolution al posto dei classici convolutional layer (riducendo drasticamente il costo computazionale), batch normalization dopo ogni livello, ReLU come attivazione (softmax solo nell'ultimo FC), riduzione spaziale tramite stride, e RMSProp come ottimizzatore. Due iperparametri riducono ulteriormente modello e costo: width multiplier α e resolution multiplier ρ. MobileNet-224 ha circa 4,2M di parametri e su ImageNet raggiunge un'accuratezza dell'89,5% (error rate 10,5%), superando AlexNet con un numero nettamente inferiore di parametri.

Depthwise separable convolution

Divide un kernel in due kernel separati ed esegue in sequenza due operazioni:

  1. depthwise convolution: tanti kernel quant'è la profondità C del volume di input, ognuno applicato solo a uno specifico strato dell'input (profondità 1);
  2. pointwise convolution: una convoluzione classica in cui ogni kernel ha dimensione 1 × 1 × C, che combina i canali.

Applicando in sequenza le due operazioni si ottiene un volume di output con le stesse dimensioni della convoluzione classica, ma con un costo molto inferiore:

Convoluzione classica:          W_O · H_O · N · F · F · C
Depthwise separable:            W_O · H_O · C · F · F · 1 + W_O · H_O · N · 1 · 1 · C

Nell'esempio delle slide (8 × 8, C = 3, F = 5, N = 256): convoluzione classica ≃ 1229K moltiplicazioni; depthwise separable = 4800 + 49152 ≃ 54K, cioè il 4,4%. Svantaggio: riducendo troppo i parametri, una rete troppo piccola potrebbe non apprendere correttamente durante l'addestramento; usata correttamente, migliora l'efficienza senza ridurre in maniera significativa l'accuratezza.

Depthwise separable: quante moltiplicazioni risparmi?

Imposta le dimensioni del volume (W=H, C), il kernel F e il numero di kernel N per confrontare le moltiplicazioni della convoluzione classica con quelle della depthwise separable (valori di default dall'esempio delle slide).

13. Il confronto su ImageNet, ViT e Swin

L'ImageNet Large Scale Visual Recognition Challenge (ILSVRC) è una competizione internazionale annuale sulle prestazioni di diversi problemi di computer vision su un sottoinsieme di ImageNet: 1000 classi, 1,2M immagini di training, 50K di validation, 100K di test. La tabella seguente riassume i modelli visti (l'errore di LeNet-5 non è riportato perché non addestrata su ImageNet):

Modello# Layer# ParametriMAddsError rate
LeNet-5560K
AlexNet860M0.7G15.3%
VGG-1616138M15.3G7.3%
GoogLeNet227M1.6G6.7%
ResNet-505025M3.9G5.3%
DenseNet-1211217M2.8G
MobileNet-2242244.2M0.6G10.5%
SENet2.3%

ViT e Swin: i Transformer per la visione

ViT (Vision Transformer, 2020, Google Research) è il primo Transformer progettato per l'image recognition: l'immagine viene suddivisa in regioni non sovrapposte 16 × 16; ogni regione è linearizzata e integrata con la posizione relativa nell'immagine originale; i vettori sono dati in input a un Transformer Encoder che codifica le relazioni tra le regioni. Su ImageNet raggiunge l'88% (error rate 12%), risultati comparabili con le CNN.

Swin (Shifted Window, 2021, Microsoft Research Asia) è un Transformer gerarchico: per ogni livello, l'immagine è divisa in finestre non sovrapposte, ogni finestra in patch non sovrapposte, ogni patch è linearizzata e integrata con la posizione; lungo la gerarchia le finestre vengono shiftate per catturare connessioni tra livelli, e fuse progressivamente (riducendo la risoluzione, aumentando i canali). Su ImageNet raggiunge l'87% (error rate 13%).

14. Pre-processing e transfer learning

Image pre-processing — in uno scenario reale le immagini presentano differenze che, se non standardizzate, riducono sensibilmente le prestazioni: dimensione, risoluzione, contrasto, luminosità, numero di canali (RGB/grayscale), pixel range ([0,255] vs [0,1]), errori di etichettatura. Non esiste una «ricetta» unica: si devono analizzare le immagini a disposizione e selezionare le operazioni più opportune. Operazioni comuni: resize, aspect ratio, crop, conversione in grayscale, allineamento, normalizzazione del colore.

Transfer learning — il training di reti complesse su dataset di grandi dimensioni può richiedere giorni o settimane anche su più GPU, e un nuovo problema richiede un training set etichettato di notevoli dimensioni. Con transfer learning si intende un insieme di tecniche per adattare un modello pre-addestrato (su uno specifico dominio per un determinato task) a un nuovo dominio o task:

Keras e PyTorch forniscono modelli pre-addestrati pronti all'uso per classificazione, estrazione di feature e fine-tuning. Il motivo per cui servono grandi quantità di dati: le reti moderne contengono milioni (o miliardi) di parametri addestrabili e, per ottenere buone prestazioni, devono vedere un numero proporzionale di esempi.

Verifica le tue conoscenze

Che cosa restituisce un sistema di image classification?

L'etichetta di una classe (scelta tra un insieme predefinito) e spesso una probabilità (o score) associata alla classe restituita, riferita di solito all'oggetto predominante nell'immagine.

Quali sono gli svantaggi dei MLP per l'elaborazione delle immagini?

Un neurone per ogni input: il numero di pesi cresce rapidamente (es. 600×400×3 = 720.000 input → 3,6M di pesi per un layer di 5 neuroni); nessuna invarianza per traslazione (reagiscono diversamente a un'immagine e alla sua versione traslata); la relazione spaziale viene persa (i pixel adiacenti definiscono le caratteristiche dell'immagine).

Che cosa hanno dimostrato Hubel e Wiesel e come si collega alle CNN?

Nel 1968 dimostrarono che la corteccia visiva dei mammiferi ha un'architettura a strati con rappresentazioni sempre più complesse. Le simple cell rispondono a edge con una particolare orientazione in una zona (receptive field); le complex cell rispondono indipendentemente dalla zona (invarianza spaziale), «sommando» simple cell con la stessa orientazione. Lo stesso principio — combinare cellule semplici per crearne di complesse — è alla base delle CNN.

Quali sono le tre principali differenze tra una CNN e un MLP?

1) Processing locale: i neuroni sono connessi solo localmente al livello precedente (meno connessioni); 2) pesi condivisi: neuroni diversi dello stesso livello eseguono la stessa elaborazione su porzioni diverse dell'input (meno pesi); 3) alternanza di livelli di feature extraction e pooling.

Scrivete la formula che lega input, filtro, stride e padding nell'output di una convoluzione.

W_out = (W_in − F + 2·Padding) / Stride + 1. Un kernel ha lo stesso numero di canali del volume di input; per canali multipli i risultati delle convoluzioni per canale vengono sommati in un'unica feature map per kernel.

Quali sono gli obiettivi e le caratteristiche del pooling?

Ridurre la dimensione della feature map mantenendo le informazioni più importanti: diminuisce i parametri (meno overfitting, meno potenza di calcolo) e rende la rete robusta a piccole trasformazioni, distorsioni, traslazioni e cambi di scala. Aggrega con una finestra scorrevole (di solito Max o Avg) nell'ambito di ciascuna feature map; non ha parametri addestrabili.

Descrivete la parte fully-connected e la softmax.

Il volume di output della feature extraction viene linearizzato (vettore di m = W·H·C valori) e dato a un MLP che apprende combinazioni non lineari delle feature e classifica. La softmax softmax(x)_i = e^{x_i} / Σ_k e^{x_k} è l'attivazione dell'output: assicura che le probabilità sommino a 1.

Descrivete l'architettura e i risultati di LeNet-5.

Tre convolutional layer (C1, C3, C5), due average pooling (S2, S4), due fully-connected (F6 e Output); tanh per la non-linearità, SGD come ottimizzatore, ~60K parametri. Addestrata su MNIST (70K immagini 32×32, 10 classi) con accuratezza del 99% sul test. È il «modello base» di ogni CNN: conv+pool intervallati per le feature, FC per la classificazione.

Come funziona il mini-batch gradient descent e che differenza c'è tra epoca e iterazione?

Gli n pattern del training set sono ordinati casualmente e suddivisi in mini-batch; i gradienti sono accumulati e i pesi si aggiornano solo a fine mini-batch. size_mb = 1 → stochastic; size_mb = n → batch. Un'epoca è la presentazione di tutti gli esempi; un'iterazione è la presentazione di un mini-batch e il conseguente aggiornamento dei pesi.

Quali sono i contributi principali di AlexNet?

ReLU (non-linearità, velocizza l'apprendimento), dropout (regolarizzazione, p = 0.5 nei primi due FC), data augmentation (training e test), addestramento in parallelo su più GPU. Vinse l'ImageNet LSVRC-2012 con error rate 15,3%; svantaggio: ~60M di parametri.

Descrivete ReLU: formula, vantaggi e svantaggi.

f(net) = max(0, net). Vantaggi: derivata 0 per net ≤ 0 e 1 per net > 0 (contrasta il vanishing gradient); efficiente da calcolare. Svantaggi: funzione non limitata (può far esplodere l'output); per input negativi restituisce 0, disattivando i neuroni e riducendo la capacità di adattamento.

Come funziona il dropout in training e in test?

In training, per ogni immagine ogni neurone ha probabilità p di essere ignorato in forward e backward: ogni input passa attraverso una diversa architettura, aumentando la robustezza. In test si usa l'intera rete ma l'output è ridotto di un fattore p. Aumenta le iterazioni per convergere ma riduce il tempo per epoca.

Qual è il ruolo dei kernel 1×1 e come riducono la complessità?

I kernel 1×1 creano un «collo di bottiglia» che riduce i canali prima di una convoluzione costosa. Nell'esempio: 5×5 diretta su 14×14×480 = 112,9M connessioni; con un 1×1 intermedio (16 kernel) e poi la 5×5 = 5,3M connessioni — un risparmio di oltre 20 volte a parità di output.

Che cos'è un inception module?

Un modulo con quattro percorsi paralleli: convoluzioni 1×1, 3×3 e 5×5 (le ultime due precedute da una convoluzione 1×1 di riduzione) e un max pooling 3×3 seguito da un 1×1; tutti con padding opportuno per mantenere le dimensioni spaziali. Gli output dei quattro percorsi vengono concatenati in un unico volume.

Che cosa sono le skip connection e i residual block di ResNet?

Le skip connection portano l'input di un sotto-blocco fino all'output, dove viene sommato con l'output del secondo convolutional layer: il blocco apprende il residuo F(x) invece della mappatura completa H(x) = F(x) + x. Quando un layer con stride 2 riduce le dimensioni, la skip (tratteggiata) usa una conv 1×1 stride 2 per riallineare le dimensioni prima della somma.

Che cos'è l'internal covariate shift e come lo risolve la batch normalization?

I mini-batch possono giacere in regioni diverse dello spazio delle feature (covariate shift anche nei livelli hidden): l'addestramento «rimbalza» tra distribuzioni rallentando la convergenza. La BN normalizza, per ogni mini-batch, l'output dei neuroni hidden prima della funzione di attivazione, con parametri addestrabili γ e β. In prediction si usano le statistiche calcolate sull'intero dataset a fine training.

Che cos'è la depthwise separable convolution e quanto costa rispetto alla convoluzione classica?

Divide il kernel in due: depthwise (un kernel per canale, profondità 1) + pointwise (kernel 1×1×C). Costo: W_O·H_O·C·F·F + W_O·H_O·N·C contro W_O·H_O·N·F·F·C. Nell'esempio (8×8, C=3, F=5, N=256): 54K contro 1229K moltiplicazioni, il 4,4%.

Come funziona ViT e in cosa si differenzia Swin?

ViT: l'immagine è divisa in patch 16×16 non sovrapposte, linearizzate e integrate con la posizione relativa, elaborate da un Transformer Encoder (88% su ImageNet). Swin: Transformer gerarchico a finestre (shiftate lungo i livelli per catturare connessioni tra finestre), fuse progressivamente riducendo la risoluzione e aumentando i canali (87% su ImageNet).

Quali sono le due modalità principali di transfer learning?

Estrattore di feature: si usano le feature di livelli intermedi di una rete pre-addestrata per addestrare un classificatore tradizionale (es. SVM). Fine-tuning: si rimpiazza il livello di output con una nuova softmax (numero di classi adeguato), si inizializzano i pesi da quelli pre-addestrati (tranne le connessioni dell'ultimo livello, random) e si riaddestra sul nuovo dataset.