Deep Learning pro segmentaci obrazu

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.

Text volně navazuje na článek Deep learning a prostředí MATLAB.

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 … (http://cs.wikipedia.org).

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ří:

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 Segmenter, ve které lze obrázky segmentovat využitím palety připravených nástrojů (obrázek 2).

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 3.

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. Schéma vnitřního uspořádání CNN je na obrázku 4.

Mezi konvoluční vrstvy jsou často vsazeny vrstvy pro úpravu dílčích výstupů (normalizace, pooling). 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.

Typická klasifikační CNN přiřazuje celému vstupnímu obrázku jednu z předdefinovaných kategorií, na které je síť naučena. Princip jejího fungování je znázorněn na obrázku 5.

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 + BatchNormaliza­tion + ReLU + MaxPooling2D a navazujících klasifikačních vrstev FullyConnected + Softmax + Classificatio­nOutput.

vrstvy = [imageInputLa­yer([28 28 1]);
      convolution2dLa­yer(5, 20);
      batchNormaliza­tionLayer();
      reluLayer();
      maxPooling2dLayer(2, 'Stride', 2);
      fullyConnected­Layer(10);
      softmaxLayer();
      classification­Layer()];

nastaveni = trainingOptions('sgdm');
cnn = trainNetwork(tre­novaciObrazky, 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 25 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(o­brazek, cnn), 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 3 (viz. výše).

Efektivní sémantickou segmentaci snímků umožňuje speciální architektura hluboké neuronové sítě zvaná SegNet [1]. Na vstup sítě přichází snímek určený pro segmentaci. Vlastní síť je rozdělena do dvou částí. V první polovině sítě jsou skupiny vrstev označované jako kodéry, které slouží k extrakci významných rysů ze snímku. Na jejich základě 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. Ty 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 6 je zobrazen princip fungování sítě SegNet s 5-ti skupinami kodérů a dekodérů.

V MATLABu lze sítě SegNet vytvářet funkcí segnetLayers. SegNet je síť typu DAG s rozvětvenou architekturou (obrázek 7). Každá skupina – kodér nebo dekodér – se skládá z vrstev Convolution2D, BatchNormaliza­tion, 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 PixelClassifi­cation pro přiřazení klasifikačních kategorií jednotlivým pixelům na snímku. Na obrázku 7 je zobrazena architektura sítě 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.

Další informace o sémantické segmentaci v prostředí MATLAB najdete na stránce Semantic Segmentation.

Využití sémantické segmentace v praxi

V současné době jsou typickými oblastmi využití sémantické segmentace:

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.

Zaujal Vás program MATLAB a jeho využití v oblastech segmentace obrazu a deep learning?
Nabízíme Vám zdarma časově omezenou zkušební licenci programu MATLAB k otestování jeho možností:

Vyzkoušejte si nástroje pro segmentaci obrazu a 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.

Jaroslav Jirkovský (HUMUSOFT), 7.9.2018

close