Articoli

Utilizzo di deep learning per il riconoscimento di oggetti

Autrice: Joyce Xu

Traduttrice: Sabrina Sala

 

 

1

 

Con la comparsa di veicoli a guida autonoma, sistemi di videosorveglianza intelligenti e varie applicazioni come quella del conteggio delle persone, la richiesta di sistemi di riconoscimento facciale è ormai in continua crescita. Questi sistemi riguardano non solo il riconoscimento e la classificazione degli oggetti presenti nelle immagini, ma anche la localizzazione di ciascuno di essi, tracciando attorno ad essi un appropriato riquadro di delimitazione. Ciò ha reso il sistema di riconoscimento di oggetti un compito sempre più complesso rispetto al suo predecessore nell’ambito della visione artificiale: la classificazione di immagini.

Fortunatamente gli approcci più appropriati per il riconoscimento di oggetti sono, attualmente, estensioni di modelli per la classificazione di immagini. Qualche mese fa Google ha rilasciato una nuova API (interfaccia di programmazione di un’applicazione) di riconoscimento di oggetti in Tensorflow. In questa release troviamo modelli pre-addestrati con i relativi pesi:

Nello scorso articolo, abbiamo parlato delle tre architetture di reti neurali sopra citate (MobileNets, Inception e ResNet), oggi affronteremo invece i modelli di riconoscimento di oggetti per Tensorflow: Faster R-CNN, R-FCN e SSD. Attraverso questo articolo capiremo come il deep learning è applicato a questi modelli per il riconoscimento di oggetti, come questi ultimi si differenzino tra loro e quali siano i punti in comune.

Faster R-CNN

La faster R-CNN è ormai un modello di riferimento per la rilevazione di oggetti basata sul deep learning  (apprendimento profondo), che ha ispirato molti modelli successivi di rilevazione e segmentazione, inclusi i due che andremo ad esaminare. Sfortunatamente non possiamo comprendere appieno la Faster R-CNN senza analizzare R-CNN e Fast R-CNN, sue predecessori.

R-CNN

Possiamo certamente dire che la R-CNN, Region-based Convolutional Neural Network, è la rete che ha dato il via ai giochi. Consiste in tre fasi:

  1. Scansione dell’immagine di input per la rilevazione di possibili oggetti, utilizzando un algoritmo chiamato Selective Search, che estrae approssimativamente 2000 regioni di questa immagine (Region Proposal)
  2. Esecuzione della rete neurale convoluzionale (CNN) in cima a ciascuna regione.
  3. Estrapolazione dell’output da ogni CNN per immetterlo dentro ad:
    1. una SVM (Support Vector Machine) per classificare la regione
    2. Effettuare una regressione lineare per restringere il riquadro di delimitazione dell’oggetto, se esistente.

Le fasi sono illustrate (dal basso verso l’alto) nella figura sottostante

2

2

In altre parole, prima generiamo le possibili regioni, quindi estraiamo le caratteristiche e infine classifichiamo quelle regioni sulla base delle caratteristiche estratte. In sostanza, abbiamo trasformato la rilevazione di oggetti in un problema di classificazione. La R-CNN risulta molto intuitiva ma, sfortunatamente, anche molto lenta.

Fast R-CNN

Lo sviluppo immediatamente successivo è la Fast R-CNN. Questa ricorda l’originale in molte delle sue caratteristiche ma è migliore in termini di velocità di rilevazione per due aspetti:

  1. L’estrazione di caratteristiche viene effettuata prima di estrarre le regioni di interesse, ma utilizzando solo una CNN per l’intera immagine al posto che 2000 CNN sulle 2000 regioni sovrapposte.
  2. La SVM viene rimpiazzata da una funzione softmax e, inoltre, la rete neurale viene utilizzata anche per le previsioni anziché creare un nuovo modello.

Il modello appare similmente a:

 

3 1

Come possiamo vedere dall’immagine, stiamo ora generando proposte regionali basate non sull’immagine originale, ma piuttosto sull’ultima mappa delle caratteristiche estrapolate dalla rete. Ciò ci permette di allenare una sola CNN per l’intera immagine.

In aggiunta, al posto che allenare differenti SVM per classificare ogni oggetto, vi è un singolo strato softmax che genera direttamente la probabilità per la classe di riferimento. Quindi, abbiamo ora una sola rete neurale da allenare, a differenza di quanto succedeva prima dove invece c’era una rete neurale affiancata a molteplici SVM.

La Fast R-CNN performa, perciò, molto meglio in termini di velocità. Tuttavia, rimane un grosso difetto: l’algoritmo di selective search per proporre le possibili regioni.

Faster R-CNN

Siamo giunti ora all’obiettivo iniziale del nostro articolo: Faster R-CNN. L’intuizione è stata quella di rimpiazzare il lento algoritmo di selective search con una rete neurale veloce. Nello specifico essa ha introdotto la region proposal network (RPN), rete di proposta regionale.

Come funziona la RPN:

  • All’ultimo strato di una CNN iniziale, una finestra scorrevole 3×3 si muove attraverso la mappa delle caratteristiche per mapparla poi in una dimensione inferiore (ad esempio 256-d).
  • Per ogni posizione della finestra scorrevole, la RPN genera molteplici regioni possibili basate su vincoli spaziali di dimensioni fisse chiamati riquadri di ancoraggio (anchor boxes).
  • Ogni proposta regionale consiste in:
    • un punteggio (score) per la presenza dell’oggetto in quella determinata regione
    • 4 coordinate rappresentanti il riquadro di delimitazione della regione.

In altre parole, guardiamo alla nostra regione nell’ultima mappa delle caratteristiche, considerando i differenti k riquadri di ancoraggio attorno ad essa. Per ciascun riquadro viene visualizzata l’eventualità che contenga un oggetto e quali siano le coordinate del riquadro. Nell’immagine è rappresentato come appare dalla posizione di una finestra scorrevole:

 

4 1

4 1

Il punteggio 2k rappresenta la probabilità data da softmax per ciascun riquadro k per la presenza di un oggetto. Da notare è che, nonostante la RPN elabori le coordinate dei riquadri di delimitazione, essa non classifica comunque i possibili oggetti: ha il solo scopo di individuare regioni in cui siano presenti oggetti e quindi comunicare le coordinate dei relativi riquadri. Se un riquadro di ancoraggio ha un punteggio, relativo alla presenza di un oggetto, superiore a una determinata soglia, allora quel dato riquadro verrà selezionato come possibile regione.

Avendo ora le nostre possibili regioni, le introduciamo direttamente nella Fast R-CNN. Aggiungiamo uno strato di Pooling, alcuni strati completamente connessi, infine uno strato di classificazione softmax e un regressore dei riquadri di delimitazione (bounding box regressor). Possiamo dire, in un certo senso, che Faster R-CNN = RPN + Fast R-CNN.

 

5 1

5 1

La Faster R-CNN raggiunge così miglior velocità e accuratezza. Nonostante siano stati molteplici i tentativi successivi di aumentare la velocità di riconoscimento degli oggetti, solo pochi modelli sono stati davvero in grado di superare questa rete. In altre parole, la Faster R-CNN non rappresenta certo il metodo più semplice e veloce per la object detection ma presenta tuttora una delle migliori performance. Quindi, la Faster R-CNN in Tensorflow con la Inception ResNet è il modello più lento ma anche il più accurato.

Nonostante la Faster R-CNN possa sembrare complessa, è possibile notare che il cuore della sua struttura è il medesimo di quello originario della R-CNN: identificare possibili regioni di oggetti e classificarle. Questo è l’approccio dominante della maggior parte degli odierni modelli di rilevazione di oggetti, incluso quello che andremo ad analizzare ora.

R-FCN

Ritorniamo per un momento indietro. Abbiamo detto che la Fast R-CNN ha migliorato di molto la sua velocità di rilevazione condividendo una singola CNN per tutte le regioni. Questo meccanismo di base è lo stesso della R-FCN: aumentare la velocità massimizzando il numero di parametri condivisi.

La Region-based FullyConvolutional Net (R-FCN) condivide la totalità della computazione per ogni singolo output.

Da una parte, quando classifichiamo un oggetto vogliamo che il modello risulti invariante alle traslazioni, in modo da identificarlo ovunque esso appaia. Dall’altra, abbiamo però la necessità di conoscere anche un’eventuale varianza alle traslazioni: se il nostro oggetto si trova nell’angolo in alto a sinistra, il modello deve tracciare un riquadro di delimitazione in quel determinato punto. Perciò, come trovare un compromesso tra i due estremi, varianza e invarianza?

La soluzione proposta dalla R-FCN è rappresentata dalle position-sentitive score maps: mappe dei punteggi (relative alle features, estratte tramite convoluzioni, alla quale è attribuito un punteggio in base alla presenza della data classe) sensibili alla posizione degli oggetti che intendiamo classificare.

Ognuna di queste mappe rappresenta una posizione relativa di una classe di oggetti. Per esempio, una mappa dei punteggi potrebbe attivarsi qualora identifichi la parte in alto a destra di un gatto, mentre un’altra potrebbe attivarsi quando rileva la parte inferiore sinistra di una macchina. Essenzialmente queste score maps sono mappe di caratteristiche convoluzionali che sono state allenate a riconoscere determinate parti di ogni oggetto.

La R-FCN funziona in questo modo:

  1. Eseguire una CNN (in questo caso una ResNet) sull’immagine di input.
  2. Aggiungere uno strato convoluzionale che coinvolga tutte le mappe generate dal passaggio precedente in modo da ottenere un insieme di punteggi complessivi dell’immagine. Ottenendo k²(C+1) mappe di punteggio, dove k² rappresenta il numero di posizioni relative per dividere un oggetto (per esempio 3² per una griglia 3×3), e dove C+1 rappresenta il numero di classi più lo sfondo.
  3. Eseguire una RPN per generare le regioni di interesse (RoI)
  4. Dividere ciascuna RoI nelle medesime k² sottoregioni di cui è composta la mappa dei punteggi
  5. Dobbiamo ora verificare se nell’insieme dei punteggi complessivi, ogni sottoregione combaci con la corrispondente posizione relativa di un oggetto. Per esempio, se vogliamo considerare la sottoregione in alto a sinistra, dobbiamo prendere la mappa dei punteggi che corrisponde all’angolo in alto a sinistra di un oggetto e farne una media all’interno della RoI. Questo processo è ripetuto per ogni classe.
  6. Dopo che ogni k² sottoregione ha un valore di “object match” per ogni classe, si fa una media delle sottoregioni per ottenere un punteggio per ogni classe.
  7. Classificare le RoI con una funzione softmax sui rimanenti C+1 vettori dimensionali.

Una R-FCN, avente una RPN che genera le RoI, apparirà all’incirca così:

6 1

6 1

Capire come funzioni questo modello è più semplice se si può visualizzare concretamente ciò che fa. Qui di seguito abbiamo un esempio del suo funzionamento mentre cerca di individuare un neonato.

 

 

 

 

7Figura 4: visualizzazione di una RoI che non si sovrappone correttamente all’oggetto

In parole semplici: la R-FCN considera ogni regione, suddividendole poi in sottoregioni e chiedendosi per ciascuna di queste se corrispondano o meno alla relativa porzione dell’immagine di input. Ad esempio “assomiglia alla porzione in centro a destra di un bambino?”. Ciò viene ripetuto per ogni classe. Se la maggior parte delle sottoregioni risulta corrispondente, allora la RoI viene classificata come neonato, dopo che la funzione softmax viene eseguita su tutte le classi.

In questo modo, la R-FCN è capace di identificare contemporaneamente la varianza alle traslazioni, proponendo differenti regioni di oggetti, e l’invarianza alle traslazioni attraverso il riferimento di ogni regione alle stesse mappe di punteggio. Queste mappe di punteggio dovrebbero imparare a classificare un gatto come tale, ovunque esso appaia. Inoltre, è completamente convoluzionale: ciò significa che la computazione è condivisa nell’intera rete.

Ciò permette alla R-FCN di essere nettamente più veloce rispetto alla Faster R-CNN, raggiungendo comunque lo stesso grado di accuratezza.

SSD

L’ultimo modello che andremo ad analizzare è la Single-Shot Detector (SDD). Come la R-FCN ha raggiunto una velocità molto maggiore rispetto alla Faster R-CNN ma in modo nettamente diverso.

I primi due modelli eseguono region proposal e region classification in due fasi distinte. Inanzitutto, utilizzano una RPN (region proposal network) per generare le regioni di interesse, successivamente classificano queste regioni attraverso i propri strati interamente connessi o gli strati convoluzionali sensibili alla posizione degli oggetti da classificare. La SSD unisce questi due processi in un singolo passaggio, prevedendo simultaneamente i riquadri di delimitazione e le classi, nel momento in cui esamina l’immagine.

Data un’immagine di input ed un insieme di etichette al dataset, la SSD agisce in questo modo:

  • Passa l’immagine attraverso una serie di strati convoluzionali, producendo mappe delle caratteristiche a scale differenti (per esempio 10×10, poi 6×6 e ancora 3×3 ecc.)
  • Per ogni posizione in ciascuna di queste mappe delle caratteristiche, usa un filtro convoluzionale 3×3 per valutare un piccolo set di riquadri di delimitazione predefiniti. Questi ultimi sono l’equivalente dei riquadri di ancoraggio (anchor boxes) della Faster R-CNN.
  • Per ogni riquadro prevede simultaneamente:
    1. Il riquadro del bounding box
    2. La probabilità per ogni classe.
  • Durante l’allenamento fa corrispondere il riquadro effettivo con quello predetto sulla base del metodo Intersection over Union (IoU), ovvero l’Indice di Jaccard. I riquadri meglio predetti verranno etichettati come “positivi”, come anche tutti gli altri riquadri che abbiano un valore IoU >0.5.

L’allenamento della SSD ha però una difficoltà peculiare rispetto ai precedenti modelli. Nei primi due modelli, la RPN permetteva di prendere in considerazione solo ciò che aveva anche solo la minima possibilità di essere un oggetto. Con la SSD, invece, questo primo filtro viene eliminato: esso classifica e traccia riquadri di delimitazione in ogni singola posizione nell’immagine, usando riquadri di differenti forme e di molteplici scale. Ciò ha come risultato l’avere un numero molto più elevato di riquadri dove, però, la maggior parte di questi è negativo (dal momento che non rileva oggetti).

La SSD corregge questo problema in due modi. Per prima cosa utilizza la non-maximum suppression (NMS) per raggruppare diversi riquadri sovrapposti in un unico riquadro. Quindi se ad esempio quattro riquadri di simile forma e grandezza contengono lo stesso oggetto, la NMS permette di tenere il riquadro migliore, il più accurato, e di scartare i restanti. In secondo luogo, utilizza una tecnica chiamata hard negative mining per bilanciare le classi durante l’allenamento. Con questa tecnica, solo un sottogruppo degli esempi negativi con la più elevata loss in fase di training (i cosiddetti falsi positivi) è utilizzato per ogni iterazione in fase di allenamento. La SSD mantiene un rapporto 3:1 tra negativi e positivi.

La sua architettura appare così:

 

8

Come detto poco sopra, vediamo esserci degli “extra feature layers”. Queste mappe delle caratteristiche dalle misure variabili aiutano a individuare oggetti di diverse dimensioni. Eccone un esempio:

9

In mappe delle caratteristiche di dimensioni più piccole (4×4), ogni riquadro ricopre una regione più ampia dell’immagine, permettendo così di individuare oggetti più grandi. La region proposal e la classificazione sono perciò eseguite nello stesso momento: avendo p classi di oggetti, ogni riquadro di delimitazione è associato a un vettore dimensionale (4+p) che produce 4 riquadri di coordinate e p probabilità di classe. In ultima istanza, viene utilizzata anche qui una funzione sotmax per classificare gli oggetti.

Possiamo perciò dire che la SSD non è poi così diversa rispetto ai due modelli precedenti. Tuttavia omette il passaggio di individuazione delle regioni, considerando ogni riquadro in ogni posizione dell’immagine insieme alla sua classificazione. Eseguendo tutti questi processi simultaneamente, la SSD è di certo il più veloce tra i tre modelli presi in considerazione.

Conclusioni

La Faster R-CNN, la R-FCN, e la SSD sono tre dei migliori e più usati modelli per la rilevazione di oggetti. Tutti fanno affidamento su reti neurali convoluzionali per le prime fasi del processo e seguono, all’incirca, lo stesso metodo di proposta delle regioni e classificazione.

 

Guida alle architetture di reti profonde

Autrice: Joyce Xu

Traduttrice: Sabrina Sala

 

 

1

GoogLeNet, 2014

Negli ultimi anni, molto del progresso ottenuto nell’utilizzo del deep learning (apprendimento profondo) per la visione artificiale può essere ricondotto a un gruppo ristretto di architetture di reti neurali. Lasciando da parte la matematica, i codici e i dettagli dell’implementazione, in questo articolo intendiamo analizzare come questi modelli funzionino.

Al momento, Keras domina con sei di questi modelli pre-addestrati già inseriti all’interno della libreria.

  • VGG16
  • VGG19
  • ResNet50
  • Inception v3
  • Xception
  • MobileNet

Le reti VGG, insieme alla precedente AlexNet del 2012, segue lo schema archetipico delle reti convoluzionali classiche: una serie di convoluzioni, max-pooling, strati di attivazione e infine alcuni strati di classificazione completamente connessi. MobileNet è, essenzialmente, una versione semplificata dell’achitettura di Xception, ottimizzata per le applicazioni mobile. Tuttavia, sono stati i rimanenti tre modelli a ridefinire davvero il modo in cui attualmente guardiamo alle reti neurali. Questo articolo si focalizzerà quindi sull’intuizione avuta con le architetture di ResNet, Inception e Xception, e sul perché esse sino diventate il punto di riferimento per i successivi studi di visione artificiale.

ResNet

ResNet è nata da una semplice osservazione: “perché aggiungendo ulteriori strati a reti neurali profonde l’accuratezza non migliora ma, addirittura, peggiora?”

Intuitivamente, reti neurali più profonde non dovrebbero performare peggio di quelle poco profonde, o almeno non durante l’allenamento quando non vi è alcun rischio di overfitting. Prendiamo una rete di esempio con n strati che raggiungono una certa accuratezza. Come minimo, una rete con n+1 strati dovrebbe essere in grado di raggiungere lo stesso grado di accuratezza, copiando i primi n strati ed eseguendo un identity mapping per l’ultimo strato. Allo stesso modo, reti di n+2, n+3 e n+4 strati possono, con lo stesso metodo, ottenere la medesima accuratezza. Tuttavia, al crescere della profondità della rete questo non è sempre vero.

Gli sviluppatori di ResNet hanno ricondotto questo problema all’ipotesi che le mappature dirette sono difficili da allenare. Hanno così proposto un rimedio: a posto che cercare di apprendere da mappature sottostanti da x di H(x), è possibile invece apprendere la differenza tra i due, ovvero il “residuale” e, successivamente, aggiustare quest’ultimo all’input.

Poniamo che il residuale sia F(x)=H(x)-x. Ora la nostra rete cerca di apprendere da F(x)+x.

Ciò ha dato vita a ai famosi blocchi di ResNet (rete residuale):

 

2.jpg

ResNet block

 

Ogni “blocco” di ResNet consiste in una serie di strati e una identity mapping che aggiunge l’input del blocco al su output. Questa operazione di “addizione” viene fatta elemento per elemento. E nel caso in cui l’input e l’output siano di dimensioni differenti, possono essere utilizzate le tecniche di zero-padding o di proiezioni (attraverso convoluzioni 1×1) per creare dimensioni corrispondenti.

Ritornando alla nostra rete esempio, questo metodo può semplificare notevolmente la costruzione di strati di identità di cui è composta. È infatti molto più semplice imparare a spingere F(x) verso 0 e lasciare l’output come x. ResNet fornisce, quindi, agli strati un punto di riferimento x da cui apprendere, piuttosto che partire da zero da una trasformazione di identità.

Questa idea è davvero efficace nella pratica. Prima di questa, nelle reti neurali profonde si riscontrava un problema di annullamento del gradiente, la cui discesa, data dalla minimizzazione della funzione di errore, si riduce esponenzialmente attraverso la retropropagazione degli strati precedenti. In sostanza, la lunga strada attraverso gli strati precedenti rendeva i segni degli errori talmente piccoli da non permettere alla rete di apprendere. Ciò nonostante, grazie all’innovazione introdotta da ResNet, descritta sopra, possiamo ora costruire reti di innumerevoli strati (potenzialmente anche più di mille) che abbiano un elevato grado di accuratezza. Questo è stato un grande passo in avanti, considerato che il modello più profondo creato fino ad allora, era di 22 strati (vincitore della competizione ILSVRC del 2014).

Sono stati pubblicati molti articoli successivi sul deep learning (apprendimento profondo)  ma senza grandi miglioramenti. ResNet rimane, fondamentalmente, il modello che ha cambiato la nostra comprensione delle reti neurali e di come esse apprendano.

La rete di 1000+ strati è open source! La potete travare qui.

Inception

Se ResNet si concentra sulla profondità, Inception Family™ è invece focalizzata sull’estensione. In particolare, gli sviluppatori di Inception erano interessati all’efficienza computazionale dell’allenamento di reti più larghe. In altre parole: come possiamo aumentare la larghezza delle reti neurali senza eccedere la capacità computazionale di un elaboratore?

Il lavoro originario riguardava una componente nota con il nome di “Inception model”. Il cuore di questo modello, racchiudeva due elementi innovativi.

  1. La prima intuizione riguarda operazioni sugli strati. In una tradizionale CNN, ogni strato estrae informazioni dallo strato precedente al fine di trasformare i dati di origine in un differente tipo di informazione. L’output di una convoluzione 5×5 estrae caratteristiche differenti da quelle di un 3×3 o di un max-pooling e così via. Per ogni strato, come possiamo quindi intuire quale kernel fornisca informazioni più rilevanti?

Perché non lasciare quindi che sia il modello a scegliere?

Un modulo Inception elabora molteplici e differenti trasformazioni sugli stessi dati di input, in contemporanea, concatenando i risultati in un singolo output. In altre parole, ogni strato “Inception module” consiste in una convoluzione 5×5, una 3×3 e un max-pool.  È lasciato allo strato successivo la selezione delle features più rilevanti.

3

3

La maggiore densità di informazione dell’architettura di questo modello ha un problema rilevante: il drastico aumento della capacità computazionale necessaria. Non solo i filtri convoluzionali più larghi (es 5×5) sono impegnativi e onerosi da calcolare, ma anche la sovrapposizione di differenti filtri incrementa il numero di mappe delle caratteristiche per ogni strato. Ciò risulta un vero impedimento per il nostro modello.

Vediamola in un altro modo: per ogni filtri che aggiungiamo, dobbiamo eseguire una convoluzione su tutte le mappe di input per calcolare un singolo output. Nell’immagine sottostante vediamo come la creazione di una mappa di output da un singolo filtro implichi la computazione su ogni singola mappa degli strati precedenti.

4

Poniamo che vi siano M mappe di input.  Per ogni filtro aggiuntivo, dobbiamo farlo convolvere lungo tutte le M mappe di input; allo stesso modo, se abbiamo ulteriori N filtri, dovremmo farli convolvere lungo tutte le N*M mappe. In altre parole, “ogni aumento uniforme nel numero di [filtri] risulta in una aumento al quadrato della computazione”. Il nostro modulo Inception ha così triplicato o quadruplicato il numero di filtri. Dal punto di vista computazionale, è un vero guaio.

Ciò porta alla seconda intuizione: usare convoluzioni 1×1 per una riduzione della dimensionalità. Al fine di risolvere la difficoltà computazionale sopra descritta, gli sviluppatori di Inception hanno usato le convoluzioni 1×1 per “filtrare” la profondità degli output. Queste convoluzioni prendo in considerazione un valore alla volta, ma attraverso molteplici canali, e possono inoltre Estrarre informazioni spaziali e comprimerle in una dimensione minore. Per esempio, usando 2° filtri 1×1, un input di dimensione 64x64x100 (con 100 mappe delle caratteristiche) può essere compresso a 64x64x20. Riducendo il numero di mappe di input, gli sviluppatori sono stati in grado di sovrapporre parallelamente differenti trasformazioni di strati, con il risultato di avere reti che erano, al tempo stesso, profonde (avendo numerosi strati) e larghe (con operazioni parallele).

5

5

a) modulo Inception, prima versione b) modulo Inception con riduzione della dimensionalità

la prima versione di Inception, chiamata “GoogLeNet” è quella citata in precedenza da 22 strati che ha vinto la competizione ILSVRC del 2014. Inception v2 e v3, sviluppate un anno dopo, sono migliori rispetto alla versione precedente per diversi fattori: il più rilevante è il refactoring di convoluzioni larghe in altre più piccole e consecutive, che siano quindi più semplici da apprendere. Ad esempio nella Inception v3, la convoluzione 5×5 è stata sostituita da due convoluzione consecutive 3×3.

Inception è diventata rapidamente un riferimento per l’architettura dei modelli successivi. La sua ultima versione, la v4, aggiunge anche connessioni residuale tra ogni modulo, creando un ibrido tra Inception e ResNet. Ciò nonostane, il fattore più importante è che questo modello dimostra la forza di architetture “network-in-network” ben concepite, raggiungendo un nuovo livello nella legittimazione del potere delle reti neurali.

Da notare è che la ricerca sulle versioni successive v2 e v3 è stata pubblicata il giorno immediatamente successivo alla data di uscita della ricerca su ResNet.

Xception

Xception, “extreme inception”, a differenza delle precedenti architetture, ha mutato la nostra comprensione delle reti neurali, in particolare le reti convoluzionali. Come suggerisce il nome, porta il principio di Inception al suo estremo.

L’ipotesi è stata: “le correlazioni spaziali e quelle tra i canali (B/N, RGB) sono sufficientemente svincolati da rendere preferibile non mapparle insieme”

Ciò significa che in una CNN tradizionale, gli stati convoluzionali individuavano correlazioni tra spazio e profondità. Nell’immagine seguente possiamo rivederne il funzionamento.

4

Il filtro considera simultaneamente una dimensione spaziale (ogni quadrato colorato 2×2) e una cross-channel o dimensione di “profondità” (la pila di quattro quadrati). Allo strato di input di un’immagine, questo è l’equivalente di un filtro convoluzionale che esamina un gruppo di pixel 2×2 attraverso tutti i tre canali RGB. Quindi ci poniamo una domanda: che ragione abbiamo di considerare la regione di immagine e i canali simultaneamente?

 

6

Inception comincia a separare questi due elementi: grazie a convoluzioni 1×1 proietta l’input originale in molteplici spazi di input di dimensioni minori, e da ognuno di questi utilizza differenti filtri per trasformare quei piccoli blocchi tridimensionali di dati. Xception va anche oltre: piuttosto che dividere i dati di input in molteplici gruppi compressi, mappa separatamente per eseguire, successivamente, una convoluzione 1×1 in profondità per cogliere le correlazioni cross-channel. Questa operazione è conosciuta con il nome di “depthwise separable convolution” che consiste in una convoluzione spaziale (depthwise convolution) eseguita in modo indipendente per ogni canale, seguita da una convoluzione 1×1 (pointwise convolution) tra i canali. È quindi una ricerca di correlazioni dapprima in uno spazio bidimensionale e, successivamente, in uno spazio unidimensionale. Questa mappatura 2D+1D è più semplice da apprendere, rispetto a una completamente 3D.

 

Xception supera le prestazioni di Inception v3 sui dataset di ImageNet, e lo fa altrettanto bene con dataset per la classificazione di immagini di 17mila classi. In aggiunta, ha lo stesso numero di parametri di modello di Inception, permettendo così un’ottima efficienza. Nonostante Xception sia molto recente, la sua architettura è già entrata a far parte delle applicazioni di Google per la mobile vision, attraverso MobileNet.

Da notare è che lo sviluppatore di Xception, François Chollet, è anche l’autore di Keras.

Prospettive e applicazioni

La conoscenza di ResNet, Inception e Xception è diventata ormai sempre più importante, sia in ambito di ricerca che in quello aziendale. Un’applicazione interessante è il transfer learning, una tecnica del machine learning in cui vengono applicate conoscenze prese da una fonte (prendiamo in esempio un modello ResNet allenato) ad un dominio target . Ciò generalmente comprende due azioni: inizializzare un modello con pesi pre-istruiti da ResNet, Inception ecc, utilizzandolo sia per l’estrazione di caratteristiche, sia per l’ottimizzazione (fine-tuning) degli ultimi strati su un nuovo dataset. Attraverso il transfer learning questi modelli possono essere riutilizzati per qualsiasi operazione ad esso correlata, dal rilevamento di oggetti per veicoli a guida autonoma, alla creazione di didascalie e sottotitoli per registrazioni video.

Potete trovare una guida di Keras ai modelli di fine-tuning qui.

 

implementare una rete neurale profonda per giocare a fifa 18

Autore: Chintan Trivedi

Linkedin: https://www.linkedin.com/in/chintan-trivedi-78665774/

Traduttrice: Sabrina Sala

 

Gli A.I. bots, ossia di programmi in grado d’agire, sono solitamente programmati con una serie di regole a priori che comunicano con il gioco. Nella maggior parte dei casi, questo approccio è sufficientemente efficace per far sì che il bot imiti i comportamenti umani. Tuttavia, in molti contesti è ancora molto semplice distinguere un bot da un vero essere umano. Prenderemo quindi in considerazione questo  quesito: cosa succederebbe nel caso in cui lasciassimo che il bot comprenda autonomamente dall’osservazione del gioco umano, senza l’utilizzo di regole empiriche?

Ciò richiede un gioco dove sia possibile raccogliere questo genere di dati sul comportamento dei giocatori e FIFA 18 fa al caso nostro. Poter registrare le nostre azioni e decisioni durante la fase di gioco ci permette di implementare un bot basato sulla deep learning, senza che si renda necessaria la programmazione di una singola regola di gioco.

Il codice per questo progetto ed il modello già allenato possono essere trovati qui.

 

Meccanismi di gioco

Il meccanismo alla base per implementare un tale bot non necessita di accesso ad alcun codice interno. È sufficiente un semplice screenshot della finestra di gioco per dare avvio al nostro engine. Quest’ultimo, processa le informazioni visive e realizza sulla base di esse un’azione che viene comunicata al gioco attraverso una simulazione della pressione dei tasti. Quindi, la procedura viene ripetuta per ogni step.

 

4 1

Ora che abbiamo l’input, l’insieme di screenshot che permettono al bot di agire, giungiamo alla parte interessante: la costituzione di un’intelligenza artificiale che apprenda dal gioco. Ciò viene fatto dapprima 1) utilizzando una rete neurale convoluzionale (CNN) per elaborare le schermate e, secondariamente, 2) sfruttando le reti di memoria a breve e lungo termine (LSTM) per decidere in merito all’azione più appropriata.

 

Step 1) allenare una rete neurale convoluzionale (CNN)

Le CNN sono spesso conosciute per la loro capacità di individuare oggetti in un’immagine con elevata accuratezza. Associando ad essa potenti GPU e architetture di reti intelligenti, possiamo ottenere un modello di CNN che opera in tempo reale.

5 2

5 2

Per far sì che il nostro bot processi l’immagine che gli è stata data come input, utilizziamo una CNN veloce ed estremamente leggera chiamata MobileNet. La mappa delle caratteristiche, estrapolate dalla rete, rappresenta una comprensione profonda dell’immagine, riuscendo ad individuare dati quali la posizione dei giocatori e di altri oggetti di interesse nello spazio dello schermo. Questa mappatura è quindi usata con un single-shot multi-box per individuare i giocatori nell’area di gioco, insieme al pallone e alla porta.

6

 

Step 2) allenare reti di memoria a breve e lungo termine (LSTM)

7

Ora che abbiamo una comprensione dell’immagine, possiamo procedere con il passaggio successivo, l’azione. Tuttavia, non possiamo limitarci allo studio di una sola schermata per decide come agire ma, piuttosto, dovremmo guardare a una breve sequenza di queste. È qui che entrano in gioco le LSTM poiché sono conosciute per modellare una sequenza temporale di dati. Ciascun frame consecutivo è utilizzato come passo temporale nella nostra sequenza, e per ognuno di essi viene estrapolata una feature map utilizzando il modello delle CNN. Queste ultime sono poi introdotte simultaneamente in due reti LSTM.

La prima rete LSTM ha la funzione di capire quali movimenti il giocatore necessita di fare ed è, quindi, un modello di classificazione “multi-classe”. La seconda LSTM riceve lo stesso input ma deve, invece, decidere quale azione scegliere tra passaggio corto, cross, passaggio filtrante e tiro. È quindi anch’essa un modello multiclasse. Gli output prodotti da queste due classificazioni sono poi convertiti nella pressione dei tasti che controllano le azioni di gioco.

Le reti sono state allenate sulla base di dati collezionati attraverso il gioco manuale, la raccolta delle immagini e la pressione del tasto corretto.

 

Valutazione della prestazione del bot

Non potremmo valutare la performance del bot, se non lasciando che giochi. Dopo soli 400 minuti di allenamento, il bot ha imparato a correre verso la porta avversaria, a fare passaggi frontali e scattare una fotografia dello schermo ogni qualvolta rilevi un goal. Nella modalità principiante di FIFA 18, ha già conseguito 4 goal in sei partite, uno in più di quanti ne abbia fatti Paul Pogba durante la stagione 17/18.

Video del bot in azione possono essere trovati qui.

 

Conclusioni

Le impressioni iniziali a questi approccio di implementazione di bot in grado di giocare sono certamente positive. Con un allenamento piuttosto limitato, il bot è riuscito a cogliere le regole basi del gioco: muoversi verso la porta avversaria e spingere la palla nella rete. Sarebbe sicuramente in grado di avvicinarsi al livello di performance umano se sottoposto a molte più ore di allenamento, le quali potrebbero essere facilmente raccolte dallo sviluppatore del gioco. In aggiunta, estendere il modello di allenamento a riprese reali di partite, permetterebbe di rendere il comportamento del bot molto più naturale e realistico.

 

 

Capsule Networks – Daniele D’Armiento

Daniele D’Armiento – Physicist presso Samsung
“Analisi di una rete neurale capsulare nella Computer Vision”
L’attuale stato dell’arte per la classificazione d’immagini, introdotte nell’ottobre 2017, sta aprendo nuove strade inesplorate nel mondo del Deep Learning (apprendimento profondo) non più basate sull’ormai comune prassi di aumentare la profondità della rete o aumentare i dati a nostra disposizione per raggiungere performance migliori ma contrariamente su una struttura capsulare ed un processo definito “routing-by-agreement” in grado di superare la perdita delle informazioni spaziali delle reti convoluzionali ed al tempo stesso di ottenere simil-analoghe performance con una quantità di dati inferiore.

La GTX 745 e l’installazione di tensorflow – gpu su Windows

Autrice: Eleonora Bernasconi

 

Specifiche della scheda grafica NVIDIA GeForce GTX 745

Specifiche: https://www.geforce.com/hardware/desktop-gpus/geforce-gtx-745-oem/specifications

CUDA Cores: 384

Base Clock (MHz): 1033

Memory Clock: 1.8 Gbps

Standard Memory Config: 4 GB

Memory Interface: DDR3

Memory Bandwidth (GB/sec): 28.8

 

Figura 01 – nvidia-smi per il monitoraggio della GPU

Apri il Command Prompt ed inserisci:

cd C:\Program Files\NVIDIA Corporation\NVSMI

nvidia-smi

N.B.La percentuale di utilizzo della GPU oscilla tra il 92% e il 94%, nel Task Manager di Windows si mantiene sul 70%.

Installazione tensorflow con GPU per Windows 10

Requisiti

Python 3.5

Nvidia CUDA GPU. Vedi se la GPU è compatibile con CUDA.

Settaggio della scheda Nvidia GPU

Installa Cuda Toolkit 8.0 e cuDNN v5.1.

Download ed installazione di CUDA Toolkit

Toolkit 8.0 https://developer.nvidia.com/cuda-downloads

Esempio directory di installazione: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

Download ed installazione di cuDNN

Installa cuDNN versione 5.1 per Windows 10: https://developer.nvidia.com/cudnn

Estrai i file cuDNN ed inseriscili nella directory Toolkit.

Variabili d’ambiente

Assicurati dopo aver installato CUDA toolkit, che CUDA_HOME sia impostata nelle variabili d’ambiente, altrimenti aggiungile manualmente.

Figura 02 – Variabili d’ambiente CUDA_HOME parte 01

 

Figura 03 – Variabili d’ambiente CUDA_HOME parte 02

Installa Anaconda

Download : https://www.anaconda.com/download/

Crea un nuovo ambiente con il nome tensorflow-gpu e la versione di python 3.5.2

conda create -n tensorflow-gpu python=3.5.2

N.B. Nel caso in cui ci si ritrovasse con versioni incompatibili tra di loro, basta attivare questi comandi per risolvere il problema:

conda install -c conda-forge tensorflow-gpu

Anaconda installerà automaticamente le versioni richieste di cuda, cudNN e gli altri packages.

Figura 04 – conda install -c conda-forge tensorflow-gpu

 

activate tensorflow-gpu

Figura 05 – activate tensorflow-gpu

 

Installa tensorFlow

pip install tensorflow-gpu

Figura 06 – pip install tensorflow-gpu

Adesso hai finito ed hai installato con successo tensorflow con la GPU!

Ricordati di attivare il comando: activate tensorflow-gpu per metterti in modalità GPU!

 

Test GPU

python

import tensorflow as tf

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

 

Figura 07 – test GPU

 

Test su CIFAR-10 con 10 epoche

Tempo medio per epoca: 150 sec

Tempo totale: 25 min

Figura 08 – Test su CIFAR-10 con 10 epoche

Metodi per la riduzione della dimensionalità basati sulla Varietà differenziabile: il caso ISOMAP

Autore: Matteo Alberti


 

In questo tutorial andiamo ad aprire una mini serie dedicata ai metodi di riduzione della dimensionalità basati su una struttura matematica chiamata Varietà differenziabile (Manifold)

Andiamo dunque a capire che cosa sia una Varietà differenziabile, quando risulta utile e come applicarlo senza però entrare nel dettaglio sulla struttura e sulle proprietà matematiche.

“Manifold non è altro che uno spazio matematico dove localmente viene a ricrearsi uno spazio euclideo (di una specifica dimensione) ma non a livello globale”

Quindi quando e come andremo ad applicare questa serie di metodi?

La risposta è semplice: Quando i metodi lineari falliscono

 

Andiamo ad indagare in maniera più approfondita:


 

Esempio:

Nei metodi lineari (come PCA, MDS, SVD) i nostri dati possono essere ridimensionati solo attraverso combinazioni lineari delle nostre features, ciò comporta che strutture più complesse e non lineari non vengono scovate e dunque discriminate.

Riportiamo un esempio grafico:

 

Metodi Lineari ci ridurrebbero i dati perdendo la struttura geometrica. Come mostra in figura i punti X1 ed X2 risulterebbero avvicinati (e cosi tutta la struttura risulterebbe “appiattita”)

Metodi basati sulla Varietà differenziabile contrariamente ci riescono. I principali sono:

  • ISOMAP
  • Local Linear Embedding (LLE)

 

Vogliamo ricordare che il nostro obiettivo è “preservare la geometria locale”


 

Questa idea di base ci permette di risolvere molti problemi non solo in fase di pre-processing (Nella computer Vision per esempio ci permette di risolvere problemi di: Stima della posizione, compressione dei dati, riduzione del rumore nell’immagine ed interpolazione di dati mancanti)

 

 

ISOMAP

Iniziamo dunque con il primo strumento:

L’algoritmo si compone di tre fasi:

  • Determinare il numero di vicini (neighbors) sul Manifold (basandola sulle distanze Euclidea)

Per ogni punto andremo a mappare i vicini (determinati in base al numero di vicini fissato come nell’algoritmo K-NN o in base ad un raggio fissato)

 

  • In questo step andremo a stimare la Geodetica. Andremo dunque a calcolare la distanza di ogni coppia di punti ma non lavorando in uno spazio Euclideo esso corrisponderà al percorso più breve fra tutti i possibili percorsi per collegare due punti nel manifold. Un esempio di comune utilizzo può esser l’algoritmo di Djkstra, molto comune nel calcolo di della navigazione stradale.
  • In questo ultimo step andremo ad applicare una MDS (multidimensional scaling) alla matrice di distanze della geodetica al fine di ricostruirlo in uno spazio Euclideo che manterrà la stessa struttura geometrica. I vettori di coordinate nello spazio euclideo sono scelti per minimizzare la seguente funzione di costo:


Dy corrisponde alla matrice di distanze Euclidee

L2 corrisponde alla radice quadrata della somma degli elementi

τ non è altro che una funzione di conversione (le distanze vengono sostituite in prodotti interni) al fine di utilizzare algoritmi di ottimizzazione efficienti.


 

 

Andiamo ad implementarlo in Python:

Prima di tutto importiamo i pacchetti necessari di scikit-learn

import numpy as np

import matplotlib.pyplot as plt

from sklearn import manifold

 

La nostra classe sarà cosi articolata:

DATA= manifold.Isomap(n_neighbors=N, n_components=C, eigen_solver=’auto’, tol=0, max_iter=None, path_method=’auto’, neighbors_algorithm=’auto’, n_jobs=1)

Andiamo ad analizzare i parametri principali:

  • n_ neighbors= Numero intero, corrisponde al numero di vicini
  • n_ components= Numero intero, generalmente impostato di default su 2. Corrisponde al numero di coordinate nello spazio del Manifold
  • path_ method= di default ’auto’, FW per Floyd-Warshall, D per l’algoritmo di Djkstra imposta in che modo calcolare le distanze nel grafo.

 

 

Se vogliamo andare a stampare un grafico con i relativi tempi di esecuzione:

 

 

from time import time

t0=time()

ISOMAP_DATA= manifold.Isomap(n_neighbors, n_components=2).fit_transform(OUR_DATA)

t1=time()

print("%s: %.2g sec" % ('ISO' t1-t0))

plot.embedding(ISOMAP_DATA, "ISOMAP ottenuto in " % (t1-t0)

plot.show()

Facciamo due ultime considerazioni di utilizzo pratico:

 

ISOMAP risulta esser uno strumento di riduzione molto efficace che ci permette di bypassare molti problemi legati alla linearità ma il poter preservare una struttura geometrica locale naturalmente è a discapito di alcuni fattori, in particolare:

  • Sensibile ad outliers
  • Pochi parametri liberi

Questo perché la funzionalità dell’algoritmo dipende principalmente dalla scelta di pochi parametri (la scelta del numero dei vicini) infatti anche solo pochi valori outliers possono in qualche modo avvicinare porzioni di dati che dovrebbero contrariamente venir discriminati.

Per questo motivo ISOMAP è altamente consigliato quando abbiamo già qualche idea sulla struttura dei dati anche perché rispetto ad altri metodi lineari risulta computazionalmente più intensivo.

 

Nel Prossimo tutorial andremo ad affrontare LLE, il secondo dei nostri metodi basati sul Manifold.

 

Riferimenti

http://scikit-learn.org/stable/index.html (Official Website of Scikit libraries)

http://web.mit.edu/cocosci/Papers/sci_reprint.pdf  (documentazione su ISOMAP)