Histogramm orientierter Gradienten (HOG) in Dlib
Das Histogramm orientierter Gradienten (HOG) ist ein Merkmalsdeskriptor, der in der Computer Vision und Bildverarbeitung zum Zwecke der Objekterkennung verwendet wird. Die Idee hinter HOG ist es, Merkmale in einen Vektor zu extrahieren und sie in einen Klassifizierungsalgorithmus wie eine Support-Vektor-Maschine einzuspeisen, die bewertet, ob ein Gesicht (oder ein Objekt, das Sie trainieren, um es tatsächlich zu erkennen) in einer Region vorhanden ist oder nicht. Im HOG-Feature-Deskriptor wird die Verteilung ( Histogramme ) von Gradientenrichtungen ( orientierte Gradienten ) als Features verwendet. Gradienten (x- und y-Ableitungen) eines Bildes sind nützlich, da die Größe der Gradienten an Kanten und Ecken (Regionen mit abrupten Intensitätsänderungen) groß ist und wir wissen, dass Kanten und Ecken viel mehr Informationen über die Objektform enthalten als flache Regionen.
In der Originalarbeit wurde der Prozess für die Erkennung des menschlichen Körpers implementiert, und die Erkennungskette war die folgende :

Das Erkennen eines Gesichts aus einem Bild mit der HOG-Methode erfordert die folgenden Schritte: –
- Berechnen Sie die Gradientenbilder
- Berechnen Sie das HOG
- Blocknormalisierung
- Einspeisen des Vektors in SVM
Berechnen Sie die Gradientenbilder: Der erste Schritt besteht darin, die horizontalen und vertikalen Verläufe des Bildes zu berechnen, indem das Bild mit den folgenden Kerneln gefiltert wird:

6: Kernel zur Berechnung des Gradienten
Hier müssen die Eingabebilder die gleiche Größe haben und ein festes Seitenverhältnis wie 64×128, 100 ×200 oder 128 ×256 haben, jedoch nicht 101×205.


Das Verlaufsbild hat viele nicht wesentliche Informationen entfernt (z. B. konstanter farbiger Hintergrund ), aber Umrisse hervorgehoben. Trotzdem können wir das Bild identifizieren. Bei jedem Pixel hat der Gradient eine Größe und eine Richtung.
Berechne das SCHWEIN : Das Bild wird dann in 8×8 Zellen unterteilt, um eine kompakte Darstellung zu bieten und unser Schwein robuster gegen Rauschen zu machen. Dann berechnen wir für jede dieser Zellen ein SCHWEIN.

Um die Richtung eines Gradienten innerhalb einer Region abzuschätzen, erstellen wir einfach ein Histogramm aus den 64 Werten der Gradientenrichtungen (8×8) und ihrer Größe (weitere 64 Werte) innerhalb jeder Region. Der nächste Schritt besteht darin, ein Histogramm der Verläufe in diesen 8 × 8-Zellen zu erstellen. Das Histogramm enthält 9 Bins, die den Winkeln 0, 20, 40 … 160 entsprechen.
Wenn wir das SCHWEIN bauen, entstehen 3 Fälle:
- Was ist, wenn der Winkel kleiner als 160° ist und nicht auf halbem Weg zwischen 2 Klassen liegt. Dann wird in solchen Fällen der Winkel in der richtigen Kategorie des SCHWEINS hinzugefügt.
- Was ist, wenn der Winkel kleiner als 160° ist und genau zwischen 2 Klassen liegt. Dann betrachten wir in solchen Fällen einen gleichen Beitrag zu den 2 nächsten Klassen und teilen die Größe in 2
- was ist, wenn der Winkel größer als 160 ° ist. Dann betrachten wir in solchen Fällen, dass das Pixel proportional zu 160 ° und zu 0 ° beigetragen hat.

In Abb. 10 das blau eingekreiste Pixel hat einen Winkel (Richtung) von 80 Grad und eine Magnitude von 2. Es fügt also 2 zum 5. Behälter hinzu, wie es dem ersten Fall folgt. Der Gradient an dem mit Rot eingekreisten Pixel hat einen Winkel von 10 Grad und eine Größe von 4. Da 10 Grad auf halbem Weg zwischen 0 und 20 liegt, teilt sich die Stimme des Pixels gleichmäßig in die beiden Bins auf, wie es dem zweiten Fall folgt.

In Abb. 11 das Pixel mit dem Winkel 165 Grad trägt proportional zum 0-Grad-Bin und dem 160-Grad-Bin bei, wie es dem dritten Fall folgt.
Das SCHWEIN sieht für jede 8×8-Zelle wie folgt aus (Abb. 12).

Blocknormalisierung : Schließlich kann ein 16×16-Block angewendet werden, um das Bild zu normalisieren und es für die Beleuchtung invariant zu machen. Das Anwenden des 16×16-Blocks bedeutet, dass wir das Bild dunkler machen, indem wir alle Pixelwerte durch 2 dividieren, sodass sich die Gradientengröße um die Hälfte ändert und sich daher die Histogrammwerte um die Hälfte ändern. Im Idealfall möchten wir, dass unser Deskriptor unabhängig von Beleuchtungsvariationen ist.
Einspeisen des Vektors in SVM: Ein 16 × 16-Block hat 4 Histogramme, die zu einem 36 x 16-Elementvektor verkettet werden können. Schließlich werden alle 36×1-Vektoren zu einem großen Vektor verkettet, der unser Merkmalsvektor ist, auf dem wir eine weiche SVM trainieren und das Gesicht in einem Bild vorhersagen können.
In Dlib ist ein trainiertes Modell zur Erkennung von Gesichtern vorhanden, Sie müssen nur ein Objekt dieses Modells erstellen.
Das ist also das Ende der Vorhersage von Gesichtern mit HOG mit Dlib.
FAZIT
Es gibt immer eine große Debatte darüber, was bei der Erkennung von Gesichtern Haar Cascade Classifier oder HOG based Face Detector besser ist. Dlib ist dem Haar Cascade Classifier in Bezug auf Implementierung, Geschwindigkeit und Genauigkeit voraus. Die Verwendung des HOG-Klassifikators bietet mehrere Vorteile. Zuerst wird das Training mit einem verschiebbaren Unterfenster im Bild durchgeführt, sodass keine Unterabtastung und Parametermanipulation erforderlich ist, wie dies im Haar-Klassifikator der Fall ist. Dies macht die HOG + SVM-Gesichtserkennung von Dlib einfacher zu bedienen und schneller zu trainieren. Beachten Sie, dass HOG eine höhere Genauigkeit für die Gesichtserkennung als Haar Cascade Classifier hat. Der Haar-Kaskadenklassifikator macht mehr falsch positive Vorhersagen auf Gesichtern als der schweinebasierte Gesichtsdetektor.
Wenn Sie die Genauigkeit von Haar cascade Classifier vs HOG based face detector sehen möchten, können Sie hier lesen.