Spiegazione della funzione di perdita Yolo


16

Sto cercando di capire la funzione di perdita di Yolo v2:

λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ijobj[(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2+i=0S21iobjcclasses(pi(c)p^i(c))2

Se qualcuno può dettagliare la funzione.


5
nessuno può aiutarti senza contesto ... almeno dicci di che carta proviene.
bdeonovic,

1
"Non capisco" e "dettagliare la funzione" sono eccessivamente ampi. Prova a identificare domande particolari. Nota che ci sono numerose questioni relative alla Yolo già , alcuni dei quali possono fornire con almeno una parte di ciò che cercate
Glen_b -Reinstate Monica

1
Vorrei aggiungere la mia risposta se hai indicato ciò che non è chiaro da questa eccellente spiegazione: medium.com/@jonathan_hui/…
Aksakal

1
In questo blog qui c'è una spiegazione grafica dettagliata di yolo e yolov2. Risponde alla domanda relativa alla funzione di perdita. Ifind è molto utile per i principianti e gli utenti più esperti.
MBoaretto,

Risposte:


18

Spiegazione dei diversi termini:

  • Le costanti 3 sono solo costanti per tenere conto di più aspetti della funzione di perdita. Nell'articolo è il più alto per avere più importanza nel primo termineλ c o o r dλλcoord
  • La previsione di YOLO è un vettore : previsioni bbox per ciascuna cella della griglia e previsione della classe per ciascuna cella della griglia (dove è il numero di classi). Le 5 uscite bbox della casella j della cella i sono coordinate del centro tte della bbox , altezza , larghezza e un indice di confidenzaB C C x i jSS(B5+C)BCCxij h i j w i j C i jyijhijwijCij
  • Immagino che i valori con un cappello siano quelli veri letti dall'etichetta e quelli senza cappello siano quelli previsti. Quindi qual è il valore reale dall'etichetta per il punteggio di confidenza per ogni bbox ? È l'intersezione sull'unione del riquadro di delimitazione previsto con quello dell'etichetta.C^ij
  • 1i01iobj è quando c'è un oggetto nella cella e altrove1i0
  • ji11ijobj "indica che il predittore del riquadro di limitazione nella cella è responsabile di tale previsione". In altre parole, è uguale a se c'è un oggetto nella cella e la fiducia dei predittori di questa cella è la più alta tra tutti i predittori di questa cella. è quasi lo stesso tranne per il valore 1 quando non ci sono oggetti nella cellaji1j 1 n o o b j i j iij1ijnoobji

Nota che ho usato due indici e per ogni previsioni Bbox, questo non è il caso in questo articolo, perché c'è sempre un fattore o quindi non esiste un'interpretazione ambigua: il scelto è quello corrispondente al punteggio di confidenza più alto in quella cella.j 1 o b j i jij1ijobj j1ijnoobjj

Spiegazione più generale di ogni termine della somma:

  1. questo termine penalizza la cattiva localizzazione del centro delle cellule
  2. questo termine penalizza il rettangolo di selezione con altezza e larghezza imprecise. La radice quadrata è presente in modo tale che gli errori nelle piccole scatole di delimitazione siano più penalizzanti degli errori nelle grandi scatole di delimitazione.
  3. questo termine cerca di rendere il punteggio di confidenza uguale all'IOU tra l'oggetto e la previsione quando c'è un oggetto
  4. Cerca di ottenere un punteggio di confidenza vicino a quando non ci sono oggetti nella cella0
  5. Questa è una semplice perdita di classificazione (non spiegata nell'articolo)

1
Il secondo punto dovrebbe essere B*(5+C)? Questo è il caso di YOLO v3.
sachinruk,

@sachinruk questo riflette i cambiamenti nel modello tra l'originale YOLO ed è v2 e v3.
David Refaeli,

12

λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ijobj[(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2+i=0S21iobjcclasses(pi(c)p^i(c))2

La funzione di perdita YOLOv2 non sembra spaventosa? In realtà non lo è! È una delle funzioni di perdita più audaci e intelligenti in circolazione.

Diamo prima un'occhiata a ciò che la rete prevede realmente.

Se ricapitoliamo, YOLOv2 prevede rilevamenti su una mappa caratteristica 13x13, quindi in totale abbiamo 169 mappe / celle.

Abbiamo 5 scatole di ancoraggio. Per ogni casella di ancoraggio abbiamo bisogno del punteggio di obiettività-fiducia (se è stato trovato qualche oggetto?), 4 coordinate ( e ) per la casella di ancoraggio e 20 classi principali. Questo può essere visto grossolanamente come 20 coordinate, 5 punteggi di confidenza e 100 probabilità di classe per tutte e 5 le previsioni del riquadro di ancoraggio messe insieme.tx,ty,tw,th

Abbiamo alcune cose di cui preoccuparsi:

  • xi,yi , che è la posizione del centroide della scatola di ancoraggio
  • wi,hi , ovvero la larghezza e l'altezza della scatola di ancoraggio
  • Ci , che è l' obiettività , ovvero il punteggio di confidenza del fatto che esista o meno un oggetto, e
  • pi(c) , che è la perdita di classificazione.
  • Non abbiamo solo bisogno di addestrare la rete per rilevare un oggetto se c'è un oggetto in una cella, ma dobbiamo anche punire la rete, se prevede un oggetto in una cella, quando non ce n'è. Come facciamo questo? Usiamo una maschera ( e ) per ogni cella. Se originariamente esisteva un oggetto è 1 e le altre celle senza oggetto sono 0. è solo inverso di , dove è 1 se non c'era nessun oggetto nella cella e 0 se c'era.𝟙iobj𝟙inoobj𝟙iobj 𝟙 n o o b j i 𝟙 o b j i𝟙inoobj𝟙iobj
  • Dobbiamo farlo per tutte le 169 celle e
  • Dobbiamo farlo 5 volte (per ogni scatola di ancoraggio).

Tutte le perdite sono errori al quadrato medio , ad eccezione della perdita di classificazione, che utilizza la funzione di entropia incrociata .

Ora, rompiamo il codice nell'immagine.

  • Dobbiamo calcolare le perdite per ogni scatola di ancoraggio (5 in totale)

    • j=0B rappresenta questa parte, dove B = 4 (5 - 1, poiché l'indice inizia da 0)
  • Dobbiamo farlo per ciascuna delle celle 13x13 dove S = 12 (poiché iniziamo l'indice da 0)

    • i=0S2 rappresenta questa parte.
  • 𝟙ijobj è 1 quando c'è un oggetto nella cella , altrimenti 0.i

  • 𝟙ijnoobj è 1 quando non ci sono oggetti nella cella , altrimenti 0.i
  • 𝟙iobj è 1 quando è prevista una classe particolare, altrimenti 0.
  • λ sono costanti. λ è il più alto per le coordinate al fine di focalizzarci maggiormente sul rilevamento (ricorda, in YOLOv2, prima lo addestriamo per il riconoscimento e poi per il rilevamento, penalizzare pesantemente per il riconoscimento è una perdita di tempo, piuttosto ci concentriamo su come ottenere i migliori box di delimitazione!)
  • Possiamo anche notare che sono in radice quadrata. Questo viene fatto per penalizzare le scatole di delimitazione più piccole in quanto abbiamo bisogno di una previsione migliore su oggetti più piccoli rispetto a oggetti più grandi (chiamata dell'autore). Dai un'occhiata alla tabella qui sotto e osserva come vengono puniti di più i valori più piccoli se seguiamo il metodo "radice quadrata" (guarda il punto di flesso quando abbiamo 0,3 e 0,2 come valori di input) (PS: ho mantenuto il rapporto di var1 e var2 stesso solo per spiegazione):wi,hi

        var1 | var2 | (var1 - var2) ^ 2 | (sqrtvar1 - sqrtvar2) ^ 2

        0.0300 | 0,020 | 9.99e-05 | 0.001

        0,0330 | 0.022 | 0,00012 | 0,0011

        0,0693 | 0,046 | 0.000533 | 0,00,233 mila

        0,2148 | 0.143 | 0,00512 | 0,00,723 mila

        0.3030 | 0,202 | 0,01 | 0.01

        0.8808 | 0,587 | 0,0862 | 0,0296

        4.4920 | 2.994 | 2.2421 | 0,1512

Non così spaventoso, giusto!

Leggi QUI per ulteriori dettagli.


1
I e j in \ sum dovrebbero iniziare da 1 invece di 0?
webbertiger

1
Sì, è corretto webertiger, ho aggiornato la risposta di conseguenza. Grazie!
RShravan

Non è 1 quando c'è un oggetto nella cella i del riquadro di delimitazione j? e non per tutti j? come scegliamo quale j impostare su uno e il resto su zero. cioè qual è la scala / ancora corretta dove è accesa. 1ijobj
sachinruk,

1
Credo che S dovrebbe essere ancora 13, ma se la somma inizia tra 0 dovrebbe finire inS21
Julian,

3
@RShravan, dici: "Tutte le perdite sono errori al quadrato medio, tranne la perdita di classificazione, che utilizza la funzione entropia incrociata". Potresti spiegare? In questa equazione, sembra anche MSE. Grazie in anticipo
Julian

3

La tua funzione di perdita è per YOLO v1 e non per YOLO v2. Sono stato anche confuso con la differenza nelle due funzioni di perdita e sembra che molte persone lo siano: https://groups.google.com/forum/#!topic/darknet/TJ4dN9R4iJk

Il documento YOLOv2 spiega la differenza di architettura rispetto a YOLOv1 come segue:

Rimuoviamo i livelli completamente collegati da YOLO (v1) e utilizziamo i riquadri di ancoraggio per prevedere i riquadri di delimitazione ... Quando passiamo ai riquadri di ancoraggio, disaccoppiamo anche il meccanismo di predizione della classe dalla posizione spaziale e prediamo invece classe e obiettività per ogni ancoraggio.

Ciò significa che la probabilità di confidenza sopra dovrebbe dipendere non solo da e ma anche da un indice di anchor box, diciamo . Pertanto, la perdita deve essere diversa da quella sopra. Sfortunatamente, la carta YOLOv2 non afferma esplicitamente la sua funzione di perdita.pi(c)icj

Cerco di indovinare la funzione di perdita di YOLOv2 e di discuterne qui: https://fairyonice.github.io/Part_4_Object_Detection_with_Yolo_using_VOC_2012_data_loss.html


1

Ecco la mia nota di studio

  1. Funzione di perdita: errore di somma quadrata

    un. Motivo: facile da ottimizzare b. Problema: (1) non si allinea perfettamente con il nostro obiettivo di massimizzare la precisione media. (2) In ogni immagine, molte celle della griglia non contengono alcun oggetto. Questo spinge i punteggi di confidenza di quelle celle verso 0, spesso sopraffacendo il gradiente dalle celle che contengono un oggetto. c. Soluzione: aumentare la perdita derivante dalle previsioni delle coordinate del riquadro di delimitazione e ridurre la perdita derivante dalle previsioni di confidenza delle caselle che non contengono oggetti. Utilizziamo due parametri e = 0,5 d. L'errore di somma quadrata equivale ugualmente a pesare errori in scatole grandi e piccole

    λcoord=5
    λnoobj

  2. Solo un riquadro di selezione dovrebbe essere responsabile per ciascun oggetto. Assegniamo a un predittore il compito di predire un oggetto in base al quale la previsione ha l'IOU corrente più elevato con la verità di base.

un. Perdita dalla coordinata del riquadro associato (x, y) Si noti che la perdita proviene da un riquadro di delimitazione da una cella della griglia. Anche se obj non nella cella della griglia come verità di base.

{λcoordi=0S2[(xix^i)2+(yiyi^)2]responsible bounding box0 other

b. Perdita da larghezza w e altezza h. Si noti che la perdita proviene da un riquadro di delimitazione da una cella della griglia, anche se l'oggetto non si trova nella cella della griglia come verità di base.

{λcoordi=0S2[(wiw^i)2+(hih^i)2]responsible bounding box0 other

c. Perdita dalla fiducia in ogni riquadro rilegato. Non che la perdita provenga da un riquadro di delimitazione da una griglia cel, anche se l'oggetto non si trova nella cella della griglia come verità di base.

{i=0S2(CiC^i)2obj in grid cell and responsible bounding boxλnoobji=0S2(CiC^i)2obj not in grid cell and responsible bounding box0other
d. Perdita dalla probabilità di classe della cella della griglia , solo quando l'oggetto è nella cella della griglia come verità fondamentale.

{i=0S2cclasses(pi(c)p^i(c))2obj in grid cell0other

La funzione di perdita penalizza la classificazione solo se obj è presente nella cella della griglia. Penalizza anche le coordinate del riquadro di delimitazione se quella casella è responsabile del riquadro di terra (IOU più elevato)


Domanda su "C", nel documento, la fiducia è il valore oggetto o nessun oggetto emesso moltiplicare per l'IOU; è solo per il tempo di prova o è utilizzato anche per la funzione di costo di addestramento? Pensavo di sottrarre il valore C dall'output e dall'etichetta (proprio come abbiamo fatto con i valori della griglia), ma non è corretto?
Moondra,

0

La formula di perdita che hai scritto riguarda la perdita di carta originale YOLO , non la perdita v2 o v3.

Ci sono alcune differenze importanti tra le versioni. Suggerisco di leggere i documenti o di controllare le implementazioni del codice. Documenti: v2 , v3 .

Alcune differenze principali che ho notato:

  • La probabilità di classe viene calcolata per rettangolo di selezione (quindi l'output è ora S ∗ S ∗ B * (5 + C) anziché S S (B * 5 + C))

  • Le coordinate del riquadro di delimitazione ora hanno una rappresentazione diversa

  • Nella v3 usano 3 scatole attraverso 3 diverse "scale"

Puoi provare ad entrare nei dettagli nitidi della perdita, sia guardando l'implementazione python / keras v2 , v3 (cerca la funzione yolo_loss) o direttamente l'implementazione c v3 (cerca delta_yolo_box e delta_yolo_class).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.