YOLO: descrizione dell'architettura [ITA]
Oct. 21, 2023, 3:55 p.m.
E' sempre difficile trovare materiale che sia in lingua Italiana nel web e che riguardi il mondo del deep learning. Questo può essere un limite per tutte le persone che vogliono avvicinarsi a questo mondo ma che non conoscendo bene l'inglese hanno difficoltà a comprendere ed imparare leggendo le direttamente le pubblicazioni o articoli online.
Da qui nasce la mia volontà di cercare di spiegarvi le architetture di "object detection" presenti in letteratura, in lingua Italiana. Alcuni termini saranno comunque in inglese così da non incorrere in incomprensioni qualora vogliate iniziare a studiare le pubblicazioni originali.
Oggi partiamo quindi dal paper che a mio avviso è il più iconico e che ha portato maggiore enfasi nel mondo della object detection, ovvero parliamo di YOLO: You Only Look Once.
DESCRIZIONE GENERALE
Figura 1: Descrizione generale YOLO. Source: https://arxiv.org/abs/1506.02640 |
L’algoritmo divide l’immagine in input in una griglia formata da S x S celle. Se il centro di un oggetto cade all’interno della cella, quest’ultima è responsabile dell’individuazione dell’oggetto intero. Ogni cella predice B bounding-boxes e la loro confidenza che varia tra 0 e 1. Questo parametro di confidenza è definito come prodotto tra : (probabilità che ci sia un’oggetto)* IoU (tra il box predetto e il box vero). Se non c’è alcun oggetto, la probabilità risulta 0 altrimenti 1. Ogni predizione è composta da un vettore formato da 5 elementi per la bounding box ( x_centro,y_centro, width, height, confidence) . Inoltre per ogni cella viene calcolata la probabilità dell’oggetto di essere di una C-esima classe. Questo viene eseguito una sola volta nonostante vengano calcolate più di una Bounding-Boxes.
In fase di test la probabilità assegnata alla predizione è data dal prodotto tra: probabilità riferita alla classe-iesima*IoU( tra box predetta e box vera).
STRUTTURA DELL’ARCHITETTURA
Figura 2: Architettura YOLO. Source: https://arxiv.org/abs/1506.02640 |
L’architettura della rete neurale convoluzionale si inspira all’architettura GoogLeNet utilizzata per classificare immagini. Questa architettura ha come caratteristica principale quella di applicare all’immagine o al layer in input, filtri di diversa natura e in particolare filtri (1x1) per poi infine creare una feature map formata dall’insieme dei risultati ottenuti dopo l’applicazione di questi filtri. Questo modello prende il nome di Inception Model che è descritto in figura 3.
Figura 3: Inception Module, version 1.0. Source: https://arxiv.org/abs/1409.4842 |
TRAINING
Il pre-training dell’architettura è stato fatto utilizzando il dataset ImageNet che presenta 1000 classi differenti. Solo i primi 20 layers (seguiti poi da un avg-pooling layer e un FC layer) sono stati allenati con questo dataset per una settimana ottenendo un’accuracy di 88%. E’ stato utilizzato per il training e per l’inferenza il framework Darknet.
Una volta pre-allenato il modello, è stato successivamente implementata l’architettura presente in Figura 2, aggiungendo quindi ai 20 layers pre-allenati, 4 layers convoluzionali e 2 FC (fully connected) layers inizializzati con valori dei pesi random. Inoltre è stata modificata la risoluzione in input da 224x224 a 448x448.
E’ stata utilizzata una funzione di attivazione lineare per il layer finale, mentre tutti gli altri layer utilizzano una funzione di attivazione rettificata (1).
LOSS FUNCTION
In questo modello è stata utilizzato come funzione di loss, la somma dell’errore quadratico (sum-squared error) perché facile da ottimizzare. La funzione di Loss è la somma di 5 termini:
questa scelta non si addice molto all’esigenza di massimizzare la precisione media nelle predizioni. Con questa funzione infatti, gli errori di classificazione vengono posti sullo stesso piano di quelli di localizzazione. In più, in ogni immagine, molte celle della griglia possono non contenere nessun oggetto. Questo spinge il confidence score di queste celle verso lo zero, rendendo spesso più influenti del dovuto i gradienti ottenuti da quest’ultime. Tutto ciò, come spiegato dagli autori, può causare una maggiore instabilità del modello, portandolo a divergere.
Per rimediare a questo problema, gli autori aumentano il gradiente ottenuto dalle bounding box che contengono oggetti e riducono quello ottenuto dalle bounding box che non ne contengono. Per farlo, usano due parametri, rispettivamente λcoord e λnoobj. Di default questi parametri valgono λcoord = 5 e λnoobj = 0.5
La funzione di Loss può essere divisa in tre parti:
- Classification Loss (5)
- Localization Loss (1, 2)
- Confidence Loss (3,4)
Si noti che la loss function penalizza l'errore di classificazione solo se un oggetto è presente in quella cella della griglia (da qui la probabilità condizionale di classe discussa in precedenza). Inoltre, penalizza l'errore relativo alle cordinate della boundary box solo per la box che ha l'IOU più alto di ogni altro predittore di tutti i predittori in quella cella della griglia).
Per evitare di incorrere nell’overfitting del modello è stato utilizzato un dropout layer con un rate del 50% dopo il primo FC layer per prevenire la co-adaptation (ovvero quando diverse unità nascoste in una rete neurale hanno un comportamento altamente correlato ) tra i layers. In più c'è stato l'augmentation del dataset introducendo uno scaling e traslazione randomica pari al 20%. In più è stato randomicamente modificata la luminosità e la saturazione dell’immagine di un fattore pari a 1.5 considerando lo spazio di colori HSV.
Per i risultati ottenuti dagli autori del paper vi lascio il link dove potete scaricare la pubblicazione ufficiale in inglese e approfondire: https://arxiv.org/pdf/1506.02640.pdf.