Deep Learning a prostředí MATLAB

Deep learning je jedno z nejprogresiv­nějších odvětví strojového učení se schopností řešit úlohy, které byly ještě před deseti lety nemyslitelné. Uplatnění deep learningu zasahuje mnoho oborů lidské činnosti od systémů počítačového vidění přes vyhledávací, diagnostické a asistenční systémy až po autonomní vozidla a bezpečnost. MATLAB, jakožto vývojové prostředí pro vědeckotechnické výpočty, nabízí v oblasti strojového učení a deep learningu množství algoritmů a usnadní jejich aplikaci při řešení praktických úkolů.

Přehled aktuálních nástrojů programu MATLAB pro deep learning najdete zde.

Strojové učení je podoblastí umělé inteligence, zabývající se algoritmy a technikami, které umožňují počítačovému systému „učit se“. Strojové učení se značně prolíná s oblastmi statistiky a dobývaní znalostí a má široké uplatnění … (http://cs.wikipedia.org).

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

Deep learning nachází využití v mnoha oblastech, zejména pak v úlohách:

Učení deep learning modelů

Přesnost deep learning modelu závisí z velké části na množství dat použitých k jeho učení. Nejpřesnější modely vyžadují tisíce, či dokonce miliony vzorků. Učení takového modelu může trvat velmi dlouhou dobu. Jakmile je model naučen, lze jej nasadit do provozu v reálném čase. Typickou aplikací je detekce chodců v pokročilých systémech pro podporu řízení (ADAS).

Deep learning 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 deep learningu poskytuje MATLAB dva základní nástroje: konvoluční neuronové sítě (Convolutional Neural Networks – CNN) a autoenkodéry (Autoencoders). Využití CNN k rozpoznávání objektů na snímku v programu MATLAB je na obrázku 1.

Rozppoznávání objektů pomocí CNN

Obrázek 1: Rozpoznávání objektů pomocí CNN v prostředí MATLAB

Dvouminutové video s ukázkou klasifikace obrázků pomocí CNN v prostředí MATLAB: Deep Learning in 11 Lines of MATLAB Code.

Rozpoznávání obrazu

Konvoluční neuronové sítě (CNN) představují oblíbenou architekturu modelů v oblasti deep learningu. Neuronová síť je uspořádána do vrstev obsahujících sady propojených uzlů. Výpočetní algoritmus CNN je založen na konvoluci mezi vstupními daty a filtry, které reprezentují hledané charakteristické rysy. CNN využívá dvourozměrné (2-D) konvoluční vrstvy a je tedy vhodná pro zpracování 2-D dat, jako jsou obrázky.

Princip fungování CNN

Obrázek 2: Princip fungování konvoluční neuronové sítě

V horní části obrázku 2 je znázorněno schéma sestavení konvoluční neuronové sítě určené ke klasifikaci objektů v obrazových datech. Ve spodní části je principiální znázornění jejího fungování. Data protékají skrze neuronovou síť a dochází k jejich konvoluci s naučenými filtry (koeficienty filtrů jsou naučené váhy neuronové sítě). Výstup z konvoluce v jedné vrstvě je vstupem do vrstvy následující.

Filtry mohou začínat jako velmi jednoduché rysy, typu světlých a tmavých míst či hran, a postupně přechází do složitějších tvarů v následujících vrstvách. Cílem konvolucí je extrahovat z obrazových dat informace (ve formě mapy charakteristických rysů), na základě kterých lze objekty na snímcích rozpoznat.

Konvoluční vrstvy jsou často doplněny vrstvami ReLU a Pooling, které výstupy upraví (např. odstraní záporné hodnoty) a převzorkují na menší rozměr.

Za sadou konvolučních vrstev bývají napojeny vrstvy klasifikační, které pracují z extrahovanými rysy ze vstupních obrázků. Výstupem klasifikačních vrstev může být pravděpodobnostní rozdělení pro přiřazení klasifikační třídy (hledaného objektu) ke vstupnímu obrázku.

CNN v MATLABu

V prostředí MATLAB se s CNN pracuje velmi pohodlně. Jsou zde připraveny funkce pro vytvoření jednotlivých vrstev sítě, u kterých může uživatel nastavovat parametry. Poté vrstvy pospojuje, síť natrénuje a využije ke klasifikaci s novými daty.

Typická CNN může sestávat z vrstvy ImageInput pro vstup obrázků, jedné nebo několika za sebou zapojených skupin vrstev Convolution2D + ReLU + MaxPooling2D a navazujících klasifikačních vrstev FullyConnected + Softmax + Classificatio­nOutput.

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

nastaveni = trainingOptions('sgdm');
cnn = trainNetwork(tre­novaciObrazky, vrstvy, nastaveni);

vysledek = classify(cnn, novyObrazek);

V prostředí MATLAB je k dispozici více než 20 typů vrstev, ze kterých lze hluboké neuronové sítě skládat. Uživatelé mohou vytvářet i vrstvy vlastní. Kromě sítí se sériově řazenými vrstvami (vrstvy následují jedna za druhou) je možné vytvářet i rozvětvené sítě s architekturou DAG (Directed Acyclic Graph). Rozvětvené sítě mohou zvýšit přesnost a usnadnit ladění.

ZDARMA: On-line výukový kurz Deep Learning Onramp. Naučte se využívat MATLAB pro deep learning za 2 hodiny.

CNN a klasické klasifikační algoritmy

Konvoluční neuronové sítě nemusí být vždy využívány včetně klasifikačních vrstev. Je možné využívat pouze konvoluční vrstvy pro extrakci charakteristických rysů z dat. Získané rysy jsou pak vstupem do klasických klasifikačních algoritmů strojového učení, jako jsou rozhodovací stromy (classification trees), support vector machines, k-nearest neighbors, discriminant analysis a jiné metody, které jsou v MATLABu k dispozici.

Učení metodou Transfer Learning

Naučení celé konvoluční neuronové sítě z výchozího nastavení vyžaduje ohromné množství trénovacích dat, protože je třeba nastavit miliony váhových koeficientů. 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. 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í.

Transfer learning

Obrázek 3: Učení CNN „od nuly“ vs. učení metodou transfer learning

Přístup vychází z předpokladu, že úlohy klasifikace objektů v obrazových datech jsou v prvních krocích (v prvních vrstvách sítě) v zásadě shodné. Nejprve se z obrazu extrahují jednoduché prvky (hrany, přechody) a poté složitější struktury, až ke konkrétním objektům. K přizpůsobení sítě konkrétnímu problému tedy postačí doučit pouze několik posledních vrstev, které již rozlišují mezi konkrétními objekty. Extrakci jednoduchých rysů zajistí před-učená síť. Kvalita výsledku velmi závisí na kvalitě před-učené sítě, proto je důležitý její vhodný výběr. MATLAB nabízí stažení a využívání oblíbených před-učených sítí, např. sítě AlexNet (síť naučená s 1,2 miliony obrázků, obsahuje 25 vrstev, klasifikace objektů do 1000 kategorií).

Porovnání náročnosti učení a přesnosti klasifikace při vytváření neuronové sítě „od nuly“ v porovnání s využitím před-učené sítě je v tabulce 1.

tabulka 1: Učení CNN Učení sítě „od nuly“ Učení metodou transfer learning
Trénovací data tisíce až miliony trénovacích obrázků stovky až tisíce trénovacích obrázků
Výpočetní nároky vysoké střední
Doba učení dny až týdny pro reálné úlohy sekundy až minuty
Přesnost modelu vysoká dobrá, závisí na před-učeném CNN modelu

Urychlení pomocí GPU

Učení modelu pro deep learning může trvat velmi dlouhou dobu, v rozmezí dnů či týdnů. Nasazení výpočtů na grafických kartách (GPU) vede ke značnému urychlení. V případě typické úlohy klasifikace objektů v obrazu lze snížit dobu učení z dnů na hodiny. Využití GPU výpočtů k učení CNN je v prostředí MATLAB plně podporováno.

Prověření CNN metodou Deep Dream

Lze jednoduchým způsobem kontrolovat, zda je síť naučena správně? Kromě testování s daty, u kterých dopředu známe správný výsledek, můžeme provést optickou kontrolu vizualizační technikou deep dream. MATLAB poskytuje funkci deepDreamImage syntetizující umělý obrázek, který silně aktivuje vrstvy dané sítě pro zvolenou kategorii obrázků. Opticky pak můžeme zkontrolovat, zda naučené vlastnosti odpovídají hledanému tvaru. Na obrázku 4 je vizualizace sítě AlexNet pro kategorii květináče.

Deep Dream

Obrázek 4: Kontrola správného naučení CNN metodou deep dream

CNN a počítačové vidění

Jednou z nejčastějších úloh v oblasti počítačového vidění je detekce specifických objektů ve snímané scéně. Typickým příkladem může být rozpoznání dopravních značek při jízdě automobilem. Při detekci objektů se nejedná o zařazení celého snímku do dané kategorie, ale o rozeznání objektu, který pokrývá pouze jeho část. V ostatních částech se pak nacházejí další objekty, které nás nezajímají, a proto není možné klasifikovat snímek jako celek. Jak přenést sílu a přesnost CNN do této úlohy?

V MATLABu je k dispozici několik algoritmů typu R-CNN (Regions with Convolutional Neural Networks), kdy je konvoluční neuronová síť aplikována na klasifikaci výřezů (regionů) v rámci daného snímku. Namísto klasifikace všech výřezů získaných pomocí „plovoucího“ okénka, R-CNN detektor zpracovává pouze výřezy, kde je výskyt hledaného objektu pravděpodobný. To významnou měrou redukuje výpočetní nároky. V MATLABu jsou k dispozici detektory R-CNN, Fast R-CNN a Faster R-CNN. Jak již název napovídá, je výhodou posledně jmenovaného detektoru rychlost detekce, což usnadňuje jeho nasazení v reálném provozu. Na obrázku 5 najdete ukázku aplikace detektoru R-CNN při rozpoznávání dopravních značek.

R-CNN

Obrázek 5: Rozpoznávání dopravních značek pomocí R-CNN detektoru

Stejně jako v případě CNN, je i v algoritmech R-CNN možné využít před-učenou síť. Algoritmus učení R-CNN pak pouze „doučí“ výslednou síť pro uživatelem specifikované objekty.

Sémantická segmentace obrazu

Sémantická segmentace obrazu představuje rozdělení obrázku na části podle jejich významu. Každému pixelu je přiřazena klasifikační třída, tj. význam. Např. při segmentaci snímku ulice je cílem rozlišit vozovku, chodník, budovy, chodce, dopravní značky, stromy, …

Více informací najdete v článku Deep learning pro segmentaci obrazu.

Nasazení CNN do reálného prostředí

Nástroj GPU Coder umožní generování optimalizovaného zdrojového kódu CUDA® z programů a funkcí v jazyce MATLABu, včetně vytvořených hlubokých neuronových sítí. Využití nalezne zejména v embedded aplikacích počítačového vidění a v autonomních systémech. Generovaný kód volá optimalizované knihovny NVIDIA CUDA, včetně cuDNN, cuSolver a cuBLAS. Může být integrován do uživatelských projektů ve formě zdrojového kódu, statických knihoven či dynamických knihoven, nebo jej lze využít k prototypování na grafických kartách, jako je NVIDIA Tesla® a NVIDIA Tegra®. Generovaný kód CUDA lze využít též uvnitř MATLABu k urychlení výpočetně náročných částí programů. GPU Coder umožní začlenění stávajícího kódu CUDA do uživatelských algoritmů v MATLABu i do generovaného kódu.

Jaroslav Jirkovský (HUMUSOFT), 31.8.2018