Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

MATLAB zlehka - Deep learning na tři řádky

Deep learning je využití hlubokých neuronových sítí pro úlohy jako je například klasifikace obrazu.

Neuronová síť Alexnet

Alexnet je jedna z prvních dobře fungujících neuronových sítí svého druhu. Můžeme pomocí ní např. zjistit, co se nachází na obrázku, již třemi řádky kódu. Zde jsou:

net = alexnet; %načtení neuronové sítě
Obrazek = imread('https://itnetwork.cz/images/17395/matlabzlehka04/banan.jpg'); %načtení obrázku z webu
CoTamJe=classify(net,Obrazek) % klasifikace obrázku pomocí neuronky

MATLAB vás zřejmě upozorní na nenainstalovaný AlexNet Network support package. Instalace pomocí balíku je nejlepší způsob, jak dostat natrénovanou a popsanou neuronku do MATLABu. Pro instalaci balíku je třeba mít účet na MathWorks (zdarma).

URL adresa v kódu ukazuje na následující obrázek banánu:

Obrázek banánu ke klasifikaci neuronovou sítí - Matlab

Výstupem těch třech řádků kódu je úspěšné rozpoznání tohoto banánu:

CoTamJe =
  categorical
     banana

Proč je to úspěch snadněji pochopíme pomocí malé exkurze do nedaleké historie.

Stručná historie konvolučních neuronových sítí

V případě, že bychom pro detekci banánu nechtěli používat neuronové sítě, museli bychom vyřešit spoustu problémů. Obecně úloha rozpoznání něčeho v obraze je velmi netriviální.

Jak definujeme banán?

Můžeme začít s tím, že banán je žlutý, má jistý tvar, velikost a texturu. Ani jedna z těchto vlastností není u banánu pokaždé stejná a už vůbec není "banánově exkluzivní" (např. jablko může být také žluté). I v rozpoznávání čísel, kterých je jen 10 a jsou oproti objektům všedního světa jednoduchá, jsou klasické algoritmy značně nedokonalé. Při použití klasifikátoru založeném na konvolučních neuronových sítích je přesnost a rychlost lepší než u člověka samotného. Nevýhodou neuronek obecně je potřeba velkého množství dat a výpočetního výkonu pro učící fázi.

Soutěž LSVRC

Od roku 2010 existuje soutěž v klasifikaci obrázků do 1000 kategorií (ILSVRC). Jednou z těchto kategorií je i banán, nicméně objekty jsou ze širokého spektra – květiny, věci denní potřeby, psí plemena, atd... (celý list zde). V roce 2012 soutěž s výrazným náskokem vyhrála právě konvoluční neuronová síť Alexnet. Proč?

Konvoluce

Zjednodušeně řečeno – konvoluce umožňuje předzpracovat obrázky tak, že neuronová síť vyhodnocuje příznaky, které jsou zásadní pro rozpoznání objektů. Například hrany, světlost, apod. Všechny příznaky jdou těžko vyjádřit a pojmenovat a v tom je zásadní výhoda CNN (Convolutional Neural Network). Příznaky si totiž vytvoří síť sama podle toho, kterými obrázky ji naučíme. Neříkáme tedy neuronce "dívej se na vertikální hrany", ale pokud síť v procesu učení vyhodnotí, že vertikální hrany jsou důležitým příznakem pro rozpoznání bernardýna od iPodu, pak ano – neuronová síť patřičně upraví konvoluční filtry tak, aby hrany rozpoznávaly.

Sečteno podtrženo od té doby skoro všichni ILSVRC soutěžící okopírovali myšlenky, které Alexnet dokázala využít a každým rokem byla představena nová síť s novou a vylepšenou architekturou, která vedla zas o kousek blíže k přesným výsledkům. Spoustu těchto sítí můžete směte a bez zdlouhavých ceremonií v MATLABu využívat.

Také si povšimněte, že rok 2012 je přibližně doba, kdy se na scéně objevují samořídící auta a Facebook začíná s přehledem zvládat automatické označování lidí na fotografiích.

Klasifikace vlastního obrázku

Klasifikovaná květina - Matlab

Úvodní tři řádky je nutné trochu upravit, abychom zvládli klasifikovat jakýkoliv obrázek pomocí Alexnet.

Změna rozměrů

Prvním krokem je změna rozměrů obrázku na požadovaných 227x227 pixelů, což je prostě vstup celé sítě (banánový obrázek má požadovaný rozměr, proto jsme tento krok vynechali). Ke změně rozměrů slouží funkce imresize().

Pravděpodobnost

Dále by nebylo od věci rovnou vidět, jak moc si je neuronová síť klasifikací jistá. Tato informace se dá vyčíst z druhého výstupního parametru funkce classify(). Jedná se o vektor o 1000 prvcích, kteréžto se sčítají do jedničky. Maximum celého vektoru je tedy pravděpodobnost, že klasifikace je správná.

Ukažme si náš program s těmito vylepšeními. Zbytek kódu slouží pro vypsání výsledku rovnou do obrázku:

A = imread('kytka256.jpg'); %(obrázek součástí .zip souboru)
A_227x227 = imresize(A,[227 227]); %změnit velikost
[label,score] = classify(net,A_227x227); % klasifikovat

A_s_textem = insertText(A,[1 1],...% přidat text
    cellstr(string(label) + " "+ num2str(max(score)*100)+" %"),'FontSize',26,'boxcolor','magenta');
imshow(A_s_textem)

Alexnet si je na 95,8 % jistá, že na obrázku se nachází kopretina... A ejhle, to je špatně. Na obrázku je ve skutečnosti květ Slunečnice topinambur. Když však zkusíme vyhledat v seznamu tříd Jerusalem artichoke (anglický název pro topinamburu), setkáme se s nezdarem. Topinambura prostě není jednou ze tříd, tak to neuronka namířila na kopretinu. Zde se dostáváme k jednomu z úskalí konvolučních neuronových sítí – co je nenaučíme, nevědí.

Jak vypadá a funguje Alexnet

Struktura sítě Alexnet není tajná informace. Chcete-li se na ní podívat, slouží k tomu v MATLABu funkce analyzeNetwork():

net = alexnet;
analyzeNetwork(net);

V následujícím textu je zjednodušující popis toho, za co jsou jednotlivé vrstvy sítě zodpovědné.

Vrstvy 1-5

Prvních pět vrstev sítě Alexnet - Matlab
  • První vrstva sítě je vstupní, také má velikost, která se rovná velikosti RGB obrázku (227x227x3).
  • Druhá vrstva je již zmíněná konvoluce neboli také filtrace a to co se neuronka naučí jsou právě filtry (konvoluční jádra, kernely). V tomto případě jich je 96 a mají rozměr 11x11x3 (3 protože 3 barevné kanály).
  • Třetí vrstvouReLU (Rectified Linear Unit) projdou všechny hodnoty a pokud jsou nižší, než 0, stane se z nich právě 0. Pokud jsou vyšší, k žádné změně nedojde. To má za následek zvýšení nelinearity (nelinearita znamená, že pokud vstup zvýšíme například 2x, výstup nebude zvětšen právě 2x). Sítě pak fungují lépe.
  • Čtvrtá vrstva - Normalizace umožňuje snížit odpověď neuronů, které vykazují příliš velkou aktivitu (aby to nebylo jen o nich).
  • Snížení velikosti provede pátá vrstva a to tím způsobem, že z okolí (zde 3x3) vybere ten nejvyšší prvek (proto max pooling). Snížení velikosti vede ke snížení parametrů nutných k učení, tím pádem ke zvýšení rychlosti.

Vrstvy 17-25

Vrstvy 16–25 neuronové sítě Alexnet - Matlab
  • Vrstvy 6-16 jsou kombinací předešlých vrstev s různými parametry.
  • Vrstva 17 obsahuje 4096 neuronů a každý z nich propojí s 9216 výstupy z vrstvy 16, proto se také nazývá Fully Connected.
  • DropOut (vrstva 19) náhodně nastaví jakýkoliv vstup s 50% pravděpodobností na 0, což opět zvýší nelinearitu v systému.
  • Předposlední, 24. vrstva (SoftMax), zařídí, že pravděpodobnosti klasifikace do jednotlivých tříd budou od 0 do 1 a jejich součet bude také 1.
  • Poslední vrstva je vrstva výstupní, ze které nám vypadne kýžený výsledek.

Uvnitř sítě - Aktivace

Funkce classify() vezme obrázek a pošle ho do Alexnet. Obrázek postupně propadne všemi vrstvami, kde aktivuje dané neurony až do poslední vrstvy. Tam každý neuron za sebou skýtá jednu možnou třídu toho, co je na obrázku. Ta, která je nejvíce aktivována, je výstupem funkce classify(). Do celého procesu aktivace můžete nahlédnout pomocí funkce activations():

aktivace = activations(net,A_227x227,5);%aktivace z 5. vrstvy

aktivace_4d = reshape(aktivace,size(aktivace,1) , size(aktivace,2) , 1 , size(aktivace,3) );
aktivace_4d = imadjustn (mat2gray (aktivace_4d));%upravy pro lepsi zobrazeni

montage(aktivace_4d (:,:,:,1:16));%zobrazeni prvnich 16 aktivaci (pro lepsi zobrazeni)

Na obrázku vidíme, co se stalo s květinou v páté vrstvě Alexnet. Někdy je květ tmavý, někdy světlý, někdy není vidět vůbec, nebo pouze okraj. Ze souboru těchto vlastností Alexnet na konci vyhodnotí, že se jedná o kopretinu.

Aktivace neuronové sítě Alexnet 1–16 v 5. vrstvě - Matlab

Závěr

Podívali jsme se na to, jak je v MATLABu jednoduché použít konvoluční neuronovou síť pro klasifikaci obrazu. Stručně jsme si vysvětlili jak a proč tyto sítě fungují. CNN se nevyužívají pouze ke klasifikaci obrázků, ale také k detekci objektů ("na souřadnicích x y se nachází chodec"), sémantické segmentaci ("tento pixel je chodec a tento pixel je jiné vozidlo"), ale také ke generování samotných obrázků apod. Pochopitelně jejich zaměření není pouze na obrazy. Používají se také u jednorozměrných signálů (zvuk, EKG, vývoj ceny Bitcoinu, a další) k podobným úlohám.

Příště si ukážeme jak neuronovou síť natrénovat na našich vlastních obrázcích.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 23x (53.64 kB)
Aplikace je včetně zdrojových kódů

 

Všechny články v sekci
Matlab
Článek pro vás napsal tesař.tech
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje dýchání přibližně celý život
Aktivity