Histogram zorientowanych gradientów (HOG) w Dlib
histogram zorientowanych gradientów (HOG) jest deskryptorem funkcji używanym w komputerowym widzeniu i przetwarzaniu obrazu w celu wykrywania obiektów. Ideą HOG jest wyodrębnienie funkcji do wektora i wprowadzenie ich do algorytmu klasyfikacji, takiego jak maszyna wektorów pomocniczych, która oceni, czy twarz (lub jakikolwiek obiekt, który uczysz ją rozpoznawać) jest obecna w regionie, czy nie. W deskryptorze funkcji Wieprza jako cechy stosuje się rozkład ( histogramy ) kierunków gradientów ( gradientów zorientowanych). Gradienty (pochodne x i y ) obrazu są użyteczne, ponieważ wielkość gradientów wokół krawędzi i narożników jest duża (obszary nagłych zmian intensywności) i wiemy, że krawędzie i narożniki zawierają o wiele więcej informacji na temat kształtu obiektu niż obszary płaskie.
w oryginalnym artykule proces został wdrożony do wykrywania ludzkiego ciała, a łańcuch wykrywania był następujący :

wykrywanie twarzy z obrazu za pomocą metody Hog wymaga następujących kroków :-
- Oblicz obrazy gradientu
- Oblicz obrazy gradientu
- normalizacja bloku
- podanie wektora do SVM
Oblicz obrazy gradientu: Pierwszym krokiem jest obliczenie gradientów poziomych i pionowych obrazu, filtrując obraz za pomocą następujących jąder :

: jądra do obliczenia gradientu
tutaj obrazy wejściowe muszą być tego samego rozmiaru o stałym współczynniku kształtu, takim jak 64×128, 100×200 lub 128×256, ale nie 101×205.


gradientowy obraz usunął wiele nieistotnych informacji (np. stałe kolorowe tło ), ale podświetlone kontury. Nadal możemy zidentyfikować obraz. Przy każdym pikselu gradient ma wielkość i kierunek.
Oblicz Wieprza: obraz jest następnie dzielony na komórki 8×8, aby zapewnić zwartą reprezentację i sprawić, że nasz wieprz będzie bardziej odporny na hałas. Następnie obliczamy Wieprza dla każdej z tych komórek.

ys. 9: 8×8 komórek Wieprza. Obraz jest skalowany 4x do wyświetlenia (https://www.learnopencv.com/wp-content/uploads/2016/11/hog-cells.png)
aby oszacować kierunek gradientu wewnątrz regionu, po prostu budujemy histogram spośród 64 wartości kierunków gradientu (8×8) i ich wielkości (kolejne 64 wartości) wewnątrz każdego regionu. Następnym krokiem jest utworzenie histogramu gradientów w tych komórkach 8×8. Histogram zawiera 9 pojemników odpowiadających kątom 0, 20, 40 … 160.
gdy zbudujemy Wieprza, to powstaną 3 przypadki:
- co jeśli kąt jest mniejszy niż 160° a nie w połowie drogi między 2 klasami. Następnie w takich przypadkach kąt zostanie dodany w odpowiedniej kategorii Wieprza.
- co jeśli kąt jest mniejszy niż 160° i dokładnie pomiędzy 2 klasami. Wtedy w takich przypadkach bierzemy pod uwagę równy udział do 2 najbliższych klas i dzielimy wielkość na 2
- co jeśli kąt jest większy niż 160°. Następnie w takich przypadkach uważamy, że piksel przyczynił się proporcjonalnie do 160° i do 0°.

na rys. 10 piksel otoczony kolorem niebieskim ma kąt (kierunek) 80 stopni i wielkość 2. Więc dodaje 2 do piątego pojemnika, tak jak następuje pierwszy przypadek. Gradient w pikselu otoczonym kolorem czerwonym ma kąt 10 stopni i wielkość 4. Ponieważ 10 stopni jest w połowie drogi między 0 a 20, głos piksela dzieli się równomiernie na dwa pojemniki, jak następuje po drugim przypadku.

ys. 11:(https://www.learnopencv.com/wp-content/uploads/2016/12/hog-histogram-2.png)
na rys. 11 piksel o kącie 165 stopni przyczynia się proporcjonalnie do kosza 0 stopni i kosza 160 stopni, zgodnie z trzecim przypadkiem.
wieprz wygląda tak dla każdej komórki 8×8 jak (ryc. 12).

normalizacja bloku : w końcu można zastosować blok 16×16 w celu normalizacji obrazu i uczynienia go niezmiennym dla oświetlenia. Zastosowanie bloku 16×16 oznacza, że obraz jest ciemniejszy, dzieląc wszystkie wartości pikseli przez 2, a więc wielkość gradientu zmieni się o połowę, a zatem wartości histogramu zmienią się o połowę. Idealnie, chcemy, aby nasz deskryptor był niezależny od zmian oświetlenia.
podawanie wektora do SVM: blok 16×16 ma 4 histogramy, które można połączyć, tworząc wektor 36 x 1 elementowy. Wreszcie, wszystkie wektory 36×1 są połączone w duży wektor, który będzie naszym wektorem funkcji, na którym możemy wytrenować miękką SVM i przewidzieć twarz Na obrazie.
w Dlib obecny jest wytrenowany model do wykrywania twarzy wystarczy utworzyć obiekt tego modelu.
więc to koniec przewidywania twarzy za pomocą Wieprza za pomocą Dlib.
wnioski
zawsze toczy się ogromna debata, która jest lepsza w wykrywaniu twarzy haar Cascade classifier lub detektora twarzy opartego na Wieprzu. Dlib wyprzedza haar cascade classifier pod względem implementacji, szybkości i dokładności. Istnieje kilka korzyści z korzystania z klasyfikatora Wieprza. Najpierw szkolenie odbywa się za pomocą przesuwanego podokiennika na obrazie, więc nie jest wymagane podpróbkowanie i manipulacja parametrami, jak to jest w klasyfikatorze Haar. Dzięki temu wykrywanie twarzy HOG + SVM dlib jest łatwiejsze w użyciu i szybsze w treningu. Należy pamiętać, że HOG ma większą dokładność wykrywania twarzy niż klasyfikator kaskadowy Haar. Haar Cascade classifier zrobić więcej fałszywie dodatnie przewidywania na twarzach niż HOG oparte Face detector.
Jeśli chcesz zobaczyć dokładność haar Cascade classifier vs wieprz oparty face detector można przeczytać tutaj.