V tomto příspěvku jsme se dozvědět podrobnosti o Histogram Orientovaných Gradientů (HOG) feature deskriptor. Dozvíme se, co je pod kapotou a jak je tento deskriptor vypočítáván interně pomocí OpenCV, MATLAB a dalších balíčků.
tento příspěvek je součástí série, kterou píšu o rozpoznávání obrazu a detekci objektů.
kompletní seznam výukových programů v této sérii je uveden níže:
- rozpoznávání Obrazu pomocí tradiční Počítačové Vidění techniky : Část 1
- Histogram Orientovaných Gradientů : Část 2
- Příklad kódu pro rozpoznávání obrazu : Část 3
- Školení, lepší oční detektor: Část 4a
- detekce Objektů pomocí tradiční Počítačové Vidění techniky : Část 4b
- Jak trénovat a vyzkoušet své vlastní OpenCV detektor objekt : Část 5
- rozpoznávání Obrazu pomocí Hluboké Učení : Část 6
- Úvod do Neuronových Sítí
- Pochopení dopředných Sítí
- Rozpoznávání Obrazu pomocí Konvoluční Neuronové Sítě
- detekce Objektů pomocí Hluboké Učení : Část 7
hodně věcí vypadat těžké a tajemné. Ale jakmile si uděláte čas na jejich dekonstrukci, tajemství je nahrazeno mistrovstvím a to je to, po čem jdeme. Pokud jste začátečník a zjistíte, že počítačové vidění je těžké a tajemné, nezapomeňte na následující
otázka : jak jíte slona?
v : Jedno sousto za druhým!
- co je deskriptor funkce?
- jak vypočítat Histogram orientovaných gradientů ?
- Krok 1 : Předzpracování
- Krok 2: Vypočítejte obrázky gradientu
- Krok 3: Vypočítejte Histogram gradientů v 8×8 buňkách
- Krok 4 : 16×16 Blok Normalizace
- Krok 5: Vypočítejte vektor funkce HOG
- Vizualizace Histogram Orientovaných Gradientů
- Přihlásit Se K Odběru & Stáhnout Kód
co je deskriptor funkce?
feature deskriptor je reprezentace obrazu nebo obrazu patch, který zjednodušuje obraz extrahování užitečných informací a zahodit nadbytečné informace.
Typicky, feature deskriptor převádí obraz velikost šířka x výška x 3 (kanály ) pro funkce vektoru / pole délky n. V případě HOG feature deskriptor, vstupní obraz je o velikosti 64 x 128 x 3 a výstupní funkce vektor je délka 3780.
Mějte na paměti, že HOG deskriptor může být vypočtena pro jiné velikosti, ale v tomto příspěvku se budu držet čísla prezentovány v původní papír, takže můžete snadno pochopit pojem na konkrétním příkladě.
to vše zní dobře, ale co je „užitečné“ a co je „cizí“ ? Chcete-li definovat „užitečné“, musíme vědět, k čemu je „užitečné“? Je zřejmé, že vektor funkcí není užitečný pro účely prohlížení obrázku. Je však velmi užitečné pro úkoly, jako je rozpoznávání obrazu a detekce objektů. Vektor funkcí produkovaný těmito algoritmy, když je přiváděn do algoritmů klasifikace obrazu, jako je Support Vector Machine (SVM), přináší dobré výsledky.
ale jaké druhy „funkcí“ jsou užitečné pro klasifikační úkoly ? Pojďme diskutovat o tomto bodě na příkladu. Předpokládejme, že chceme vytvořit detektor objektů, který detekuje tlačítka košil a kabátů.
tlačítko je kruhové ( na obrázku může vypadat elipticky) a obvykle má několik otvorů pro šití. Na obrázku tlačítka můžete spustit detektor hran a snadno zjistit, zda se jedná o tlačítko, pouhým pohledem na samotný okrajový obrázek. V tomto případě jsou informace o hraně „užitečné“ a informace o barvě nejsou. Kromě toho musí mít funkce také diskriminační sílu. Například dobré funkce extrahované z obrázku by měly být schopny rozeznat rozdíl mezi tlačítky a jinými kruhovými předměty, jako jsou mince a pneumatiky automobilů.
v deskriptoru Hog feature se jako znaky používá distribuce ( histogramy ) směrů gradientů ( orientovaných gradientů). Přechody ( x a y deriváty ) obrazu jsou užitečné, protože velikost gradientů je velké kolem hrany a rohy ( regiony náhlých změnách intenzity ) a víme, že hrany a rohy pack v mnohem více informací o objektu tvar než rovný regionů.
jak vypočítat Histogram orientovaných gradientů ?
v této části se podíváme na podrobnosti výpočtu deskriptoru funkce HOG. Pro ilustraci každého kroku použijeme opravu obrázku.
Krok 1 : Předzpracování
jak již bylo zmíněno, deskriptor funkce HOG používaný pro detekci chodců se vypočítá na 64×128 náplasti obrazu. Obrázek může mít samozřejmě jakoukoli velikost. Typicky jsou záplaty ve více měřítcích analyzovány na mnoha místech obrázků. Jediným omezením je, že analyzované záplaty mají pevný poměr stran. V našem případě musí mít záplaty poměr stran 1: 2. Například mohou být 100×200, 128×256 nebo 1000×2000, ale ne 101×205.
pro ilustraci tohoto bodu jsem ukázal velký obrázek o velikosti 720×475. Vybrali jsme náplast velikosti 100×200 pro výpočet našeho deskriptoru funkce HOG. Tato oprava je oříznuta z obrázku a změněna na 64×128. Nyní jsme připraveni vypočítat deskriptor HOG pro tuto opravu obrázku.
papír Dalal a Triggs také zmiňuje gama korekce jako předzpracování krok, ale výkon zisky jsou menší a tak jsme přeskočení kroku.
Krok 2: Vypočítejte obrázky gradientu
Chcete-li vypočítat deskriptor prasete, musíme nejprve vypočítat horizontální a vertikální přechody; koneckonců chceme vypočítat histogram gradientů. Toho lze snadno dosáhnout filtrováním obrazu pomocí následujících jader.
stejných výsledků můžeme dosáhnout také použitím operátoru Sobel v OpenCV s velikostí jádra 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)
Dále můžeme zjistit velikost a směr gradientu pomocí následujícího vzorce
Pokud jste pomocí OpenCV, výpočet lze provést pomocí funkce cartToPolar, jak je uvedeno níže.
// C++ Calculate gradient magnitude and direction (in degrees)Mat mag, angle;cartToPolar(gx, gy, mag, angle, 1);
stejný kód v Pythonu vypadá takto.
# Python Calculate gradient magnitude and direction ( in degrees )mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)
níže uvedený obrázek ukazuje přechody.
Všimněte si, že x-gradient požáry na svislé čáry a y-gradient požáry na horizontální linie. Velikost gradientních požárů tam, kde vůbec dochází k prudké změně intenzity. Žádný z nich nehoří, když je region hladký. Záměrně jsem vynechal obrázek ukazující směr přechodu, protože směr zobrazený jako obrázek toho moc nesděluje.
obraz přechodu odstranil mnoho nepodstatných informací (např. konstantní barevné pozadí), ale zvýraznil obrysy. Jinými slovy, můžete se podívat na přechodový obrázek a stále snadno říci, že na obrázku je osoba.
na každém pixelu má gradient velikost a směr. U barevných obrázků se vyhodnocují přechody tří kanálů(jak je znázorněno na obrázku výše). Velikost gradientu v pixelu je maximální velikost gradientů tří kanálů a úhel je úhel odpovídající maximálnímu gradientu.
Krok 3: Vypočítejte Histogram gradientů v 8×8 buňkách
v tomto kroku je obraz rozdělen na 8×8 buněk a pro každých 8×8 buněk se vypočítá histogram gradientů.
o histogramech se dozvíme za chvíli, ale než tam půjdeme, nejprve pochopíme, proč jsme obraz rozdělili na 8×8 buněk. Jedním z důležitých důvodů, proč použít popisovač funkcí k popisu opravy obrázku, je to, že poskytuje kompaktní reprezentaci. Oprava obrazu 8×8 obsahuje hodnoty 8x8x3 = 192 pixelů. Gradient této opravy obsahuje 2 hodnoty (velikost a směr) na pixel, který přidává až 8x8x2 = 128 čísel.
na konci této části uvidíme, jak jsou tato 128 čísla reprezentována pomocí 9-bin histogramu, který lze uložit jako pole 9 čísel. Nejen, že je reprezentace kompaktnější, díky výpočtu histogramu nad náplastí je tato reprezentace robustnější vůči šumu. Jednotlivé graidenty mohou mít šum, ale histogram přes náplast 8×8 činí reprezentaci mnohem méně citlivou na šum.
ale proč 8×8 náplast ? Proč ne 32×32 ? Je to volba designu informovaná o rozsahu funkcí, které hledáme. HOG byl původně používán pro detekci chodců. Buňky 8×8 na fotografii chodce zmenšené na 64×128 jsou dostatečně velké, aby zachytily zajímavé rysy (např. ).
histogram je v podstatě vektor ( nebo pole ), 9 přihrádek ( čísla ) odpovídající úhly 0, 20, 40, 60 … 160.
podívejme se na jednu náplast 8×8 na obrázku a uvidíme, jak vypadají přechody.
Pokud jste začátečník v počítačové vidění, obraz v centru města, je velmi informativní. Zobrazuje náplast obrazu překrytou šipkami zobrazujícími gradient — šipka ukazuje směr přechodu a její délka ukazuje velikost. Všimněte si, jak směr šipek ukazuje na směr změny intenzity a velikost ukazuje, jak velký je rozdíl.
vpravo vidíme surová čísla představující gradienty v buňkách 8×8 s jedním malým rozdílem-úhly jsou mezi 0 a 180 stupni místo 0 až 360 stupňů. Ty se nazývají „nepodepsané“ přechody, protože gradient a jeho záporné hodnoty jsou reprezentovány stejnými čísly. Jinými slovy, šipka přechodu a jedna o 180 stupňů proti ní jsou považovány za stejné. Ale proč nepoužívat 0-360 stupňů ?
empiricky bylo prokázáno, že nepodepsané přechody fungují lépe než signované přechody pro detekci chodců. Některé implementace HOG vám umožní určit, zda chcete použít podepsané přechody.
dalším krokem je vytvoření histogramu gradientů v těchto 8×8 buňkách. Histogram obsahuje 9 zásobníků odpovídajících úhlům 0, 20, 40 … 160. Následující obrázek ilustruje proces. Díváme se na velikost a směr gradientu stejné náplasti 8×8 jako na předchozím obrázku.
bin je vybrán na základě směru a hlas (hodnota, která jde do koše)je vybrána na základě velikosti. Nejprve se zaměříme na pixel obklopený modrou barvou. Má úhel (směr ) 80 stupňů a velikost 2. Takže přidá 2 do 5. koše. Gradient v pixelu obklopeném červenou barvou má úhel 10 stupňů a velikost 4. Protože 10 stupňů je na půli cesty mezi 0 a 20, hlas podle pixelu se rozdělí rovnoměrně do dvou košů.
je třeba si uvědomit ještě jeden detail. Pokud je úhel větší než 160 stupňů, je mezi 160 a 180 a víme, že úhel se obepíná kolem 0 a 180 ekvivalentů. Takže v níže uvedeném příkladu pixel s úhlem 165 stupňů přispívá úměrně k zásobníku 0 stupňů a zásobníku 160 stupňů.
příspěvky všech pixelů v 8×8 buněk jsou přidány k vytvoření 9-bin histogram. U výše uvedené opravy to vypadá takto
v naší reprezentaci je osa y 0 stupňů. Můžete vidět, že histogram má velkou váhu blízko 0 a 180 stupňů, což je jen další způsob, jak říci, že v náplasti gradienty směřují nahoru nebo dolů.
Krok 4 : 16×16 Blok Normalizace
V předchozím kroku jsme vytvořili histogram na základě gradientu obrazu. Přechody obrazu jsou citlivé na celkové osvětlení. Pokud obraz ztmavnete vydělením všech hodnot pixelů 2, Velikost gradientu se změní na polovinu, a proto se hodnoty histogramu změní na polovinu.
v ideálním případě chceme, aby náš deskriptor byl nezávislý na variacích osvětlení. Jinými slovy, chtěli bychom „normalizovat“ histogram, aby nebyly ovlivněny změnami osvětlení.
než vysvětlím, jak je histogram normalizován, podívejme se, jak je normalizován vektor délky 3.
řekněme, že máme barevný vektor RGB . Délka tohoto vektoru je $ \ sqrt{128^2 + 64^2 + 32^2} = 146.64$. Toto se také nazývá norma L2 vektoru. Dělení každého prvku tohoto vektoru 146,64 nám dává normalizovaný vektor .
nyní zvažte další vektor, ve kterém jsou prvky dvakrát větší než hodnota prvního vektoru 2 x = . Můžete to vyřešit sami, abyste zjistili, že normalizace bude mít za následek, což je stejné jako normalizovaná verze původního vektoru RGB. Můžete vidět, že normalizace vektoru odstraní měřítko.
Teď, když víme, jak normalizovat vektor, můžete být v pokušení myslet si, že při výpočtu PRASE můžete jednoduše normalizovat 9×1 histogram stejným způsobem jsme normalizované 3×1 vektor výše. Není to špatný nápad, ale lepší nápad je normalizovat větší blok 16×16.
16×16 blok má 4 histogramy, které mohou být spojeny k formě 36 x 1 prvek vektoru, a to může být normalizovány jen způsob, 3×1 vektor je normalizovaný. Okno se pak přesune o 8 pixelů (viz animace) a v tomto okně se vypočítá normalizovaný vektor 36×1 a proces se opakuje.
Krok 5: Vypočítejte vektor funkce HOG
Chcete-li vypočítat konečný vektor funkce pro celou opravu obrazu, vektory 36×1 jsou zřetězeny do jednoho Obřího vektoru. Jaká je velikost tohoto vektoru ? Vypočítejme
- kolik pozic bloků 16×16 máme ? K dispozici je 7 vodorovných a 15 svislých poloh, což činí celkem 7 x 15 = 105 pozic.
- každý blok 16×16 je reprezentován vektorem 36×1. Takže když je všechny spojíme do jednoho vektoru, získáme 36×105 = 3780 rozměrový vektor.
Vizualizace Histogram Orientovaných Gradientů
HOG deskriptor obrazu patch je obvykle zobrazen vynesením 9×1 normalizované histogramy v 8×8 buněk. Viz obrázek na boku. Všimnete si, že dominantní směr histogramu zachycuje tvar osoby, zejména kolem trupu a nohou.
bohužel neexistuje snadný způsob, jak vizualizovat deskriptor HOG v OpenCV.