Tesi Reti CNN
Tesi Reti CNN
Relatore Laureando
prof. Enrico Masala Ignazio Barraco
Dicembre 2019
Ringraziamenti
Prima di entrare nel vivo della trattazione, desidero ringraziare vivamente il mio relatore,
prof. Enrico Masala, per gli spunti, gli strumenti e per il costante supporto offertomi prima
e durante lo svolgimento della tesi e per l’interesse che ha acceso in me verso l’argomento
trattato, che sono sicuro mi saranno di grande aiuto nel proseguo della mia vita, lavorativa
e non.
Un GRAZIE, un po’ più intimo,
A chi mi è stato accanto,
A chi mi ha sostenuto,
A chi ci è voluto essere,
A chi mi ha spinto, spronato,
A chi non ha mai smesso di credere in me,
A chi è tornato a farmi credere in me stesso,
A chi mi è stato di esempio per essere quello che sono oggi.
Sarebbe quasi scontato adesso elencare ciascuno di voi, ma siccome le cose semplici
non mi piacciono, lascio a ciascuno di voi che leggerà questa pagina, la possibilità di
immaginarsi o meno in una di queste affermazioni oppure chissà solo in qualcuna o in
tutte. E semmai, pensiate di esserci, spero in cuor mio di avervi lasciato qualcosa anch’io
e di potervela lasciare ancora in futuro. Ma soprattutto un grazie speciale va a voi,
Leonardo, Isidoro e Pina, grazie per tutto.
iii
Sommario
iv
Indice
1 Introduzione 1
1.1 Panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Scopo della Tesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
v
3 Lo Stato Dell’Arte delle Reti Neurali 22
3.1 Introduzione allo stato dell’arte . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2 The ImageNet Large Scale Visual Recognition Challenge (ILSVRC) . . . . 23
3.3 Architetture dei Modelli CNN . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.1 1994: LeNet5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.2 2012: AlexNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.3 2013: ZFNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3.4 2013: Network in Network . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3.5 2014: VGG-Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.6 2014: GoogLeNet (Inception V1) . . . . . . . . . . . . . . . . . . . . 32
3.3.7 2015: Inception V2 & Inception V3 . . . . . . . . . . . . . . . . . . . 33
3.3.8 Inception-V4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.9 2015: ResNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.10 2016: Inception-ResNet . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.11 2016: PolyNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.12 2016: ResNext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.13 2016: XCeption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3.14 2016: PVANet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3.15 2017: DenseNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3.16 2016/2017: SqueezeNet . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4 Reti CNN Mobile ed Embedded . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.1 2017: MobileNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.2 2017: MobilNet V2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.3 2018: FastDownSampling MobileNet . . . . . . . . . . . . . . . . . . 42
3.4.4 2017: ShuffleNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4.5 2016: SimpleNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4.6 2017: CondenseNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.4.7 Enet (Efficient Neural Network) . . . . . . . . . . . . . . . . . . . . 43
3.4.8 2017: CapsuleNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.5 Architetture di Rete per Object Detection . . . . . . . . . . . . . . . . . . . 45
3.6 Region Proposal Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.7 Region CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.7.1 2015-Fast Region Based CNN . . . . . . . . . . . . . . . . . . . . . . 46
3.7.2 2016 Faster R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.7.3 2017: R-FCN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.8 Reti per Semantic Segmentation . . . . . . . . . . . . . . . . . . . . . . . . 48
vi
3.8.1 2016 MASK R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.8.2 2016: ParseNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.9 Un Differente tipo di approccio . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.9.1 2016 YOLO: Real-Time Object Detection . . . . . . . . . . . . . . . 50
3.9.2 2016: SSD MultiBox . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.9.3 2017: RetinaNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.10 Video Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
vii
5 Scenari Applicativi 79
5.1 Inference e Scenari pratici . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.2 TensorFlow: classificazione . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.2.1 Classificazione TF con modello architetturale CUSTOM . . . . . . . 80
5.2.2 Classificazione con Modello di Rete già allenato . . . . . . . . . . . . 82
5.2.3 Classificazione con TensorFlow Slim . . . . . . . . . . . . . . . . . . 83
5.3 TensorFlow: Localizzazione e Classificazione mediante Api Object Detection 85
5.4 Caffe: Classificazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.4.1 Classificazione con Rete referenziata da Caffe . . . . . . . . . . . . . 87
5.5 Caffe: Object Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.5.1 Ricerca Selettiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.5.2 Caffe: script di Object Detection . . . . . . . . . . . . . . . . . . . . 88
5.6 PyTorch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.6.1 PyTorch: Classificazione . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.6.2 PyTorch: SSD Single Shot Multibox Detector[70] . . . . . . . . . . . 93
5.6.3 PyTorch: Yolo per Object Detection . . . . . . . . . . . . . . . . . . 95
5.6.4 Pytorch: Yolo per Video Object Tracking . . . . . . . . . . . . . . . 97
5.7 Semantic Segmentation e Detectron . . . . . . . . . . . . . . . . . . . . . . 98
7 Conclusioni 123
Bibliografia 125
viii
Capitolo 1
Introduzione
1.1 Panoramica
L’utilizzo di internet e in particolare dei Social Network ha oramai invaso le nostre vite
in maniera del tutto trasparente, inserendosi in maniera centrale nella stragrande maggio-
ranza delle nostre attività giornaliere, siano esse lavorative o ricreative. Tutto ciò ha fatto
sı̀ che le problematiche e gli ambiti di ricerca inerenti si siano progressivamente ampliati
ed abbiano svariato su diversi fronti.
L’argomento centrale di questa tesi sono le immagini e i video, che caratterizzano internet
ma soprattutto i social network. Idea preponderante sarà il riconoscimento dei contenuti
all’ interno all’interno di questi, al fine di riuscire a predire in maniera sempre più accurata
ciò che già naturalmente l’uomo può analizzare.
In questo ambito negli ultimi anni è diventato di fondamentale importanza l’utilizzo di
tecniche di Intelligenza Artificiale, quindi di “apprendimento automatico”, una disciplina
dell’informatica che studia tecniche mirate alla progettazione di sistemi hardware e soft-
ware utili a far fornire all’elaboratore elettronico prestazioni che comunemente possono
apparire solo come di pertinenza dell’intelligenza umana. Oggi l’Intelligenza Artificiale è
sfruttata da molti colossi informatici, tecnologici e non: Facebook la sfrutta per i propri
algoritmi di tag, Google per la ricerca delle foto, Amazon per indicare consigli sui prodotti
e sugli acquisti e cosı̀ anche altre piattaforme social come Pinterest o Instagram; questi
algoritmi riscuotono grande successo nell’identificazione di visi umani oltre che di deter-
minati oggetti in immagini e video oltre che essere molto usate per il riconoscimento di
tracce audio e linguaggi naturali.
Un argomento di studio in rapido e costante sviluppo e pertanto una nuova e migliore
architettura/algoritmo/tecnica è annunciata da una settimana all’altra o a distanza di
mesi, nonostante spesso si tratti di un miglioramento dello stato dell’arte conosciuto fino
a quel momento.
L’obiettivo dichiarato e verso cui si sta puntando con decisione in ambito machine learning
è pareggiare e in alcuni casi superare i risultati che riesce ad ottenere l’essere umano.
1
1 – Introduzione
2
1 – Introduzione
Figura 1.1: In alto a destra un classico esempio di classificazione (MACAW 97,2%) mentre
a sinistra di localizzazione e classificazione; in basso un classico esempio di object detection
di oggetti multipli.
3
Capitolo 2
Nella nostra ricerca si farà uso sia del termine Machine Learning (ML) [1] che del
termine Deep Learning [2] (DL) (e delle relative sigle indicate tra parentesi), consci
del fatto che erroneamente si fa spesso confusione, usandoli come sinonimi e come sino-
nimo del termine Intelligenza Artificiale. Di seguito sarà fatta una panoramica veloce su
entrambe al fine di fare chiarezza e comprendere meglio ciò che sarà esposto nei paragrafi
successivi.
Machine Learning indica un insieme di metodi con cui si allena l’intelligenza artificiale
in modo tale da poter svolgere delle attività non programmate, ma soprattutto da poter
apprendere dall’esperienza pregressa come esattamente fa l’intelligenza umana, correggen-
dosi e quindi migliorandosi attraverso gli errori commessi e prendendo decisioni autonome.
Il Deep Learning costituisce l’insieme delle tecniche necessarie alla realizzazione del Ma-
chine Learning e quindi può essere considerata una sottoclasse dello stesso. Gli algoritmi
di DL simulano il comportamento del cervello umano.
Il ML è un metodo statistico di apprendimento, nel quale ogni istanza, raccolta in un set di
dati campionati a priori (immagini nel nostro caso), è descritta da un set di informazioni
(features) o attributi, mentre il DL è un metodo statistico per estrarre le informazioni
(features) o gli attributi da un da un set di dati mediante l’uso di reti neurali.
Il termine Deep riveste un ruolo chiave: deriva proprio dal fatto che le reti neurali utilizza-
te sono dotate di svariati livelli nascosti di neuroni, che le rendono per l’appunto profonde
e somiglianti a livello strutturale al cervello umano.
L’intelligenza artificiale si lega indissolubilmente con l’ottimizzazione matematica, la quale
fornisce metodi, teorie e domini di applicazione. Molti problemi di apprendimento auto-
matico, infatti, sono formulati come problemi di minimizzazione di una certa funzione di
perdita (loss function) applicati ad set di esempi (training set). Nel nostro caso, esprime
la differenza tra i valori predetti dal modello in fase di allenamento e i valori attesi. “L’o-
biettivo finale è dunque quello di insegnare alla rete la capacità di predire correttamente i
valori attesi su un set di istanze non presenti nel training set (test set) mediante la mini-
mizzazione della loss function”. [3]. Sono stati utilizzati termini quali training set, test
set, loss fuction: questi sono alcuni degli elementi che saranno dettagliati nei prossimi
capitoli.
4
2 – Convolutional Neural Network
L’argomento centrale della ricerca può apparire a primo impatto come qualcosa di vera-
mente semplice ma in realtà presuppone la conoscenza di un ampio ventaglio di teoria
matematica e innovazioni algoritmiche. Ad esempio, a livello pratico il punto di partenza
sarà un’immagine di input utilizzata allo scopo di ottenere in output una immagine “eti-
chettata” nella quale i soggetti rappresentati saranno categorizzati: come già ampiamente
sottolineato ciò per noi umani è qualcosa di innato, però quando lavoriamo con una mac-
china, quale un pc o un dispositivo mobile (con discrete capacità di calcolo), che svolgerà
5
2 – Convolutional Neural Network
1
Le nozioni teoriche sono tratte da diverse fonti: capitoli di libri scientifici trattanti ML [5], articoli su
siti specializzati [7] nel settore ma anche da siti di ricerca generica per alcune definizioni [6]
6
2 – Convolutional Neural Network
Le reti neurali artificiali (ANN: Artificial Neural Network) [8], come già anticipato, sono
modelli matematici che simulano i comportamenti del cervello umano. ll cervello è un
calcolatore straordinario: interpreta a velocità elevatissime informazioni fornite dai sensi
e impara autonomamente a creare le rappresentazioni interne, che gli permettono di svol-
gere questa funzionalità. Già a partire dagli anni 90’ con i primi approcci si è cercato
di riprodurre in maniera artificiale il comportamento del cervello progettando delle sorte
di reti (ancora ai tempi embrionali ma oggi molto performanti), costruite tentando prima
di individuare le caratteristiche essenziali dei neuroni e delle loro interconnessioni e poi
programmando un calcolatore che simulasse tale comportamento.
I neuroni sono internamente costituiti da: dendriti, sinapsi ed assoni. Un neurone
raccoglie i segnali provenienti da altre cellule grazie ai dentriti ed emette impulsi elettrici
attraverso l’assone, a sua volta diviso in migliaia di diramazioni, alla cui estremità è rico-
noscibile la sinapsi che trasforma l’attività dell’assone in fenomeni elettrici che inibiscono
o eccitano l’attività dei neuroni collegati. Quando un neurone riceve un segnale, invia
lungo l’assone un impulso di attività elettrica.
L’apprendimento avviene quando le sinapsi trasmettono i segnali da un neurone all’altro.
Traslando tutto ciò al nostro contesto, si nota una similitudine con il comportamento del
cervello: le reti artificiali sono composte da unità interconnesse, che corrispondono proprio
ai neuroni mentre la funzione della sinapsi è simulata da un peso modificabile associato
a ogni connessione. Ciascuna unità trasforma l’insieme dei segnali ricevuti in un unico
segnale in uscita, che viene trasmesso alle altre unità.
Tale trasformazione avviene in due fasi: il segnale in ingresso è moltiplicato per il peso del-
la connessione e poi tutti i risultati ottenuti vengono sommati. Nel tempo cosı̀ il neurone
si specializza quindi a riconoscere determinati stimoli e ad apprenderli.
Nelle reti Neurali Artificiali sono stati utilizzati due tipi di neuroni artificiali: i per-
cettroni e quelli maggiormente usati negli ultimi anni detti neuroni sigmoidali o di
Sigmoid. Il percettrone prende in input diversi valori binari x1, x2, x3..xn e produce un
singolo valore binario in output: per valutare questo valore, bisogna combinare i pesi (wj)
corrispondenti ad ogni ingresso (xj). Come detto si tratta di un valore binario e quindi
vale 0 o 1, e lo assume a seconda che la somma pesata degli input sia minore o maggiore
di un valore di soglia che dipende dal neurone.
7
2 – Convolutional Neural Network
Il percettrone (fig 2.3) nell’ottica della nostra ricerca può essere assimilato come un
modello matematico di classificazione che valuta i valori ricevuti in input: un singolo per-
cettrone non è abbastanza per costruire una vera e propria rete complessa che prenda
decisioni complesse, ripetute e in cascata, e magari decisioni sempre più granulari, per cui
sarà necessario costruire degli strati detti layer costituiti da diversi percettroni.
{ ∑
0 se ∑i wj xj ≤ soglia
y= (2.1)
1 se i wj xj > soglia
La funzione 2.1 può essere riscritta ottenendo la 2.2 e definendo come scostamento
il valore b (matematicamente equivalente a “-soglia”); attraverso questa semplificazione
possiamo definire la precedente funzione come la misura di quanto sia facile attivare il
neurone: ogni variazione nei pesi o nello scostamento può fare variare l’uscita, e questo
può essere sfruttato per far sı̀ che la rete si comporti in modo diverso al variare della
situazione.
{
0, se w · x + b ≤ 0
y= (2.2)
1, se w · x + b > 0
8
2 – Convolutional Neural Network
Questo è il punto cruciale alla base delle reti neurali nella fase di apprendimento: si
varia un parametro, che sia il peso o lo scostamento della rete, per avvicinarsi a modelli
di predizione sempre più corretti e precisi. L’insieme dei pesi e del valore di scostamento
costituiscono il bias e rappresentano proprio l’informazione che il neurone apprende in
fase di addestramento e che conserva per le successive riutilizzazioni.
Il percettrone, pur avvicinandosi a questo concetto ideale non è il migliore dei neuroni
artificiali, visto che è un classificatore binario che fornisce quindi in output 0 e 1: questo
dettaglio è limitante poichè non ci permetterà di osservare un cambio significativo nel
modello ma solo una variazione alla modifica dei bias. Il neurone artificiale che assimila
meglio tale comportamento è invece il Neurone Sigmoidale rappresentato nel medesimo
modo del percettrone e che può avere quindi fino a n input (x1, x2..xn) con i relativi pesi
(w1, w2..wn) e che dipende dallo scostamento b; ha un uscita y, che può essere applicata
nuovamente come ingresso per altri neuroni sulla rete: la differenza sostanziale con il
percettrone sta nel fatto che il valore che possono assumere gli ingressi e le uscite sono
valori che oscillano tra 0 e 1.
Questo permetterà di modellare sistemi realistici.
La funzione di uscita 2.3 è di seguito definita e dipende dalla funzione sigmoidale. 2.4:
y = σ(w · x + b) (2.3)
1
σ(z) ≡ (2.4)
1 + e− z
Dal punto di vista matematico mentre la funzione del percettrone risulta essere una fun-
zione a scalino quella del neurone sigmoidale è una curva molto lenta che la rende adatta
a fornire in uscita cambiamenti sempre piccoli al variare dei parametri.
Figura 2.4: Struttura a livelli di una rete neurale. Fonte immagine: [11].
9
2 – Convolutional Neural Network
Una rete neurale quindi risulta essere costituita da uno strato di input e da uno di
output (figura 2.4), che in figura sono i più esterni mentre gli strati interni dipendono
dal tipo di rete implementata e determinano la profondità della rete; il numero di input
dipende dallo scopo e dalle scelte implementative mentre lo strato di output è variabile in
base al numero di valori in uscita del modello, e la presenza di più neuroni di uscita può
rendere più o meno preciso il risultato.
Un output, in questa struttura, può essere inviato come input allo strato successivo crean-
do delle reti feed-forward a patto che non vi siano dei cicli, quindi l’informazione vie-
ne sempre inviata in avanti; se ipoteticamente creassimo dei cicli potremmo parlare di
Reti Neurali Ricorrenti (RNN-Recurrent Neural Network), che si avvicinano
più al comportamento umano ma che sono meno utilizzate in termini di applicazione,
computazione e risultati e non saranno viste in questa ricerca.
10
2 – Convolutional Neural Network
2.3 La Convoluzione
Proposta una panoramica molto generale sulle Reti Neurali si può adesso scendere più
nel dettaglio analizzando quelle che sono le reti di nostro interesse: le Reti Neurali
Convoluzionali.
Figura 2.6: Idea alla base della convoluzione. Fonte ed approfondimenti: [13].
La Convoluzione, infatti, riprende le funzioni viste in precedenza (2.1) (2.2) (2.3) (2.4)
che saranno sfruttate come punto di partenza e che dipendono da due funzioni con ar-
gomenti reali: una funzione pesata (a) detta kernel ed una funzione x di input.
Dall’applicazione di queste verrà fuori una funzione risultante s come nell’equazione (2.5).
Il simbolo della convoluzione è un asterisco e il risultato ottenuto sarà una feature map.
s(t) = (x ∗ w)(t) (2.5)
Lavorando con dati “informatizzati” o per meglio dire “digitali”, il tempo risulta essere
discretizzato e dalla precedente formula si otterrà una formula più appropriata (2.6):
∞
∑
s(t) = (x ∗ w)(t) = x(a)w(t − a) (2.6)
a=−∞
11
2 – Convolutional Neural Network
∑∑
S(i, j) = (K ∗ I)(i, j) = I(i + m, j + n)K(m, n) (2.9)
m n
Come visto, le reti neurali tradizionali ricevono in input un singolo vettore e lo tra-
sformano attraverso una serie di strati nascosti, nel quale ogni neurone è connesso ad ogni
singolo neurone sia dello strato precedente che di quello successivo. Nel caso l’input sia
costituito da immagini di dimensioni ridotte, ad esempio 32×32×3 (32 altezza, 32 larghez-
za, 3 canali di colore), un singolo neurone connesso nella suddetta maniera comporterebbe
un numero totale di 32 × 32 × 3 = 3072 pesi, quindi un numero considerevole di pa-
rametri di partenza; le dimensioni però, in realtà, non sono queste ma ben più elevate:
appena 256 pixel fanno crescere il carico a 256 × 256 × 3 = 196.608 pesi per singolo
neurone, ovvero quasi 2 milioni di parametri per una semplice rete con un singolo livello
composto da dieci neuroni. L’architettura appena riassunta è chiamata fully-connected
[14] (fig.2.7) e risulta troppo esosa, cosı̀ le Convolutional Neural Networks si fondano su
tre fondamentali proprietà: l’interazione sparsa (sparse interaction), l’invarianza
rispetto a traslazioni (invariant to translation), e la condivisione dei parametri
(weight sharing). Viene fuori una rete più efficace e allo stesso tempo parsimoniosa in
termini di parametri.
12
2 – Convolutional Neural Network
L’interazione sparsa [14] (fig. 2.8) permette di ridurre le dimensioni del kernel rispetto
all’input: ad esempio processando un’ immagine, si dispone di centinaia o migliaia di
pixel ma tecnicamente si possono riconoscere solo ridotte quantità di feature significative.
Questo sta a significare che si può ridurre il numero di parametri da salvare, riducendo la
richiesta di risorse per il modello e aumentando la sua efficienza.
In pratica con m input e n output allora la matrice moltiplicativa sarà di m x n con
complessità O(m x n); limitando il numero di connessioni che l’output può avere verso k
si otterrà una complessità O(k x n) e un miglioramento delle prestazioni.
L’idea è quella di condividere parametri tra più funzioni in un modello. Nelle reti neurali
tradizionali ogni elemento della matrice pesata è pesato solo una volta per ottenere l’output
del singolo layer e viene moltiplicato per l’input senza mai essere modificato nel tempo,
risultando riutilizzabile a posteriori.
Come sinonimo di parameter sharing potremmo parlare di Tied Weights, poichè il valore
dei pesi applicati ad un input è legato al valore dei pesi applicati dovunque.
In una rete Convoluzionale oltretutto ogni membro del kernel è usato da tutti gli input e
quindi la condivisione dei parametri offre il vantaggio di imparare un unico set di parametri
piuttosto che un set di parametri distinto per ogni locazione.
È una proprietà che il layer acquisisce grazie alla condivisione dei parametri e nello spe-
cifico una funzione si dice equivariante quando al variare dell’input vi è una uguale
variazione dell’output. Proprio come si erano notato per i neuroni artificiali per quanto
riguarda la loro applicabilità nella costruzione di reti artificiali di apprendimento. Nel caso
specifico della convoluzione se avessi una funzione g() che trasli l’input, allora la funzione
di convoluzione risulterebbe equivariante rispetto alla funzione g(). Dando in input una
serie di dati si creerebbe una sorta di finestra temporale in cui andare ad individuare quali
siano le feature dell’input. Nel nostro caso, invece, passando in input una immagine 2D
la Convoluzione creerà una mappa di feature (quindi di elementi salienti) dell’input e nel
caso venisse traslato l’input o venisse mosso un oggetto nell’immagine di input, nell’output
ci sarebbe un movimento proporzionato.
La convoluzione però non è naturalmente equivariante a tutte le trasformazioni ma sola-
mente a cambi in scala o a rotazioni delle immagini e questo sarà un elemento da valutare
nelle prestazioni finali di una rete.
13
2 – Convolutional Neural Network
Le reti neurali sono costituite da svariati livelli alternati tra loro, che principalmente
saranno di tipo convolutivo o di sottocampionamento (pooling layer); oltre agli appena
citati, di comune utilizzo risultano essere i ReLu layer e i layer fully connected, livelli
fortemente connessi che sono posti alla fine della struttura della rete. Questi layer tutti
insieme costituiscono il blocco base solitamente presente in ogni CNN e sono posti tra di
loro in cascata.
• Input Layer
Il primo layer è quello che riceve l’immagine e la ridimensiona prima di passarla ai
layer successivi.
• Convolutional Layer
Lo scopo dello strato di Convoluzione è quello di estrarre le features: sono le ca-
ratteristiche significative delle immagini, usate per poi calcolare i match tra i punti
caratteristici durante il testing: è il livello principale della rete.
Si cercano di individuare dei pattern, come ad esempio curve, angoli, circonferenze
o quadrati raffigurati in un’immagine con elevata precisione.
I livelli convolutivi possono essere molteplici ma questo dipende dall’architettura di
rete: maggiore è il loro numero, maggiore è la complessità delle caratteristiche che
riescono ad individuare.
La matrice, che a livello matematico è detta Kernel, è il filtro (di cui viene indi-
cata solitamente la dimensione, ad esempio 3x3) che verrà convoluto con l’input e
permetterà di ottenere una Activation Map detta Feature Map. È chiaro che
cambiando il filtro con la stessa immagine di input otterrei delle mappe risultanti
diverse.
Facendo un riassunto prettamente pratico ma anche semplicistico, si può dire che
una CNN apprende i valori di questi filtri durante il training e si evince che quanti
più filtri si useranno quante più features si estrarranno.
La feature Map ottenuta dipenderà dalla profondità (Depth) cioè il numero di filtri
usati, dallo Stride che è il numero di pixel di cui ci sposta con la nostra matrice di
filtro sulla matrice di input e dallo Zero-Padding cioè il numero di zeri di padding
usati per completare la matrice di input lungo i bordi (wide convolution).
14
2 – Convolutional Neural Network
• Pooling Layer
I set di features ottenuti sono passati a questo strato che prende immagini di grandi
dimensioni e le contrae preservando le informazioni fondamentali. Il pooling spaziale
può essere di diversi tipi, tra cui il più famoso ed usato è il max-pooling, che
riprende il concetto del vicino spaziale prendendo il più grande elemento della mappa
dentro la finestra scelta. Permette di identificare se la caratteristica di studio è
presente nel livello precedente.
Questo livello, inoltre, rende l’input delle features più piccolo e gestibile riducendo il
numero di parametri sulla rete e di conseguenza ottimizzando la computazione; rende
inoltre la rete invariante alle piccole trasformazioni quali distorsione o traslazione
rispetto all’immagine iniziale.
15
2 – Convolutional Neural Network
Nell’architettura di una CNN è pratica comune inserire fra due o più layer convolutivi
uno strato di Pooling, la cui funzione è quella di ridurre progressivamente la dimensione
spaziale degli input (larghezza e altezza), in modo da diminuire il numero di parametri e
il carico computazionale. Di seguito saranno evidenziati alcuni tra gli algoritmi di pooling
utilizzati nella costruzione di reti convolutive.
Il GAP negli ultimi anni è stato parecchio usato per ridurre l’overfitting dovuto alla
riduzione del numero dei parametri all’interno della rete o anche per ridurre le dimensioni
dei tensori 3-D.
In particolare, riesce a permettere una riduzione estrema della dimensionalità riducendo
un tensore dalla dimensione H x W x D alla dimensione 1 x 1 x D. Il layer GAP riduce ogni
feature map in un singolo numero che riassume i valori ottenuti, utilizzando una media
dei valori del layer precedenti e della feature map.
2.5.2 Max-Pooling
Il Max-Pooling, citato già in precedenza, è stato molto spesso usato nella costruzione di
reti neurali; in questo livello viene calcolato il valore massimo o comunque il più grande
per ciascuna feature map. Il risultato viene poi sottocampionato o raccolto insieme agli
altri valori in modo da creare una rappresentazione che comprenda i valori più presenti:
da sottolineare che non si tratta però di una media matematica.
Lo Spatial Pyramid Pooling (SPP) [16] è un livello di pooling, che spesso viene im-
plementato in livelli interni multipli, e a differenza dei due precedenti ha avuto grande
applicazione nelle reti di Object Detection, quindi per utilizzare reti “RPN (Region
Proposal Network)” nelle quali vengono proposte delle regioni spaziali in cui possibil-
mente è possibile trovare oggetti.
Solitamente le reti neurali, attraverso alcune operazioni aggiuntive rimuovono la limita-
zione dell’utilizzo di immagini con dimensione fissata pur sapendo che questo può ridurre
alla lunga la loro precisione e accuratezza: con questo tipo di pooling viene eliminata
questa condizione limitante. L’operazione nello specifico crea una feature map da una
intera immagine, per poi fare un pooling delle feature in regioni arbitrarie in modo da
generare delle rappresentazioni di dimensioni fissate, utili ad allenare il detector di oggetti
sulle immagini. In altre parole, viene fatta una aggregazione di informazioni tra il livello
convolutivo e quello successivo che può essere un Fully Connected o un livello che si occupa
di Object Detection.
16
2 – Convolutional Neural Network
Region-of-Interest (RoI) Pooling [54] [96] è un tipo di pooling layer che completa
il max-pooling di un input in forma non stabilita e produce una piccola feature map di
dimensione stabilita cioè 7x7. Questa dimensione è un iperparametro della rete. Ciò ha
permesso una velocizzazione della fase di allenamento, rendendo le architetture che ne
fanno uso tra le più veloci nel campo dell’Object Detection.
Molto più dettagliatamente è utilizzata per produrre in un singolo passaggio una singola
feature map da tutte quelle proposte dalle reti RPN (Region Proposal). In qualche modo
anche questa risolve il problema di avere delle immagini di dimensioni fisse in input.
Nella costruzione del layer vanno appositamente settati 3 parametri che non saranno det-
tagliati in questa trattazione:
pooled width, pooled height, spatial scale.
Nella fase di progettazione di una CNN e comunque anche in quella di una rete neurale ci
sono determinati passi da eseguire più o meno facoltativi.
2.6.1 Il modello
Il modello è la tipologia di rete neurale che sarà scelta per l’attività programmata: ov-
viamente sarà una CNN appartenente a una delle diverse famiglie di modelli come le
VGG-NET O le ResNet, delle quali sono conosciute diverse versioni, differenti tra loro e
più o meno ottimizzate.
Come primo passaggio quindi bisognerà andare a valutare quale tipo di rete andare ad
usare, più o meno in base alla potenza di calcolo disponibile e al tipo di analisi o task da
svolgere.
Modelli troppo semplici possono portare a problemi di underfitting mentre modelli esagera-
ti possono portare ad overfitting, quindi questa è una scelta di fondamentale importanza in
quanto caratterizzerà ogni scelta successiva e ogni risultato e predizione. Ovviamente l’u-
tente può pensare di costruire un nuovo modello di sana pianta, componendolo con i layer
visti in precedenza ma solitamente si parte da dei modelli già conosciuti che costituiscono
lo stato dell’arte attuale.
2.6.2 Il Dataset
Il dataset come si può facilmente evincere dal nome è un set di dati, nel nostro caso di
immagini, usate per testare ed allenare l’architettura di rete. Esistono tre tipi di dataset:
Training-Set, Validation-Set e Test-Set.
17
2 – Convolutional Neural Network
Si può scegliere di utilizzare un dataset preesistente (successivamente sarà fatta una car-
rellata dei più famosi dello stato dell’arte), di crearne uno partendo da uno dei noti magari
riducendone le dimensioni o in alternativa di crearne uno totalmente personalizzato con
delle immagini che devono essere ridimensionate in modo adeguato, seguendo delle regole
dettate dal modello di rete scelto.
In generale servirà creare un Training-Set che sarà usato per permettere al modello di
rete, scelto nel primo passo, di imparare; un Validation Set per fare delle valutazioni sul
modello, anche al fine di migliorare i parametri già appresi ed affinare le prestazioni della
rete ed infine un Test-Set per provare a fare delle prove pratiche sul modello già finito e
già allenato. Spesso parte del validation set viene usato anche come Test-Set.
18
2 – Convolutional Neural Network
Transfer Learning
È pratica più comune sfruttare una rete già addestrata e utilizzarla per un secondo o
successivo task. In particolare, vengono presi i pesi dall’addestramento di qualcun altro e
trasferiti per testare una rete o per riallenare un modello simile: la rete può partire quindi
con dei pesi già pre-allenati.
A sua volta vi sono due sottoutilizzi: Feature extractor nel quale si rimuove l’ultimo
layer (fully-connected) e si usa il resto della rete come feature extractor su un nuovo set
di dati su cui lavorare oppure il Fine-tuning nel quale vengono ottimizzati i pesi della
rete preaddestrata.
In questo modo le features generiche della rete diventano piano piano sempre più specifiche
per la nuova attività.
Pretrained models
Le nuove reti convoluzionali richiedono per l’allenamento 2-3 settimane pur sfruttando
multiple GPU, cosı̀ spesso si cerca di sfruttare l’addestramento e il fine-tuning fatto e
condiviso da altri utenti e si va ad usare la rete già pronta per un nuovo task. Nell’ap-
plicazione pratica della ricerca in oggetto ci si soffermerà su questa attività. Una rete
pre-allenata nello specifico è una rete che è stata allenata sulla stessa tipologia di dati di
input e magari sulla stessa applicazione. Quindi diventa fondamentale reperire oltre che
il dataset anche delle reti pre-allenate coi relativi parametri, in modo da poterle sfruttare
in maniera diretta.
Nella precedente sezione è stato approfondito il concetto del training della rete (attività
che non sarà di nostro interesse pratico). Nei capitoli successivi ci si imbatterà in altri
concetti di difficile comprensione, che senza alcun tipo di background potrebbero sembrare
qualcosa di astratto: di seguito allora verrà fatta una descrizione ad alto livello di queste
nozioni, in modo da non restare scoperti su elementi utili alla comprensione di ciò che sarà
visto.
Gli algoritmi di apprendimento supervisionato, categoria in cui sono inquadrati gli algo-
ritmi di classificazione che saranno studiati, lavorano in due fasi: il training (Addestra-
mento) che è stato già accennato e il testing in cui ciò che è stato appreso viene sfruttato
per classificare nuovi elementi del set di dati.
Nella fase di training bisogna stimare i pesi, con delle tecniche di ottimizzazione mate-
matica come quella della discesa del gradiente (gradient descent) mediante back
propagation [17] basata su due fasi cicliche: propagazione e aggiornamento dei pesi.
Nella fase di propagazione (forward step) gli elementi di input attraversano l’intera
rete per poi recuperare, dopo la propagazione, gli output ottenuti in precedenza.
Viene calcolato l’errore di predizione attraverso la loss function, con cui calcolare il gra-
diente che verrà poi propagato all’indietro nella rete.
La seconda fase di aggiornamento della rete invece prevede che i valori del gradiente ven-
gano passati all’algoritmo di discesa del gradiente che li sfrutterà per aggiornare i pesi di
ciascun neurone. L’aggiornamento dei pesi viene fatto usando una costante detta lear-
ning rate.
L’addestramento è svolto in cicli con due possibili modalità cioè quella stocastica e quella
19
2 – Convolutional Neural Network
Il Gradient Descent [18] o Discesa del Gradiente è un algoritmo mirato ad ottenere la stima
dei pesi: viene minimizzata una funzione obiettivo J(Θ) formata da N parametri (Θ) e
viene aggiornato il valore dei parametri in base alla differenza con il gradiente negativo
di J(Θ) rispetto al parametro considerato. L’aggiornamento del parametro viene fatto
attraverso un valore η chiamato learning rate. Sarà quindi in parole povere sfruttata
una funzione J(Θ) allo scopo di arrivare ad un valore di massimo o di minimo in cui
fermarsi. I modi con cui questo algoritmo si può eseguire sono: la Batch Gradient
Descent (BGD) [18], o Discesa del Gradiente a Batch, che comporta la discesa del
gradiente su tutto il Training set; lo Stochastic Gradient Descent (SGD) [19], o
Discesa del Gradiente Stocastica, che esegue la discesa del gradiente per ogni elemento del
Training set e aggiorna il suo valore volta per volta. Infine, si può citare la Mini Batch
Gradient Descent (MBGD) [18], o Discesa del Gradiente a Mini Batch, che è una via
di mezzo fra la SGD e la BGD, in quanto effettua degli aggiornamenti ai parametri della
funzione con set ridotti, evitando l’uso di tutto il dataset o di singoli valori raggiungendo
velocemente i valori di minimo e massimo.
2.7.3 Batch-Normalization
La tecnica di Batch Normalization [20] è una tecnica che permette di migliorare velocità,
performance e stabilità di una rete neurale. È utilizzata per normalizzare l’input e sembra
proprio che possa risolvere il problema dello shift covariato interno, nel quale i parametri
20
2 – Convolutional Neural Network
2.7.4 Dropout
Il Dropout [21] si riferisce all’ignorare alcune unità neurali durante le fasi di allenamento.
Appare come una forma di regolarizzazione che agisce “sganciando” alcuni nodi dalla rete.
Tutto ciò viene fatto per ridurre l’overfitting o comunque per prevenirlo. L’applicazione
del dropout produce ad ogni iterazione una diversa rete ridotta del modello di partenza,
composta da quei nodi che sono sopravvissuti al processo di drop.
Di conseguenza viene a crearsi una sorta di combinazione di modelli che tende quasi sempre
a migliorare la performance, riducendo l’errore di generalizzazione. L’idea quindi, è quella
di utilizzare una singola rete neurale completa, i cui pesi sono le versioni ridimensionate
dei pesi calcolati in precedenza.
Il Dropout è implementato per ogni layer all’interno della rete neurale e può essere usato
quindi con tutti i tipi di layer ma non nel layer di output.
21
Capitolo 3
Questo capitolo sarà totalmente diverso rispetto precedente che offriva una panoramica
riassuntiva e delle nozioni tecnico teoriche sul mondo del Machine Learning e delle reti
neurali; adesso saranno passate in rassegna quelle che sono state le famiglie di reti e i
relativi modelli progettati negli ultimi decenni, fino ad arrivare ai modelli ancora oggi
utilizzati. Vale anche qui la doverosa precisazione sul termine “modello”, che come già
detto, è inteso come la distribuzione di una specifica architettura che appartiene ad una
determinata famiglia: ad esempio, parlando della famiglia ResNet, sarà usato il termine
modello, quando si parlerà di una versione della rete appartenente alla suddetta famiglia.
Verrà inoltre fatta una suddivisione in merito ai task per cui sono state progettate le reti
che si vanno ad analizzare: nello specifico classificazione, localizzazione, segmentazione di
oggetti in immagini e tracking di oggetti nei video. Un’ennesima suddivisione è stata fatta
in base al fatto che siano state progettate per lavorare in ambito mobile o meno.
Si partirà da una rassegna storica in modo da avere una base da cui partire per analizzare
ciò che viene offerto al momento come “stato dell’arte” mentre nella parte conclusiva del
capitolo invece, saranno toccati i video e l’object tracking nei video e un tipo di approccio
ibrido che si pone a metà strada tra una architettura vera e propria ed una API che è
YOLO.
22
3 – Lo Stato Dell’Arte delle Reti Neurali
Nell’ambito della ricerca di questa tesi è doveroso partire da un evento scientifico che
ha dato via alla grande macchina dell’evoluzione dell’Image Recognition: “The Ima-
geNet Large Scale Visual Recognition Challenge (ILSVRC)” [22]. Fu una sfida
la cui prima edizione si tenne nel 2010, e che si tiene ancora oggi con cadenza annuale, il
cui obiettivo principale era ed è valutare algoritmi per il riconoscimento e la classificazione
degli oggetti nelle immagini su larga scala. Lo scopo iniziale della challenge era stimare
il contenuto delle immagini, fornendo una annotazione automatica. In particolare, questa
operazione venne effettuata su un sottoinsieme di immagini: venne utilizzato il dataset
ImageNet che disponeva già delle necessarie annotazioni relativamente alle categorie di
oggetti riconoscibili.
La base della sfida era l’uso obbligatorio di questo set pubblico di immagini annotato
per comparare degli algoritmi di riconoscimento mentre la competizione e il workshop,
conseguente alla competizione, permettevano di discutere riguardo alle migliorie ottenute
nell’anno in termini di risultati e prestazioni.
Le annotazioni del dataset in particolare ricadono in due categorie: image-level annota-
tion in riferimento alla presenza o no di un oggetto nell’immagine quindi ad esempio (c’è
una macchina nell’immagine o non c’è una tigre nell’immagine) e object-level annota-
tion con delle annotazioni specifiche sull’oggetto relativamente a posizione e dimensioni
in pixel di un determinato oggetto nell’immagine (c’è una macchina alla posizione centrale
20, 25, di altezza 30pixel e larghezza 20 pixel).
La sfida, andando di pari passo con l’evoluzione degli algoritmi e delle tecnologie, ha
mutato/aumentato negli anni il numero di task da performare:
23
3 – Lo Stato Dell’Arte delle Reti Neurali
• SIFT (Scale Invariant Feature Transform) [24]: è un algoritmo che estrae al-
cuni “feature point”, cioè i punti interessanti di alcune immagini di riferimento, al
fine di fornire una descrizione delle caratteristiche dell’oggetto. L’algoritmo si com-
pone essenzialmente di una prima parte in cui vengono riconosciuti i keypoint e poi
localizzati, seguita da una parte in cui verrà creato una sorta di orientamento dei
punti rispetto ai bordi dell’immagine, che è il preludio allo step finale nel quale verrà
creato il descrittore delle features.
Uno degli elementi fondamentali di questo algoritmo è il DoG (difference of Gaus-
sians) che implica l’uso di una versione sfocata dell’immagine originale, che verrà
sottratta da una meno sfocata dell’originale, al fine di reperire proprio nelle immagini
i cosiddetti feature point.
• LBP (Local Binary Pattern) [25] [28]: è un semplice ma efficiente descrittore per
le texture dell’oggetto. È stato molto utilizzato in applicazioni di riconoscimento di
volti umani in 2D e venne introdotto da Ojala [26].
Il funzionamento dell’operatore è molto semplice: a ciascun pixel dell’immagine viene
assegnato un valore binario, dipendente dalla valorizzazione dei pixel che stanno nel-
l’intorno preso in considerazione (ad esempio 3x3). Se si prendesse in considerazione
un pixel campione centrale “pc” da valutare e un pixel p nell’intorno considerato, se
p assumesse un valore superiore o uguale a quello di pc allora a p verrebbe assegnato
il valore 1 altrimenti il valore 0.
Mettendo in sequenza i valori binari ottenuti si ottiene un numero binario finale, il
cui numero di cifre dipende dalla dimensione dell’intorno. L’inconveniente di questa
prima versione dell’algoritmo era proprio la dimensione dell’intorno: all’inizio era
prefissato a 3, mentre poi successivamente venne reso libero e l’operatore LBP venne
esteso per gestire intorni di dimensioni variabili.
Si passò poi anche a considerare la gestione non più di un intorno quadrato ma bensı̀
anche di un intorno circolare inserendo ancora due elementi: il numero di punti cam-
pione P e il valore del raggio R. Il procedimento risultò essere lo stesso ma permise
di valutare un numero di campioni più ampio.
24
3 – Lo Stato Dell’Arte delle Reti Neurali
• Le SVM cioè Macchine a Vettori di Supporto [27] sono dei modelli di appren-
dimento supervisionato utilizzabili sia per scopi di apprendimento che per scopi di
classificazione.
Ottengono i maggiori risultati nei problemi di classificazione binaria ma nonostante
ciò sono lo strumento più utilizzato per la classificazione di pattern. L’idea alla base
è la seguente: date due classi di appartenenza e dato un insieme di esempi detto
training set, ogni esempio viene etichettato con una delle due classi indicate e suc-
cessivamente mediante un algoritmo di addestramento per le SVM viene creato un
modello che assegna automaticamente un possibile nuovo esempio ad una delle due
classi.
Nel 2011 il team XRCE, già menzionato nella precedente edizione (2010) per avere pro-
posto il Vettore di Fisher [29] in versione migliorata ed adattata alla classificazione su
larga scala, vinse stavolta la gara di Classificazione proponendo un vettore di Fisher
ottimizzato per la classificazione su larga scala [30], riproponendo ciò che avevano pro-
posto nella precedente edizione ma affiancandolo ad una Compressione PQ (Product
Quantization [31] [32] [33] e ad una Semplice Macchina di Apprendimento Ar-
tificiale: la One-vs-all linear Simple Vector Machine (one vs-all linear SVMs)
[34]. Il vettore di Fisher risultò infatti essere molto performante a livello computazionale,
poichè forniva eccellenti risultati con i classificatori lineari e soprattutto permetteva di
essere compresso con una perdita minima.
La combinazione di questi 3 elementi permise al team di ottenere dei risultati ottimali per
il task di classificazione in quell’annata.
Per quanto riguarda il task di single-object localization i vincitori furono i componenti del
team UvA, che sfruttando un approccio di ricerca selettiva [35] campionarono densa-
mente [36] e quantizzarono i descrittori SIFT dei diversi colori; poi raggruppando i risultati
con una piramide spaziale [38] e classificando con una “histogram intersection kernel
SVM” [39] allenata su una GPU [40] riuscirono ad ottenere delle sostanziali migliorie
prestazionali.
La ricerca selettiva è uno dei metodi maggiormente utilizzati per generare possibili regio-
ni di posizionamento degli oggetti: viene ottenuto una sorta di vettore per ogni papabile
regione, sul quale viene applicata una piramide spaziale multivello al fine di avere una
compattazione dei prodotti, dal momento che avevano dimensioni eccessive ma anche per
mantenere sempre la qualità visiva dell’immagine.
Come detto però l’edizione del 2012 è quella che diede la svolta dal momento che entrarono
in scena tecniche ancora oggi molto utilizzate.
In particolare, il SuperVision team, allenò una rete neurale convolutiva su valori RGB con
60 milioni di parametri, sfruttando anche l’uso di una GPU ed utilizzando la funzione di
attivazione ReLU [41] e la tecnica del Drop-out per ridurre l’overfitting [42].
Questa fu la prima rete neurale presentata nel campo di nostro interesse e tra i primi risul-
tato tangibili è sottolineabile l’abbassamento della percentuale di errore dal 26% al 15%,
dato che denota un grande miglioramento nelle performance di accuratezza di predizione.
La loro architettura conteneva 5 strati di convoluzione, intervallati da degli strati di poo-
ling e da 3 strati completamente connessi. Ciascuno strato è inoltre suddiviso in due
sottostrati per permettere l’elaborazione su due GPU.
Con certezza si può dire che questa fu l’edizione che via via spinse sempre di più verso
l’uso delle reti neurali per la classificazione e la localizzazione e soprattutto a partire da
quel momento iniziarono ad essere presentati e studiati molteplici modelli architetturali
differenti tra loro che iniziarono a dare predizioni sempre più accurate, performance mi-
gliorate e soprattutto costi computazionali sempre ridotti, cosa che non aveva permesso
in precedenza l’implementazione pratica delle reti neurali.
25
3 – Lo Stato Dell’Arte delle Reti Neurali
Cosı̀ nell’edizione del 2013 la maggior parte dei partecipanti utilizzò reti di convoluzione
e tra tutti i team iscritti al contest, i vincitori furono i componenti di Clarifai, con una
rete progettata mediando diverse reti convoluzionali multi-layer. Le architetture furono
sfruttate usando la tecnica di visualizzazione di Zeiler e Fergus [43] e addestrate su GPU
con la tecnica del dropout [44].
Nel task di localizzazione di un singolo oggetto, il vincitore fu il progetto chiamato “Over-
Feat”, basato su un framework mirato all’utilizzo di reti convoluzionali per la classifica-
zione, localizzazione e rilevamento mediante finestra multi-scala scorrevole [45].
In questo anno venne anche introdotto il task di rilevamento di oggetti multipli, il cui
vincitore fu, ancora una volta, il team UvA dell’Università di Amsterdam che, utilizzando
un nuovo metodo efficiente di codifica, progettato nuovamente da Van de Sande come nel
2011, riuscı̀ a campionare densamente i descrittori dei colori per poi raggrupparli in una
struttura di ricerca selettiva basata su una piramide spaziale multilivello [46] [47].
Il 2014 fu una annata di grandi risultati dato che si dimezzò l’errore nella classificazione
rispetto alla precedente edizione e di conseguenza raddoppiò anche la media nel ricono-
scimento corretto di oggetti; venne permesso l’uso di dati esterni per allenare le reti e
per ciascuno dei 3 task quindi vennero proposte due competizioni: una tradizionale e una
quindi con dati di allenamento esterno.
Balzò agli onori la “GoogLeNet” che vinse il contest di classificazione grazie all’introdu-
zione dei layer “Inception” [48], mentre nel contest di localizzazione è invece la rete VGG
[49] ad ottenere i migliori risultati. I dettagli su queste due architetture saranno analizzati
in seguito nella sezione descrittiva sui modelli conosciuti.
Nel 2015 le prestazioni sul dataset Imagenet vennero ancora migliorate e vennero introdotti
due ulteriori task:
• la classificazione di scene, organizzata dal MIT Places Team basata su 401 categorie.
26
3 – Lo Stato Dell’Arte delle Reti Neurali
Nell’edizione del 2017 invece la fondazione SENet partecipò con eccellenti risultati alla
competizione abbassando i risultati percentuali di predizione con un nuovo modello archi-
tetturale chiamato “Squeeze and Excitation Networks [56] [57]: il loro obiettivo fu
quello di migliorare la potenza di una rete modellando esplicitamente le dipendenze tra i
canali convolutivi e per fare ciò proposero un meccanismo di “feature recalibration” attra-
verso cui imparare ad usare le informazioni globali per selezionare le feature interessanti
eliminando quelle poco utili.
La rete proposta era la SeNets che in sintesi aggiungeva parametri ad ogni canale del bloc-
co convolutivo, cosı̀ che si potessero aggiustare i pesi di ogni mappa. Quello che bisogna
considerare è che i pesi della rete per ogni canale sono creati in modo eguale quando si
ottengono le relative feature map. Il blocco SE che implementarono opera sull’input del
blocco convolutivo e sul numero di canali, facendo un average pooling; il tutto è seguito
da un fully connected layer con una successiva ReLU che aggiunge la non-linearità. Infine,
viene aggiunto un secondo fully connected layer seguito da una attivazione Sigmoidale e
viene pesata ogni feature map del blocco convolutivo.
Figura 3.3: A destra il blocco Residuale tradizionale mentre a sinistra il blocco residuale
inserito nella Squeeze and Excitation Net. Fonte ed approfondimento: [57].
27
3 – Lo Stato Dell’Arte delle Reti Neurali
Le Cnn vennero proposte per la prima volta da Fukushima nel 1988 [58], ma non vennero
praticamente usate per via del grosso carico computazionale che richiedeva il processo di
training. Cosı̀ negli anni 90 Yann LeCun, applicando un algoritmo di apprendimento
basato sul gradiente, portò avanti un nuovo progetto di studio sviluppando la sua LeNet
[59] ed ottenendo dei successi nell’ambito del problema della classificazione delle cifre
scritte manualmente.
Man mano, col tempo, ci si accorse che con varie migliorie, si potevano ottenere sempre
migliori prestazioni usando le CNN, arrivando a definirle come le migliori strutture per
processare immagini in 2D e 3D, proprio perché il loro comportamento assimilava sempre
meglio il comportamento dell’apprendimento visivo umano.
Sostanzialmente però fino al 2010 non si era riusciti ancora ad avere delle implementazioni
vere e proprie a causa della limitata capacità di calcolo computazionale e di memoria di
cui si poteva disporre.
La sua architettura nel 1994 venne conosciuta come LeNet5 e venne considerata esatta-
mente come primo vero e proprio modello convolutivo; fu il risultato di diversi tentativi,
compiuti da LeCun, a partire dal 1988.
Da sottolineare come ai tempi non essendoci GPU dedicate, le CPU erano parecchio lente
quindi fare training era complicato e il salvataggio dei dati era tanto importante quanto
complicato.
La struttura si componeva di due layer convoluzionali, due sottostrati di campionamento
posti dopo il livello convolutivo e 2 layer fully connected seguiti da un layer di output con
connessione Gaussiana.
Nel momento in cui l’hardware cominciò ad essere sempre più efficiente, le CNN ini-
ziarono ad avere credibilità anche a livello implementativo divenendo il caposaldo per i
ricercatori e come già visto nella sezione introduttiva, grazie ad Alex Krizhevesky [62]
che insieme al suo gruppo di studi vinse l’ILSVRC 2012, venne riscritto lo stato dell’arte
del deep learning.
28
3 – Lo Stato Dell’Arte delle Reti Neurali
La struttura prevedeva un primo livello che si occupasse della convoluzione e del Max
Pooling, implementato con LRN (Local Response Normalization): erano stati usati 96
differenti filtri recettivi, di dimensione 11x11; nel secondo livello con filtri 5x5 era svolta
la medesima operazione. Nel terzo, quarto e quinto erano usati filtri 3x3 ma con rispetti-
vamente 384, 384, 296 feature map per l’operazione di convoluzione che era seguita dalla
funzione di Relu. Infine, i due fully layer erano usati con funzione softmax.
AlexNet Vs LeNet
29
3 – Lo Stato Dell’Arte delle Reti Neurali
Nel 2013 Matthew Zeiler and Rob Fergue vinsero l’ILSVRC con una CNN che estendeva la
AlexNet, chiamata ZFNet [43] il cui nome derivò proprio dal nome dei due scopritori.
Il vincitore del contest di classificazione fu il team Clarifai, il cui fondatore e CEO era
Zieler. Questo team fece solo delle modifiche minime sulla ZFNet che è stata considerata
come rete vincitrice del contest. Anche questa rete è costosa a livello computazionale
come la AlexNet, ma è stata creata ottimizzando la precedente con un kernel sul primo
livello 7x7, piuttosto che 11x11 per ridurre il numero di filtri e il numero di parametri e
soprattutto per ridurre la profondità del primo layer convolutivo da 4 a 2.
La ZFNet ha di contro migliorato in maniera significativa l’errore di predizione rispetto
alla AlexNet.
Una rete, apparentemente simile alle precedenti, ma che presenta diversi cambiamenti
è la NiN cioè la Network in Network [63]: introduce l’uso della MLP (Multilayer
Perceptron) ed è quindi uno dei primi prototipi di convoluzione multilivello, nel senso che
dopo il livello tradizionale di convoluzione venne usato un livello aggiuntivo per combinare
le feature tra un livello e il successivo.
Venne implementata con filtri 1x1 in modo da aumentare la non linearità del modello
ed incrementare la profondità della rete. Questa idea venne ripresa in reti che divennero
molto più famose come le ResNet, le Inception e le relative derivate. La Nin Introduce
anche la Global Average Pooling (Gap) al posto dei layer fully connected, riducendo
ancora il numero di parametri: la struttura con i Gap veniva cambiata generando alla fine
un vettore di feature molto più piccolo quindi generando mappe di feature di dimensione
ridotta.
Figura 3.7: la figura a destra rappresenta un layer tradizionale mentre quella a sinistra un
multilayer perceptron. Fonte: [63].
30
3 – Lo Stato Dell’Arte delle Reti Neurali
Le VGG-NET [49], il cui nome deriva da Visual Geometry Group, si affacciarono nel
2014 come progetto di spicco per l’ILSVRC per il task di classificazione pur vincendo il
contest per quanto concerne il task di localizzazione.
Posero agli occhi di tutti quella che era a loro avviso la svolta concettuale per ottenere
migliorie: la profondità della rete. Fu il primo anno in cui un modello di rete convolutiva
ottenne un rate di errore sotto il 10%. Furono tra le prime reti che sfruttarono l’idea
che usare filtri 3x3, quindi filtri più piccoli, ma ripetuti in sequenza, permettendo di
ottenere gli stessi risultati ottenuti usando filtri recettivi molto più grandi: idea in forte
contrapposizione con le AlexNet. Chiaramente questo aumentò il numero di filtri.
Ottennero un grosso risparmio computazionale visto che diminuı̀ il numero di parametri,
pur producendo una mappatura migliore tra le immagini e le etichette di categoria di
classificazione.
Per la classificazione venne progettata una rete che di base proponeva due livelli convolutivi
basati sulla funzione di attivazione RELU con un layer SoftMax finale ottimizzato per
l’operazione di classificazione.
Per la localizzazione, i bounding box sono rappresentati con vettori in 4-D riferiti alle
coordinate di centro, altezza e larghezza. La regressione logistica fu rimpiazzata con la
funzione di perdita euclidea.
I Modelli proposti VGG 11, 16 e 19 differiscono tra loro per il numero di layer, con
rispettivamente 8, 13, 16 layer convolutivi.
La VGG 19 divenne il modello più costoso a livello computazionale in quel momento.
VGG-Net vs AlexNet
Figura 3.8: Confronto ad alto livello tra le due architetture e di quanto esposto nella
precedente sezione. Fonte: [64].
31
3 – Lo Stato Dell’Arte delle Reti Neurali
Il 2014 fu un altro anno epocale poiché il vincitore fu Chrstian Szegedy di Google [51]
[52] [48] che si era prefissato l’obiettivo di ridurre la complessità computazionale rispetto
alle già esageratamente costose vecchie CNN: introdusse e propose l’Inception Layer,
che disponeva di campi ricettivi variabili, realizzati mediante l’uso di kernel di dimensioni
diverse e mirati a catturare le correlazioni tra i pattern con delle specifiche operazioni.
Sostanzialmente quindi questa fu la prima architettura Inception, il cui nome è un chiaro
riferimento all’omonimo film. L’idea fu quella di combinare filtri 1x1, 3x3, 5x5 tra di loro
all’interno del blocco Inception.
Figura 3.9: Blocco Inception nella sua versione, con le riduzioni della dimensione. Fonte
ed approfondimenti: [65].
Nel blocco della figura precedente si notano 4 percorsi paralleli: il primo usa un layer
1x1 come ripetitore dell’input, il secondo un 1x1 seguito da un layer 3x3, il terzo un layer
1x1 seguito da uno 5x5 e l’ultimo usa un layer 3x3 unito ad un 1x1. I percorsi centrali
usano il blocco 1x1 sull’input, per ridurre il numero di canali di input e ridurre la comples-
sità. Alla fine l’output di ogni path verrà concatenato e dato in input al layer successivo.
Nell’Inception Block ciò che risulta essere customizzabile sono il numero di canali di out-
put per layer, in modo da gestire autonomamente la complessità.
L’applicazione di questo blocco permise grossi miglioramenti prestazionali e di numero di
parametri e portò alla riduzione dell’overfitting.
Per la prima GoogleLeNet venne utilizzato uno stack totale di 9 blocchi inception mentre
le funzioni di Max Pooling poste tra i blocchi Inception permisero di ridurre la dimensio-
nalità: la struttura nella prima parte era identica alla AlexNet e alla LeNET, lo stack dei
blocchi centrali è derivato dalle VGG ed infine prima dell’uscita il Global Average Pooling
sostituı̀ l’uso di uno stack di layer fully connected. Il totale finale risultò essere di 22 layer
più 5 layer di pooling. Questa struttura viene solitamente chiamata Inception v1.
32
3 – Lo Stato Dell’Arte delle Reti Neurali
Figura 3.10: A destra Architettura Inception V1, a sinistra blocco Inception V2. Fonte
ed approfondimenti: [65].
Diventò necessario ridurre l’impatto della computazione nei layer dei blocchi Inception:
l’intuizione fu che le reti neurali lavorano meglio quando la convoluzione non altera le
dimensioni dell’input in modo drastico. Riducendo le dimensioni però si creava il collo di
bottiglia (BottleNeck Layer) che scaturiva dal fatto che le convoluzioni erano parallele
e gran parte delle operazioni era concentrata in quel layer.
Chrstian Szegedy e il suo team di ricercatori cosı̀ iniziarono a proporre delle migliorie alla
precedente struttura arrivando a sviluppare la versione 2 e la versione 3 della rete Incep-
tion.
Il team ebbe una importante intuizione: sostituire layer più grandi, come quelli 5x5 o 7x7,
con layer consecutivi di dimensioni inferiori.
Cosı̀ ad esempio, nella Inception v2, cavalcando l’idea appena esposta venne sostituito il
layer 5x5 con due layer 3x3 mentre nella versione 3 sostituirono il layer 7x7 con tre layer
3x3.
Evidenziarono cosı̀ altre possibili migliorie notando che i classificatori ausiliari non contri-
buivano molto nella parte finale del processo di training ed introdussero la Batch Nor-
malization o il Dropout per regolarizzare queste funzioni.
Entrambe vennero introdotte nella versione 3 insieme al RMSPropOptimizer e al La-
bel Smoothing, un componente per regolarizzare l’overfitting quando la rete inizia ad
essere troppo precisa/fidata nella predizione rispetto una specifica classe.
33
3 – Lo Stato Dell’Arte delle Reti Neurali
3.3.8 Inception-V4
Inception-v4 è una evoluzione delle precedenti, molto più semplificata e con più moduli
della V3. Purtroppo, fin da subito non vennero date grosse spiegazioni riguardo alle nuove
introduzioni architetturali.
In particolare, si è evidenziato che l’immagine passa prima in un layer detto Stem, per poi
finire in 3 tipi diversi di livelli Inception chiamati A, B, C.
L’Inception v4 introdusse i “Reduction Blocks” utili a cambiare l’altezza e la larghezza
dei moduli.
Figura 3.11: Architettura Inception V4. Fonte ed approfondimenti: [65] [66] [68].
Residual Network [50]: e’ il 2015 e Kaming progettò una rete rivoluzionaria che cambiò
qualcosa che era stata alla base delle precedenti proposte.
ResNet nacque dall’osservazione che con l’aumento di livelli ci potesse essere il rischio di
imbattersi in peggioramenti della rete. Intuitivamente, reti neurali più profonde non do-
vrebbero performare peggio di quelle poco profonde, o almeno non durante l’allenamento
quando non vi è alcun rischio di overfitting. Tuttavia, al crescere della profondità della
rete questo non è sempre vero.
Gli sviluppatori di ResNet ricondussero questo problema all’ipotesi che le mappature di-
rette sono difficili da allenare e proposero un rimedio, ovvero l’uso del blocco residuale:
l’idea fu che la rete ora potesse imparare principalmente le differenze tra i layers in ingresso
e in uscita dal blocco. I layer delle reti proposte variarono allora tra “34”, “50”, “101”,
“152”,
“1202”. Ad esempio, la più popolare cioè la ResNet50 disponeva 49 layer convolutivi e di
uno fully connected.
Le ResNet quindi sono delle reti “feed forward” con una “residual connection”: que-
st’ultima, costruita con diversi tipi di blocchi di resto in base al tipo diverso di architettura
scelta. Prima di allora era molto diffuso il problema dell’annullamento del gradiente, la
cui discesa, data dalla minimizzazione della funzione di errore, si riduce esponenzialmente
attraverso la retro propagazione degli strati precedenti. In sostanza, il percorso lungo gli
strati precedenti rendeva gli errori talmente piccoli da non permettere alla rete di appren-
dere. Con le ResNet iniziarono a vedersi reti con innumerevoli strati caratterizzati da un
elevato grado di accuratezza.
Questo diede il via ai nuovi progetti: la versione più ampia di residual network venne
proposta da Zagoruvko nel 2016 [67], anno nel quale venne proposta anche una versione
34
3 – Lo Stato Dell’Arte delle Reti Neurali
Figura 3.13: Struttura concettuale dei moduli Residuali. Fonte ed approfondimenti: [72].
35
3 – Lo Stato Dell’Arte delle Reti Neurali
Grazie all’ispirazione delle ResNet venne progettato un modulo ibrido tra la ResNet e le
Inception. Vennero progettate la Inception-ResNet v1 [52] e la Inception-ResNet
v2.
La v1 ha dei costi computazionali simili alla Inception v3 mentre la v2 è simile alla Incep-
tion v4. Entrambi usano i moduli Inception A, B, C visti nella sezione delle Inception e
in figura 3.12 e anche il reduction block. Nella v1 è visibile una connessione “scorciatoia”
alla sinistra di ogni modulo, che può essere vista come una dimostrazione del fatto si può
andare “in profondità” con l’uso delle reti ResNet.
Nonostante i costi siano similari a quelli della Inception v3, questa ha tempi di allenamento
minori pur raggiungendo prestazioni leggermente peggiori in termini di accuratezza. La
v2 è molto simile alla precedente ed anche qui si nota il collegamento a sinistra ma la
differenza sta principalmente negli iperparametri da settare.
PolyNet [73] fu una rete che riuscı̀ a ridurre l’errore ottenuto dalle InceptionResNet v2.
Nel 2016 nel ILSVRC fu uno dei progetti di maggiore spicco ma il paper relativo venne
esposto nel 2017 quando venne proposto un nuovo modello chiamato PolyInception, una
combinazione polinomiale di unità Inception, inserite in percorsi paralleli o a cascata.
Rispetto ai modelli precedenti nei quali le unità erano sequenziali, questa soluzione alter-
nativa permise di aprire a nuove strutture che si differenziassero da quelle convenzionali.
Subito dopo questa venne progettata la Very Deep PolyNet che include tre livelli ope-
rativi su diverse risoluzioni spaziali. I Moduli PolyInception proposti in figura 3.15 sono i
seguenti:
• poly-2: si hanno tre path, uno identità, uno è un blocco Inception singolo e uno è
un doppio blocco Inception.
• poly2: il primo blocco Inception può essere condiviso tra i due path seguenti. Ricorda
una sorta di Recurrent Neural Network.
36
3 – Lo Stato Dell’Arte delle Reti Neurali
ResNext [69] fu una rete che ebbe un grande risalto nel ILSVRC 2016 e in particolare
nel contest di classificazione poichè introdusse una nuova dimensionalità relativamente alle
reti neurali cioè la cardinalità.
In contrasto col concetto di Network in Network questo approccio è detto Network in Neu-
ron e si espande lungo una nuova dimensione. Al posto di una funzione lineare applicata
su ogni path qui l’idea è di applicare una funzione non lineare per ogni path.
La cardinalità infatti controlla il numero di trasformazioni complesse, in aggiunta alla
profondità e alla grandezza intesa come larghezza.
La ResNext, il cui nome nasce dall’idea della “Next Dimension”, va a performare le Re-
sNet, InceptionV3 e la Inception-ResNet-v2, ottenendo ottimi risultati e mostrando un
design molto più semplice dei modelli Inception.
37
3 – Lo Stato Dell’Arte delle Reti Neurali
Xception [74] fu un modello architetturale che apportò delle migliorie al modulo Incep-
tion e alle relative architetture, proponendo una semplice ma elegante struttura intesa
come via di mezzo tra una ResNet e una Inception V4.
L’architettura disponeva di 36 layer convoluzionali, quindi avvicinandosi alla struttura
della ResNet34, cosı̀ come il codice, mentre il modello risultò semplice come la ResNet e
più comprensibile rispetto alla Inceptionv4.
Il tipico modulo Inception infatti guarda alla correlazione tra i canali, con una convoluzio-
ne 1x1, mappando i dati originali in 3 o 4 spazi, separati e più piccoli dello spazio originale
di input e poi mappa le correlazioni in spazi 3D con convoluzioni 3x3 o 3x5.
Xception proposto da Francois Chollet, che fu anche il creatore e sviluppatore principale
delle librerie Keras, non è altro che una estensione di Inception che sviluppa tali mo-
duli dando vita a muovi moduli con “convoluzione separabile in profondità”. È anche
comunemente chiamata convoluzione separabile, e consiste in una convoluzione in pro-
fondità realizzata in modo indipendentemente su ogni canale di input e seguita da una
convoluzione punto per punto. Un’altra differenza riguardò la presenza o assenza di non
linearità: Inception contiene la Relu, mentre la convoluzione separabile è implementata
senza linearità.
I costi computazionali nel nostro contesto ricoprono un ruolo fondamentale, cosı̀ come le
tempistiche di training per cui si cercò di abbassare questi parametri nelle applicazioni
pratiche, proponendo nuove strutture che unissero gli elementi dello stato dell’arte alla
ricerca dell’accuratezza di predizione.
Nelle Pvanet [75] l’idea fu quella di ridurre il numero di canali inserendo più layer e ri-
ducendo la ridondanza dei dati grazie alla C-ReLu (Concatenated Rectified Linear
Unit) [41] [78] e l’Inception Layer. Nello specifico la C-RELU venne applicata negli stati
iniziali per ridurre i costi al 50% mentre l’inception Layer venne applicata sulla sottorete
per ottenere le features.
Venne inoltre adottata l’idea della rappresentazione multi-scala, che combinò gli output in-
termedi in modo che i diversi livelli di dettagli e la non linearità potessero essere considerati
simultaneamente.
Figura 3.17: La C-Relu può duplicare il numero dei canali di output, andando a
concatenare la negazione dell’output prima di applicare la ReLU. Fonte: [75].
38
3 – Lo Stato Dell’Arte delle Reti Neurali
GaoHuang e il suo gruppo nel 2017, proposero le DenseNet [76] cioè delle CNN “Densely
Connected”, con dei layer densamente collegati tra loro in modo che l’output del prece-
dente fosse direttamente collegato ai successivi.
Concatenando le feature map apprese da differenti layer si ottiene un aumento di efficienza
e aumenta la variazione sugli input: questa è la principale differenza rispetto alle ResNet.
Rispetto alle Inception che invece optano anche per la concatenazione, le DenseNet sono
più semplici ed efficienti.
Come conseguenza diretta della concatenazione, le feature map sono utilizzabili in tutti i
layer successivi alla produzione e viene incoraggiato il riuso all’interno della rete creando
un modello sempre più compatto.
Tra gli altri vantaggi riconosciuti è da sottolineare la riduzione della scomparsa del gra-
diente, la riduzione dei parametri della rete ma anche la qualità di propagazione del flusso
di informazioni e del gradiente tra i layer: ogni layer ha accesso diretto ai gradienti, a
partire dalla funzione di perdita fino all’input.
Può essere definito uno dei modelli architetturali meglio performanti per il task di classi-
ficazione.
La SqueezeNet [56] è una delle architetture più recenti e riprende diversi concetti delle
ResNet e delle Inception proponendo una migliore architettura a livello di design, dimen-
sionalmente più piccola e con un numero ridotto di parametri. Consente di effettuare un
training distribuito in maniera più efficiente, cosa che produce meno overhead. Questi ri-
sultano essere i vantaggi di una architettura di dimensioni minori, che presenta una grande
accuratezza, paragonabile a quella delle reti AlexNet.
In particolare, per ridurre il numero di parametri e la dimensione si possono usare varie
strategie: sostituire i filtri con filtri 1x1 o con filtri 3x3 oppure cercare di diminuire il
numero di canali di input o sottocampionare sulla rete in un momento successivo alla
convoluzione in modo che il layer convolutivo abbia una mappa di attivazione più grande.
Uno degli elementi, che balza all’occhio, osservando l’architettura è l’assenza di fully con-
nected layer o di dense layer alla fine della cascata di moduli che compongono la rete:
39
3 – Lo Stato Dell’Arte delle Reti Neurali
entrambi sono usati per permettere la classificazione e agiscono in modo totalmente diffe-
rente; in questo caso questa operazione finale è completata all’interno dei moduli FIRE
della rete.
40
3 – Lo Stato Dell’Arte delle Reti Neurali
È una classe di modelli per applicazioni prettamente mobile o embedded e si tratta di reti
caratterizzate da una architettura con convoluzione separabile in profondità [74], che
permette di creare dei modelli leggeri.
Vengono introdotti due semplici iperparametri globali, per trovare il giusto compromesso
tra latenza e accuratezza di previsione e per permettere di creare un modello adattabile
al tipo di applicazione per cui è richiesto.
La fattorizzazione, come già detto per le reti Inception, riduce la computazione di calcolo e
la dimensione del modello: qui verrà introdotta insieme alla convoluzione separabile che è
una fattorizzazione della convoluzione standard in una convoluzione in profondità, seguita
da una convoluzione punto per punto.
Questi risultano essere gli approcci per progettare questo tipo reti.
In questa sezione sarà fatta una carrellata di tutte quelle tipologie di reti conosciute ed
implementabili su macchine con capacità di calcolo ridotte.
Nelle MobileNets [79] la convoluzione punto per punto applica una convoluzione 1x1 per
combinare i risultati della precedente convoluzione mentre la convoluzione in profondità
invece applica un singolo filtro per ogni canale di input.
La MobileNet v2 [81] è una delle evoluzioni che migliora lo stato dell’arte delle appli-
cazioni in ambito mobile. Sono state introdotte due nuove caratteristiche: il bottleneck
lineare tra i layer e i collegamenti shortcut (o meglio residual connection) tra i bottleneck.
I residual block collegano l’inizio e la fine di un blocco di convoluzione con una skip con-
nection e mediante questi nuovi strati si riesce ad accedere ad attivazioni precedenti che
non sono state modificate nel blocco di convoluzione: riesco ad avere apprendimento più
veloce e migliore precisione.
Le operazioni sono ridotte del 50% rispetto alla versione precedente e sono necessari il
30% in meno di parametri.
41
3 – Lo Stato Dell’Arte delle Reti Neurali
Le ShuffleNet [84] [85] sono caratterizzate dalla convoluzione punto per punto di gruppo
e dallo shuffle tra canali cioè una sorta di mescolamento mirato a ridurre i costi computa-
zionali e mantenere al contempo una discreta accuratezza.
La ShuffleNet comparata con modelli mobile similari riesce a produrre un buon numero
di feature map per immagazzinare più informazioni, cosa che solitamente è problematica
per le reti molto piccole ma che qui si riesce a sostenere in maniera molto discreta.
Non è il top tra le applicazioni mobile visto che già le MobileNet sono più accurate, spe-
cialmente nelle ultime versioni, però si può definire un buon compromesso costo-efficienza.
Le reti convoluzionali più conosciute e diffuse come AlexNet, VGGNet, ResNet, GoogLe-
Net, sono famose per le loro centinaia di milioni di parametri, che le portano ad essere di
grandi dimensioni e portano ad una richiesta esagerata di risorse complicandone il relativo
training, l’ottimizzazione e l’efficienza.
Di contro le architetture leggere, ottimizzate su questi parametri di valutazione, risultano
peccare in termini di accuratezza.
La SimpleNet [86] [87] si propone come architettura che può raggiungere un buon trade-
off: dispone di 13 layer per svolgere tutto ciò che svolgono le altre architetture divenendo
42
3 – Lo Stato Dell’Arte delle Reti Neurali
Le Enet [89] sono il risultato di diverse strategie e risultano essere molto leggere pur
offrendo grandi prestazioni. Progettate da Adam Paszke, possono operare anche a livello
mobile dal momento che richiedono poca potenza.
Questo algoritmo etichetta ogni pixel nell’image con una classe di oggetti. Viene usato un
decoder e un encoder: l’encoder è una CNN usata per la classificazione mente il decoder
permette di sovracampionare il risultato dell’encoder.
Le CapsuleNet CNN [91] sono una classe di modelli usati per riconoscere le features
di un oggetto e offrono ottime performance nel riconoscimento oggetti pur avendo dei li-
miti rispetto alle tradizionali CNN: per esempio il non tener conteggio delle relazioni tra
le feature, delle prospettive, delle dimensioni e dei loro orientamenti. Quindi riescono ad
esempio, a distinguere bene gli elementi, senza riconoscere il loro posizionamento specifico.
La proposta fu diversa rispetto al passato: Sara Sabour, Nicholas Frost e Geoffrey Hinton
pubblicarono un paper chiamato “Dynamic Routing Between Capsule”, e poco dopo lo
stesso Geoffrey Hinton pubblicò un altro paper che propose dei concetti tratti dal prece-
dente paper ma applicati alle reti neurali. Si iniziò a parlare di Capsule e CapsuleNet.
43
3 – Lo Stato Dell’Arte delle Reti Neurali
I risultati proposti furono incoraggianti pur riferendosi alle “digits” cioè elementi disegna-
ti, scritti, tracciati e in particolare venne fatto sia un paragone con le architetture neurali
conosciute al momento, sia venne tracciata una nuova idea: il cervello umano possiede
dei moduli chiamati “capsule”, capaci di rispondere a determinati stimoli visuali in modo
ottimale quali riferimenti spaziali come posizione, dimensione, orientamento, velocità.
Il cervello in particolare conosce dei meccanismi di routing, quindi di instradamento delle
informazioni di basso livello che permettono di capire quale è la migliore capsula per ge-
stirle nel miglior modo possibile.
Le capsule sono un set di layer neurali innestati ai quali si possono aggiungere altri livelli
all’interno degli stessi creando dei contenitori ricorsivi. Il neurone all’interno della capsula
cattura le informazioni all’interno di una immagine, e la capsula produce un vettore di
output che certifica l’esistenza dell’entità. Tale vettore è poi inviato ai possibili genitori
che la capsula individua all’interno della rete neurale; per ciascuno di essi si può trovare
un vettore di predizione, che è calcolato basandosi sulla sulla moltiplicazione dei suoi pesi
stessi per una matrice di pesi.
Questa, seppur ad alto livello, fu la proposta innovativa delle CapsuleNet.
44
3 – Lo Stato Dell’Arte delle Reti Neurali
Il task di Object Detection può essere diviso in due grosse sottoclassi, analizzate nelle due
seguenti sezioni:
Approccio 2-stage: RPN (Region Proposal Network) quindi basato sull’identificazione
di alcune regioni spaziali e caratterizzato internamente da due stage operativi.
Approccio 1-: SSD e Yolo che costituiranno la seconda sottofamiglia, e che utilizzano
un approccio diverso.
Questa grande famiglia di reti convoluzionali costituisce la base forte del task appena
descritto, inteso come task di classificazione e localizzazione di più oggetti all’interno
di una immagine. In questa sezione partendo dalle generiche Region-CNN si passerà
ad analizzare una serie di miglioramenti implementativi: le Fast R-CNN, le Faster
R-CNN e le Mask R-CNN.
Le Region CNN [95] in primo luogo selezionano diverse regioni all’interno di una im-
magine, per poi passare ad etichettare le categorie di oggetti nelle regioni attraverso una
CNN usata per estrarre le features da ogni area proposta.
Nello specifico, queste famiglie di reti sono caratterizzate da 4 passaggi operativi: la Ri-
cerca Selettiva che viene effettuata sull’immagine di input e seleziona diverse regioni in
alta qualità; poi selezionata una CNN pre-trained, che viene posta prima dell’output, la
possibile zona proposta viene trasformata nella dimensione richiesta dalla rete e le featu-
re estrette vengono inviate all’output; subito dopo le feature e le categorie, intese come
etichette delle regioni, sono combinate per allenare una vector machine multiple (questa
fase è detta Category Prediction. Infine, le feature e i box etichettati sono combinati
per allenare un modello osservativo a regressione lineare (fase di Bounding Box Pre-
diction).
L’alto carico computazionale ha creato molte complicazioni nell’utilizzo visto che è richie-
sto un tempo eccessivo (quasi 47 secondi) per classificare tutte le regioni di ogni singola
immagine e visto che la ricerca selettiva può proporre regioni candidate non ottimali, non
basandosi su algoritmi di learning.
Figura 3.25: Schema esplicativo di una Region CNN based. Fonte ed approfondimenti:
[97].
45
3 – Lo Stato Dell’Arte delle Reti Neurali
Le Fast R-CNN [53] sono un modello migliorativo delle R-CNN: viene usata l’intera im-
magine come input per l’estrazione delle features piuttosto che tutte le regioni selezionate,
come fatto con la ricerca selettiva in precedenza. La CNN seleziona le features dell’imma-
gine generando la tipica feature map e poi da questa sono selezionate le regioni candidate
che vengono racchiuse nei box. Da sottolineare l’introduzione del Rol Pooling Layer
che riceve queste regioni, le rimodella in dimensioni ben definite e le passa ai Layer Fully
connected per la classificazione finale.
Risulta lampante il vantaggio rispetto al modello architetturale precedente, visto che con
la CNN non sará analizzata una svariata quantità di regioni.
Figura 3.26: Schema esplicativo di una Fast Region CNN. Fonte ed approfondimenti: [97].
Sia la R-CNN che la Fast R-CNN usano la ricerca selettiva per trovare delle regioni, pur
sapendo che si tratta di un algoritmo lento e che consuma risorse in maniera eccessiva:
questo porta ad un peggioramento delle prestazioni della rete. Shaoqing Ren e il suo
team progettarono un algoritmo che permettesse alla rete di individuare le regioni salienti
abbandonando l’uso della ricerca selettiva.
Come nella Fast R-CNN anche nelle Faster [54] (fig.3.27) l’immagine è inviata alla CNN
che provvede a creare una mappa di feature; subito dopo è presente una nuova rete a sé
stante, che si occuperà di estarre delle regioni da proporre che saranno poi rimodellate dal
Rol Pooling Layer e che verranno usate per classificare l’immagine.
46
3 – Lo Stato Dell’Arte delle Reti Neurali
Figura 3.27: Schema esplicativo di una Faster Region CNN. Fonte ed approfondimenti:
[97].
47
3 – Lo Stato Dell’Arte delle Reti Neurali
La Segmentazione Semantica è una delle tematiche innovative per l’ambito della nostra
trattazione.
È una applicazione che sta riscuotendo molto successo dal momento che in questo periodo
storico-tecnologico si cercano di ricavare sempre più informazioni dai dati e anche dalle
immagini stesse, al fine poi di utilizzare quanto ottenuto in contesti di realtà aumentata,
per i veicoli self-drived, per l’interazione macchine-uomo ed altro ancora. Si può anche
considerare come un possibile terzo step di applicazione delle reti neurali alle immagini:
dopo la classificazione e la localizzazione, ci si può occupare dell’identificazione esatta (o
quasi) degli oggetti all’interno dell’immagine. L’applicazione risulta essere molto costo-
sa dal momento che ogni pixel localizzato viene “categorizzato” e perchè si cercherà di
delimitare esattamente un oggetto nei suoi contorni.
Le Mask R-CNN [99] sono una variante modificata delle Faster R-CNN in cui il Rol Pooling
Layer è sostituito con un Rol Alignment Layer. Il loro scopo però non è solo quello di
localizzare ma di segmentare gli oggetti presenti nell’immagine di input.
Questa struttura permette di usare l’interpolazione bilineare per ottenere informazioni
spaziali sulle feature map, rendendo la Mask R-CNN migliore per la predizione pixel per
pixel. Poi per il resto il Rol restituisce in output lo stesso risultato delle architetture
precedenti ma ci permette, se volessimo, di aggiungere una nuova rete CNN per predire la
posizione dell’oggetto a livello di singolo pixel.
Figura 3.29: Schema esplicativo di una MASK R-CNN. Fonte ed approfondimenti: [97].
48
3 – Lo Stato Dell’Arte delle Reti Neurali
49
3 – Lo Stato Dell’Arte delle Reti Neurali
Fortunatamente negli ultimi anni sono state create nuove architettura per ovviare al pro-
blema del collo di bottiglia delle R-CNN. In questa sezione sono inserite le applicazioni
di Real-Time Object Detection: Yolo and SSD sono le più conosciute e le più diffuse in
termini di utilizzo.
Si tratta della seconda famiglia di approcci in merito al task di Object Detection e in
particolare quella dell’approccio one-stage.
You only look once (YOLO) è [102] [103] delle architetture stato dell’arte per l’Object
Detection.
Finora i sistemi visti per l’Object Detection hanno sempre riproposto classificatori e loca-
lizzatori per riconoscere un oggetto: questo approccio invece prevede l’uso di una singola
rete. L’immagine verrà divisa in regioni e verrano predetti i box relativi e la probabilità
per ogni regione. Il meccanismo di base appare semplice: l’immagine di input viene divisa
in una griglia S x S e se il centro di un oggetto finisce all’interno di una cella, quella cella è
responsabile del riconoscimento di quel determinato oggetto. Ogni cella predice un tot di
box e produce un punteggio di confidenza che corrisponde a quanto il modello è corretto
in termini di posizionamento e predizione.
La pipeline quindi è singola ed è ottimizzata per una singola operazione, e questo porta ad
estremizzare positivamente le prestazioni: risulta essere una architettura velocissima che
processa real time circa 45 frames per secondo, mentre la versione ridotta FAST YOLO
riesce a processare 155 frames per secondo.
Unica pecca negativa riguarda il fatto che Yolo rispetto alle altre reti commette più errori
nella predizione fornendo falsi positivi magari sugli sfondi delle foto.
L’immagine viene ridimensionata in 448x448, viene lanciata una singola CNN e viene
ottenuto il risultato. L’architettura si ispira alla GoogLeNet ma a differenza di quella al
posto del modulo Inception viene usato un layer di riduzione 1x1, seguito da moduli con-
voluzionali 3x3: la rete risulta avere 24 layer convolutivi seguiti da 2 layer fully connected
mentre la versione FAST consta di un minor numero di layer convolutivi cioè 9.
La versione 1 è stata seguita da Yolo v2 [104], la quale ha portato dei miglioramenti
mediante l’inserimento di alcune modifiche architetturali, visto che Yolo rispetto alle Fa-
ster R-CNN mostrava un numero maggiore di errori di localizzazione: è’stata introdotta
la Batch Normalization per regolarizzare il modello, è stata migliorata la classificazione
alla piena risoluzione 448x448 ma soprattutto risultano importanti le Anchor Boxes.
Yolo prediceva le coordinate dei bounding box usando direttamente i fully connected layer
invece con queste Anchor Boxes predicendo gli offset al posto delle coordinate si semplifica
il problema e l’apprendimento diventa più semplice.
50
3 – Lo Stato Dell’Arte delle Reti Neurali
La prima versione riusciva a predire solamente 98 boxes per immagine mentre nella
successiva più di un centinaio. La V2 inoltre predice su una mappa 13x13, aggiungendo
un layer che funge da filtro passa-basso, portando le features dal vecchio layer 26x26 al
nuovo: quindi si passa da 26x26x512 feature a 13x13x2048.
Yolo v2 è stato chiamato Yolo9000 per la capacità di predire oltre 9000 categorie.
YOLOv3 [105] fa predizioni su 3 diverse scale, riducendo l’immagine rispettivamente in
scala 32, 16 e 8, allo scopo di rimanere accurata anche su scale più piccole (le versioni
precedenti avevano dei problemi con le immagini piccole).
Per ciascuna delle 3 scale, ogni cella è responsabile della predizione di 3 bounding box,
utilizzando 3 anchor boxes. Inoltre, risulta molto più precisa delle versioni precedenti, e
pur essendo un po’ più lento, rimane comunque uno degli algoritmi più veloci in circola-
zione. La v3 usa come architettura una variante della Darknet, con 106 layer convoluti.
Interessante è anche Tiny YOLO, funzionante su Tiny Darknet, e in grado di girare
su dispositivi limitati come gli smartphone.
DarkNet
Yolo si poggia quindi su DarkNet, una rete neurale di cui sono stati progettati vari modelli
ma dei quali non vi è molta descrizione sui paper scientifici: fondamentalmente YOLO
viene considerato una sorta di framework scritto in C e che può sfruttare il supporto CPU
e GPU.
Ad esempio, per Yolov2 è stato usata la DarkNet-19, molto simile alle VGG e con filtri
3x3 e un numero doppio di canali dopo ogni layer di pooling. Su questo modello, sulla
base delle intuizioni delle NIN è stato usato un “global average pooling” per completare
le predizioni, piuttosto che usare filtri 1x1. Questo modello ha 19 layer convolutivi e 5
max-pooling layer. Per l’Object Detection sono stati aggiunti poi 11 layer.
Yolo v3 invece, usa una variante con 53 layer, con 53 layer aggiuntivi per classificazione
che portano il computo a 106 layer totali. Questo la rende chiaramente più pesante.
51
3 – Lo Stato Dell’Arte delle Reti Neurali
Figura 3.33: DarkNet-19 a destra, DarkNet53 a sinistra. Fonte: Sito Ufficiale [103].
Questa architettura è stata rilasciata intorno alla fine del 2016 e raggiunse ottimi livelli in
termini di prestazioni.
SSD [106] è una sigla che indica Single Shot Detector anche se il vero nome è Single Shot
Multibox Detector: single shot poiché l’operazione viene svolta in un singolo passo dalla
rete mentre il multibox è la tecnica utilizzata per riconoscere gli oggetti.
SSD velocizza il processo eliminando l’uso della regione proposta ma per recuperare la
perdita di accuratezza usa il multi-scale features e i default boxes: tutto ciò la rende
accurata come le Faster R-CNN ma anche più veloce sia rispetto alla Faster sia rispetto
alle prime versioni di Yolo.
L’architettura di base è quella della VGG-16 senza i fully connected layer, scelta poichè
era una delle più conosciute ed usate e perchè permetteva di fare molto Transfer Learning.
I fully connected layer sono stati sostituiti con un set di layer convoluzionali aggiuntivi.
I blocchi veri e propri usati per l’Object Detection sono due: estrazione della feature e
applicazione dei filtri convolutivi per riconoscere gli oggetti. Le features sono estratte
con struttura VGG16 con convoluzione 4x3 (ad esempio) quindi poi verranno applicati
dei piccoli filtri convolutivi per l’Object Detection. Vengono ottenuti dei feature layer di
dimensione m x n con p canali (m x n x p) e viene applicata una convoluzione 3x3 e per
ogni locazione sono ottenuti k box di dimensioni differenti; per ciascuno dei k box vi sono
c punteggi di classe e 4 offset relativamente alla forma originale del box. Si otterranno
cosı̀ (c+4)x k x m x n output. La famiglia di reti appena esposta dispone di due modelli:
52
3 – Lo Stato Dell’Arte delle Reti Neurali
53
3 – Lo Stato Dell’Arte delle Reti Neurali
I risultati ottenuti nell’ambito della classificazione delle immagini hanno incoraggiato delle
valutazioni in merito alle CNN e alla loro possibile applicazione nell’ambito dei video, nei
quali le reti, non hanno accesso solo alle informazioni presenti in una sola immagine statica
ma anche ad una complessa evoluzione temporale.
Ovviamente si va incontro ad un problema molto più complicato già a partire dai dataset
visto che i video sono molto più complicati da catalogare annotare e salvare anche per via
delle dimensioni maggiori; in secondo luogo bisognava andare a vedere quale pattern di
rete fosse il migliore per apprendere informazioni locali più dettagliate in modo da influen-
zare in maniera più consona le predizioni, e soprattutto andare a valutare le tempistiche
di allenamento delle reti, in modo tale da ottimizzare il numero di parametri e ridurre in
maniera ottimale i tempi di allenamento.
I primi studi [111] per avvicinarsi al problema furono portati avanti usando un dataset di
1 milione di video sportivi tratti da Youtube divisi in 487 categorie e poi dal momento che
il problema si spostò dall’analisi della singola immagine all’analisi di un flusso di immagini
continue e ravvicinate cioè i vari frame che compongono il video, l’idea per migliorare
l’approccio fu quella di dividere lo stream di processamento in due parti: una che impara
le features a bassa risoluzione, l’altra che apprende ad alta risoluzione e che opera sulla
porzione centrale del frame. Questo approccio ha ridotto la dimensionalità dell’input.
Con i feature appresi durante l’utilizzo di queste tecniche sul dataset citato, si è provato
a fare una sorta di transfer learning su un dataset minore cioè UCF-101, che consta di
13.320 video di 101 categorie: si notarono dei miglioramenti rispetto al fare direttamente
allenamento su un dataset più piccolo come l’UCF.
Oltre al già citato problema delle dimensioni del dataset sorse un nuovo problema: la lun-
ghezza variabile di un video rispetto ad un altro. Si cercò di lavorare almeno inizialmente
su spezzoni/ritagli di video cercando poi di aggregare le predizioni tra i vari spezzoni fino
a giungere grazie a Karpathy e al suo gruppo alla definizione di 3 approcci diversi per
classificare un frame alla volta:
• Early Fusion: viene preso un più lungo e contiguo segmento per il video.
• Slow Fusion: il più complicato, nel quale vengono sovrapposti parzialmente 4 seg-
menti contigui nei layer convolutivi.
Il metodo sperimentato che ebbe più successo fu lo Slow Fusion, seppur di poco rispetto
al Single Frame che risultò essere quello più semplice: in generale il miglior risultato si
ottenne combinando i metodi in un altro metodo combinato: Single +Early + Late +
Slow.
Venne anche sviluppato il modello di CNN multirisoluzione andando a separare l’in-
put in due stream: l’input veniva passato a due livelli convolutivi separati che però si
ricongiungevano solo dopo due sequenze isolate di Convoluzione + MaxPooling + Batch
Normalization. Questo fornı̀ una forte riduzione del tempo di Convoluzione.
In termini molto spiccioli, l’idea più plausibile visti i risultati ottenuti sembrò quella di
combinare le informazioni riguardo alle immagini che temporalmente compongono un vi-
deo. Sfruttare le architetture convoluzionali parve qualcosa di naturale, visto che queste
fornivano grandi prestazioni nell’Object Detection ma visto anche che valutare il singolo
54
3 – Lo Stato Dell’Arte delle Reti Neurali
frame e fare una media non forniva informazioni complete per una accurata classificazione
dei video.
Necessitava però con questa strategia una grande quantità di frame per ottenere una pre-
cisione maggiore.
Quindi se da un lato si cercò di usare strutture convoluzionali già conosciute che facessero
uso di tecniche di pooling adattate, dall’altro si fece parallelamente strada l’idea dell’uso
di Reti Neurali Ricorrenti [112]. Ogni frame era processato indipendentemente con le
tecniche di pooling usando una CNN, mentre la Rete Neurale Ricorrente usata era deriva-
ta dal modello LSTM (Long Short Term Memory) che venne sfruttato per acquisire
informazioni a livello temporale.
Condividendo i parametri nel tempo, entrambe le architetture sono capaci di mantenere un
numero costante di parametri mentre catturano delle informazioni globali sull’evoluzione
temporale del video. Questo tipo di approcciò era molto dispendioso a livello computa-
zionale dal momento che faceva uso di diversi filtri convoluzionali 3D, allora fu necessario
ipotizzare qualcosa che abbattesse questa problematica: processare un frame al secondo.
Questa scelta faceva perdere le “motion information” cioè le informazioni sugli sposta-
menti ma queste potevano essere compensate inserendole in forma di flusso ottico (flusso
ottenuto dall’analisi di frame adiacenti). Questa seconda strategia fu quella su cui cadde
la scelta.
Le architetture CNN usate furono due: AlexNet e GoogLeNet, architetture già analizzate
in precedenza: in questa sezione in aggiunta saranno analizzati anche i modelli di Pooling
specifici usati in ambito video, evitando di trattare in maniera dettagliata ciò che riguarda
le Reti Neurali Ricorrenti. La prima strada di analisi, inerente alla combinazione delle in-
formazioni tra più frame si incentrò sulla ricerca di una struttura di layer di Max-Pooling
che abbinasse prestazioni e risultati ottimali: questo layer infatti dimostrò di essere perfor-
mante in termini di apprendimento veloce dal momento che l’aggiornamento del gradiente
è generato da un set di features sparso relativo a tutti i frame.
Le architetture di Max-Pooling analizzate furono le seguenti:
• ConvPooling: il max pooling è fatto sul layer di convoluzione finale sui frame del
video, in modo che le informazioni spaziali nell’output siano preservate nel dominio
del tempo.
• Late Pooling: prima le feature passano su 2 layer fully connected e poi dal max
pooling, e i pesi dei layer convolutivi e dei layer fully sono condivisi. Questa
implementazione combina direttamente informazioni di alto livello tra i frame.
55
3 – Lo Stato Dell’Arte delle Reti Neurali
• Slow Pooling: combina le informazioni dei frame dentro finestre temporali; il max
pooling è applicato sulle feature di 10 frame per poi passarlo ad un fully connec-
ted layer con pesi condivisi mentre nella seconda parte viene combinato l’output
di un singolo max pooling layer con l’output di tutti i fully connected layer. Ven-
gono cosı̀ combinate le informazioni locali prima di combinare quelle di più frame
temporalmente sparsi.
• Local Pooling: simile allo Slow, sono combinate le feature locali dopo l’ultimo layer
convolutiva. Ho un solo layer di pooling e non rischio di perdere informazioni tem-
porali. Ovviamente subito dopo ho due fully connected layer con pesi condivisi e un
ampio soft-max layer che combina tutto.
Usando questi modelli con architettura AlexNet sul Dataset Sports-1M si evidenziò che
il Late Pooling era quello con risultati peggiori e che il Time-Domain Convolution dava
risultati meno completi rispetto agli altri modelli: il ConvPooling era il modello migliore.
Ma il risultato più importante che venne fuori è che era necessario studiare un nuovo
modello più sofisticato che usasse per l’apprendimento sia più domini temporali che un
singolo dominio temporale: le Reti Ricorrenti insieme all’uso delle cnn quindi risultarono
essere il modello più ovvio in ambito video per la classificazione di oggetti/soggetti tra i
frame.
56
Capitolo 4
In questo capitolo verrà discusso tutto ciò che realmente ci permetterà di mettere in pratica
le nozioni teoriche viste nella parte relativa alle reti neurali. Partendo dai Dataset che
sono l’input da fornire alle nostre reti si finirà con l’analizzare i framework, cioè quei
programmi o applicativi che permettono di lavorare sulle reti Neurali. Successivamente
saranno passate in rassegna anche alcune Api che operano sopra alcuni framework ma
anche dei progetti di Api/software a se stanti, che poggiano su framework o che operano
in maniera del tutto indipendente quali Detectron e DetecTorch.
4.2 Dataset
Uno degli elementi fondamentali per il machine learning è la disponibilità di dataset cioè
delle collezioni di dati adeguati (in formato diverso in base al task di pertinenza) da
utilizzare per le fasi di training e testing, oltre che di valutazione finale del modello.
Chiaramente saranno dettagliati dataset che contengono delle immagini e in particolare
per ogni categoria presente nel dataset, dovranno essere presenti un ampio numero di
immagini cercando di non avere un numero di elementi troppo diverso fra tutte le classi,
al fine di evitare situazioni di sbilanciamento.
Per rendere la rete più robusta sarà necessario disporre di immagini che rappresentino
l’oggetto da classificare con angolazioni diverse, con sfondi diversi e magari anche con
situazioni di luminosità differenti.
Per ciascuna categoria del dataset, le immagini raccolte dovranno essere suddivise in un
training set ed un validation set che contiene una quantità ridotta di immagini.
È importante tuttavia fare attenzione al fatto che le immagini presenti nel validation
set, non siano presenti anche nel training set in modo da non rendere falso il valore di
accuratezza. Per ogni classe di immagine, la situazione ottimale sarebbe quella di avere
nel training set sia immagini rappresentanti l’oggetto in questione con uno sfondo e sia
57
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
4.2.2 ImageNet
https://wordnet.princeton.edu/
http://www.image-net.org/about-overview
Imagenet è stato ampiamente descritto e discusso a livello storico nella sezione intro-
duttiva sulle reti neurali, in quanto il relativo contest fu il punto di partenza per esplorare
il contesto centrale della nostra trattazione. Nello specifico il dataset di ImageNet [113], è
un database organizzato sulla base della gerarchia WordNet, nella quale ogni concetto è
descritto da più frasi e parole: potremmo considerare un concetto come set di sinominimi
o synset; seguendo la stessa logica ogni nodo è raffigurato da centinaia/migliaia di imma-
gini.
Al momento esistono in media oltre 500 immagini per nodo e per ciascuno di essi ImageNet
compila una lista accurata di immagini dal web.
http://host.robots.ox.ac.uk/pascal/VOC/
http://host.robots.ox.ac.uk/pascal/VOC/databases.html
Il progetto Pascal Voc [114] fornisce un dataset per il riconoscimento oggetti e un set
di strumenti per accedere al set e alle annotazioni.
A partire dal 2005 fino al 2012 venne portata avanti una sfida di valutazione delle presta-
zioni che incoraggiò due tipi di testing dei metodi: metodi che sono allenati solo usando il
set di training e valutazione (trainval) e metodi che sono testati usando ogni tipo di dato
eccetto i test set.
La valutazione dei nuovi metodi sui dataset forniti può essere reperita attraverso il Server
di Valutazione che viene reso disponibile sul sito ufficiale, insieme al Dataset vero e pro-
prio. Le immagini sono reperite in formato PNG dal sito “Flickr” seguendo la legislazione
relativa al sito di pertinenza in merito al loro sfruttamento.
58
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
https://groups.csail.mit.edu/vision/SUN/
https://vision.princeton.edu/projects/2010/SUN/
Lo scopo del Dataset Sun [115] [116] è quello di fornire ai ricercatori una ampia
quantità di immagini annotate che coprono una larga varietà di scene ambientali, luoghi
e oggetti correlati a questi.
È stato usato il dizionario WordNet come in Imagenet, in modo da stabilire un dizionario
per le scene specifiche e poi successivamente collezionare le relative immagini mediante
strumenti di ricerca e alla fine annotare ciascuna di esse manualmente.
SUN, il cui acronimo significa Scene Understanding, contiene 899 categorie e 130.519
immagini e usa 397 categorie per valutare gli algoritmi e le relative prestazioni in ambito
“scene recognition”.
http://archive.ics.uci.edu/ml/datasets/SIFT10M
Il Dataset SIFT10M [117] è usato principalmente per valutare il metodo di appros-
simazione al vicino più prossimo, e il titolo dei file, in formato PNG, indica la colonna in
cui è posizionato il feature Sift.
Ogni punto è una feature sift estratta da Caltech-256 grazie alla libreria open source
VLFeat.
4.2.6 CALTECH-256
http://www.vision.caltech.edu/Image_Datasets/Caltech256/
Caltech-256 [118] è la nuova versione del dataset Caltech-1, le cui immagini sono
ottenute da Google and PicSearch. Il 32% del totale delle immagini è valutata come good
seguendo una scala che comprende 3 parametri: good, bad con foto confuse, artistiche o
poco definite e not applicable per le categorie non presenti.
59
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
http://cocodataset.org
Coco(Microsoft Common Objects in Context) [119] è un ampio dataset per il
riconoscimento di oggetti e soggetti umani e per la relativa classificazione ed entra proprio
nel cuore della nostra ricerca; in particolare, gli oggetti e la loro posizione all’interno
di queste (le immagini reperibili per una determinata categoria non contengono solo il
singolo oggetto ma contengono un contesto ben determinato in cui sono riconoscibili altri
elementi): questo portò nel tempo ad avere la necessità che ogni possibile oggetto fosse
categorizzato e quindi di conseguenza la necessità di avere un database su larga scala.
La ricerca della soluzione per questo problema portò a questo dataset: COCO contiene 91
categorie di oggetti comuni, di cui 82 ne contengono almeno 5000 etichettate, per un totale
di circa 330.000 immagini di cui oltre 200mila già etichettate, per un totale di 2.5Milioni di
oggetti categorizzati. Quindi risulta essere di grande aiuto nell’ambito della localizzazione
oggetti nelle immagini in due dimensioni, essendo molto più grande dei dataset altrettanto
conosciuti come PASCAL VOC e SUN e IMAGENET.
https://storage.googleapis.com/openimages/web/index.html
https://github.com/openimages/dataset
Open Images V4 [120] è un dataset di 9.2M di immagini, con annotazioni unificate
per la classificazione, riconoscimento di oggetti e riconoscimento di relazioni visuali nelle
immagini stesse.
Le immagini seguono la Creative Commons Attribute License che lo contraddistingue
rispetto ad altri dataset e che regolarizza a livello legale la condivisione e la modifica di
materiale. Tutte le immagini sono state collezionate da Flickr (altro tratto distintivo,
nonostante altri dataset reperiscano le immagini dalla stessa fonte): dispone di 30.1M
di etichette per 19.8mila concetti, 15.4 box di riconoscimento per 600 classi di oggetti e
375 mila relazioni che riguardano 57 classi. Le immagini nello specifico raffigurano scene
complesse con mediamente 8 oggetti per foto. La prerogativa di OpenImages è stata
quella di fornire immagini in diverse scale di qualità e molto varie tra loro e in particolare
il dataset differisce per 3 elementi chiave rispetto agli altri concorrenti, due dei quali già
elencati: la CC-BY License, il collezionamento da Flickr che lo rende ampio mentre il
terzo tratto distintivo riguarda le immagini che non sono ottenute mediante la ricerca con
tag specifici ma sono riferite a della classi naturali non definite, essendo scene ampie con
più oggetti facilmente distinguibili o meno tra loro.
Dopo aver collezionato le immagini queste sono copiate in due risoluzioni:
60
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
• 1600HQ con massimo 1600pixel sul lato lungo e 1200 sul lato corto.
Subito dopo vengono estratti dalle foto i principali metadati e solo successivamente rimosse
le foto con contenuti inappropriati, rimossi i duplicati e le foto maggiormente condivise
su Internet. Alla fine di questi processi di pruning, viene creata una partizione in Train
Images, Validation Images, Test Images.
http://www.cvlibs.net/datasets/kitti/index.php
Il Dataset Kitti [121] [122] [123] [124] è frutto di un progetto dell’Università di
Karlsruhe, in collaborazione con l’Istituto Tecnologico Toyota di Chicago, che sfruttando la
piattaforma utilizzata per il progetto del gruppo di ricerca AnnieWAY (che sta sviluppando
una auto dalla guida autonoma) ha equipaggiato una auto con due camere: una ad alta
risoluzione e una in scala di grigi al fine di catturare immagini da aggiungere al dataset
durante degli spostamenti nella zona della città di Karlsruhe.
Nell’ambito riconoscimento oggetti risultano essere disponibili 7481 immagini di training e
7518 immagini di test per un totale di 80.256 oggetti etichettati. Le immagini sono salvate
in PNG e i Dataset forniti sono disponibili per soli ed esclusivi studi accademici.
http://www.cs.toronto.edu/~kriz/cifar.html
CIFAR-10 e CIFAR-100 [125] sono un sottoinsieme di immagini raccolte da Alex
Krizhevsky, Vinod Nair, e Geoffrey Hinton. CIFAR-10 contiene 60.000 immagini 32x32
divise in 10 classi equamente divise con 50.000 immagini di train e 10.000 immagini di
test.
CIFAR-100 invece ha 100 classi da 600 immagini, con 500 immagini di train e 100 di test.
Le 100 classi sono divise in 20 superclassi.
Oggi è uno dei dataset maggiormente usati per il testing delle reti neurali.
https://github.com/visipedia/inat_comp
iNaturalist Dataset [126] consiste in un set di 859 mila immagini di oltre 5mila
specie di piante ed animali. Le immagini spesso ritraggono anche lo stesso tipo di specie,
però in contesti diversi, in situazioni diverse, in posti diversi del mondo e sono collezionate
con differenti camere permettendo di averle con diverse qualità.
Il focus di questo dataset è incentrato sulle immagini di training: se riducessimo il numero
di immagini di training per categoria, per la classificazione perderemmo in termini di pre-
stazioni, per cui si è cercato di fornire più immagini riguardanti la stessa specie in modo
da essere performanti nelle prestazioni di classificazione e comunque in modo da adattarsi
al principio naturale della biodiversità visto che realmente esistono milioni di specie tra
piante ed animali. Questo fa sı̀ che serva uno strumento di predizione che sia accurato e
che copra in larga scala la biodiversità globale.
La base del dataset è una raccolta di immagini ed etichette, reperite dal sito scientifico
61
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
http://places.csail.mit.edu/
https://github.com/CSAILVision/places365
Il laboratorio del Mit di Computer Science e Intelligenza artificiale produsse questo
dataset basato sulle scene e chiamato proprio Places [127] che consta di 205 categorie di
scene e 2.5 milioni di immagini categorizzate.
• Oxford Flowers102Dataset:
http://www.robots.ox.ac.uk/~vgg/data/flowers/102/index.html
• STL-10:
https://cs.stanford.edu/~acoates/stl10/
• NORB:
https://cs.nyu.edu/~ylclab/data/norb-v1.0/
• COIL 20/100:
http://www.cs.columbia.edu/CAVE/software/softlib/coil20.php
http://www.cs.columbia.edu/CAVE/software/softlib/coil-100.php
62
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
4.3 Framework
4.3.1 Tensorflow
https://www.tensorflow.org/
TensorFlow [128] è uno dei più famosi framework open source per svolgere attività di
machine learning e anche grazie alla sua ampia flessibilità ed adattabilità è stato adottato
da molte aziende tra cui Airbnb, CocaCola, DeepMind, Airbus, Amd, Intel, Nvidia,
Twitter, IBM, Google.
Google nello specifico ne ha fatto uso per l’ampia capacità di comprendere e processare
linguaggi naturali, classificazione di testi, immagini, riconoscimento di scrittura manuale
ed è l’azienda che porta avanti il suo sviluppo.
Funzionalità di TF
TensorFlow viene catalogato come uno dei tools più semplici e di facile comprensione
nel momento in cui ci si approccia per la prima volta al Deep Learning, grazie all’ampia
documentazione fornita ma anche perché usa di base Python come linguaggio e perché,
come detto in precedenza, è supportato da Google e dispone di una ampia comunità di
ricercatori che sviluppano continuamente Api aggiornate e migliorate in modo da mante-
nere sempre aggiornata la piattaforma allo stato dell’arte attuale nell’ambito del machine
learning.
Tensor Flow si compone di 2 tools fondamentali: il TensorBoard che permette la visua-
lizzazione dei dati nel modello di rete e le relative performance e il TensorFlow Serving
utilizzato per lo sviluppo di nuovi algoritmi.
In particolare, TensorBoard è un grosso punto di forza rispetto ad altri framework, visto
che gli altri sono costretti a sfruttare la libreria Matplotlib; ultimamente si è cercato di
adattare TensorBoard anche per PyTorch ma non è un progetto nativo del tool.
La nuova implementazione di TensorFlow Lite ne apre ancor di più gli orizzonti di utilizzo.
Le Api di alto livello di cui si fa uso sono le seguenti:
• Keras, usata per costruire ed allenare i modelli di Deep Learning. È una Api con
interfaccia semplice, ottimizzata per i casi di utilizzo comune e che fornisce anche
dei feedback nel caso di errori dell’utente.
È caratterizzata da dei blocchi connessi configurabili, collegabili tra loro ma anche
estendibili nel caso si volesse proporre una nuova idea di modello.
63
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
• Importing Data che corrisponde alla pipeline di input per i dati in ingresso nel
nostro programma TensorFlow.
• Estimators che è una Api che fornisce un pacchetto completo di modelli per training
e produzione dati.
TensorFlow dispone anche di una serie di Api di basso livello dette TensorFlow Core:
• Introduction che indica come muoversi tra tutte le Api di basso livello, mostrando
come gestire il programma di base o come gestire le operazioni di sessione a runtime,
oppure come usare le Api di alto livello o come costruire in nostro ciclo di training
o semplicemente come usare uno di quelli forniti da Estimators.
• Tensors che espone come creare, accedere e manipolare i tensori cioè gli elementi
fondamentali di TensorFlow: infatti tutto il sistema è basato sulla definizione ed
esecuzione di operazioni che coinvolgono proprio i tensori, siano essi dei vettori o
delle matrici generiche. Quando si scrive un programma per TensorFlow l’operazione
basilare è quella di manipolare i tensori infatti il programma lavora formando un
grafo di oggetti TensorFlow. Questi possono essere di tipo float32, int32, string o
uno shape, che corrisponde al numero delle dimensioni che ha; fondamentale è che
ogni tensore abbia elementi tutti dello stesso tipo. Vi sono altri tipi speciali di tensori
quali variabili, costanti, placeholder o Sparse Tensor.
• Graphs and Sessions: viene usato un grafo per per rappresentare lo stato compu-
tazionale delle operazioni in termini di dipendenza proprio tra le singole operazioni.
DataFlow è un comune modello per monitorare la computazione delle operazioni
nelle unità: ogni nodo corrisponde ad una unità operativa. Viene cosı̀ definito un
grafo che corrisponde esattamente ad una sessione operativa.
• Ragged Tensor: permette di capire come usare questi elementi che non sono altro
l’equivalente di liste senza dimensione definita annidate. Questi sono usati in molte
operazioni di TensorFlow tra cui quelle matematiche.
TensorFlow fornisce anche un Debugger mentre la versione Lite fornisce delle tecniche
di ottimizzazione per le versioni mobile ed embedded.
Altro aspetto da considerare di TensorFlow è la performance, fondamentale quando si
allena un modello di machine learning: a tale scopo vengono forniti documenti e descrizioni
64
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
per migliorare l’input dei dati, o per migliorare la configurazione o semplicemente per
implementare le tecniche migliori di ottimizzazione del codice scritto. “Distribution
Strategy” è un’altra Api di TF ed è un modo semplice per distribuire la fase di training
tra più device o macchine. Permette agli utenti di usare modelli esistenti e allenare codice
con poche modifiche, nel caso si volesse proprio fare allenamento in modo distribuito.
TensorFlow (TF) è uno dei 3 framework per cui sarà fornito supporto in questa trattazione
e per cui sono stati scritti diversi script implementativi atti a completare i task evidenziati
nell’introduzione.
Per interfacciarsi fin da subito con TensorFlow è stata sfruttata l’ampia guida fornita sia
sul sito ufficiale sia nel repository ufficiale di GitHub. Oltretutto quando ci si avvicina ad
un framework di machine learning è buona norma valutare il proprio sistema e verificare se
tra i prerequisiti hardware del sistema vi sia una GPU, che permette di avere prestazioni
migliori in qualsiasi attività di machine learning visto e considerato che si ha a che fare
con operazioni dal costo computazionale alto.
GPU (graphics processing unit) e TPU (tensor processing unit) possono ridurre
notevolmente le tempistiche di esecuzione di un singolo step di training oltre che l’utilizzo
anche di una pipeline efficiente che invia i dati alla fine di ogni step in maniera tempestiva.
L’Api “tf.data” aiuta a rendere flessibile ed efficiente la pipeline che in input su TF prevede
le seguenti fasi:
• Estrazione.
TensorFlow Datasets
65
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
• Una sezione ufficiale, nella quale sono degli sviluppatori accreditati a postare Modelli
Architetturali già allenati ed Api di esempio di alto livello: tutto il materiale di questa
sezione è sottoposto a testing continuo, aggiornamenti periodici.
Fondamentalmente può essere definita come un repository ufficiale, clonabile nella
nostra cartella di lavoro, e per il quale si possono installare le relative dipendenze.
• Una sezione relativa a ciò che viene proposto dai ricercatori, che quindi non ha nulla
a che vedere con il team ufficiale di sviluppo del framework.
In particolare, sono i ricercatori stessi a richiedere di poter sottomettere del materia-
le, e sono loro stessi a mantenere testato ed aggiornato ciò che postano. La directory
è reperibile sotto il nome Research e contiene modelli di rete già allenati, Api di
utilizzo diretto del framework, esempi di utilizzo per allenamento, transfer learning
o esempi di valutazione delle prestazioni sotto forma di tutorial o notebook Jupyter.
Tra questi di nostro interesse sarà la directory “Object Detection” e la directory
“Slim” che ci aiuteranno a performare i nostri task.
Repository Ufficiale
Facendo una veloce carrellata dei vari path ci si accorge facilmente che non tutti i
modelli architetturali sono utili alla nostra trattazione e quindi sarà preso in considerazione
solo ciò che concerne le CNN per immagini e in particolare:
Con questo comando ad esempio verrà lanciata l’esecuzione eager della rete “Re-
snet50” e quindi sostituendo dopo –model il nome del modello da testare verrà
provata qualunque altra tipologia di architettura disponibile.
Volendo usare la “distribution strategy” (non supportata da eager) il comando
sarebbe:
python benchmark_main.py --model resnet50 -dist_strat
L’eventuale aggiunta del parametro –callback fornisce la possibilità di usare una lista
di callback aggiuntive.
• ResNet:
https://github.com/tensorflow/models/blob/master/official/resnet
Contiene una implementazione della Rete ResNet allenata su ImageNet per TF. I
dettagli relativi alle ResNet sono stati visti già nella sezione esplicativa delle reti
mentre ciò che risulta interessante è l’indicazione di alcuni modelli già pre-allenati
66
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
TF Slim
https://github.com/tensorflow/tensorflow/tree/master/research/slim
Slim [129] è una libreria leggera per definire, allenare, e valutare modelli in TensorFlow.
Sarà ora analizzata dettagliatamente e testata nei capitoli successivi. I suoi componenti
possono essere facilmente mixabili con quelli tradizionali di TF ma a livello implementativo
è composta da diversi elementi indipendenti da TF quindi in qualche modo è definibile
come una vera e propria Api. Si compone di diversi parti funzionali:
• TF Slim Data è una libreria per facilitare la lettura da vari formati standard di
utilizzo comune ed è composta a sua volta da diversi layer in modo da permettere
flessibilità in caso di supporto in lettura per file multipli. Ha due componenti princi-
pali, uno che specifica come il dataset è rappresentato e uno che fornisce le istruzioni
per ottenere i dati.
A livello puramente implementativo TF Dataset è una tupla che incapsula:
data sources cioè la lista di path che compone il dataset, reader che corrisponde
al TFReader appropriato per il tipo di data sources, decoder che indica la classe
usata per decodificare il contenuto del dataset, num samples che è chiaramente
il numero di samples del dataset, items to description cioè la mappa degli item
forniti. Operativamente, il dataset è letto aprendo i file specificati nel data sources,
mediante la classe reader che sfrutta il decoder indicato per richiedere una lista di
item che saranno ritornati come Tensori.
• arg scope fornisce un nuovo “scope” che permette all’utente di definire gli argomenti
di default per delle specifiche operazioni.
67
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
68
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
• Inception V3
• Inception V4
• Inception Resnet V2
• Vgg 16
• Vgg 19
https://github.com/tensorflow/models/tree/master/research/object_detection
TensorFlow Object Detection è una Api open source creata per realizzare, allenare e
testare modelli di riconoscimento e localizzazione oggetti e quindi sarà una delle applica-
zioni centrali della nostra tesi visto che sarà nostro obiettivo sfruttare dei modelli capaci
di completare il suddetto task.
Questa Api si pone sopra Tensorflow sfruttando le sue librerie e i suoi moduli oltre che
Protobufs per configurare i modelli ed allenare i parametri. Queste di seguito sono le reti
pre-allenate fornite:
• SSD ResNet50.
• Diverse varianti di Faster R-CNN allenate sul dataset Coco, Kitti Dataset,
Open images, i-Naturalist.
Alla seguente pagina [131] sono disponibili i link relativi per reperire i modelli di nostro
interesse. TF Object Detection cosı̀ come TF Slim dispone di alcune librerie, funzionali al
nostro scopo, che pertanto saranno sfruttate e chiamate all’occorrenza nei nostri script per
permettere di completare il task della localizzazione unito alla classificazione degli oggetti.
69
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
4.3.2 CAFFE
http://caffe.berkeleyvision.org/
Caffe [132]: è un framework che supporta interfacce C, C++, Python, Matlab e che
lavora anche da linea di comando. È stato sviluppato dal Berkeley Vision and Learning
Center (BVLC), con il contributo di un’intera community.
Caffe potenzia progetti di ricerca accademica, prototipi di startup e applicazioni industria-
li visive, vocali e multimediali su larga scala. È utilizzato moltissimo con modelli di Reti
Convolutive e risulta essere molto veloce.
Uno degli elementi di particolare rilevanza, derivato dall’uso della libreria C++, è la possi-
bilità di utilizzare liberamente le reti disponibili nel repository “Caffe Model Zoo” che sono
pre-allenate e quindi pronte all’uso, spesso anche con funzioni di chiamata già predisposte
dal framework.
Nell’ambito di nostro interesse cioè quello del processamento di immagini è uno dei fra-
mework più usati, soprattutto perché può grazie alla sua velocità di processamento, ana-
lizzare oltre 60 milioni di immagini in un giorno con una singola scheda Nvidia K40 GPU.
Caffe di contro non supporta la fine granularità dei livelli come TensorFlow e non vi e’
molto supporto per il modellamento delle reti: i layer sono strutturati e definiti princi-
palmente ai livelli bassi di programmazione e nel caso si vogliano fare delle modifiche per
ottenere magari livelli con granularità maggiore si va incontro a particolari difficoltà.
Come visto già con TensorFlow, per sfruttare l’accelerazione GPU è necessario installa-
re il supporto CUDA di NVIDIA e le relative dipendenze e quindi chiaramente servirà
l’installazione della versione di Caffe con supporto CPU.
Caffe Repository
Caffe è anche una community infatti sul repository GitHub di riferimento di seguito lin-
kato è possibile reperire una grande quantità di materiale utile.
https://github.com/BVLC/caffe.
Sono necessarie svariate dipendenze, appositamente indicate nella guida all’installazio-
ne presente nel repository appena citato: tra i più significativi c’è BLAS (http://www.
netlib.org/blas/) che offre delle routine per compiere operazioni matematiche con vet-
tori e matrici.
Sono forniti come anticipato dei modelli pre-allenati che vengono scaricati direttamente
nella directory models/¡nomemodello¿, lanciando lo script dalla cartella principale della
repo il seguente comando:
scripts/download model binary.py dirname dove “dirname” è specificatamente uno
dei modelli proposti:
70
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
Alla seguente pagina invece [133] vi sono una svariata quantità di modelli, selezionati qui
di seguito, scegliendo come criterio principale il fatto che lavorassero sui task di nostro
interesse e selezionando tra le svariate versioni quelle più prestanti o quelle meno pesanti
in termini di storage.
71
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
• Modelli ResNet.
GitHub Repository: https://github.com/KaimingHe/deep-residual-networks
I modelli allenati sono stati proposti per il contest ILSRVC e per quello Coco. Questo
modello vinse in definitiva le seguenti competizioni: ImageNet classification, Image-
Net detection, ImageNet localization, COCO detection, e COCO segmentation. Il
progetto oggi è portato avanti da MRA (Microsoft Research Area).
• Modello SqueezeNet.
SqueezeNet viene proposta in diverse versioni tutte allenate con ImageNet:
a) SqueezeNet 1.0.
b) SqueezeNet 1.1.
c) SqueezeNet 1.0 Deep-Compression: dimensioni ridottissime, circa 660KB molto
più piccola della AlexNet ma con la stessa accuratezza teorica.
d) SqueezeNet Residual: viene ottenuta aggiunge un bypass layer alla SqueezeNet
1.0.
Questi evidenziati appaiono come i modelli più salienti che la community di Caffe mette a
disposizione ma in realtà sono presenti altri modelli, molti dei quali a noi non utili o che
non dispongono di tutti i file necessari per un utilizzo immediato poichè difettano del file
deploy.prototxt, che deve essere fornito da chi allena la rete, dal momento che contiene
dei parametri settati in fase di training.
Altre reti pre-allenate sono reperibili alla pagina:
http://www.vlfeat.org/matconvnet/pretrained/
72
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
http://torch.ch/
http://pytorch.org/
Torch è un framework che offre ampio supporto per il machine learning. Il suo utilizzo
è diffuso tra diversi colossi mondiali quali Facebook, Twitter o Google. È prevalentemente
usato con librerie C/C++ ed implementa le librerie CUDA.
PyTorch invece è uno dei framework più in voga al momento, è considerato quasi il com-
petitore di TensorFlow ed è essenzialmente una porta verso Torch; è usato per costruire
reti neurali e eseguire la computazione specialmente nei casi di alta complessità.
Sviluppato dal Fair (Facebook Al Research) usa Python a differenza di Torch ed è carat-
terizzato da un processo di modellamento molto più semplice rispetto a quello eseguito
da Torch. Come TensorFlow l’elemento fondamentale di PyTorch sono i tensori, matri-
ci multidimensionali di numeri, necessarie per il calcolo matematico in python; PyTorch
permette di produrre modelli molto più intuitivi e facilmente studiabili, nonostante alle
sue spalle vi sia una comunità di sviluppo minore ma comunque in crescita esponenziale.
Nel capitolo successivo saranno visti diversi esempi che girano su PyTorch.
L’introduzione appena fatta ha sottolineato che si tratta di uno dei framework sui cui
in termini di ricerca si sta puntando molto.
In questa pagina del sito ufficiale: [136] viene data la possibilità di scegliere le proprie
impostazioni di installazione, se avvalersi del supporto Cuda o semplicemente il tipo di
sistema operativo. Come per gli altri framework esiste un apposito repository nel quale
reperire modelli di rete allenati: [137].
• Una libreria contenente strutture dati per tensori multidimensionali e che al suo
interno dispone delle principali operazioni matematiche sui tensori e la serializzazione
di questi per i più svariati utilizzi: questo package è chiamato Torch.
https://pytorch.org/docs/stable/torch.html
• Una libreria che fornisce classi e funzioni di automatica differenziazione dei valori
scalari e che supporta ogni operazione sui Tensori: torch.autograd.
https://pytorch.org/docs/stable/autograd.html
73
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
• Una libreria di utilities che contiene funzioni e processi come il DataLoader molto
utili per l’utilizzo del framework: torch.utils.data.
https://pytorch.org/docs/stable/data.html
Per testare il framework è necessario come sempre un modello allenato: di questo dopo
l’allenamento viene salvato un “checkpoint” che sarà utilizzato poi per l’Inference. I mo-
delli sono definiti da una classe che estende una classe “Module” mentre tutti i componenti
sono presenti nel package torch.nn che sarà necessario importarla nelle dichiarazioni quan-
do si vorrà scrivere uno script. Il caricamento e l’utilizzo del set di dati invece è molto
semplice e necessita del pacchetto “torchvision”. Dato che la costruzione del dataset e
l’allenamento non svolgono un ruolo principale per la nostra tesi, si passerà subito ad ana-
lizzare nel dettaglio l’interazione con il modello allenato, e l’utilizzo di questo per ottenere
delle predizioni su nuove immagini; i passaggi da eseguire sono i seguenti:
• Caricare un’immagine di test dal nostro filesystem, che è quella che verrà valutata.
Questi più o meno sono dei passaggi standard visti anche negli altri framework, con la sola
differenza che in qualche modo torch fornisce una sorta di aiuto distribuendo, per i modelli
maggiormente usati, delle librerie con le relative funzioni istanziabili. Sarà comunque
necessario il seguente import:
import torchvision.models as models.
• resnet18 = models.resnet18().
• alexnet = models.alexnet().
• vgg16 = models.vgg16().
• densenet = models.densenet161().
• googlenet = models.googlenet().
74
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
Sono forniti anche in versione pre-allenata e sono importabili e richiamabili nel modo
seguente; la prima volta il modello sarà automaticamente scaricato.
• resnet18 = models.resnet18(pretrained=True).
• alexnet = models.alexnet(pretrained=True).
• vgg16 = models.vgg16(pretrained=True).
• densenet = models.densenet161(pretrained=True).
• googlenet = models.googlenet(pretrained=True).
Muovendoci tra i vari repository che trattano PyTorch sul Web, è apparsa di importante
rilevanza tecnica la seguente:
https://github.com/Cadene/pretrained-models.pytorch
Vengono proposti diversi modelli pre-allenati e un supporto completo per il relativo utilizzo
in termini di funzioni richiamabili: dopo l’installazione, dettagliata sul repository, dagli
script o programmi sviluppati si potrà semplicemente fare il relativo import di import
pretrainedmodels per usufruire di un vasto numero di reti allenate tra le più prestati
del momento e del relativo codice in python per l’utilizzo.
Attraverso il seguente semplice script python si può verificare quali sono i parametri da
usare per l’eventuale utilizzo indicando tra gli apici uno dei nomi elencati come di seguito:
import pretrainedmodels
print(pretrainedmodels.pretrained_settings[’densenet201’])
4.3.4 Caffe2
https://github.com/caffe2
Caffe2 è un framework che discende dal ben più famoso Caffe con la semplice differenza
che questa è una versione leggera, flessibile, modulare e veloce. All’interno del repository,
sopra linkato, si possono trovare molti modelli pre-allenati ma soprattutto degli script
che permettono la conversione di un modello da Caffe a Caffe2. Dispone infatti di una
discreta “ModelZoo” alla pagina [138] mentre nella seguente [139] viene fornita una ampia
quantità di tutorial di utilizzo per gli utenti. In particolare, però al momento quello che
risulta essere di rilevante interesse è che sono utilizzabili le librerie di Caffe2 mediante
PyTorch e quindi mediante l’installazione del solo Pytorch.
75
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
4.3.5 Keras
https://keras.io/
Keras è’ una libreria di Reti Neurali molto minimalista, supportata da una interfaccia
Python mentre il framework è sfruttabile sia per le RRN e le CNN.
La libreria come già visto è usata anche su TensorFlow, di cui è anche una Api di alto
livello mirata alla costruzione di reti neurali.
Non verrà approfondita direttamente nessuna applicazione del framework ma solo un esem-
pio di script di testing di rete neurale già allenata, disponibile nel seguente repository:
[140].
https://github.com/Microsoft/CNTK
Anche questo framework è open source e risulta essere molto simile a Caffe in quanto
opera in modo efficiente su reti convolutive per il processamento di immagini, linguaggi
parlati e testi ed è supportato anche da interfacce in C++, Python oltre che essere uti-
lizzabile da linea di comando. Fornisce prestazioni di gran lunga migliori rispetto ad altri
framework, se utilizzato su macchine multiple.
Gli user non devono programmare a basso livello per implementare nuovi layer complicati,
cosa che era necessaria in Caffe. Supporta anche le RNN, ma soprattutto le reti di nostro
interesse cioè le CNN, ed è utilizzabile anche su ARM. Per questo framework non verranno
fatti ulteriori approfondimenti sull’uso pratico.
Lasagne: https://lasagne.readthedocs.io/en/latest/
DL4J(DeepLearning4J): https://deeplearning4j.org/
Chainer: http://chainer.org/
DIGITS: https://developer.nvidia.com/digits
OpenDeep: http://www.opendeep.org
PuRine: https://github.com/purine/purine2
MINERVA: https://github.com/dmlc/minerva
MXNET: https://github.com/dmlc/mxnet
76
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
https://github.com/facebookresearch/detectron
Detectron è un software che implementa lo stato dell’arte degli algoritmi per riconoscere
e localizzare gli oggetti e per fare segmentazione degli oggetti. È stato sviluppato in Python
dal Facebook Al Research Team per lavorare su Caffe2. Questo team ha portato avanti
svariati progetti in ambito ML come le Feature Pyramid Networks for Object Detection,
le Mask R-CNN presenti anche in Detectron, e diversi altri progetti di Object Detection
con svariate tecniche con l’obiettivo principale e dichiarato di fornire alta qualità e grandi
performance. Detectron fornisce supporto per Mask R-CNN, RetinaNet, Faster R-CNN,
RPN, R-FCN, e Fast R-CNN e permette l’utilizzo di altre architetture quali ResNext,
ResNet, Feature Pyramid Networks, Vgg16 e diverse altre reti di recente progettazione.
Per fare il testing sulle reti richiesta molta capacità computazionele quindi l’uso della
GPU è obbligatorio e in particolare, è necessario avere delle GPU molto performanti per
non incorrere in errori, anche durante il testing su reti magari anche un po’ più datate.
Nel model zoo relativa [141] sono proposti diversi modelli pre-allenati e in particolare
all’interno della cartella Configs [142] sono proposte diverse possibili configurazioni utili
per fare partire l’inference, che come già detto è la pratica di testing delle reti, in modo
diretto, fornendo delle immagini a nostra scelta in input, e settando dei parametri più o
meno facoltativi e comunque di alto livello relativi all’allenamento.
77
4 – Lo Stato Dell’Arte degli applicativi: Framework, Dataset, API,
GPU E TPU
Docker
Docker in questo contesto è un altro strumento che è risultato utile per lo sfruttamento
dell’esecuzione con supporto GPU: attraverso l’uso di “contenitori”, si possono creare am-
bienti isolati per separare l’esecuzione di una operazione di Machine Learning dal resto
delle operazioni in esecuzione sul sistema.
Quindi di conseguenza è chiaro che il nostro framework, qualunque esso sia, può essere
lanciato dentro questo ambiente che permette di condividere le risorse principali del si-
stema. Docker è già configurato ad esempio per TensorFlow, framework sul quale è stato
testato, ma va comunque scaricato e installato sul proprio sistema per poterlo utilizzare.
Jupyter
Jupyter è una applicazione di utilizzo comune per chi lavora nell’ambito della nostra ricerca
o comunque sviluppa del codice in python: molti tutorial infatti sono fruibili in questo
formato.
Questo permette di editare, lanciare e quindi eseguire degli script o dei pezzi di codice solo
attraverso l’uso di un browser. I notebook, cioè i documenti in sé e per sé, sono sezionabili
in parti di codice e in parti esplicative del codice quindi commenti sulle operazioni svolte. È
anche possibile verificare l’esecuzione di un pezzo di codice a runtime o anche visualizzare
i grafici ottenuti mendiante il plotting in python.
78
Capitolo 5
Scenari Applicativi
TensorFlow sarà il primo framework che sarà testato e sarà quello su cui si incentrerà la
fase di testing. Per il task di classificazione, su Tensorflow sono state percorse 3 vie in fase
di sviluppo:
• Una prima modalità in cui viene ricercata la libreria “custom” relativa alla rete
neurale scelta, nella quale vi sia il codice per fare training, tuning o semplicemente
inference, della quale richiamare le funzioni necessarie.
• Una terza modalità che userà la Api TensorFlow Slim e le librerie che offre.
79
5 – Scenari Applicativi
Questa è la prima delle modalità sopra descritte: è stato reperito il codice di un modello
architetturale, prodotto da qualche utente, per poi farne un pruning del superfluo (ad
esempio del codice per allenamento o tuning). Subito dopo individuando le funzioni di
nostro interesse, è stato scritto uno script che richiamasse tali funzioni corredando il tutto
con funzioni di input e stampa.
Tra le opzioni scelte questa è la via meno consigliata da percorrere, perchè comporta o
la scrittura di un codice complesso per il quale spesso è necessario andare a conoscere
dei dettagli della fase di training (è consigliato nel caso sia l’utente stesso ad allenare la
rete) o comunque è necessario reperire del codice di altri utenti e questo spesso comporta
difficoltà in caso di codice poco chiaro o poco commentato.
In primo luogo, sarà fondamentale importare numpy, matplotlib e ovviamente lo stesso
Tensorflow, oltre che il codice della rete reperito cioè modified inception.
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import myutils
import modified_Inception
In questo specifico esempio è stato usato un modello di rete scaricato dalla rete tramite una
URL, che è stato necessario indicare in fase setting insieme ai path di input. Saranno utiliz-
zate delle funzioni “wrapper” di classificazione e predizione tratte da “modified Inception”
mentre in output è stato scelto di fare un pruning sulle prime 10 migliori classi di predizio-
ne: spesso in molte applicazioni sarà necessario ridimensionare l’immagine e questo è uno
di quei casi specifici visto che il modello inception modificato (modified inception) lavora
su input da 299x299 pixel quindi immagini in formato differente per le quali è necessaria
questa operazione di standardizzazione.
Alcune delle operazioni utilizzate per la predizione sono le seguenti:
def classify(image_path):
img = Image.open(image_path)
pred = model.classify(image_path=image_path)
model.print_scores(pred=pred, k=10, only_first_name=True)
def plot_resized_image(image_path):
resized_image = model.get_resized_image(image_path=image_path)
plt.imshow(resized_image,interpolation=’nearest’)
plt.show()
80
5 – Scenari Applicativi
Pur avendo utilizzato una rete Inception molto datata si tratta di una immagine molto
chiara con un solo soggetto per cui le prime predizioni hanno risultati percentuali deci-
samente elevati, mentre le predizioni successive sono molto basse: ciò denota uno di quei
casi in cui la rete performa bene.
81
5 – Scenari Applicativi
Qui sono importanti le due funzioni load graph e read tensor from image, e sess.run() ol-
tre alla funzione load label.
Nel seguente esempio è stata scelta la rete Inception v3 per ottenere le prime 5 predizioni:
e’ una rete molto più moderna rispetto a quella vista nell’esempio precedente e in teoria
dovrebbe essere più performante.
Il risultato di seguito mostrato confermerà ciò, pur trattandosi di una imma-
gine (fig: 5.1) ben definita e allo stesso modo facile da predire
92.81%: lorikeet
0.17%: coucal
0.07%: macaw
0.05%: ping-pong ball
0.04%: sulphur-crested cockatoo
82
5 – Scenari Applicativi
TF Slim, come visto, fornisce molte risorse come reti pre-allenate e librerie grazie ai quali
è stato possibile produrre uno script che elaborasse in maniera ottimale le immagini al
fine di classificarle. I dati, se già convertiti in TFRecord, sono direttamente utilizzabili
altrimenti sarebbe stata necessaria una conversione. Verrà fatto l’import di tutto ciò che
servirà (come fatto nei precedenti esempi) tenendo conto che sarà necessario importare
anche il “nuovo” Slim, i dataset e ciò che concerne il processamento delle reti, operazioni
per le quali viene fornito pieno supporto nel repository.
Di seguito i pezzi di codice di maggiore interesse:
from datasets import dataset_utils
from tensorflow.contrib import slim
from datasets import imagenet
from nets import inception
from preprocessing import inception_preprocessing
La vera funzione di grosso interesse è quella esposta di seguito: viene preprocessata l’imma-
gine e poi inizializzata la rete con degli appositi parametri, prima di lanciare la predizione
a partire da un checkpoint di allenamento, attraverso cui viene fatto partire il processo di
inference.
image = tf.image.decode_jpeg(image_string, channels=3)
processed_image = inception_preprocessing.preprocess_image(image,
image_size, image_size, is_training=False) processed_images =
tf.expand_dims(processed_image, 0)
Infine, viene fatta l’inizializzazione della sessione prima di lanciare la funzione che darà in
output il vettore delle predizioni:
with tf.Session() as sess:
init_fn(sess)
np_image, probabilities = sess.run([image, probabilities])
83
5 – Scenari Applicativi
È quindi chiaro che conoscendo come utilizzare i vari modelli di rete pre-allenati, con
delle semplici modifiche, si possono generalizzare gli script.
Al link [144] sono fornite diverse nozioni da cui potere attingere per compiere le modifiche
necessarie per l’uso di vari modelli pre-allenati mentre al link [145] è possibile trovare la
lista dei modelli disponibili.
Figura 5.2
Inception V1
Testando questa applicazione su una rete Inception V1 sull’immagine (fig.5.2) si otterranno
le seguenti predizioni:
45.14%: Cocker spaniel, English cocker spaniel, cocker
21.55%: Sussex spaniel
10.37%: Irish setter, red setter
5.06%: Welsh springer spaniel
2.99%: Clumber, clumber spaniel
VGG16
Testandoil tutto su una VGG16 si otterranno i seguenti risultati:
86.47%: Cocker spaniel, English cocker spaniel, cocker
5.42%: Sussex spaniel
5.38%: Clumber, clumber spaniel
1.14%: Golden retriever
0.53%: English setter
È chiara la differenza di prestazione tra le due reti proposte: una offre predizioni più
accurate, una più grossolane.
84
5 – Scenari Applicativi
In questa sezione si lavorerà sul secondo task di nostro interesse cioè quello di localizzazione
unito alla classificazione quindi Object Detection; lo script, prodotto in Python, è editabile
come sempre al variare del dataset, del tipo di rete scelta e dei parametri delle immagini
di test: tralasciando queste parti di codice sarà importante andare ad analizzare le parti
in cui si svolgono le vere e proprie operazioni salienti, come il caricamento del grafo.
def load_graphandmodel():
detection_graph = tf.Graph()
with detection_graph.as_default():
od_graph_def = tf.GraphDef()
with tf.gfile.GFile(PATH_TO_FROZEN_GRAPH, ’rb’) as fid:
serialized_graph = fid.read()
od_graph_def.ParseFromString(serialized_graph)
tf.import_graph_def(od_graph_def, name=’’)
return detection_graph
Il cuore dello script sta in questa funzione da richiamare per eseguire la valutazione di una
singola immagine:
def run_inference_for_single_image(image, graph):
with graph.as_default():
with tf.Session() as sess:
ops = tf.get_default_graph().get_operations()
all_tensor_names = {output.name for op in ops for output in
op.outputs}
tensor_dict = {}
for key in [’num_detections’, ’detection_boxes’,
’detection_scores’,’detection_classes’,
’detection_masks’]:
tensor_name = key + ’:0’
if tensor_name in all_tensor_names:
tensor_dict[key] =
tf.get_default_graph().get_tensor_by_name(tensor_name)
if ’detection_masks’ in tensor_dict:
detection_boxes =
tf.squeeze(tensor_dict[’detection_boxes’], [0])
detection_masks =
tf.squeeze(tensor_dict[’detection_masks’], [0])
real_num_detection =
tf.cast(tensor_dict[’num_detections’][0], tf.int32)
detection_boxes = tf.slice(detection_boxes, [0, 0],
[real_num_detection, -1])
detection_masks = tf.slice(detection_masks, [0, 0, 0],
[real_num_detection, -1, -1])
detection_masks_reframed =
utils_ops.reframe_box_masks_to_image_masks(
detection_masks, detection_boxes, image.shape[1],
image.shape[2])
85
5 – Scenari Applicativi
detection_masks_reframed =
tf.cast(tf.greater(detection_masks_reframed, 0.5),
tf.uint8)
tensor_dict[’detection_masks’] =
tf.expand_dims(detection_masks_reframed, 0)
image_tensor =
tf.get_default_graph().get_tensor_by_name(’image_tensor:0’)
output_dict = sess.run(tensor_dict,feed_dict={image_tensor:
image})
output_dict[’num_detections’] =
int(output_dict[’num_detections’][0])
output_dict[’detection_classes’] = output_dict[
’detection_classes’][0].astype(np.uint8)
output_dict[’detection_boxes’] =
output_dict[’detection_boxes’][0]
output_dict[’detection_scores’] =
output_dict[’detection_scores’][0]
if ’detection_masks’ in output_dict:
output_dict[’detection_masks’] =
output_dict[’detection_masks’][0]
return output_dict
Ottenuto il vettore “output dict” si potranno estrarre i valori relativi a classificazione, box
e localizzazione del box. La predizione ottenuta e la conseguente localizzazione
avranno percentuali elevatissime.
Figura 5.4: Immagine annotata: la predizione è 94%: Dog per il cane a sinistra, 93%: Dog
per il cane a destra.
86
5 – Scenari Applicativi
Come fatto con Tensorflow, si è provato a produrre uno script che permettesse di testare
la classificazione usando il numero maggiore possibile di reti neurali.
La parte iniziale prevede l’import delle solite librerie utili ed indispensabili e del codice
per la selezione dei path e la modalità di uso di caffe quindi CPU o GPU; per questo
esempio verrà sfruttata una delle reti di riferimento di Caffe, la AlexNet nella versione
allenata in maniera differente rispetto alla tradizionale, cioè senza data-augmentation e
con la normalizzazione e il pooling invertito.
import caffe
net = caffe.Net(model_def,model_weights,caffe.TEST)
Una doverosa premessa riguarda gli input: Caffe di default riceve immagini in BGR, quindi
verrà utilizzato un transformer nativo cioè “caffe.io.Transformer” per convertirle nel giusto
formato oppure un codice autonomo che prenda in considerazione il fatto che Caffe accetta
di prendere immagini in formato BGR con valori compresi tra 0 e 255 a cui dovrà essere
sottratto un valore del pixel fornito da Imagenet.
mu = np.load(caffe_root + ’python/caffe/imagenet/ilsvrc_2012_mean.npy’)
mu = mu.mean(1).mean(1)
transformer = caffe.io.Transformer({’data’:
net.blobs[’data’].data.shape})
transformer.set_transpose(’data’, (2,0,1))
transformer.set_mean(’data’, mu)
transformer.set_raw_scale(’data’, 255)
transformer.set_channel_swap(’data’, (2,1,0))
87
5 – Scenari Applicativi
Figura 5.5: Trattandosi di una immagine poco chiara a livello di contenuto, la predizione
non risulta molto accurata o veritiera.
Le R-CNN (Region Based CNN) sono fondamentali per riconoscere più oggetti nella stessa
immagine e nel contempo localizzarli: nella cartella models del repository di Caffe, infatti
è fornito un modello di R-CNN allenato su ILSVRC13 che è possibile sfruttare per fare
un esempio di utilizzo del framework.
Per il nostro scopo servirà anche la ricerca Selettiva, il cui codice è reperibile nel seguente
repository:
https://github.com/sergeyk/selective_search_ijcv_with_python
Può essere comodo scaricare il repository e importare il pacchetto e quindi chiamare le
funzioni interne per poterla utilizzare direttamente oppure semplicemente si può lanciare
l’installazione dei pacchetti come spiegato nella guida fornita.
La ricerca selettiva verrà utilizzata per individuare quali sono i box di interesse all’interno
di un’immagine da valutare. Di seguito un esempio di immagine (fig.5.6) su cui è applicato
l’algoritmo di Ricerca Selettiva, il cui codice è totalmente ripreso dal seguente repository
[146], utile a verificare visivamente analizzare come agisce l’algoritmo e capire come si può
sfruttare per il nostro task di Object Detection.
La chiave di questo script sarà la “selectivesearch” e tutto ciò che si collega ad essa,
quindi sarà necessario farne un import. Oltre questa saranno necessari altri strumenti di
elaborazione grafica uniti agli strumenti che solitamente sono necessari.
from skimage import io
import skimage.data
from skimage import img_as_float
import selectivesearch
import dlib
import cv2
import caffe
88
5 – Scenari Applicativi
In questo caso il modello è allenato su Imagenet per il dataset del contest di classifica-
zione del 2012. Essendo richiesta molta capacità computazionale per la ricerca selettiva è
preferibile eseguire lo script in modalità GPU.
Di seguito la parte di codice inerente alla creazione della rete.
net = caffe.Net(model_def,model_weights,caffe.TEST)
Bisognerà adesso definire le regioni da classificare per poi classificarle ad una per una:
è una operazione lunga e complessa che richiede tante linee di codice che non saranno
dettagliate, ma che saranno presenti nello script. In particolare, verrà definita una ricerca
selettiva ridotta, in cui non verranno prese in considerazioni tutte le box trovate, ma solo
quelle più salienti la cui classificazione e dimensione sarà considerabile: la scelta sarà quella
di eliminare le regioni di dimensioni inferiori ai 15 pixel.
89
5 – Scenari Applicativi
Saranno usate quindi due funzioni: selective search() e classify each region() che prende
l’immagine e le regioni candidate.
Rilevante è anche la funzione boundingbox analysis(), che analizza i risultati delle due
precedenti operazioni cioè le regioni trovate e le loro probabilità di classificazione: verrà
ciclato l’output di tutte le regioni e per ciascuna verrà presa la probabilità più alta; se la
probabilità è maggiore di un certo valore, designato come 0.4 ad esempio, questo sarà un
valore che sarà considerato, altrimenti verrà scartata il box relativo.
Sostanzialmente le chiamate del nostro main saranno le seguenti dove cat inds è il file che
contiene gli indici delle classi:
net_output = classify_each_region(img, candidates)
bounding_box = bounding_box_analysis(img, candidates, net_output,
cat_inds, filename, 1, True)
90
5 – Scenari Applicativi
5.6 PyTorch
Come prima parte di codice vi è il solito passaggio di inclusione delle librerie necessarie:
da notare qui l’import di torch e torchvision.
from torch import nn
from torch import optim
import torch.nn.functional as F
from torchvision import datasets, transforms, models
Se non si volesse usare il modello, nella versione proposta dalla comunità di PyTorch, ma
si volesse utilizzare un altro modello da noi allenato servirà il modello pretrained bloccato
ad un determinato checkpoint e il codice della classe “TheModelClass(nn.Module)” che va
generato in fase di train.
pathmodel= /model/*%*.pth
checkpoint = torch.load(pathmodel’’)
model = ThemodelClass(num_classes=1000)
model.load_state_dict(checkpoint)
91
5 – Scenari Applicativi
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224,
0.225]) ])
img = image_transformation(image_original)
L’altra funzione fondamentale è quella di predizione dove avviene la scelta dell’uso della
CPU piuttosto che della gpu e il calcolo della predizione dell’immagine.
def predict(image_path, model):
model.eval()
model.cpu()
img_final = processing_image(image_path)
img_final = img_final.unsqueeze_(0)
img_final = img_final.float()
output=model.forward(img_final)
L’output ottenuto sarà ritornato e sfruttato per creare la conversione da array di tensori
ad array numpy e poi per la conversione in label vere e proprie.
Sull’ immagine in fig.5.8 si avrà il seguente risultato per le prime 5 predizioni, con l’uso di
un modello di rete Densenet.
79.63% cardoon
17.84% artichoke, globe artichoke
0.0030% half track
0.0027% coral fungus
0.0023% earthstar
Figura 5.8: Immagine classificata con script Python con rete DenseNet: il risulto ottenuto
è molto performante per via dell’immagine ben definita come contenuto e per l’uso di una
rete molto accurata.
92
5 – Scenari Applicativi
SSD è uno degli algoritmi più popolari per Object Detection e risulta essere veloce come
il Faster R-CNN. I modelli più vecchi si sviluppavano in due parti implementative: una
prima parte in cui viene proposta una regione da classificare e un seguente classificatore
per la zona proposta. Questo era computazionalmente costoso e complicato per le appli-
cazioni real-time.
Il multibox invece è una tecnica che predice un bounding box come un problema di regres-
sione e per ogni box vengono generati punteggi per vari oggetti localizzati. Il bounding-box
a livello implementativo è un semplice box, che può contenere diversi oggetti, e che è iden-
tificato da delle coordinate.
SSD invece è una pura architettura convolutiva organizzata in 3 parti: Convoluzione Base,
Convoluzione Ausiliaria e Convoluzione di Predizione.
La convoluzione base è derivata da una esistente architettura di classificazione che propone
una feature map di convoluzione di basso livello; la convoluzione ausiliare invece aggiunge
una convoluzione di livello superiore e infine la convoluzione di predizione va identificare
e localizzare gli oggetti in queste mappe.
È stato necessario reperire online i modelli che solitamente vengono usati, chiamati SSD300
e SSD 512, sui quali rispettivamente si possono usare immagini con dimensione 300x300
in formato RGB e immagini più grandi sulla seconda. È venuta fuori una rete più grande
che a livello teorico dovrebbe fornire prestazioni migliori.
Verrà presentato un esempio di classificazione e localizzazione, partendo da un checkpoint
di rete pre-allenata e verranno riassunti i risultati ottenuti. Ovviamente anche in questo
esempio è necessario un file di label per categorizzare gli elementi e anche la stessa im-
magine di input necessita di essere preprocessata per essere fruibile automaticamente dal
modello di architettura utilizzato.
Documentazione aggiuntiva, dettagli implementativi e informazioni sui modelli e sulle fun-
zioni di utilizzo sfruttate nel nostro script sono ritrovabili nel seguente repository:
https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Object-Detection
Il nostro esempio sfrutterà un SSD300, per il quale miglior checkpoint dello sviluppa-
tore che ha allenato il modello su TitanX Pascal, è alla “epoch” 186 con una validation
loss di 2.515.
if torch.cuda.is_available():
checkpoint = torch.load(checkpoint)
else:
checkpoint=torch.load(checkpoint,device)
start_epoch = checkpoint[’epoch’] + 1
best_loss = checkpoint[’best_loss’]
model = checkpoint[’model’]
model = model.to(device)
model.eval()
Sarà convertita l’immagine in modo da renderla consona all’input, settando 300x300 come
risoluzione.
resize = transforms.Resize((300, 300))
to_tensor = transforms.ToTensor()
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
93
5 – Scenari Applicativi
Ritornata l’immagine sarà compito dello script la gestione del box, a livello estetico e
il font della classificazione. Dal main verrà lanciata la funzione appena definita con dei
parametri a piacimento.
detect(original_image, min_score=0.2, max_overlap=0.5,
top_k=200).show()
I risultati ottenuti testando questo script sulla seguente immagine 5.9 sono i seguenti:
94
5 – Scenari Applicativi
Yolo è uno degli strumenti più performanti in termini di Object Detection ma è anche un
ottimo modello architetturale ibrido misto tra una rete e una Api usato anche per tracciare
degli oggetti in un video, implementazione che sarà dettagliata in questo capitolo. In
questo esempio invece sarà utilizzato Yolo attraverso PyTorch, sfruttando l’ultima versione
pre-allenata del modello cioè Yolo v3 reperibile sul sito ufficiale:
https://pjreddie.com/media/files/yolov3.weights
allenato sul dataset Coco e sfrutta la DarkNet.
Molte delle funzioni utilizzate sono state sviluppate in questo repository:
https://github.com/cfotache/pytorch_objectdetecttrack
nella quale sono proposte tutte le librerie necessarie.
Le parti di codici più salienti sono le seguenti:
config_path=’model/yolov3.cfg’
weights_path=’model/yolov3.weights’
class_path=’model/coco.names’
img_size=416
conf_thres=0.8
nms_thres=0.4
model = Darknet(config_path, img_size=img_size)
model.load_weights(weights_path)
model = model.to(device)
model.eval()
classes = load_classes(class_path)
if torch.cuda.is_available():
Tensor = torch.cuda.FloatTensor
else:
Tensor=torch.FloatTensor
La funzione di predizione che sarà chiamata dal main si occuperà anche della trasforma-
zione:
def detect_image(img):
ratio = min(img_size/img.size[0], img_size/img.size[1])
imw = round(img.size[0] * ratio)
imh = round(img.size[1] * ratio)
img_transforms = transforms.Compose([ transforms.Resize((imh, imw)),
transforms.Pad((max(int((imh-imw)/2),0),
max(int((imw-imh)/2),0), max(int((imh-imw)/2),0),
max(int((imw-imh)/2),0)),(128,128,128)),
transforms.ToTensor(),])
image_tensor = img_transforms(img).float()
image_tensor = image_tensor.unsqueeze_(0)
input_img = Variable(image_tensor.type(Tensor))
with torch.no_grad():
detections = model(input_img)
detections = non_max_suppression(detections, 80, conf_thres,
nms_thres)
return detections[0]
95
5 – Scenari Applicativi
Dal main infine sarà chiamata una funzione che si occupa della definizione grafica dei box e
del calcolo delle relative coordinate. I risultati ottenuti sull’immagine 5.10 sono i seguenti:
Figura 5.10
96
5 – Scenari Applicativi
97
5 – Scenari Applicativi
Partendo dall’ampia descrizione fatta in merito a questo task, dall’ampia descrizione fatta
per questa API nel capitolo precedente e sapendo che permette di testare alcuni tra gli
ultimi modelli più performanti di reti neurali, si è cercato di reperire degli esempi demo
pronti e testati per toccare con mano le vere potenzialità dell’applicazione in oggetto.
Effettivamente attraverso Detectron si è potuto testare ciascuno dei tre task analizzati
in questa tesi. All’interno di https://github.com/facebookresearch/Detectron viene
proposto un esempio già predisposto per valutare una immagine con una MASK R-CNN
ed una rete FPN allenata su dataset Coco 2014, anche se in realtà per effettuare altri
esempi basterà variare i parametri in base alla disponibilità dei modelli di rete forniti
nel repository indicato che consta di svariati documenti ed informazioni dettagliate per il
lancio dello script in maniera opportuna e a nostro piacimento.
È stato testato questo software proprio perchè ci ha permesso di valutare anche il task della
Segmentazione Semantica degli oggetti quindi la contornazione dei soggetti rappresentati
nelle immagini attraverso le MASK R-CNN.
L’operazione di segmentazione è molto costosa e richiede molte risorse, quindi è preferibile
testarla con l’ausilio di una GPU.
Alcuni esempi di risultati ottenuti per la semantic segmentation sono i seguenti:
98
5 – Scenari Applicativi
99
Capitolo 6
Nei capitoli precedenti è stato esposto dettagliatamente sia il contesto storico che l’am-
bito tecnico-matematico ed applicativo in merito al Image Recogniton. In questa sezione
saranno analizzati i dati ottenuti dal processamento di una serie di immagini con gli ap-
plicativi visti. Sono state apprese diverse informazioni e sfaccettature tecniche, che non
erano totalmente chiare nella letteratura teorica ma soprattutto sono stati individuati sva-
riati comportamenti tenuti in determinate situazioni, evidenziando una serie di “pattern
comportamentali”. Tutto ciò in unione ai dati acquisiti e ai grafici estrapolati per-
metterà di formulare alcune semplici ma importanti considerazioni sulla robustezza delle
reti trattate. Per completezza di esposizione, si noti che il “primo task” si è occupato
di performare una semplice classificazione dell’oggetto principale presente nell’immagine
mentre il “secondo task” ha portato a localizzare e subito dopo classificare uno o più
oggetti individuabili nell’immagine.
La fase di testing, esposta di seguito, presuppone una fase preliminare di scelte tecniche
che andranno poi ad influenzare in maniera impattante la nostra ricerca: la scelta del mo-
dello di rete neurale da utilizzare per ciascuno dei due task, il numero di immagini su cui
lavorare e quindi di conseguenza da che dataset attingere per la selezione delle immagini,
la scelta del “file di label” per la definizione di tutte le possibili classi e non ultima la
scelta di uno o due applicativi tra quelli sviluppati che meglio sposassero i nostri interessi,
saranno degli elementi chiavi per il raggiungimento del nostro scopo finale.
Partendo proprio dalla scelta dell’applicativo, si può dire che non è si è trattato di un
compito semplice disponendo di tre framework (Tensorflow, Pytorch e Caffe), tutti e tre
ampiamente analizzati nel dettaglio nei capitoli precedenti. Si è deciso di convergere su
Tensorflow che ha permesso di portare avanti il testing su entrambi i task: nello specifico
è stato scelto perchè fornisce delle Api con delle librerie già predisposte, quali TF Slim e
TF Object Detection. Queste, come visto, forniscono ampio supporto per l’utilizzo di
una grande varietà di reti dalle più datate alle più moderne attraverso le quali, sfruttando
determinate chiamate a funzioni e variando poche e mirate righe di codice al variare della
rete o del dataset, si può avere uno script applicativo facilmente adattabile a ogni tipo di
testing. Quindi la prima scelta è stata fatta scegliendo un criterio di “flessibilità”.
100
6 – Test Qualitativi e di Robustezza
La seconda scelta è stata quella del dataset: il più utile è apparso il Dataset COCO,
per il quale è stato usato anche il relativo “file di label”, fornito sia nel package stesso ma
anche nel package della rete neurale che chiaramente era allenata su questo. La sezione
del dataset utilizzata è quella di testing che consta di 5000 mila immagini, sulle quali
è stata fatta una selezione accurata e manuale dei contenuti, proprio per indirizzare la
ricerca verso quei pattern comportamentali di cui si è fatto cenno in precedenza. La scelta
oculata delle immagini è stato uno degli elementi intuitivi che ha fornito un rilevante aiuto
nell’elaborazione dei dati.
Un’altra scelta, ultima in ordine di elenco ma prima in ordine di importanza riguarda
l’elemento che riveste il ruolo principale all’interno del nostro contesto cioè la rete neurale.
Avendo analizzato e dettagliato diverse famiglie di reti e per ciascuna catalogato i nume-
rosi modelli, vi erano svariate possibilità ma si è deciso di convergere verso una rete che
fosse stata sviluppata ed allenata per essere applicata ad entrambi i task ma soprattutto
una rete che desse anche un buon compromesso in termini di computazione e performance
di predizione: la Inception ResNet v2.
Questa godeva già di una buona fama letteraria riguardo alla propria “capacità” e “pre-
cisione predittiva”, elemento che sarà confermato numericamente dai valori predittivi ot-
tenuti. In particolare, però per il secondo task è stata impiegata sfruttando la tecnica
denominata Faster CNN.
È stato necessario optare per ulteriori scelte molto più dettagliate in seno alle operazioni
di predizione: ad esempio il taglio alle prime 5 predizioni per la classificazione, visto e
considerato che con l’uso di reti molto performanti la prima predizione si assesta general-
mente su percentuali molto alte e già a partire dalla terza la percentuale spesso tocca valori
sotto l’1%; altro elemento di pruning è stato il considerare, nel secondo task, un numero
massimo di oggetti localizzati in una immagine facendo un taglio dei box che avessero
percentuale di predizione inferiore ad un determinato valore soglia: il tutto per evitare di
incappare in falsi positivi o in predizioni senza un vero senso realmente valido ai fini della
ricerca (fig. 6.1).
Figura 6.1: Nell’immagine, in figura, che ha subito una distorsione Blur, vi è una bottiglia
ma la localizzazione indica un semaforo con predizione del 60% ad un PSNR=18
101
6 – Test Qualitativi e di Robustezza
Il punto di rottura
Un altro punto saliente della fase di testing è stato il punto di rottura. È un elemento
che è stato individuato durante l’elaborazione dei dati e anche il nome che gli è stato
affibbiato è una scelta puramente arbitraria. Corrisponde esattamente al punto in cui la
rete inizia a fallire nella predizione e non si tratta di un punto scientificamente esatto ma
di una stima del momento in cui la rete inizia a fornire una predizione in output sbagliata
o in fase discendente in termini di precisione percentuale, giungendo ad un valore tale
da essere inferiore alla seconda predizione. È quindi il punto in cui la rete non ha più
predizioni ottimali e “teoricamente” inizia a fornire classificazioni errate.
L’utilizzo di reti molto accurate fornisce un aiuto concreto nell’individuazione di tale pun-
to, poichè queste restano per lunghi tratti sono costanti nelle predizioni ma nel momento
in cui vi è un punto di rottura questo è facilmente individuabile anche dall’osservazione
della relativa curva delle percentuali. Lavorando su batch di immagini numerose si è pre-
ferito sviluppare dei semplici script che individuassero il punto di rottura a partire dagli
output forniti dalle elaborazioni della rete neurale.
Il punto di rottura, cosı̀ analizzato, appare come qualcosa di poco tangibile: per avere
maggiore chiarezza diventa necessario introdurre la modalità in cui è stata portata avanti
la nostra ricerca. Partendo da delle immagini originali, tratte dal dataset, è stata ridotta
la qualità visiva della foto applicando gradualmente delle distorsioni via via crescenti. Ciò
fa sı̀ che la rete inizi a faticare nell’analisi di una immagine, e le percentuali di predizione
inizino a ridursi drasticamente. Ovviamente aumentando la distorsione di una immagine
in maniera sensibile il punto di rottura si presenta in maniera sempre più evidente, poichè
si giunge al punto in cui le immagini diventano irriconoscibili anche all’occhio umano.
Per convenzione, sui grafici, la notazione di confronto tra la qualità delle varie immagini
sarà il PSNR, che sarà analizzato nelle seguenti sezioni, nonostante per ciascuna delle
distorsioni scelte siano stati applicativi diversi livelli crescenti di applicazione della distor-
sione, che per nostra scelta saranno denominati incrementi σ. È stata testata anche la
codifica SSIM, che pur utilizzando una notazione diversa, nell’ambito della nostra riceca
fornisce risultati similari.
Le distorsioni applicate in questa fase saranno il Blur, la variazione di Contrasto, il
Noise e la riduzione della qualità JPEG. Ad onor del vero, si era provato ad utilizzare
anche una variazione sull’immagine basata sull’estrazione dei contorni dei soggetti, chia-
mata Edge, però i grafici ottenuti fornivano dei valori impredicibili e totalmente aleatori.
Tra le 4 citate, la variazione di Contrasto e la riduzione di qualità non sono propriamente
delle distorsioni a tutti gli effetti, quindi è opportuno per chiarezza descrittiva sottolineare
che verranno indicate come “distorsioni” per comodità di esposizione.
Prima di andare a definire nel dettaglio le suddette distorsioni, diventa fondamentale intro-
durre le già citate notazioni che saranno utilizzate quando si parlerà dei grafici ottenuti: il
PSNR, che essendo standardizzato permetterà di avere una stima scientificamente valida
in merito alla qualità delle immagini; in altre circostanze come anticipato si farà anche
riferimento ai livelli di applicazione della distorsione all’immagine: è stato definito un
punto di origine corrispondente alla qualità originale e diversi livelli contraddistinti dal
valore σ di applicazione. Ad esempio, nel Blur la qualità originale sarà la zero, cosı̀ come
nel Contrasto e nel Noise mentre per la riduzione di qualità bisogna fare un discorso a
parte dal momento che il valore di origine pari alla qualità nativa dell’immagine sarà 100.
Gli incrementi σ applicati possono arrivare fino ad un massimo di σ =20 per il Blur e
di σ =100 per Contrasto e Noise, mentre per la riduzione di qualità JPEG nuovamente
il comportamento è un po’ diverso poichè con riduzioni via via progressive si giunge al
valore finale di qualità minima pari a 1.
102
6 – Test Qualitativi e di Robustezza
PSNR
Il PSNR è una misura adottata per valutare la qualità di una immagine compressa rispetto
all’originale ed in quanto tale può essere sfruttato come indice di qualità delle immagini.
Dal punto di vista matematico è definito come il rapporto tra la massima potenza di un
segnale e la potenza di rumore che può rendere non fedele la rappresentazione del segnale
stesso [151]. Viene utilizzato per le immagini che hanno delle compressioni lossy quindi in
cui vi è perdita di qualità. In questa ricerca è stato calcolato a partire dall’immagine ori-
ginale rispetto a quelle distorte. All’aumentare del PSNR si avrà una somiglianza sempre
maggiore dell’immagine distorta rispetto a quella originale, quindi si avranno a PSNR più
alte immagini tendenti all’originale dal punto di vista della percezione ottica.
Le operazioni pratiche per giungere al calcolo finale del PSNR hanno previsto la conver-
sione sia delle immagini originali che quelle modificate in formato YUV. Il termine YUV,
prima battezzato YcrCb, è stato un modello di rappresentazione per la codifica di imma-
gini e video, concepito per rispecchiare il comportamento della visione umana dato che
per l’uomo la componente della luminanza è considerata la più importante [152]. Da non
scambiare, con il termine Y’UV (YpbPr) che si considera come la divisione dello spazio
colore in 3 componenti che veniva usata per trasmissioni video in formato analogico fa-
cendo transitare su cavi diversi le informazioni cioè la luminosità detta luminanza Y, cioè
l’informazione in bianco e nero, e le due componenti di crominanza cioè i colori Pb e Pr.
La codifica qui utilizzata invece è quella del fenomeno del sottocampionamento della cro-
minanza [153], nella quale si dimezza la risoluzione del colore secondo lo schema 4:x:x e
nello specifico 4:2:2. Questo risulta essere lo schema più comune dato che solo i sistemi
ad alta gamma, a tutt’oggi, sono in grado di campionare le informazioni di luminanza e
crominanza con la stessa risoluzione cioè 4:4:4.
Il calcolo del PSNR è stato permesso dal tool VQMT: Video Quality Measurement
Tool [154], che normalmente opera sui video e nello specifico su singoli frame che non
sono altro che singole immagini. Per completezza, di seguito, le righe di codice generiche
utilizzabili per il calcolo del PSNR per una singola immagine attraverso il tool sopra citato.
magick convert test_image_$a/image_OUTPUT$X.jpg
test_finalyuv_$a/image_OUTPUT$X.yuv
vqmt test_original_processed_yuv/image_OUTPUT$X.yuv
test_finalyuv_$a/image_OUTPUT$X.yuv 200 200 1 1
./result$a/result$X PSNR
103
6 – Test Qualitativi e di Robustezza
I due filoni della fase di testing cioè Classificazione e Object Detection saranno divisi
a loro volta in due fasi operative per ciascuno: una prima fase in cui si è lavorato su un
numero ridotto di immagini pari a 10 unità, che ha permesso di focalizzarsi su un’analisi
più accurata e precisa dei risultati ottenuti ed una seconda fase definibile come “massiva”
in cui si è lavorato su una quantità di immagini più ampia che ha permesso di studiare il
comportamento della rete su larga scala. La classificazione essendo meno costosa a livello
computazionale, per quanto riguarda le operazioni di predizione nel caso dei test massivi,
è stata portata avanti su 250 immagini, mentre per la localizzazione il batch (sempre per
la fase massiva) era composto da 50 immagini.
Per la prima fase invece, partendo dal dataset originale, sono state selezionate 10 immagini
con criteri specifici: immagini con un oggetto/soggetto principale in primo piano che
fosse l’unico elemento nella foto, in modo tale da ottenere una predizione sull’immagine
originale definita e precisa. Tutto ciò per avvicinare la fase di testing a comportamenti
tendenzialmente reali e paragonabili all’occhio umano.
Questo passo aggiuntivo di selezione nasce da un’osservazione sulle possibili applicazioni
reali che può avere il nostro studio: navigando sul web infatti in diversi repository online
iniziano ad essere presentate delle applicazioni real-time, machine learning based, che
si occupano di produrre una classificazione/localizzazione ricevendo in input immagini
ottenute sul momento con Webcam o fotocamere ma anche dal fatto che mediante il
riconoscimento immediato di oggetti, molti siti/app di E-commerce permettono di trovare
esattamente l’oggetto ricercato. Tali evidenze hanno spinto a portare avanti dei test che
dessero un minimo di riscontro reale.
Alla luce di ciò, per mostrare anche le debolezze e le difficoltà della nostra rete, nella
selezione sono state aggiunte anche delle immagini incerte, la cui poca chiarezza fosse
data dal fatto che l’oggetto fornisse un labelling multiplo: ad esempio un gatto o un cane
possono essere catalogati con una label generica (quindi “dog”, “cat”) o con una label più
specifica relativa magari alla razza di ciascuno. Questo creerà delle anomalie visibili nelle
rispettive curve di predizione di tali immagini.
Nella seconda fase invece si è lavorato con una quantità di immagini pari a 250, immagini
totalmente casuali quindi senza criterio accurato di selezione: lo studio si è qui spostato
su un discorso per lo più quantitativo che qualitativo.
Per quanto riguarda il task di localizzazione, il passo aggiuntivo di selezione delle immagini,
è stato fatto cercando di individuare invece immagini con più oggetti possibili o immagini
con più soggetti chiaramente riconoscibili.
I dati ottenuti dall’elaborazione di immagini con la nostra rete sono stati rappresentati
attraverso dei grafici in grado di evidenziare comportamenti più o meno classificabili: a
partire dal primo task saranno date delle evidenze prima su delle singole immagini per poi
passare ad evidenziare i comportamenti su più immagini.
Blur
104
6 – Test Qualitativi e di Robustezza
All’interno del tool utilizzato cioè ImageMagick [155] sono disponibili due tipi di ope-
ratori molto simili tra loro: -“blur” e -“gaussian-blur”. Vi è molta confusione su quale sia
migliore in termini applicativi: il blur tradizionale tra i due è più veloce poichè usa una
tecnica che opera in due stage su ciascuno dei due assi mentre il gaussian-blur è matema-
ticamente più preciso dal momento che viene applicato in maniera simultanea su entrambi
gli assi. Il costo di differenza tra i due è molto elevato, motivo per il quale si è lavorato
sul Blur tradizionale (-blur) dovendo performare l’operazione su una quantità ampia di
immagini.
Nel comando appena listato 0x20 corrisponde a radius x sigma, dove sigma è l’argomento
importante ed è la quantità di blurring che verrà applicato e praticamente la nostra σ
mentre il radius è usato per determinare la dimensione dell’array su cui calcolare la di-
stribuzione: questo dovrebbe essere un valore intero ma se viene dichiarato come zero o
non viene dichiarato, si può sfruttare per l’operazione il valore del raggio più largo possi-
bile, in modo da fornire dei risultati più significativi per l’applicazione della distribuzione
Gaussiana.
Nelle immagini della figura 6.2 si evidenziano 4 esempi di applicazione di blurring: la rete
si rompe già nella figura b) dove la predizione diventa Croquet Ball cioè una palla per il
Croquet, uno sport americano, mentre nella d) è visibile una applicazione massimale di
Blur che riduce quasi al minimo le prestazioni di predizione della rete.
105
6 – Test Qualitativi e di Robustezza
(a) Immagine con qualità dimez- (b) Immagine con qualità pa-
zata, non si notano le modifiche ri al 15% rispetto all’originale-
PSNR=28
(c) Immagine con qualità pa- (d) Immagine con qualità pa-
ri al 3% rispetto all’originale- ri al 1% rispetto all’originale-
PSNR=23 PSNR=22
Figura 6.3: Immagine con applicazione della riduzione della qualità JPEG
Nella serie di 4 immagini in figura 6.3 si nota come la riduzione della qualità JPEG delle
immagini, pur peggiorandole sensibilmente a vista d’occhio, le renda ancora decifrabili.
106
6 – Test Qualitativi e di Robustezza
Noise
(c) Immagine con Noise σ=40- PSNR=16 (d) Immagine con Noise σ=100- PSNR=14
Nella figura 6.4 è chiara l’evoluzione di una immagine che subisce l’applicazione di un
Noise crescente. Qui il peggioramento sarà molto più visibile all’occhio umano. La terza
immagine c) corrisponde al punto di rottura: da qui la rete predirrà con percentuali via
via scarsissime fornendo dapprima “cuffia da piscina” e poi “peperone rosso”.
107
6 – Test Qualitativi e di Robustezza
Variazione di Contrasto
La variazione di Contrasto non può essere definita come una distorsione vera e propria
ma solo come una modifica/variazione delle condizioni di una immagine; infatti viene
aumentato o ridotto il Contrasto di una immagine lavorando sulla differenza di intensità
tra i soggetti più chiari o più scuri. Il tool ImageMagick va a lavorare simultaneamente
su luminosità e Contrasto, variando con lo stesso comando l’uno e l’altra. Chiaramente,
settando a zero o non settando la luminosità si può fare variare solamente il Contrasto.
Questo è quello che è stato fatto nel nostro caso.
magick test_images/image10.jpg -brightness-contrast -0,20
test_image_20/image10proc.jpg
Le immagini saranno parecchio modificate fin dai primi step di applicazione delle modifi-
che, ma manterranno a lungo la definizione dei soggetti rappresentati. Infatti, ad esempio
nella figura 6.5 il punto di rottura sarà identificabile a σ=90, quindi quasi al massimo della
“distorsione”.
(c) Immagine al punto di rottura conσ=90- (d) Immagine con Contrasto massimo σ=100-
PSNR=11 PSNR=10
Figura 6.5: Immagine a cui è stata applicata una variazione del Contrasto
108
6 – Test Qualitativi e di Robustezza
(a) (b)
(c) (d)
109
6 – Test Qualitativi e di Robustezza
La stessa analisi, per provare a dare una riprova di quanto appena detto, può essere
realizzata su un’immagine di base totalmente diversa e con sfaccettature diverse anche in
termini pratici: ad esempio una immagine che può ammettere label generiche e label più
specifiche.
L’immagine in figura 6.7 produce una predizione primaria (in condizioni originali) del
68% che indica “gatto tigrato” e come seconda predizione indica “gatto soriano” per il
23%. I dati ottenuti nei relativi grafici potrebbero essere fuorvianti ed imprevedibili dal
momento che le due label sono interscambiabili e quasi equivalenti. In questo caso il
comportamento della rete è influenzato dalle definizioni delle classi presente nel file di
label usato. Probabilmente usando un file di label ridotto, con categorie meno specifiche
avremmo una prima predizione parecchio elevata equivalente alla somma delle due sopra
citate, con percentuale totale circa del 91%. Questo ci fa immaginare un andamento della
curva similare all’immagine 6.4.
Analizzando l’andamento delle curve in figura 6.8 si nota come l’oscillazione tenda a
farle apparire come curve errate anche se in realtà, alla luce di quanto detto in merito
alle label, immagini di questo tipo costituiscono un “falso positivo” per la nostra fase di
analisi dei dati. Falso positivo proprio perchè si ha l’impressione che sia stato inviduato
un punto di rottura nonostante non lo sia realmente.
Il punto di rottura con l’applicazione del blurring è fissato al 51%, che come si osserva
dal grafico, è il punto in cui si crea un picco sulla seconda curva: qui le prime due label
si invertiranno, una diventerà la prima predizione e l’altra la seconda. Di base in questo
caso quindi le predizioni saranno mediamente più basse rispetto alla media delle predizioni
ottenute con una rete cosı̀ performante. Il Noise tendenzialmente è meno oscillante rispetto
al Blur, ma il comportamento ottenuto è similare visto che già alla prima applicazione della
distorsione è possibile incontrare il punto di rottura: esso staziona intorno al PSNR=23,
con percentuale di predizione pari al 45%. Contrasto e riduzione della qualità, di contro,
presentano delle curve più morbide ma sempre anomale rispetto agli standard ottenuti
con queste due “distorsioni” su altre immagini: tutto ciò, sottolinea ancora una volta
come entrambe di per sè abbiano meno impatto sul riconoscimento ma conferma anche
che la scelta del file label sia un elemento di grande impatto. Il Contrasto, infine, presenta
un punto di rottura chiaramente identificabile sul grafico nel punto in cui le due curve
si toccano mentre invece per la qualità staziona ad un PSNR=21, punto in cui vi è la
massima applicazione di distorsione. Di seguito in figura 6.7 sono rappresentati i grafici
di cui è stata fatta adesso una breve panoramica, grafici chiaramente poco validi ma utili
al riconoscimento di un nuovo pattern comportamentale.
110
6 – Test Qualitativi e di Robustezza
(a) (b)
(c) (d)
Figura 6.8
Per avvalorare quanto detto finora, è stato necessario lavorare su una quantità più
ampia di immagini in modo da ottenere una stima quantitativa oltre che qualitativa.
Sono stati calcolati i punti di rottura di 250 immagini per ciascuna delle 4 distorsioni,
tracciando dei grafici di dispersione, visibili in figura (6.9).
Su 250 immagini infatti 247 immagini presentano punti di rottura per il Blur, 249 per il
Noise, 195 per la riduzione di qualità e 180 per variazione di Contrasto. Quindi la rete
presenta più punti di rottura come prevedibile per Blur e Noise e meno per qualità e
Contrasto.
Osservando invece i dati numerici mostrati sempre in figura 6.9, per Blur e Noise si nota
una maggiore densità intorno ai valori di PSNR che oscillano tra 22 e 24 e che si trovano
buone densità anche su valori molto alti di PSNR: questo dimostra proprio che vi sono dei
punti di rottura anche già a PSNR alti, quindi su immagini che sono molto somiglianti alle
originali. La riduzione di qualità invece ha dei punti di rottura localizzati su intervalli di
PSNR ristretti, con picchi di densità intorno a PSNR=24 mentre la riduzione del Contrasto
mostra punti di rottura chiaramente localizzati a PSNR decisamente bassi.
111
6 – Test Qualitativi e di Robustezza
(a) (b)
(c) (d)
Figura 6.9
Per rendere ancora più tangibili i dati esposti, sono stati “plottati” dei grafici che
mostrano le frequenze dei punti di rottura per ogni distorsione: questi grafici 6.10 6.11
sono molto simili ai grafici di dispersione 6.9, ma offrono un’idea graficamente più chiara
dei pattern comportamentali della rete.
(a) (b)
Figura 6.10: I grafici di frequenza che sottolineano quanto detto finora per blurring e
Noise.
112
6 – Test Qualitativi e di Robustezza
(a) (b)
Figura 6.11: I grafici di frequenza che sottolineano quanto detto finora per riduzione di
qualità e variazione del Contrasto
(a) (b)
Figura 6.12: Prima parte dei grafici di confronto tra le diverse distorsioni, tarati su 10
immagini.
113
6 – Test Qualitativi e di Robustezza
(a) (b)
(c) (d)
Figura 6.13: Seconda parte dei grafici di confronto tra le diverse distorsioni, tarati su 10
immagini.
È visibile, come vi sia un netto divario tra Blur contro Contrasto, cosı̀ come in Blur
contro Qualità e Noise contro qualità e come vi sia un grosso equilibrio per Blur contro
Noise. In Contrasto contro Noise, nello specifico, si nota un grosso dislivello a favore di
Noise mentre il grafico Qualità contro Contrasto sottolinea ancora una volta che entrambe
sono le distorsioni meno affette.
114
6 – Test Qualitativi e di Robustezza
La fase di testing sul task di Object Detection è stata impostata sulla falsa riga di quanto
fatto nel primo task, ovviamente adattandosi al contesto ben diverso. Per quanto riguarda
i dettagli tecnici sulla rete scelta e sulla tecnica Faster R-CNN utilizzata, la lettura è
rimandata alle pagine in cui vengono esposti i dettagli tecnici, mentre qui ci si focalizzerà
subito su quanto è variato rispetto all’altra fase di testing: ci saranno dei dati aggiuntivi e
dei dati di base diversi dal momento che la rete in output fornisce la migliore predizione per
ogni istanza di oggetto individuata oltre che il numero totale di oggetti localizzati per ogni
immagine ed una immagine annotata con i box relativi agli oggetti/soggetti individuati.
Prima di mostrare un primo esempio di localizzazione, come fatto per il primo task bisogna
fare delle precisazioni per lo più tecniche. Il numero massimo di oggetti riconoscibili
è stato settato a 15, in modo da evitare che venissero identificati tanti oggetti magari
poco interessanti: alla luce di ciò è stato necessario inserire un nuovo tipo di pruning
relativamente alla percentuale di predizione. Per cui è stato deciso di considerare come
validi i box la cui prima predizione avesse una percentuale superiore al 60%. Chiaramente
questi valori non sono stati scelti casualmente ma sono frutto di diversi test, durante i
quali tali valori sono stati variati più volte al fine di trovare un buon compromesso sulla
mole di dati ottenuti e sulla tempistica di elaborazione.
L’analisi dei dati inoltre è partita su un set di 10 immagini accuratamente selezionate
con un criterio fondamentale: i soggetti/oggetti molteplici delle immagini dovevano essere
chiaramente identificabili con dei casi in cui lo stesso oggetto fosse ripetuto e magari
sovrapposto ad altri in modo da evidenziare su piccola scala come si comportasse la rete.
115
6 – Test Qualitativi e di Robustezza
Elenco delle annotazioni che la rete ha fornito come output testuale sull’immagine in
figura 6.14:
99.81% umbrella
99.19% umbrella
99.09% person
98.80% umbrella
98.40% umbrella
97.35% person
94.71% person
93.56% person
91.71% person
91.56% umbrella
Il dato che balza all’occhio è che la rete ha mostrato in output delle percentuali di predi-
zione mediamente elevate, quasi tendenti alla perfezione, avvicinandosi spesso a valori tra
95% e il 99%. Diminuendo invece in maniera sostanziale la qualità visiva dell’immagine,
il numero di oggetti localizzati è sceso fino a toccare lo zero: con predizioni sotto il 65% la
rete ha fornito label poco veritiere, ha perso degli oggetti o ha proposto dei riquadri total-
mente errati. In questa fase si proveranno ad abbozzare delle analisi qualitative tracciando
delle curve che mostrano il numero di oggetti localizzati sulle ordinate e contestualmente il
valore del PSNR sulle ascisse. Le pendenze delle curve hanno proposto dei dati parecchio
interessanti da cui ricavare ancora dei veri e propri pattern comportamentali.
Le “distorsioni” utilizzate sono le medesime rispetto a prima cioè Blur, Noise, variazione
di Contrasto e riduzione della qualità JPEG.
Figura 6.15: Immagine originale, gli oggetti individuati sono 6, 3 bottiglie, 2 banane e un
tavolo da cucina.
116
6 – Test Qualitativi e di Robustezza
Figura 6.16: Immagine con σ=10 e PSNR=19.53: gli elementi localizzati ora sono 3.
Figura 6.17: Immagine con σ=20 e PSNR=17: gli elementi localizzati alla qualità minima
sono zero.
L’analisi visiva delle immagini presentate dalla figura 6.15 alla 6.17 mostra una base
comportamentale del blurring analizzabile subito grazie ai grafici mostrati di seguito in
figura 6.18. Il Blur e il Noise mostrano una curva simile: scende in maniera lenta e
progressiva, quindi c’è un peggioramento dell’operatività della rete. Il tutto chiaramente
va correlato alle percentuali di predizione per ogni singolo box. Infatti, l’operazione in
oggetto non è altro che lo step successivo rispetto alla classificazione e di conseguenza le
due operazioni vanno analizzate in maniera parallela: l’andamento delle percentuali sarà
concorde a quanto detto nella prima fase di analisi dei dati per cui al dato del numero di
elementi evidenziati va correlata anche la precisione con cui quel dato box è classificato.
Questa breve affermazione tornerà molto utile.
La rete per Blur e Noise evidenzierà un numero di oggetti localizzati minimo ad un PSNR
che oscilla intorno ai valori 18 e 19 quindi immagini lontane dalla qualità originale massima
ma non troppo, dal momento che il PSNR in cui si evidenzia il numero massimo di oggetti
oscilla tra 26 e 27 per entrambe le distorsioni.
Per quanto riguarda invece variazione di qualità e Contrasto, è visibile che si tratti di
117
6 – Test Qualitativi e di Robustezza
Figura 6.18: Questi grafici mostrano con delle curve l’andamento delle localizzazioni al
variare del PSNR.
curve che scendono in maniera più morbida. Il Contrasto mantiene un numero costante
ed alto di elementi localizzati anche con PSNR veramente bassissimi; per la variazione di
qualità JPEG il contatore di oggetti localizzati sarà pari a zero ad un valore di PSNR=22
circa.
In una prima analisi parrebbe che i pattern comportamentali rispecchino quelli ottenuti
per la classificazione, con il Contrasto che appare anche qui quello che fa soffrire meno in
termini di operatività la rete ma con il solo cambiamento della variazione di qualità che
sembra avvicinarsi al comportamento di Blur e Noise. Servirà evidenziare altri casi per
avere la conferma di tutto ciò.
Prima di analizzare un’altra immagine, totalmente differente, bisogna sottolineare come
nel grafico del Noise, sia apparso un falso positivo: questo va a confermare positivamente
la scelta descritta in merito al taglio delle localizzazioni, che mostrassero predizioni basse
al diminuire della qualità visiva delle immagini. Dopo aver raggiunto zero localizzazioni
ad un PSNR pari a 18 sul grafico si nota un picco di salita ad un PSNR inferiore: è chiaro
che è stato localizzato erroneamente un oggetto, come nell’esempio in figura 6.19.
118
6 – Test Qualitativi e di Robustezza
Figura 6.19: Immagine di un falso positivo, con un oggetto erroneamente localizzato come
umbrella. Il PSNR è pari a 18.
Un altro esempio di immagine è visibile in figura 6.20, utile ad avere conferma dell’a-
nalisi precedentemente ottenuta.
Figura 6.20: Secondo esempio di immagine: qui con l’applicazione del Noise le prestazioni
peggiorano sensibilmente. Nella prima in alto a sinistra ho l’immagine originale, poi a
destra ho PSNR=17, in basso a sinistra PSNR=16 e destra PSNR=15.
119
6 – Test Qualitativi e di Robustezza
I grafici in figura 6.21 per l’immagine in figura 6.20, pur mostrando un andamento
altalenante, che possibilmente nasce dalla natura dell’immagine, evidenziano quanto visto
anche con l’altra immagine: Blur e Noise vanno ancora di pari passo, dando sempre
un disturbo quasi sempre similare alla rete mentre il Contrasto appare distaccarsi anche
qui nettamente rispetto ai due precedenti citati, permettendo alla rete, anche con ampie
applicazioni di distorsione una discreta localizzazione. Viene confermato che la riduzione di
qualità JPEG, che nella classificazione, andava a braccetto con il Contrasto qui si discosta
da quest’ultima, avvicinandosi invece al comportamento di Blur e Noise. Tale pattern
comportamentale sarà visibile in tutti i test fatti su svariate immagini.
Figura 6.21: Questi grafici mostrano con delle curve l’andamento delle localizzazioni al
variare del PSNR per l’immagine in figura 6.20.
Finora è stata fatta una analisi, analizzando il campione di una singola immagine per
volta e nonostante ciò è stato evidenziato un pattern comportamentale ben delineato. Per
dare però una riprova si è cercato di utilizzare un grafico che mostrasse la dispersione dei
valori di localizzazione per un determinato set di immagini lavorando su set di 5, 10, 50
immagini. Saranno mostrati per semplicità di seguito solo i grafici inerenti ad un batch di
5 immagini.
120
6 – Test Qualitativi e di Robustezza
I suddetti grafici mostrati nelle figure 6.22, 6.23, 6.24, 6.25 confermano quanto affer-
mato in precedenza. Di seguito i grafici per Blur e Noise.
121
6 – Test Qualitativi e di Robustezza
In questa pagina invece sono evidenziati i grafici per riduzione di qualità e variazione
di Contrasto.
122
Capitolo 7
Conclusioni
123
7 – Conclusioni
124
Bibliografia
125
Bibliografia
126
Bibliografia
[44] Zeiler, M. D., Taylor, G. W., and Fergus, R. (2011). “Adaptive deconvolutional
networks for mid and high level feature learning”. In ICCV.
[45] Sermanet, P., Eigen, D., Zhang, X., Mathieu, M., Fergus, R., and LeCun, Y. (2013).
“Overfeat: Integrated recognition, localization and detection using convolutional
networks”. In CoRR, abs/1312.6229.
[46] van de Sande, K. E. A., Snoek, C. G. M., and Smeulders, A. W. M. (2014). “Fisher
and vlad with flair”. In Proceedings of the IEEE Conference on Computer Vision
and Pattern Recognition.
[47] Jasper R. R. Uijlings, Koen E. A. van de Sande, Theo Gevers e Arnold W. M.
Smeulders (2013). “Selective Search for Object Recognition”. In International Journal
of Computer Vision (IJCV).
[48] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V.
Vanhoucke, and A. Rabinovich. (2015). “Going deeper with convolutions”. In CVPR.
[49] Karen Simonyan e Andrew Zisserman (2014). “Very Deep Convolutional Networks
for Large-Scale Image Recognition”. In CoRR
[50] He, Kaiming, et al. (2016). “Deep residual learning for image recognition”. Pro-
ceedings of the IEEE conference on computer vision and pattern recognition. Kai-
ming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. (2016). “Deep residual lear-
ning for image recognition”. The IEEE Conference on Computer Vision and Pattern
Recognition (CVPR), pp. 770-778
[51] C. Szegedy, V. Vanhoucke, S. Ioffe, J. Shlens, and Z. Wojna. (2015). “Rethinking
the Inception architecture for computer vision”. arXiv preprint, 1512.00567, 2015.
arxiv.org/abs/1512.00567.
[52] C. Szegedy, S. Ioffe, and V. Vanhoucke. “Inception-v4, inception-resnet and the
impact of residual connections on learning”. In ICLR Workshop, 2016.
[53] R. Girshick. (2015). “Fast R-CNN”. In ICCV.
[54] S. Ren, K. He, R. Girshick, and J. Sun. (2015). “Faster R-CNN: Towards real-time
object detection with region proposal networks”. In Neural Information Processing
Systems (NIPS).
[55] “https://medium.com/@umerfarooq 26378/from-r-cnn-to-mask-r-cnn-
d6367b196cfd”
[56] Hu, J., Shen, L. and Sun, G. (2018). “Squeeze-and-excitation network”. In CVPR
[57] “https://towardsdatascience.com/squeeze-and-excitation-networks-9ef5e71eacd7”
[58] Fukushima, Kunihiko. (1988). “Neocognitron: A hierarchical neural network capable
of visual pattern recognition”. Neural networks 1.2, pp.119- 130
[59] LeCun, Yann, et al. (1998). “Gradient-based learning applied to document
recognition”. Proceedings of the IEEE, 86.11, 2278-2324.
[60] “https://medium.com/@sh.tsang/paper-brief-review-of-lenet-1-lenet-4-lenet-5-
boosted-lenet-4-image-classification-1f5f809dbf17”
[61] Alom, Md Zahangir, et al. (2018). “The History Began from AlexNet: A vCompre-
hensive Survey on Deep Learning Approaches”. arXiv preprintarXiv:1803.01164.
[62] Krizhevsky, A., Sutskever, I., and Hinton, G. (2012). “ImageNet classification with
deep convolutional neural networks”. In NIPS.
[63] Lin, Min, Qiang Chen, and Shuicheng Yan. (2013). “Network in network”.
arXiv:1312.4400.
[64] Kataoka H, Iwata K and Satoh Y. (2015). “Feature evaluation of deep con-
volutional neural networks for object recognition and detection”. arXiv preprint
arXiv:1509.07627.
[65] “https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-
network-7fc52b863202”
127
Bibliografia
[66] “https://towardsdatascience.com/review-inception-v4-evolved-from-googlenet-
merged-with-resnet-idea-image-classification-5e8c339d18bc”
[67] Zagoruyko, Sergey, and Nikos Komodakis. (2016). “Wide Residual Networks”. arXiv
preprint arXiv:1605.07146
[68] “https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-
network-7fc52b863202”
[69] Xie, S., Girshick, R., Dollár, P., Tu, Z., He, K. (2016). “Aggregated residual
transformations for deep neural networks”. arXiv preprint arXiv:1611.05431.
[70] Veit, Andreas, Michael J. Wilber, and Serge Belongie. (2016). “Residual networks be-
have like ensembles of relatively shallow networks”. In Neural Information Processing
Systems (NIPS).
[71] Abdi, Masoud, and Saeid Nahavandi. (2016). “Multi-Residual Networks: Improving
the Speed and Accuracy of Residual Networks”. arXiv preprint arXiv:1609.05672.
[72] “https://towardsdatascience.com/introduction-to-resnets-c0a830a288a4”
[73] X. Zhang, Z. Li, C. C. Loy, and D. Lin. (2017). “Polynet: A pursuit of structural
diversity in deep networks”. In CVPR.
[74] Chollet F. (2016). “Xception: Deep Learning with Depthwise Separable
Convolutions”. arXiv preprint arXiv:1610.02357v2.
[75] K.-H. Kim, S. Hong, B. Roh, Y. Cheon, and M. Park. (2016). “PVANET:
Deep but lightweight neural networks for real-time object detection”. arXiv preprint
arXiv:1608.08021
[76] G. Huang, Z. Liu, K. Q. Weinberger, and L. Maaten. (2017). “Densely connected
convolutional networks”. In CVPR.
[77] “https://medium.com/@smallfishbigsea/notes-of-squeezenet-4137d51feef4”
[78] Wenling Shang, Kihyuk Sohn, Diogo Almeida, and Honglak Lee. (2016). “Understan-
ding and improving convolutional neural networks via concatenated rectified linear
units”. In Proceedings of the International Conference on Machine Learning (ICML).
[79] A. G. Howard, M. Zhu, B. Chen, D. Kalenichenko, W. Wang, T. Weyand, M. An-
dreetto, and H. Adam. (2017). “Mobilenets: Efficient convolutional neural networks
for mobile vision applications”. arXiv preprint arXiv:1704.04861.
[80] https://www.slideshare.net/JinwonLee9/mobilenet-pr044
[81] M. Sandler, A. Howard, M. Zhu, A. Zhmoginov, and L.-C. Chen. (2018).
“Mobilenetv2: Inverted residuals and linear bottlenecks”. In CVPR.
[82] “https://ai.googleblog.com/2018/04/mobilenetv2-next-generation-of-on.html”
[83] Z. Qin, Z. Zhang, X. Chen, C. Wang, and Y. Peng. (2018). “Fd-mobilenet: Impro-
ved mobilenet with a fast downsampling strategy”. In 2018 25th IEEE International
Conference on Image Processing (ICIP), pages 1363–1367, IEEE.
[84] X. Zhang, X. Zhou, M. Lin, and J. Sun. (2017). “Shufflenet: An extremely efficient
convolutional neural network for mobile devices”. arXiv:1707.01083.
[85] N. Ma, X. Zhang, H.-T. Zheng, and J. Sun. (2018). “Shufflenetv2: Practical
guidelines for efficient cnn architecture design”. In ECCV.
[86] Seyyed Hossein HasanPour, Mohammad Rouhani, Mohsen Fayyaz, and Mohammad
Sabokrou. (2016). “Lets keep it simple, using simple architectures to outperform
deeper and more complex architectures”. In CoRR, abs/1608.06037.
[87] Hasanpour, Seyyed Hossein and Rouhani, Mohammad and Fayyaz, Mohsen and Sa-
bokrou, Mohammad and Adeli, Ehsan. (2018). “Towards Principled Design of Deep
Convolutional Networks: Introducing SimpNet”. arXiv preprint arXiv:1802.06205.
[88] Huang, G., Liu, S., van der Maaten, L., Weinberger, K.Q. (2017). “Conden-
senet: An efficient densenet using learned group convolutions”. arXiv preprint
arXiv:1711.09224
128
Bibliografia
[89] Adam Paszke, Abhishek Chaurasia, Sangpil Kim, and Eugenio Culurciello. (2016).
“Enet: A deep neural network architecture for real-time semantic segmentation”.
arXiv preprint arXiv:1606.02147.
[90] “https://github.com/luckymouse0/SimpleNet-TF”
[91] Sabour, S., Frosst, N., and Hinton, G. E. (2017). “Dynamic routing between
capsules”. In Neural Information Processing Systems (NIPS).
[92] Bell, S., Zitnick, C.L., Bala, K., Girshick. (2016). “Inside-outside net: detecting
objects in context with skip pooling and recurrent neural networks”. In CVPR.
[93] “https://github.com/deepblacksky/capsnet-tensorflow”
[94] Larsson, Gustav, Michael Maire, and Gregory Shakhnarovich. (2016). “FractalNet:
Ultra-Deep Neural Networks without Residuals”. arXiv preprint arXiv:1605.07648 .
[95] R. Girshick, J. Donahue, T. Darrell, and J. Malik. (2015). “Region-based
convolutional networks for accurate object detection and segmentation”. TPAMI.
[96] J. Dai, Y. Li, K. He, and J. Sun. (2016). “R-FCN: Object detection via region-based
fully convolutional networks”. In Neural Information Processing Systems (NIPS).
[97] “https://d2l.ai/chapter computer-vision/rcnn.html#faster-r-cnn”
[98] “https://towardsdatascience.com/review-r-fcn-positive-sensitive-score-maps-object-
detection-91cd2389345c”
[99] K. He, G. Gkioxari, P. Dollar, and R. Girshick. (2017). “Mask r-cnn”.
arXiv:1703.068707
[100] Wei Liu, Andrew Rabinovich, Alexander C. Berg. (2016). “ParseNet: Looking Wider
to See Better”. arXiv:1506.04579
[101] “https://medium.com/datadriveninvestor/review-parsenet-looking-wider-to-see-
better-semantic-segmentation-aa6b6a380990”
[102] Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi. (2015). “You Only
Look Once: Unified, Real-Time Object Detection”. arXiv:1506.0264
[103] “https://pjreddie.com/yolo/”
[104] J. Redmon and A. Farhadi. (2017). “YOLO9000: Better, faster, stronger”. In CVPR.
[105] J. Redmon and A. Farhadi. (2018). “Yolov3: An incremental improvement”. arXiv
preprint arXiv:1804.02767
[106] W. Liu, D. Anguelov, D. Erhan, C. Szegedy, and S. E. Reed. (2015). “SSD: single
shot multibox detector”. In CoRR, abs/1512.02325.
[107] “https://towardsdatascience.com/understanding-ssd-multibox-real-time-object-
detection-in-deep-learning-495ef744fab”
[108] T.-Y. Lin, P. Goyal, R. Girshick, K. He, and P. Dollar. (2017). “Focal loss for dense
object detection. arXiv preprint, arXiv:1708.02002
[109] “https://towardsdatascience.com/review-retinanet-focal-loss-object-detection-
38fba6afabe4”
[110] T.-Y. Lin, P. Dollar, R. Girshick, K. He, B. Hariharan, and ´S. Belongie. (2017).
“Feature pyramid networks for object detection. In CVPR.
[111] Andrej Karpathy, George Toderici, Sachin Shetty, Tommy Leung, Rahul Sukthankar,
and Li FeiFei. (2014). “Large-scale video classification with convolutional neural net-
works. In Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference
on, pages 1725–1732. IEEE. research.google.com/pubs/archive/42455.pdf.
[112] J. Y. Ng, M. J. Hausknecht, S. Vijayanarasimhan, O. Vinyals, R. Monga, and G.
Toderici. (2015). “Beyond short snippets: Deep networks for video classification”. In
CVPR.
[113] Deng, J., Dong, W., Socher, R., Li, L.-J., Li, K., and Fei-Fei L. (2009). “Imagenet:
A large-scale hierarchical image database”. In CVPR.
129
Bibliografia
[114] Van Gool, L., Williams, C. K. I., Winn, J. and Zisserman, A. (2010). “The PASCAL
Visual Object Classes (VOC) Challenge”. International Journal of Computer Vision
(IJCV), 88(2), 303-338.
[115] J. Xiao, J. Hays, K. Ehinger, A. Oliva, and A. Torralba. (2010). “SUN Database:
Large-scale Scene Recognition from Abbey to Zoo”. In CPRV.
[116] J. Xiao, K. A. Ehinger, J. Hays, A. Torralba, and A. Oliva. (2010). “SUN Databa-
se: Exploring a Large Collection of Scene Categories”. In International Journal of
Computer Vision (IJCV).
[117] Dua, D. and Graff, C. (2019). “UCI Machine Learning Repository”.
“http://archive.ics.uci.edu/ml. Irvine”, CA: University of California, School
of Information and Computer Science.
[118] Griffin, G. Holub, AD. Perona P. “The Caltech 256.Caltech Technical Report”.
[119] Tsung-Yi Lin, Michael Maire, Serge Belongie, Lubomir Bourdev, Ross Girshick,
James Hays, Pietro Perona, Deva Ramanan, C. Lawrence Zitnick, Piotr Dollár.
(2014). “Microsoft COCO: Common Objects in Context”.
[120] Alina Kuznetsova, Hassan Rom, Neil Alldrin, Jasper Uijlings, van Krasin, Jordi
Pont-Tuset, Shahab Kamali, Stefan Popov, Matteo Malloci, Tom Duerig, Vittorio
Ferrari. (2018). “The Open Images Dataset V4: Unified image classification, object
detection, and visual relationship detection at scale”.
[121] Andreas Geiger andPhilip Lenz and Raquel Urtasun. (2012). “Are we ready for Auto-
nomous Driving? The KITTI Vision Benchmark Suite”. In Conference on Computer
Vision and Pattern Recognition (CVPR).
[122] Andreas Geiger and Philip Lenz and Christoph Stiller and Raquel Urtasun. (2013).
“Vision meets Robotics: The KITTI Dataset”. International Journal of Robotics
Research (IJRR).
[123] Jannik Fritsch and Tobias Kuehnl and Andreas Geiger (2013). “A New Performance
Measure and Evaluation Benchmark for Road Detection Algorithms”. International
Conference on Intelligent Transportation Systems (ITSC).
[124] Moritz Menze and Andreas Geiger. (2015). “Object Scene Flow for Autonomous
Vehicles, Conference on Computer Vision and Pattern Recognition”. In CVPR.
[125] Alex Krizhevsky. (2009). “Learning Multiple Layers of Features from Tiny Images”.
Tech Report, 2009.
[126] Grant Van Horn, Oisin Mac Aodha, Yang Song, Yin Cui, Chen Sun, Alex She-
pard, Hartwig Adam, Pietro Perona, Serge Belongie. “The iNaturalist Species
Classification and Detection Dataset”. In CVPR.
[127] B. Zhou, A. Khosla, A. Lapedriza, A. Torralba, and A. Oliva. (2016). “Places: An
image database for deep scene understanding”. arXiv preprint arXiv:1610.02055.
[128] Abadi, M., Barham, P., Chen, J., Chen, Z., Davis, A., Dean, J., Devin, M., Ghe-
mawat, S., Irving, G., Isard, M., Kudlur, M., Levenberg, J., Monga, R., Moore, S.,
Murray, D. G., Steiner, B., Tucker, P., Vasudevan, V., Warden, P., Wicke, M., Yu,
Y., and Zheng, X. (2016). “Tensorflow: A system for large-scale machine learning”.
Tech. rep., Google Brain, arXiv preprint.
[129] S. Guadarrama, N. Silberman. (2017). “TensorFlow-Slim: a lightweight library for
defining, training and evaluating complex models in TensorFlow”.
[130] Huang J, Rathod V, Sun C, Zhu M, Korattikara A, Fathi A, Fischer I, Wojna Z,
Song Y, Guadarrama S, Murphy K. (2017). “Speed/accuracy trade-offs for modern
convolutional object detectors”. In CVPR.
[131] “https://github.com/tensorflow/models/blob/master/research/object_
detection/g3doc/detection_model_zoo.md”
130
Bibliografia
131