în acest post, vom afla detaliile histogramei gradienților orientați (HOG) descriptor de caracteristici. Vom afla ce este sub capotă și cum acest descriptor este calculat intern de OpenCV, MATLAB și alte pachete.
această postare face parte dintr-o serie pe care o scriu despre recunoașterea imaginilor și detectarea obiectelor.
lista completă a tutorialelor din această serie este prezentată mai jos:
- recunoașterea imaginii folosind tehnici tradiționale de viziune computerizată : Partea 1
- histograma gradienților orientați : Partea 2
- exemplu de cod pentru recunoașterea imaginilor : Partea 3
- instruirea unui detector de ochi mai bun: partea 4a
- detectarea obiectelor folosind tehnici tradiționale de viziune pe Computer : partea 4b
- cum să vă antrenați și să testați propriul detector de obiecte OpenCV : Partea 5
- recunoașterea imaginilor folosind învățarea profundă : Partea 6
- Introducere în rețelele neuronale
- înțelegerea rețelelor neuronale Feedforward
- recunoașterea imaginilor utilizând rețele neuronale convoluționale
- detectarea obiectelor folosind învățarea profundă: Parte 7
multe lucruri par dificile și misterioase. Dar odată ce vă faceți timp pentru a le deconstrui, misterul este înlocuit de măiestrie și asta este ceea ce urmărim. Dacă sunteți un începător și sunt găsirea calculator viziune greu și misterios, amintiți-vă doar următoarele
Î: Cum mananci un elefant ?
A : Câte o mușcătură pe rând!
- ce este un Descriptor de caracteristici?
- cum se calculează histograma gradienților orientați ?
- Pasul 1 : Preprocesarea
- Pasul 2: calculați imaginile gradientului
- Pasul 3: Se calculează histograma gradienților în 8 celule 8 de la sută
- Pasul 4 : 16 16 bloc de normalizare
- Pasul 5 : calculați vectorul caracteristicii HOG
- vizualizarea histogramei gradienților orientați
- Aboneaza-Te & Descarca Codul
ce este un Descriptor de caracteristici?
un descriptor de caracteristici este o reprezentare a unei imagini sau a unui patch de imagine care simplifică imaginea prin extragerea informațiilor utile și aruncarea informațiilor străine.
de obicei, un descriptor de caracteristici convertește o imagine de dimensiune lățime x înălțime x 3 (canale ) într-un vector de caracteristici / matrice de lungime n. în cazul descriptor de caracteristici HOG, imaginea de intrare are dimensiunea 64 x 128 x 3, iar vectorul de caracteristici de ieșire are lungimea 3780.
rețineți că Descriptorul de porc poate fi calculat pentru alte dimensiuni, dar în acest post mă lipesc de numerele prezentate în lucrarea originală, astfel încât să puteți înțelege cu ușurință conceptul cu un exemplu concret.
toate acestea sună bine, dar ce este „util” și ce este „străin” ? Pentru a defini „util”, trebuie să știm pentru ce este” util”? În mod evident, vectorul de caracteristici nu este util în scopul vizualizării imaginii. Dar, este foarte util pentru sarcini precum recunoașterea imaginilor și detectarea obiectelor. Vectorul de caracteristici produs de acești algoritmi atunci când este alimentat într-un algoritm de clasificare a imaginilor, cum ar fi Support Vector Machine (SVM), produce rezultate bune.
dar, ce tipuri de” caracteristici ” sunt utile pentru sarcinile de clasificare ? Să discutăm acest punct folosind un exemplu. Să presupunem că vrem să construim un detector de obiecte care detectează butoanele cămășilor și paltoanelor.
un buton este circular ( poate arăta eliptic într-o imagine ) și are de obicei câteva găuri pentru cusut. Puteți rula un detector de margine pe imaginea unui buton și puteți spune cu ușurință dacă este un buton, pur și simplu uitându-vă doar la imaginea de margine. În acest caz, informațiile despre margine sunt „utile”, iar informațiile despre culoare nu sunt. În plus, caracteristicile trebuie, de asemenea, să aibă putere discriminatorie. De exemplu, caracteristicile bune extrase dintr-o imagine ar trebui să poată face diferența dintre butoane și alte obiecte circulare, cum ar fi monedele și anvelopele auto.
în descriptorul caracteristicii HOG, distribuția ( histogramele ) direcțiilor gradienților ( gradienții orientați ) sunt utilizate ca caracteristici. Gradienții ( derivații x și y ) ai unei imagini sunt utili deoarece magnitudinea gradienților este mare în jurul marginilor și colțurilor (regiuni cu schimbări bruște de intensitate ) și știm că marginile și colțurile împachetează mult mai multe informații despre forma obiectului decât regiunile plate.
cum se calculează histograma gradienților orientați ?
în această secțiune, vom intra în detaliile calculării descriptor caracteristică porc. Pentru a ilustra fiecare pas, vom folosi un patch al unei imagini.
Pasul 1 : Preprocesarea
așa cum am menționat anterior descriptor HOG caracteristică utilizat pentru detectarea pietonilor se calculează pe un 64 128 patch-uri de o imagine. Desigur, o imagine poate fi de orice dimensiune. De obicei patch-uri la mai multe scale sunt analizate în mai multe locații de imagine. Singura constrângere este că patch-urile analizate au un raport de aspect fix. În cazul nostru, patch-urile trebuie să aibă un raport de aspect de 1:2. De exemplu, acestea pot fi 100 de la 200 la 128 de la 256 la 1000 la 2000 la 101 la 205, dar nu și 101 la 205.
pentru a ilustra acest punct, am arătat o imagine mare de dimensiunea 720 475. Am selectat un plasture de dimensiune 100 200 pentru a calcula descriptorul nostru de caracteristici de porc. Acest plasture este decupată dintr-o imagine și redimensionate la 64 128. Acum suntem gata să calculăm Descriptorul de porc pentru acest patch de imagine.
lucrarea lui Dalal și Triggs menționează, de asemenea, corecția gamma ca o etapă de preprocesare, dar câștigurile de performanță sunt minore și astfel sărim pasul.
Pasul 2: calculați imaginile gradientului
pentru a calcula un descriptor de porc, trebuie să calculăm mai întâi gradienții orizontali și verticali; la urma urmei, vrem să calculăm histograma gradienților. Acest lucru este ușor de realizat prin filtrarea imaginii cu următoarele nuclee.
de asemenea, putem obține aceleași rezultate, folosind operatorul Sobel în OpenCV cu dimensiunea kernel-ului 1.
// C++ gradient calculation.// Read imageMat img = imread("bolt.png");img.convertTo(img, CV_32F, 1/255.0);// Calculate gradients gx, gyMat gx, gy;Sobel(img, gx, CV_32F, 1, 0, 1);Sobel(img, gy, CV_32F, 0, 1, 1);
# Python gradient calculation # Read imageim = cv2.imread('bolt.png')im = np.float32(im) / 255.0# Calculate gradientgx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)
apoi, putem găsi magnitudinea și direcția gradientului folosind următoarea formulă
dacă utilizați OpenCV, calculul se poate face folosind funcția cartToPolar așa cum se arată mai jos.
// C++ Calculate gradient magnitude and direction (in degrees)Mat mag, angle;cartToPolar(gx, gy, mag, angle, 1);
același cod în python arată astfel.
# Python Calculate gradient magnitude and direction ( in degrees )mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)
figura de mai jos prezintă gradienții.
observați că gradientul x se declanșează pe linii verticale și gradientul y pe linii orizontale. Magnitudinea de incendii gradient în cazul în care vreodată există o schimbare bruscă în intensitate. Nici unul dintre ei foc atunci când regiunea este buna. Am lăsat în mod deliberat imaginea care arată direcția gradientului, deoarece direcția arătată ca imagine nu transmite prea mult.
imaginea gradientului a eliminat o mulțime de informații neesențiale ( de exemplu, fundal colorat constant), dar a evidențiat contururi. Cu alte cuvinte, puteți să vă uitați la imaginea gradientului și să spuneți cu ușurință că există o persoană în imagine.
la fiecare pixel, gradientul are o magnitudine și o direcție. Pentru imaginile color, gradienții celor trei canale sunt evaluați ( așa cum se arată în figura de mai sus ). Magnitudinea gradientului la un pixel este maximul mărimii gradienților celor trei canale, iar unghiul este unghiul corespunzător gradientului maxim.
Pasul 3: Se calculează histograma gradienților în 8 celule 8 de la sută
în această etapă, imaginea este împărțită în 8 celule 8 și se calculează o histogramă de gradienți pentru fiecare 8 celule 8.
vom afla despre histograme într-o clipă, dar înainte de a merge acolo, să înțelegem mai întâi de ce am împărțit imaginea în 8 celule 8. Unul dintre motivele importante pentru a utiliza un descriptor de caracteristici pentru a descrie un patch al unei imagini este că oferă o reprezentare compactă. Un plasture de imagine 8 de la 8 la 8x8x3 conține valori de pixeli = 192. Gradientul acestui patch conține 2 valori (magnitudine și direcție ) pe pixel, care adaugă până la 8x8x2 = 128 numere.
până la sfârșitul acestei secțiuni vom vedea cum aceste 128 de numere sunt reprezentate folosind o histogramă de 9 bin care poate fi stocată ca o matrice de 9 numere. Nu numai că reprezentarea este mai compactă, calcularea unei histograme pe un plasture face ca această reprezentare să fie mai robustă la zgomot. Graidents individuale pot avea zgomot, dar o histogramă de peste 8 Oct 8 patch-uri face reprezentarea mult mai puțin sensibile la zgomot.
dar de ce 8 patch-uri de la 8 la 8 ? De ce nu 32 de la 32 ? Este o alegere de design informată de amploarea caracteristicilor pe care le căutăm. HOG a fost folosit inițial pentru detectarea pietonilor. 8 x8 celule într-o fotografie a unui pieton scalate la 64 x 128 sunt suficient de mari pentru a surprinde caracteristici interesante ( de exemplu, fața, partea superioară a capului etc. ).
histograma este în esență un vector (sau o matrice ) de 9 coșuri (numere ) corespunzătoare unghiurilor 0, 20, 40, 60 … 160.
să ne uităm la un 8 patch-uri 8 din imagine și să vedem cum arată gradienții.
dacă sunteți începător în viziunea computerului, imaginea din centru este foarte informativă. Acesta arată patch-ul imaginii suprapuse cu săgeți care arată gradientul-săgeata arată direcția gradientului și lungimea acestuia arată magnitudinea. Observați cum direcția săgeților indică direcția schimbării intensității și magnitudinea arată cât de mare este diferența.
în partea dreaptă, vedem numerele brute reprezentând gradienții din cele 8 celule 8 de la sută cu o diferență minoră — unghiurile sunt între 0 și 180 de grade în loc de 0 până la 360 de grade. Acestea sunt numite gradienți „nesemnați”, deoarece un gradient și este negativ sunt reprezentate de aceleași numere. Cu alte cuvinte, o săgeată de gradient și cea de 180 de grade opusă acesteia sunt considerate aceleași. Dar, de ce să nu folosiți 0 – 360 de grade ?
empiric s-a demonstrat că gradienții nesemnați funcționează mai bine decât gradienții semnați pentru detectarea pietonilor. Unele implementări ale HOG vă vor permite să specificați dacă doriți să utilizați degradeuri semnate.
următorul pas este de a crea o histogramă a gradienților în aceste 8 celule 8. Histograma conține 9 coșuri corespunzătoare unghiurilor 0, 20, 40 … 160. Figura următoare ilustrează procesul. Ne uităm la magnitudinea și direcția gradientului aceluiași plasture 8 inkt 8 ca în figura anterioară.
un coș este selectat pe baza direcției, iar votul ( valoarea care intră în coș ) este selectat pe baza mărimii. Să ne concentrăm mai întâi pe pixelul înconjurat în albastru. Are un unghi (direcție ) de 80 de grade și o magnitudine de 2. Deci, adaugă 2 la al 5-lea Coș. Gradientul pixelului înconjurat cu roșu are un unghi de 10 grade și o magnitudine de 4. Deoarece 10 grade este la jumătatea distanței dintre 0 și 20, votul pixelului se împarte uniform în cele două coșuri.
există încă un detaliu de care trebuie să fiți conștienți. Dacă unghiul este mai mare de 160 de grade, este între 160 și 180 și știm că unghiul se înfășoară în jurul echivalentului 0 și 180. Deci, în exemplul de mai jos, pixelul cu unghi de 165 de grade contribuie proporțional la coșul de 0 grade și la coșul de 160 de grade.
contribuțiile tuturor pixelilor din cele 8 celule 8 de la suta sunt adăugate pentru a crea histograma 9-bin. Pentru plasturele de mai sus, arată astfel
în reprezentarea noastră, axa y este de 0 grade. Puteți vedea histograma are o mulțime de greutate în apropiere de 0 și 180 de grade, care este doar un alt mod de a spune că în patch-uri gradienții sunt îndreptate fie în sus, fie în jos.
Pasul 4 : 16 16 bloc de normalizare
în pasul anterior, am creat o histogramă bazată pe gradientul imaginii. Gradienții unei imagini sunt sensibili la iluminarea generală. Dacă faceți imaginea mai întunecată împărțind toate valorile pixelilor la 2, magnitudinea gradientului se va schimba la jumătate și, prin urmare, valorile histogramei se vor schimba la jumătate.
în mod ideal, dorim ca descriptorul nostru să fie independent de variațiile de iluminare. Cu alte cuvinte, am dori să „normalizăm” histograma, astfel încât acestea să nu fie afectate de variațiile de iluminare.
înainte de a explica cum este normalizată histograma, să vedem cum este normalizat un vector de lungime 3.
să presupunem că avem un vector de culoare RGB . Lungimea acestui vector este $\sqrt{128^2 + 64^2 + 32^2} = 146.64$. Aceasta se mai numește norma L2 a vectorului. Împărțirea fiecărui element al acestui vector la 146,64 ne oferă un vector normalizat .
acum luați în considerare un alt vector în care elementele sunt de două ori valoarea primului vector 2 x = . Puteți lucra singur pentru a vedea că normalizarea va avea ca rezultat , care este aceeași cu versiunea normalizată a vectorului RGB original. Puteți vedea că normalizarea unui vector elimină scara.
acum, că știm cum să normalizăm un vector, s-ar putea să fiți tentați să credeți că, în timp ce calculați porcul, puteți normaliza pur și simplu histograma 9-1 la fel cum am normalizat vectorul 3-1 de mai sus. Nu este o idee rea,dar o idee mai bună este de a normaliza pe un bloc de dimensiuni mai mari de 16 de 16 de la 16.
un bloc de 16 x 16 are 4 histograme care pot fi concatenate pentru a forma un vector de 36 x 1 element și poate fi normalizat exact așa cum este normalizat un vector de 3 x 1. Fereastra este apoi mutată cu 8 pixeli (vezi animația ) și un vector normalizat de 36 XTX 1 este calculat pe această fereastră și procesul se repetă.
Pasul 5 : calculați vectorul caracteristicii HOG
pentru a calcula vectorul final al caracteristicii pentru întregul plasture de imagine, cei 36 de vectori 1 de la hectolitru sunt concatenați într-un vector gigant. Care este dimensiunea acestui vector ? Să calculăm
- câte poziții din cele 16 blocuri 16 de la untct avem ? Există 7 poziții orizontale și 15 verticale, ceea ce face un total de 7 x 15 = 105 poziții.
- fiecare bloc de 16 xtx16 este reprezentat de un vector de 36 xtx1. Deci, atunci când le concatenăm pe toate într-un singur vector gaint, obținem un vector dimensional 36 105 = 3780.
vizualizarea histogramei gradienților orientați
Descriptorul de porc al unui plasture de imagine este de obicei vizualizat prin reprezentarea grafică a histogramelor normalizate de la 9 la 1 la 8 la 8 la 8 celule. A se vedea imaginea de pe partea. Veți observa că direcția dominantă a histogramei surprinde forma persoanei, în special în jurul trunchiului și picioarelor.
din păcate, nu există o modalitate ușoară de a vizualiza Descriptorul de porc în OpenCV.