Deep learning je jedno z nejprogresivně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:
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).
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.
Dvouminutové video s ukázkou klasifikace obrázků pomocí CNN v prostředí MATLAB: Deep Learning in 11 Lines of MATLAB Code.
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.
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.
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 + ClassificationOutput.
vrstvy = [imageInputLayer([28 28 1]);
convolution2dLayer(5, 20);
reluLayer();
maxPooling2dLayer(2, 'Stride', 2);
fullyConnectedLayer(10);
softmaxLayer();
classificationLayer()];
nastaveni = trainingOptions('sgdm');
cnn = trainNetwork(trenovaciObrazky, 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.
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.
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í.
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 |
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.
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.
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.
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 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.
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