Istogramma di gradienti orientati (HOG) in Dlib
L’istogramma di gradienti orientati (HOG) è un descrittore di funzionalità utilizzato nella visione artificiale e nell’elaborazione delle immagini ai fini del rilevamento di oggetti. L’idea alla base di HOG è di estrarre le funzionalità in un vettore e alimentarlo in un algoritmo di classificazione come una macchina vettoriale di supporto che valuterà se una faccia (o qualsiasi oggetto che si allena a riconoscere effettivamente) è presente in una regione o meno. Nel descrittore di funzionalità HOG, la distribuzione ( istogrammi ) delle direzioni dei gradienti ( gradienti orientati ) viene utilizzata come funzionalità. I gradienti (derivati x e y ) di un’immagine sono utili perché la grandezza dei gradienti è grande intorno ai bordi e agli angoli ( regioni di bruschi cambiamenti di intensità) e sappiamo che i bordi e gli angoli contengono molte più informazioni sulla forma dell’oggetto rispetto alle regioni piatte.
Nel documento originale, il processo è stato implementato per il rilevamento del corpo umano e la catena di rilevamento è stata la seguente :

la Rilevazione di un volto da un’immagine utilizzando HOG metodo richiede i seguenti passaggi da seguire :-
- Calcolare il Gradiente di Immagini
- Calcolare la HOG
- Blocco di normalizzazione
- Alimentazione il vettore di SVM
Calcolare il Gradiente di Immagini: Il primo passo è quello di calcolare la posizione orizzontale e verticale sfumature dell’immagine, filtrando l’immagine con il seguente kernel :

Ecco le immagini in ingresso deve essere delle stesse dimensioni, per avere un rapporto di aspetto fisso come 64×128, 100×200 o 128×256, ma non 101×205.


L’immagine del gradiente ha rimosso molte informazioni non essenziali ( ad esempio sfondo colorato costante ), ma ha evidenziato i contorni. Possiamo ancora identificare l’immagine. Ad ogni pixel, il gradiente ha una grandezza e una direzione.
Calcola il MAIALE: L’immagine viene quindi divisa in celle 8×8 per offrire una rappresentazione compatta e rendere il nostro MAIALE più robusto al rumore. Quindi, calcoliamo un MAIALE per ciascuna di queste celle.

Per stimare la direzione del gradiente all’interno di una regione, abbiamo semplicemente costruire un istogramma tra i 64 valori del gradiente indicazioni (8×8) e la loro grandezza (un altro 64 valori) all’interno di ogni regione. Il prossimo passo è creare un istogramma di gradienti in queste celle 8×8. L’istogramma contiene 9 bidoni corrispondenti agli angoli 0, 20, 40 … 160.
Quando costruiamo il MAIALE, sorgeranno 3 casi:
- cosa succede se l’angolo è inferiore a 160° e non a metà strada tra 2 classi. Quindi in questi casi l’angolo verrà aggiunto nella giusta categoria del MAIALE.
- cosa succede se l’angolo è inferiore a 160° e esattamente tra 2 classi. Quindi in questi casi consideriamo un contributo uguale alle 2 classi più vicine e dividiamo la magnitudine in 2
- cosa succede se l’angolo è maggiore di 160°. Quindi, in questi casi, consideriamo che il pixel ha contribuito proporzionalmente a 160° e a 0°.

In fig. 10 il pixel circondato in blu ha un angolo (direzione) di 80 gradi e magnitudine di 2. Quindi aggiunge 2 al 5 ° bin come segue il primo caso. Il gradiente al pixel circondato usando il rosso ha un angolo di 10 gradi e una magnitudine di 4. Poiché 10 gradi è a metà strada tra 0 e 20, il voto del pixel si divide uniformemente nei due bidoni come segue il secondo caso.

In fig. 11 il pixel con angolo di 165 gradi contribuisce proporzionalmente al contenitore di 0 gradi e al contenitore di 160 gradi come segue il terzo caso.
Il MAIALE si presenta così per ogni cella 8×8 come (fig 12).

Blocco di normalizzazione : Infine, una 16×16 blocco può essere applicato al fine di normalizzare l’immagine e la rendono invariante per l’illuminazione. L’applicazione del blocco 16×16 significa che stiamo rendendo l’immagine più scura dividendo tutti i valori dei pixel per 2, quindi la magnitudine del gradiente cambierà della metà e quindi i valori dell’istogramma cambieranno della metà. Idealmente, vogliamo che il nostro descrittore sia indipendente dalle variazioni di illuminazione.
Alimentazione del vettore in SVM: un blocco 16×16 ha 4 istogrammi che possono essere concatenati per formare un vettore di elementi 36 x 1. Infine, tutti i vettori 36×1 sono concatenati in un vettore grande che sarà il nostro vettore di funzionalità, sul quale possiamo allenare un SVM morbido e prevedere la faccia in un’immagine.
In Dlib è presente un modello addestrato per rilevare i volti, devi solo creare un oggetto di quel modello.
Quindi è la fine di prevedere i volti usando HOG usando Dlib.
CONCLUSIONE
C’è un enorme dibattito sempre in corso che è meglio nel rilevare facce Haar cascade classifier o HOG based face detector. Dlib è in vantaggio rispetto al classificatore a cascata Haar sull’implementazione, sulla velocità e sulla precisione. Ci sono diversi vantaggi nell’utilizzo del classificatore HOG. Innanzitutto l’allenamento viene eseguito utilizzando una sotto-finestra scorrevole sull’immagine, quindi non è richiesto alcun sottocampionamento e manipolazione dei parametri come nel classificatore Haar. Ciò rende il rilevamento dei volti HOG + SVM di Dlib più facile da usare e più veloce da addestrare. Si noti che HOG ha una maggiore precisione per il rilevamento dei volti rispetto al classificatore a cascata Haar. Haar cascade classifier fare più falsa previsione positiva sui volti di HOG based face detector.
Se vuoi vedere la precisione del classificatore Haar cascade vs HOG based face detector puoi leggere qui.