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.