Segmentace obrazu spočívá v rozdělení obrázku do dvou či více oblastí za účelem získání užitečných informací o snímané scéně. Techniky založené na metodách deep learning umožní automaticky segmentovat reálné snímky na části odpovídající konkrétnímu významu. MATLAB, jakožto vývojové prostředí pro vědeckotechnické výpočty, nabízí v oblasti segmentace obrazu jak klasické metody, tak techniky využívající deep learning.
„Segmentace obrazu je metoda, nebo spíše skupina metod postavených na různých principech, digitálního zpracování obrazu, která slouží k automatickému rozdělení vlastního obrazu na oblasti se společnými vlastnostmi a které obvykle mají nějaký smysluplný význam. Typickým cílem segmentace obrazu je identifikace popředí a určení oblastí v obraze odpovídajícím významnému prvku zachycené scény … “ (Wkipedia).
Rozdělení obrázku do oblastí je obvykle založeno na charakteristikách obrazových bodů – pixelů. Jedním ze způsobů, jak separovat oblasti v obraze, je například vyhledat náhlé nespojitosti v hodnotách pixelů. Skokové změny v hodnotách pixelů (změna jasu nebo barvy) obvykle naznačují okraj hledané oblasti. Jiné metody rozdělují obraz do částí na základě blízkých barevných hodnot nebo dle podobné textury.
Základní metody segmentace obrazu
Existuje mnoho rozličných způsobů, jak segmentaci obrazu provést. Mezi segmentační metody patří:
- metody založené na prahování (hodnocení jasu každého pixelu)
- regionální metody založené na podobnosti pixelů v dané vlastnosti
- metody založené na hranicích (detekce hran na snímku)
- pokročilejší metody: aktivní kontury, segmentace rozvodím
Obrázek 1: Ukázky segmentace obrazu: (A) prahování, (B) segmentace dle barev, (C) segmentace rozvodím, (D) segmentace dle textury
Efektivní přístup k segmentaci obrazu obvykle vyžaduje kombinaci specializovaných funkcí a nástrojů v rámci komplexnějšího prostředí pro analýzu dat, vizualizaci a vývoj vlastních algoritmů.
Segmentace obrazu a MATLAB
MATLAB je inženýrský nástroj a interaktivní prostředí pro vědecké a technické výpočty, analýzu dat, vizualizaci, vývoj algoritmů, modelování a simulace. MATLAB je nástroj jak pro pohodlnou interaktivní práci, tak pro vývoj širokého spektra aplikací.
V oblasti segmentace obrazu poskytuje MATLAB množství funkcí. Základní prahování je možné provést funkcí imbinarize, která stanoví úroveň prahu Otsuovou metodou, případně lze provést i prahování víceúrovňové. Pro segmentaci na základě barevných informací můžete využít jednoduché logické operace k určení oblastí s podobnou barvou nebo shlukovou analýzu funkcí kmeans. Pracovat je možné v barevném prostoru RGB, L*a*b, HSV či YCrCb. Automatické vyhledání podobných oblastí v obraze umožní také funkce superpixels. Hranice v obrázku vyhledáte aplikací Cannyho hranového detektoru nebo Sobelova filtru funkcí edge. K segmentaci obrazu na základě textury lze využít filtrace funkcemi entropyfilt, stdfilt nebo rangefilt.
Z pokročilejších metod segmentace je v prostředí MATLAB k dispozici segmentace rozvodím funkcí watershed, segmentace aktivními konturami funkcí activecontour nebo oddělení popředí a pozadí funkcí lazysnapping.
MATLAB poskytuje též připravenou grafickou aplikaci Image Segmentation App, ve které lze obrázky segmentovat využitím palety připravených nástrojů.
Co základní metody nevyřeší
Segmentace na základě barev či kontur dokáže rozdělit snímek tak, že jsou jednotlivé objekty odděleny a ohraničeny. Nicméně nedokáže přiřadit objektům význam bez dalších doprovodných informací. Pokud například víme, že hledáme červené auto na šedé vozovce, pak segmentovaná část snímku s převahou červené barvy bude velmi pravděpodobně námi hledané vozidlo.
Co však v případě, že takovou apriori informaci nemáme k dispozici nebo se jedná o složitou scénu s mnoha objekty?
Zde můžeme sáhnout k sémantické segmentaci využívající hluboké učení – deep learning. Metodami deep learningu lze rozdělit obrázek do oblastí odpovídajících konkrétnímu významu. Ukázka sémantické segmentace snímku je na obrázku 2.
Obrázek 2: Sémantická segmentace snímku metodami deep learningu
Sémantická segmentace přiřazuje kategorie, jako jsou konkrétní typy objektů, ke každému pixelu v obrázku. Obrázek se tím rozdělí do oblastí s daným významem a je možné jej využít pro hlubší pochopení snímané scény. Na pozadí sémantické segmentace využíváme deep learning model, který v sobě nese veškeré nezbytné informace. Žádné další apriori informace nejsou pro segmentaci potřeba.
Co je deep learning
Deep learning je metoda strojového učení, kde je za pomoci mnohovrstvých nelineárních výpočetních modelů získávána užitečná informace přímo z dat. V klasifikačních úlohách dosahují deep learning modely vysoké přesnosti, která může předčít lidské schopnosti. Modely jsou trénovány s využitím velkého množství označených dat a jejich architektura je postavená na hlubokých neuronových sítích (deep networks). Využívají se zejména tzv. konvoluční neuronové sítě – CNN (Convolutional Neural Networks) jejichž základem jsou vrstvy provádějící 2-D konvoluci vstupních dat s naučenými filtry. CNN jsou vhodné zejména pro zpracování 2-D dat, jako jsou obrázky.
Mezi konvoluční vrstvy jsou často doplněny vrstvy pro úpravu výstupů. Pokud je síť určena ke klasifikaci snímků, bývá zakončena vrstvami pro přiřazení klasifikační třídy (hledaného objektu) ke vstupnímu obrázku (obrázek 3).
Obrázek 3: Princip fungování konvoluční neuronové sítě
CNN v MATLABu
V prostředí MATLAB se s CNN pracuje velmi pohodlně. Jsou zde připraveny funkce pro vytváření jednotlivých vrstev sítě, u kterých může uživatel nastavovat parametry. Poté vrstvy pospojuje, síť natrénuje a naučenou síť aplikuje na nová data.
Typická klasifikační CNN může sestávat z vrstvy ImageInput pro vstup obrázků, jedné nebo několika za sebou zapojených skupin vrstev Convolution2D + BatchNormalization + ReLU + MaxPooling2D a navazujících klasifikačních vrstev FullyConnected + Softmax + ClassificationOutput.
vrstvy = [imageInputLayer([28 28 1]);
convolution2dLayer(5,20);
batchNormalizationLayer();
reluLayer();
maxPooling2dLayer(2, ‚Stride‘,2);
fullyConnectedLayer(10);
softmaxLayer();
classificationLayer()];
nastaveni = trainingOptions‚sgdm‘);
cnn = trainNetwork(trenovaciObrazky,vrstvy,nastaveni);
vysledek = classify(cnn,novyObrazek);
MATLAB obsahuje funkce pro vytváření více než 20 typů vrstev a je zde k dispozici i šablona pro vytváření vrstev nových, definovaných uživatelem.
Naučení celé konvoluční neuronové sítě z výchozího nastavení vyžaduje ohromné množství trénovacích dat. Alternativním přístupem k učení „od nuly“ je využití před-učené sítě, která již sama extrahuje charakteristické rysy ze vstupních dat a kterou postačí „doučit“ pro konkrétní úlohu. Tento přístup, označovaný termínem transfer learning, je pohodlnou cestou aplikace deep learningu bez nutnosti využití rozsáhlého množství dat a dlouhé doby učení.
MATLAB nabízí využití oblíbených před-učených sítí, jako jsou AlexNet (síť naučená s 1,2 miliony obrázků, obsahuje 23 vrstev, klasifikuje objekty do 1000 kategorií), VGG-16, VGG-19 nebo GoogleNet.
Kromě sítí se sériově řazenými vrstvami (vrstvy následují jedna za druhou) je možné vytvářet i sítě rozvětvené. V MATLABu lze konstruovat sítě s architekturou DAG – directed acyclic graph. Rozvětvené sítě mohou zvýšit přesnost, usnadnit ladění a umožní využití oblíbených před-trénovaných modelů (GoogLeNet).
Sémantická segmentace v MATLABu
V prostředí MATLAB je k dispozici funkce semanticseg(img,network), která provede sémantickou segmentaci daného snímku pomocí připravené hluboké neuronové sítě. Ukázka sémantické segmentace snímku je zobrazena na obrázku 2.
Efektivní sémantickou segmentaci snímků umožňuje speciální architektura hluboké neuronové sítě zvaná SegNet [1]. V MATLABu lze sítě SegNet vytvářet funkcí segnetLayers. SegNet je síť typu DAG a obsahuje několik skupin vrstev (obrázek 4). Každá skupina se skládá z vrstev Convolution2D, BatchNormalization, ReLU a MaxPooling2D nebo MaxUnpooling2D. Na vstupu sítě je vrstva ImageInput pro vstup obrázku a na výstupu sítě jsou vrstvy Softmax a PixelClassification pro přiřazení klasifikačních kategorií jednotlivým pixelům na snímku.
Na vstup sítě přichází snímek určený pro segmentaci. Skupiny v první polovině sítě jsou označované jako kodéry a slouží k extrakci významných rysů ze snímku, na základě kterých dochází k určení jednotlivých segmentů. V druhé části sítě se nachází stejný počet skupin označovaných dekodéry, které provádí zpětné mapování segmentů na původní snímek. Na výstupu sítě je segmentovaný snímek se stejnou velikostí, jako snímek vstupní. Počet skupin kodérů a dekodérů si uživatel může zvolit. Na obrázku 4 je zobrazena architektura sítě SegNet se 3-mi skupinami kodérů/dekodérů.
Obrázek 4. Síť SegNet se 3-mi skupinami kodérů/dekodérů
Uživatel si také může zvolit, zda vytvoří „čistou“ síť SegNet, kterou naučí od základu, nebo využije před-trénovanou síť, založenou na síti VGG-16 nebo VGG-19.
Trénování sítě pro sémantickou segmentaci vyžaduje velké množství označených obrázků, kde jsou jednotlivým regionům přiřazeny kategorie. V prostředí MATLAB je k dispozici grafická aplikace Image Labeler, která manuální označování snímků částečně automatizuje a tím celý proces urychluje.
Využití sémantické segmentace v praxi
V současné době jsou typickými oblastmi využití sémantické segmentace:
- autonomní řízení vozidel
- průmyslové inspekční systémy
- klasifikace satelitních snímků
- analýza snímků v medicíně
S nárůstem výpočetní síly lze předpokládat, že se sémantická segmentace bude dále rozšiřovat nejen v rámci velkých analytických systémů, ale pronikne též do světa embedded aplikací, zejména v odvětví autonomní dopravy.
Více podrobností o konvolučních neuronových sítích najdete v článku Deep Learning v prostředí MATLAB.
[1] Badrinarayanan, Vijay, Alex Kendall, and Roberto Cipolla. „SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation.“ arXiv preprint arXiv:1511.00561, 2015.Distributor produktů společnosti MathWorks v České republice a na Slovensku:
HUMUSOFT s. r. o.
http://www.humusoft.cz