• No results found

V této práci jsou naprogramovány samotné vrstvy, například vrstva neuronů, ak-tivační funkce, ReLu a další. Z těchto vrstev jsou složeny klasifikátory. Každá po-pisovaná metoda popisuje jeden naprogramovaný klasifikátor. Vrstvy i klasifikátory mají jednotnou minimální strukturu.

Vrstvy obsahují funkci pro dopředný (Forward) a zpětný (Backward) výpočet.

V dopředném směru se vytváří výstup na základě vstupu. Tento směr je nutný pro klasifikaci i učení. Výsledkem zpětného výpočtu je gradient vstupů dané vrstvy. Pro výpočet zpětného chodu je zapotřebí znát gradient z předchozí z následující vrstvy.

Zpětný chod je potřebný pouze pro učení klasifikátoru. Poslední funkce v tomto modelu, která se jmenuje Update, upravuje vnitřní parametry vrstvy, pokud nějaké má. V případě vrstvy neuronů upravuje váhy W. Tento design vrstev umožnuje jejich snadné skládání. V případě dobré implementace tohoto modelu je tvoření klasifikátorů velmi snadné. V každé vrstvě jsou implementovány příslušné vzorce z předchozích článcích.

Zdrojový kód 4: Vrstva neuronů

1 v i r t u a l v o i d Forward ( b o o l t r a i n ) o v e r r i d e {

3 z . S e t T e n s o r (w * * ( x−>GetTVect ( ) ) ) ; }

5 v i r t u a l Tensor Backward ( Tensor& dz ) o v e r r i d e {

7 Tensor r ( x−>N, x−>width , x−>height , x−>depth , x−>mode) ;

r . S e t T e n s o r ( ( (w . t r a n s p o s e ( ) * ( * dz . GetTVect ( ) ) ) / ( f l o a t ) ( x−>N) ) ) ;

9 r e t u r n r ; }

11 v i r t u a l v o i d Update ( Tensor& dz ) o v e r r i d e {

13 w . a r r a y ( ) −= ( dz * (* x ) . transpose ( ) ) . array ( ) * ( Node : : Lambda ( ) / ( f l o a t ) ( x−>c o l s ( ) ) ) ;

15 }

Každý klasifikátor obsahuje funkci pro trénování a klasifikaci. Učení probíhá na trénovacích datech, které jsou specifikovány v prvním argumentu této funkce.

V druhém argumentu lze specifikovat validační data. Validační data nejsou povinná, ale poskytují průběžné vyhodnocování přesnosti klasifikátoru, při učení. Klasifikace pouze zařadí každý vstupní vzorek do jedné z tříd. Při klasifikaci jsou odstraněny nežádoucí vrstvy, jako je Dropout. Výstupem klasifikace je pole čísel, jejichž po-řadí souhlasí s popo-řadím rozpoznávaných prvků. Každé číslo vyjadřuje předpověď správné třídy pro daný prvek. V průběhu učení a klasifikace může každý klasifikátor zobrazovat užitečné informace v uživatelském prostředí.

45

3 Ukázková aplikace

Tento program jsem vytvořil pro ukázku funkčnosti nejúspěšnější metody rozpo-znávání písmen. Uživatelské prostředí a princip extrakce jednotlivých písmen jsou podobné programu pro zpracování formulářů. Uživatelské prostředí lze vidět na ob-rázku 19.

Obrázek 19: Uživatelské prostředí programu pro rozpoznávání písmen

Text musí být napsán do jednoduchého formuláře, protože obecné hledání písmen a mezer v textu je mimo rozsah této bakalářské práce. Z výsledků jednotlivých metod rozpoznávání jsem vybral nejúspěšnější metodu, kterou je hluboká neuronová síť a tu jsem použil v tomto programu. Program dokáže rozpoznávat s přesností přibližně 85%. Nižší přesnost je způsobena horší kvalitou rozpoznávaného obrázku obrazu.

Uživatel může nahrát vyfocenou tabulku s textem. Jediným požadavkem je, aby text obsahoval pouze velká tiskací písmena bez diakritiky. Nahraná fotka je zob-razena a každé písmeno je ohraničeno červeným obdélníkem. Pokud jsou písmena špatně čitelná, nebo nejsou správně označena, pak je možnost upravit kontrast a jas.

Ve chvíli, kdy jsou písmena nalezena, lze kliknout na tlačítko Classify a písmena se přepíší do digitální podoby.

Pro nalezení písmen byla opět využita knihovna OpenCv. Nejprve je fotka upra-vena morfologickými funkcemi, aby došlo ke spojení malých mezer, což je velmi důležité, protože kvalita vyfocené tabulky je horší než kvalita naskenovaného for-muláře. Po nalezení tabulky, pomocí kontur, jsou opět nalezena jednotlivá políčka a nakonec samotná písmena podobně, jak bylo popsáno v kapitole Automatické zpracování formulářů. Na konec je písmeno upraveno na velikost 32x32 pixelů.

Po extrakci písmene následuje rozpoznání, které probíhá roztažením obrázku 32x32 na vektor o velikosti 1024 prvků. Tento vektor je vložen do neuronové sítě, která vytvoří výstupní vektor. Největší prvek výstupního vektoru označuje písmeno, o kterém neuronová síť předpovídá, že se nachází na daném obrázku. Předpovězené písmeno je vykresleno pod políčko s daným písmenem.

Taková aplikace by se po zdokonalení mohla použít pro přepis formulářů nebo dokumentů do digitální podoby. Jednou z možností zdokonalení by bylo přidání autokorekce, protože ve většině případů chybné písmeno vytvoří nesmyslné slovo, které lze podle slovníku opravit. Dalším zdokonalením by bylo použití konvoluce, například z knihovny TensorFlow, která dokáže rozpoznávat písmena s přesností blížící se 100 %.

3.1 Implementace

Jednou z překážek pro správné rozpoznání písmene je proměnné pozadí. Toto je způ-sobeno nerovnoměrným osvětlením formuláře. Jelikož je neuronová síť natrénována na písmenech s bílým pozadím, je nutné co nejlépe odstranit šedé pozadí a případný šum. Pro tento účel jsem vytvořil algoritmus, který iterativně omezuje maximální hodnotu pixelů a následně obrázek normalizuje. Normalizace „roztáhne“ hodnoty tak, aby byly v rozmezí 0 – 255. Ve chvíli kdy má více než polovina pixelů hodnotu 255 je algoritmus ukončen.//

Zdrojový kód 5: Odstranění nežádoucího pozadí

1 f o r ( i n t j = 0 ; j < 3 0 ; j ++)

V kódu je vidět, že se pracuje s obrázkem v proměnné ”show”. Funkce ”threshold”

nastaví maximální hodnotu pixelů na 240. Takto se odstraní část šumu a funkce

”normalize” normalizuje obrázek. Součet všech pixelů s hodnotou 255 je porovnán s polovinou počtu pixelů a na základě této informace algoritmus pokračuje nebo je ukončen.

47

4 Závěr

Získal jsem 328 vyplněných formulářů od různých lidí. Jelikož je na každém formu-láři 130 písmen, získal jsem více než 42000 písmen pro moji databázi. Databáze, je poměrně kvalitní, díky množství písmen a jejich různorodosti, a lze ji použít pro další aplikace. Tato databáze je více než dostatečně rozsáhlá, pro použití v baka-lářské práci. Pro zlepšení kvality databáze je možné ji rozšířit o další naskenované formuláře. Na přiloženém CD je k dispozici formulář a program pro automatické zpracování vyplněných formulářů.

Všechny metody kromě konvoluční neuronové sítě se povedlo úspěšně implemen-tovat. Implementace metod, které pracují pouze s vektory, jsou poměrně rychlé, ale je zde prostor pro optimalizaci rychlosti, jak je vidět z porovnání s programem MATLAB. K zrychlení učení, by mohlo pomoci, například přesunutí některých vý-počtů na grafickou kartu. Bohužel je přesunutí vývý-počtů na GPU poměrně složitá záležitost. Tato vylepšení by bylo možné aplikovat například jako součást diplomové práce.

Jednotlivé metody jsem prozkoumal a nejlepší univerzální metodou je hluboká neuronová síť. V případě obrázků je však značně lepší konvoluční neuronová sít. Kon-voluční neuronová síť v programu MATLAB dokonce dokáže rozpoznávat písmena s podobnou úspěšností jako člověk. Přesnost rozpoznávání 92 % je lepší výsledek, než ve který jsem doufal na začátku této bakalářské práce.

Očekával jsem, že velký počet písmen bude mít za následek výrazný pokles přes-nosti rozpoznávání vůči rozpoznávání čísel z databáze MNIST. Ukázalo se však, že rozpoznávání 26 tříd není o moc těžší než rozpoznávání 10 tříd v případě číslic. Dále je z průzkumu vidět, že by na formuláři mohlo být i více vzorků od každého písmene.

Nárůst přesnosti by byl stále významný.

Výsledný program, který aplikuje vytvořenou databázi, dokáže rozpoznat pís-mena vepsaná do tabulky s přesností zhruba 85 %. Tato přesnost se může měnit, pokud budou písmena špatně čitelná. Nikdy nelze s jistotou očekávat, že písmena budou správně rozpoznána, pokud je nedokáže přečíst ani člověk.

Možnosti rozšíření této bakalářské práce jsou rozsáhlé. Kromě opravení a opti-malizace konvoluce, by bylo možné přidat rekurentní neuronovou síť, která by byla užitečná na zpracovávání zvuku a jiných sekvenčních informací. Dalším zajímavým tématem je Residuální učení, které vytváří cesty z výstupu vrstvy přímo ke vstupu.

Tyto obchvaty mají pozitivní vliv na tok gradientu, který pak může cestovat přes desítky vrstev a tím dovoluje sestrojit velmi hluboké neuronové sítě.

Literatura

[1] Multiclass SVM optimization demo. Stanford Compu-ter Vision Lab [online]. [cit. 2018-05-08]. Dostupné z:

http://vision.stanford.edu/teaching/cs231n-demos/linear-classify/

[2] KARPATHY, Andrej. ConvNetJS demo: Classify toy 2D data.

Stanford Computer Science [online]. [cit. 2018-05-08]. Dostupné z:

https://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html [3] K-Nearest Neighbors Demo. Stanford Computer Vision Lab [online]. [cit.

2018-05-09]. Dostupné z: http://vision.stanford.edu/teaching/cs231n-demos/knn/

[4] CS231n Convolutional Neural Networks for Visual Recognition. CS231n Con-volutional Neural Networks for Visual Recognition [online]. [cit. 2018-05-09].

Dostupné z: http://cs231n.github.io

[5] IOFFE, Sergey a Christian SZEGEDY. Batch Normalization: Accelerating De-ep Network Training by Reducing Internal Covariate Shift. ArXiv [online]. 2015 [cit. 2018-05-09]. Dostupné z: https://arxiv.org/pdf/1502.03167.pdf

[6] KRATZERT, Frederik. Understanding the backward pass through Batch Nor-malization Layer. Flair of Machine Learning [online]. 2016 [cit. 2018-05-09]. Do-stupné z: https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html

[7] THOREY, Clément. What does the gradient flowing through batch normali-zation looks like?. Clément thorey [online]. 2016 [cit. 2018-05-09]. Dostupné z:

http://cthorey.github.io./backpropagation/

[8] SRIVASTAVA, Nitish, Geoffrey HINTON, Alex KRIZHEVSKY, Ilya SUTSKEVER a Ruslan SALAKHUTDINOV. Dropout: A Simple Way to Prevent Neural Networks from Overfitting. In: University of To-ronto: Computer Science [online]. 2014 [cit. 2018-05-10]. Dostupné z:

http://www.cs.toronto.edu/∼rsalakhu/papers/srivastava14a.pdf

[9] Forward And Backpropagation in Convolutional Neural Networ. Medium [online]. [cit. 2018-05-12]. Dostupné z:

https://medium.com/@2017csm1006/forward-and-backpropagation-in-convolutional-neural-network-4dfa96d7b37e

49

[10] Eigen. Eigen [online]. [cit. 2018-05-12]. Dostupné z:

http://eigen.tuxfamily.org/index.php?title=Main_Page

[11] OpenCV library [online]. Copyright © 2018, OpenCV team [cit. 12.05.2018].

Dostupné z: https://opencv.org

[12] Qt | Cross-platform software development for embedded & desktop [on-line]. Copyright © 2018 The Qt Company [cit. 12.05.2018]. Dostupné z:

https://www.qt.io

[13] Tensor support. Eigen [online]. [cit. 2018-05-12]. Dostupné z:

http://eigen.tuxfamily.org/index.php?title=Tensor_support

[14] MATLAB: Neural Network Toolbox. MathWorks: Makers of MATLAB and Simulink [online]. Copyright © 1994 [cit. 2018-05-12]. Dostupné z:

https://www.mathworks.com/products/neural-network.html

Přílohy

Příloha A - Obsah CD

• Databáze písmen - obsahuje soubory s uloženými písmeny a jejich třídami

• lib - adresář do kterého je nutné vložit knihovny, které doplňují projekty

• Database_Creator - projekt programu pro automatické zpracování formulářů z programu Visual Studio 2015

• Learning_App - projekt programu pro implementaci a pozorování metod z programu Visual Studio 2017

• Letter_Recognition - projekt programu pro rozpoznávání písmen z programu Visual Studio 2015

• Letter Recognition Software - samostatný program pro rozpoznávání písmen

• bakalarska_prace_2018_Tomáš_Blažek.pdf

• Formulář pro text.pdf - formulář potřebný pro rozpoznávání textu v Letter Recognition Software

• Formulář pro tvorbu databáze.pdf

51

Příloha B - Formulář pro tvorbu databáze

Formulář pro sběr dat

Formulář slouží jako podklad k vytvoření databáze ručně psaných velkých tiskacích písmen. Tato databáze bude použita v bakalářské práci s tématem „Strojové rozpoznávání ručně psaného textu“. Děkuji předem za vyplnění.

Poznámky k vyplnění:

1) Písmena pište do řádků vedle předtištěného písmene. Například v prvním řádku, levé tabulky, bude v kolonkách pouze písmeno A.

2) Pište písmena, tak jak jste zvyklý(á), na kráse písma nezáleží.

3) Písmeno napište dovnitř buňky, pokuste se nepřetahovat přes hranice buňky.

Správně -> <- Špatně

4) Pro vyplnění použijte propisku, která nepíše přerušovaně.

5) Při psaní vložte pod formulář další list papíru, nepiště na tvrdém podkladu.

A

Related documents