Mendelova univerzita v Brně Provozně ekonomická fakulta
Rozpoznávání objektů s využitím programu Matlab Diplomová práce
Vedoucí práce: prof. RNDr. Ing. Jiří Šťastný, CSc.
Brno 2012
Bc. Martin Novotný
2 Prostor pro stránku zadání
Rád bych poděkoval vedoucímu této diplomové práce, prof. RNDr. Ing. Jiřímu Šťastnému, CSc. za cenné rady a připomínky, které mi pomohly při tvorbě této práce.
Prohlašuji, že jsem tuto práci napsal samostatně s použitím literatury, kterou uvádím v seznamu.
V Brně dne 20. května 2012
....................................................
5
Abstract Novotný, M. Object recognition using Matlab. Diploma thesis. Brno, 2012. This thesis deals with the creation of applications for object recognition using Matlab. The first chapter deals with the introduction to Matlab and parts necessary for creating the application object recognition. In other chapters of the thesis are discussed neural networks needed to classify objects. The thesis deals with the basic procedures of image processing and subsequently is designed the methodology of object recognition and created application in Matlab.
Abstrakt Novotný, M. Rozpoznávání objektů s využitím programu Matlab. Diplomová práce. Brno, 2012. Tato diplomová práce se zabývá tvorbou aplikace pro rozpoznávání objektů s využitím programu Matlab. První kapitola práce se zabývá seznámením s programem Matlab a jeho částmi potřebnými pro tvorbu aplikace rozpoznávání objektů. V dalších kapitolách práce jsou probírány neuronové sítě potřebné ke klasifikaci objektů. Dále se práce zabývá základními postupy při zpracování obrazu a následně je navržena metodika rozpoznávání objektů a vytvořena aplikace v programu Matlab.
6
OBSAH
Obsah 1 Úvod a cíl práce 1.1 Úvod do problematiky . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Cíl práce a metodika . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Matlab 2.1 Popis prostředí Matlabu . . . . . 2.2 M-soubory . . . . . . . . . . . . . 2.3 Použité toolboxy . . . . . . . . . 2.3.1 Image Processing Toolbox 2.3.2 Image Acquisition Toolbox 2.3.3 Neural Network Toolbox .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
8 8 8 9 10 10 12 12 12 13
3 Neuronové sítě 14 3.1 Model neuronu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2 Vícevrstvé sítě a metoda backpropagation . . . . . . . . . . . . . . . 16 4 Zpracování obrazu 4.1 Snímání obrazu . . . . . . . . . . 4.2 Digitalizace obrazu . . . . . . . . 4.2.1 RGB . . . . . . . . . . . . 4.2.2 CMYK . . . . . . . . . . . 4.2.3 HSV . . . . . . . . . . . . 4.3 Předzpracování obrazu . . . . . . 4.3.1 Geometrická transformace 4.3.2 Jasová transformace . . . 4.3.3 Filtrace a ostření . . . . . 4.4 Segmentace obrazu . . . . . . . . 4.5 Popis objektů . . . . . . . . . . . 4.6 Klasifikace . . . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
20 20 22 24 24 25 25 26 27 28 28 29 29
5 Metodika porovnávání objektů v programu Matlab 5.1 Návrh GUI . . . . . . . . . . . . . . . . . . . . . . . 5.2 Popis funkcí aplikace . . . . . . . . . . . . . . . . . . 5.2.1 Načtení obrazu . . . . . . . . . . . . . . . . . 5.2.2 Výběr a ořez obrazu . . . . . . . . . . . . . . 5.2.3 Pre-processing . . . . . . . . . . . . . . . . . . 5.2.4 Trénování neuronové sítě . . . . . . . . . . . . 5.2.5 Rozpoznávání objektů . . . . . . . . . . . . . 5.2.6 Ukládání a načítání trénovacích dat . . . . . . 5.3 Ošetření chybových událostí . . . . . . . . . . . . . . 5.4 Testování rozpoznávání aplikace . . . . . . . . . . . . 5.5 Kompilace samostatně spustitelné aplikace . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
30 30 31 32 34 35 40 45 48 50 50 52
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
OBSAH
7
6 Závěr 54 6.1 Možnosti rozšíření . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.2 Přínos práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 7 Literatura
56
1
ÚVOD A CÍL PRÁCE
1 1.1
8
Úvod a cíl práce Úvod do problematiky
Vnímání obrazových vjemů patří mezi nejdůležitější vlastnosti každého člověka. S pomocí zraku dokážeme vnímat svět kolem nás, získávat informace o svém okolí a rozpoznávat v něm různé objekty. Díky sítnici našeho oka dokážeme zachycovat jasové informace a přenášet je do mozku, kde jsou tyto informace dále zpracovány a vyhodnoceny. Na základě toho dokážeme rozpoznat, co vidíme. Myšlenkou naučit těmto dovednostem také stroje se zabývá počítačové vidění. Cílem počítačového vidění je nahrazení celého procesu lidského vnímání obrazu za strojové zpracování obrazu, jehož úkolem je snímanému obrazu porozumět a interpretovat ho jako model reálného světa. Lidské oko snímající obraz se ve strojovém zpracování obrazu dá nahradit objektivem a sítnice oka vhodným snímačem obrazu. Počítač pak zastane práci mozku a provede zpracování a vyhodnocení informací. Díky tomu stroj dokáže rozpoznat co se před ním nachází a provést další potřebné kroky. Dokonce s využitím různých typů snímačů dokážeme o obraze získat informace, které nám zrak ani získat neumožňuje. Příkladem může být například snímání magnetického pole pomocí tomografu, rentgenového záření, ultrazvuku pomocí sonaru nebo snímání tepla s pomocí termovize. Systémy počítačového vidění se vyžívají v mnoha oborech lidské činnosti. Lze jej využít například v průmyslu jako součást řídících systémů robotů nebo autonomně jedoucích vozidel, dále pro detekci různých jevů při sledování bezpečnostními kamerami nebo také ke vzájemné interakci počítače s člověkem. Významné je také využití v oblasti modelování objektů nebo prostředí, například při obrazové kontrole kvality výrobků v průmyslu.
1.2
Cíl práce a metodika
Cílem této práce bude navrhnout vhodnou metodiku pro automatické rozpoznávání objektů a naimplementovat aplikaci realizující rozpoznávání objektů v programu Matlab. Pro dosažení námi stanoveného cíle práce je nutno splnit několik následujících bodů. Nejprve bude potřeba provést seznámení s programem Matlab a s jeho toolboxy, které budeme k realizaci aplikace potřebovat, dále pak vysvětlit teoretickou problematiku neuronových sítí, které budeme využívat ke klasifikaci objektů a v neposlední řadě osvětlit základní postupy při zpracování obrazu. Pro ověření správné funkce naimplementované aplikace provedeme její otestování na zkušeních objektech.
2
2
MATLAB
9
Matlab
V této kapitole si nejprve představíme program Matlab a jeho toolboxy, které budou společně s Matlabem později potřebné k vytvoření vlastní aplikace k rozpoznávání objektů. V další části práce se pak budeme věnovat základním pojmům z oboru zpracování obrazu a také si představíme neuronové sítě, které budou potřebné k rozpoznávání objektů. Nyní si blíže popíšeme program Matlab. Program Matlab se používá k řešení široké škály problémů a jeho celé popsání by bylo velmi obsáhlé. Proto se v popisu zaměříme především jen na ty části Matlabu, které budeme potřebovat pro tvorbu naší aplikace rozpoznávání objektů. MATLAB (MATrix LABoratory = maticová laboratoř) je výkonné interaktivní prostředí pro vědecké výpočty. Spojuje technické výpočty, vizualizaci dat a programovací jazyk v jednom prostředí. Společně s množstvím dostupných modulů tak vytváří ideální prostředek pro inženýry, vědce, matematiky a učitele při řešení problémů z mnoha oblastí. Aplikaci vyvíjí firma MathWorks a dodává ji s celou řadou rozšíření a toolboxů (Karban, 2006). Matlab poskytuje svým uživatelům nejen mocné grafické a výpočetní nástroje, ale i rozsáhlé specializované knihovny funkcí spolu s výkonným programovacím jazykem čtvrté generace. Knihovny jsou svým rozsahem využitelné prakticky ve všech oblastech lidské činnosti. Prostředí programu Matlab je dále vhodné pro vědeckotechnické výpočty, modelování, návrhy algoritmů, simulace, analýzu a prezentaci dat, paralelní výpočty, měření a zpracování signálů, návrhy řídicích a komunikačních systémů. Matlab je nástroj jak pro pohodlnou interaktivní práci, tak pro vývoj širokého spektra aplikací. Díky své architektuře je Matlab určen zejména těm, kteří potřebují řešit početně náročné úlohy a přitom nechtějí nebo nemají čas zkoumat matematickou podstatu problémů. Významnou předností jazyka Matlabu je jeho jednoduchost oproti jiným známým jazykům. Matlab je mnohem jednodušší než například Fortran nebo C a skýtá obrovský potenciál produktivity a tvořivosti. Za nejsilnější stránku Matlabu je považováno mimořádně rychlé výpočetní jádro s optimálními algoritmy, které jsou prověřeny léty provozu na špičkových pracovištích po celém světě. Matlab byl implementován na všech významných platformách mezi které patří Windows, Linux, Solaris a Mac (Humusoft, 2012). Mezi klíčové vlastnosti Matlabu dle Karbana (Karban, 2006) patří: • vysokoúrovňový jazyk pro technické výpočty • otevřený a rozšiřitelný systém • velké množství aplikačních knihoven • podpora vícerozměrných polí a datových struktur • interaktivní nástroje pro tvorbu grafického uživatelského rozhraní • import a export dat do mnoha formátů, znázorněno na obrázku 1 • komunikace s externími měřícími a monitorovacími přístroji v reálném čase
2.1
Popis prostředí Matlabu
10
• rozšiřitelnost modulů jazyky C, C++, Fortran, Java
Obr. 1: Vstupy a výstupy Matlabu (Humusoft, 2012)
2.1
Popis prostředí Matlabu
Po spuštění programu Matlab se objeví okno s pracovním prostředím složené z několika částí. Na obrázku 2 vidíme náhled na pracovní prostředí spuštěné v operačním systému Windows. Nejdůležitější a také nejpoužívanější částí Matlabu je příkazové okno Command Window. Okno Command Window slouží ke komunikaci s výpočetním jádrem Matlabu. Zde mohou být zadávány příkazy, vypisována chybová hlášení, varování nebo obsah proměnných. Další důležitou částí Matlabu, kterou by jsme měli zmínit je okno pracovního prostředí Workspace, které slouží ke sledování použitých proměnných a okno historie příkazů Command History, kde se průběžně ukládají všechny příkazy napsané do příkazového okna Command Window. V horní části okna Matlabu je aktuální pracovní adresář Current Directory, který je možné změnit přepsáním cesty nebo vybráním cesty pomocí tlačítka se třemi tečkami. Z aktuálního adresáře se pak spouští skripty a funkce (Karban, 2006).
2.2
M-soubory
Pracovat se systémem Matlab je možné interaktivně v hlavním okně Command Window. Uživatel zapisuje příkazy, které potvrzuje pomocí klávesy Enter. Po jejich potvrzení získává ihned odezvu či výsledek. Tento způsob práce je vhodný pro první seznámení se systémem nebo pro rychlé získání výsledků u jednoduchých typů úloh. Avšak při opuštění systému Matlab nebo při výpadku elektrické energie by byly všechny použité posloupnosti příkazů nedostupné a museli by se psát znovu. Proto zavádíme tvorbu tzv. m-souborů (Zaplatílek, Doňar, 2004).
2.2
M-soubory
11
Obr. 2: Pracovní prostředí Matlabu
M-soubory (m-files) jsou soubory s příponou *.m a obsahují posloupnost příkazů a povelů systému Matlab a jsou uloženy na pevném disku počítače nebo jiném záznamovém médiu. Vytvořit m-soubor lze v libovolném textovém editoru, který nepřidává žádné informace typu formátování a který umožňuje zápis vlastní přípony souboru *.m. Pro uživatele bývá nejjednoduší cestou použít k vytváření m-souborů vestavěný editor v Matlabu. Je zřejmé, že vytvářením m-souborů se práce s Matlabem blíží programování, tak jak jej známe z jiných vývojových prostředí (Zaplatílek, Doňar, 2004). Rozlišujeme dva základní typy m-souborů: • skripty • funkce Skripty označují jednoduché m-soubory, které obsahují příkazy Matlabu. Jejich označení vychází z angličtiny. Když je spuštěn skript, Matlab jednoduše spustí příkazy, které nalezne v souboru. Příkazy ve skriptovém souboru operují globálně s daty v pracovním prostoru. Skripty jsou užitečné k provedení analýz, řešení problémů nebo konstruování dlouhých posloupností příkazů, které se interaktivně dají dělat jenom těžkopádně a zdlouhavě. Jednoduše řečeno, skripty neumí to, co umí funkce. Funkce také patří mezi m-soubory. Na rozdíl od skriptů však mohou být volány
2.3
Použité toolboxy
12
s jedním nebo více vstupními parametry a mohou předávat jeden nebo více výstupních parametrů. To je důležité např. tehdy, když v rámci jednoho m-souboru voláte jiný m-soubor a jeho činnost se projeví tím, že předá své výsledky (parametry). Funkce je tedy sofistikovanější skript, který toho umí více a s jehož pomocí můžeme vytvářet nové funkce k funkcím existujícím.
2.3
Použité toolboxy
Otevřená architektura Matlabu vedla ke vzniku mnoha knihoven funkcí, nazývaných toolboxy. Toolboxy rozšiřují použití programu v příslušných vědních a technických oborech. Tyto knihovny, navržené v jazyce Matlabu, nabízejí předzpracované specializované funkce, které je možno rozšiřovat, modifikovat, a nebo jen čerpat informace z přehledně dokumentovaných algoritmů (Humusoft, 2012). Toolboxy jsou v podstatě m-soubory (m-files) vytvořené pro podporu řešení úloh s různým profesním zaměřením. Pro naše účely zpracování obrazu a rozpoznávání objektů nebudeme potřebovat všechny toolboxy, proto se zaměříme především na popis toolboxů, které budeme potřebovat později při implementaci naší aplikace. Z oblasti zpracování obrazu budeme potřebovat Image Processing Toolbox, Image Acquisition Toolbox a pro práci s neuronovou síťí budeme využívat Neural Network Toolbox. 2.3.1
Image Processing Toolbox
Image Processing Toolbox je výkonný, pružný a snadno ovladatelný nástroj pro zpracování a analýzu obrazu. Na základě mohutného výpočetního potenciálu Matlabu jsou vybudovány nadstavby pro návrhy filtrů, rekonstrukci a analýzu obrazů, dále nadstavby pro manipulaci s barvami, geometrií a strukturou obrazů včetně 2-D transformací. Na technologii zpracování obrazu jsou založeny špičkové metody lékařské i průmyslové diagnostiky, analýzy dat a automatizace. Analýza obrazu je nepostradatelná v astronomii, geofyzice, ale i v ekologii a dalších oborech jako jsou například komunikace, vojenství nebo spotřební elektronika. Pro svou výpočetní mohutnost, otevřenost a strukturu aplikačních knihoven je Matlab spolu s Image Processing Toolboxem optimálním nástrojem v tak mnohaoborovém prostředí jako je digitální zpracování obrazu (MathWorks, 2012). 2.3.2
Image Acquisition Toolbox
Image Acquisition Toolbox umožňuje získávat obrazová data a video z PCkompatibilních snímacích zařízení přímo do Matlabu a Simulinku. Hardware je možno detekovat automaticky a lze konfigurovat jeho nastavení, zobrazit náhled a uložit obraz nebo video do paměti nebo přímo na disk. Jsou podporována zařízení řady dodavatelů, od levných webových kamer nebo průmyslových frame grabberů až po špičkové vědecké kamery, které splňují nejnáročnější požadavky (MathWorks, 2012).
2.3
Použité toolboxy
2.3.3
13
Neural Network Toolbox
Neural Networks Toolbox poskytuje nástroje pro návrh, tvorbu, trénování, simulaci a vizualizaci neuronových sítí. Neuronové sítě nachází uplatnění zejména v oblastech, kde je použití formálních analytických nástrojů obtížné či dokonce nemožné, jako je vzorové rozpoznávání nebo řízení a identifikace nelineárních soustav. Neural Networks Toolbox nabízí grafická uživatelská rozhraní, která usnadňují návrh a práci s neuronovými sítěmi. Modulární, otevřená a rozšiřitelná stavba toolboxu zjednodušuje tvorbu vlastních funkcí a sítí. Neural Networks Toolbox také obsahuje funkce pro automatické vytváření simulačních bloků neuronových sítí do Simulinku. Současné verze umožňují práci nejenom se základními a s jednoduchými modely neuronových sítí, ale také s mnoha novými metodami, které byli vyvinuty v posledních letech. Ty obsahují nové varianty učení, jejichž součástí jsou i rychlé a optimalizační algoritmy. Pomocí přiložených demonstračních úloh je možné se seznámit s jednotlivými fázemi návrhu sítě, jejího trénování a zpracování výsledků (Tučková, Bártů, Zetocha, 2009).
3
NEURONOVÉ SÍTĚ
3
14
Neuronové sítě
Pro rozpoznávání objektů, tedy jejich klasifikaci použijeme prostřednictvím programu Matlab neuronové sítě. Proto si nyní přiblížíme základní pojmy problematiky neuronových sítí a uvedeme popis topologie neuronové sítě, kterou později použijeme v naší aplikaci. Neuronové sítě jsou inspirovány biologickými neuronovými sítěmi. Tato vlastnost určitým způsobem předurčuje, že uměle vytvořené neuronové sítě by měly být schopny, z hlediska základních principů, se chovat stejně nebo alespoň podobně jako jejich biologické vzory. Je zřejmé, že vytvoření umělého lidského mozku se všemi jeho schopnostmi je věc v podstatě neřešitelná, ať už z hlediska kvantity jeho neuronů či jejich způsobů propojení, chování jednotlivých typů neuronů apod. Přesto můžeme simulovat alespoň některé funkce lidského myšlení a u těchto funkcí pak provést implementaci (Vondrák, 2000). Neuronové sítě využívají distribuované, paralelní zpracování informace při provádění výpočtů. To znamená, že ukládání, zpracování a předávání informace probíhá prostřednictvím celé neuronové sítě spíše než pomocí určitých paměťových míst. Dá se tedy říci, že zpracování informace a paměť v neuronové síti je ve své přirozené podstatě spíše globální než lokální (Vondrák, 2000). Znalosti jsou ukládány především prostřednictvím síly vazeb mezi jednotlivými neurony. Platí zde pravidlo, že vazby mezi neurony vedoucí ke správné odpovědi jsou posilovány a naopak, vazby vedoucí ke špatné odpovědi jsou oslabovány pomocí opakované expozice příkladů popisujících problémový prostor (Vondrák, 2000). Další podstatnou a základní vlastností neuronových sítí je jejich učení. Tento fakt zjevně vyjadřuje základní rozdíl mezi dosud běžným použitím počítačů a použitím prostředků na bázi neuronových sítí. Jestliže jsme doposud veškeré své úsilí při tvorbě uživatelských programů soustředili na vytváření algoritmů které provádějí transformaci vstupní množiny dat na výstupní množinu dat, pak neuronové sítě již tuto náročnou fázi nepotřebují. Právě fáze učení u neuronových sítí nám určuje jakým způsobem se budou vstupní data transformovat na data výstupní. Fáze učení je založená na expozici vzorků (příkladů) popisující řešenou problematiku. Tyto vzorky nazýváme trénovací množinou. Tím pádem odpadá nutnost algoritmizace úlohy, která je nahrazena předložením trénovací množiny neuronové síti a jejím učením (Vondrák, 2000).
3.1
Model neuronu
Neuronová síť je síť mnoha navzájem bohatě propojených jednoduchých procesorů (Mařík, 1993). Graf propojení se obvykle nazývá topologie sítě a procesory nazýváme neurony. Uměle vytvořený neuron je popsán pomocí svého biologického vzoru a tvoří jakousi základní výpočetní jednotku složitějšího komplexu, kterým je neuronová síť. Zjednodušeně lze biologický neuron znázornit a popsat dle obrázku 3. Z obrázku vidíme, že biologický neuron se skládá z několika částí, které si nyní popíšeme:
3.1
15
Model neuronu
Obr. 3: Biologický vzor neuronu (Churý, 2005)
• Dentrity - reprezentují místo vstupu signálů do těla neuronu. • Tělo buňky - sčítá signály dané okolními neurony. Takto stanovený vnitřní potenciál vede k excitaci (vybuzení) neuronu. • Axonové vlákno - přenáší signál daný stupněm excitace k synapsím. • Synapse - tvoří výstupní zařízení neuronů, které signál zesilují či zeslabují a předávají neuronům. Základní stavební jednotkou matematického modelu neuronové sítě je tzv. formální neuron. Ten je získán ze zjednodušeného biologického neuronu. Práce neuronu je pak také motivována svým biologickým vzorem. Schématická struktura formálního neuronu je popsána na obrázku 4. Formální neuron má tedy obecně n reálných vstupů x1 , ..., xn , které jsou reprezentovány dentrity. Dá se také říci, že tyto vstupy mohou reprezentovat výstup jiných neuronů nebo podněty z vnějšího okolí. Vstupy jsou ohodnocené také obecně reálnými synaptickými váhami w1 , ..., wn , které určují propustnost těchto vstupů. Synaptické váhy tedy slouží k úpravě vstupního signálu a určují důležitost daného spoje vedoucího do neuronu. Písmenem y pak značíme výstupní excitační signál neuronu n (Vondrák, 2000). Celkový podnět neuronu udává vážený součet: ξ=
N X i=1
ω i · xi − θ
3.2
Vícevrstvé sítě a metoda backpropagation
16
Obr. 4: Formální neuron (Šíma, Neruda, 1996)
Tento celkový podnět bývá označován jako potenciál neuronu. Na potenciál reaguje neuron (perceptron) výstupní odezvou Z = S (ξ), kde S je tzv.přenosová funkce. Je-li přenosová funkce ve tvaru funkce skokové, pak se jedná o již výše zmíněný perceptron fungující jako binární klasifikátor. Další určující veličinou neuronu je tzv.práh θ. Tento práh je někdy považován za speciální případ váhy spoje vedoucího do fiktivního neuronu s trvalým výstupem -1. Potom můžeme označit θ0 = ω0 a x0 = P 1 a dostáváme ξ = N i=0 ωi · xi = ω · x. Pokud převýší podnět práh, tedy ω · x > 0, pak bod x leží v kladném nadprostoru vymezeném separující nadrovinou ω · x = 0, jinak leží v nadprosotoru doplňkovém (Mařík, 1993). Hodnota excitace y je dána tzv. aktivační funkcí neuronu, která bývá často označována také jako přenosová funkce. Přenosová funkce S tedy převádí vnitřní potenciál neuronu do definovaného oboru výstupních hodnot y. Nejčastěji je obor výstupních hodnot omezen intervalem [0,1] nebo [-1,1]. Nejčastěji používané přenosové funkce mají tvar a matematický předpis uvedený na obrázku 5.
3.2
Vícevrstvé sítě a metoda backpropagation
Asi nejrozšířenějším způsobem propojení spojitých perceptronů jsou tzv. vícevrstvé neuronové sítě, jejichž topologii můžeme vidět na obrázku 6. Tuto síť pak později také využijeme při realizaci naší aplikace v progamu Maltab. Z uvedeného obrázku vidíme, že neuronová síť je tvořena minimálně třemi vrstvami neuronů. Jedná se o vstupní vrstvu, vnitřní vrstvu (skrytou) a výstupní vrstvu. Vždy mezi sousedními dvěma vrstvami se nachází tzv. úplné propojení neuronů, tedy každý neuron nižší vrstvy je spojen se všemi neurony z vrstvy vyšší. Nyní přejdeme k tomu ja-
3.2
Vícevrstvé sítě a metoda backpropagation
17
Obr. 5: Nejčastěji používané aktivační funkce (Šíma, Neruda, 1996)
kým způsobem je informace zpracována v takovéto síti. Nejprve začneme s popisem dopředného šíření (feedforward) signálu: 1. Neurony vstupní vrstvy jsou excitovány na odpovídající úroveň (v rozmezí 0 až 1). 2. Tyto excitace jsou pomocí vazeb přivedeny k následující vrstvě a upraveny (zesíleny nebo zeslabeny) pomocí synaptických vah. 3. Každý neuron této vyšší vrstvy provede sumaci upravených signálů od neuronů nižší vrstvy a je excitován na úroveň danou svou aktivační funkcí. 4. Tento proces probíhá přes všechny vnitřní vrstvy až k vrstvě výstupní, kde pak získáme excitační stavy všech jejích neuronů. V podstatě jsme tímto způsobem získali odezvu neuronové sítě na vstupní podnět daný excitací neuronů vstupní vrstvy. Takovým způsobem vpodstatě probíhá i šíření signálů v biologickém systému, kde vstupní vrstva může být tvořena např.
3.2
Vícevrstvé sítě a metoda backpropagation
18
Obr. 6: Vícevrstvá neuronová síť (Vondrák, 2000)
zrakovými buňkami a ve výstupní vrstvě mozku jsou pak identifikovány jednotlivé objekty sledování. K naučení neuronové sítě budeme potřebovat trénovací množinu dat, která obsahuje vzorky popisující řešenou problematiku a dále pak vhodnou metodu, která dokáže tyto vzorky zafixovat v neuronové síti formou hodnot synaptických vah. Formálně můžeme trénovací množinu T definovat jako množinu prvků, které jsou definovány jako uspořádané dvojice tímto způsobem: T = {{I1 , O1 }{I2 , O2 }...{Ip , Op }}, Ii = [i1 i2 ...ik ], ij ∈ h0, 1i, Oi = [o1 o2 ...om ], oj ∈ h0, 1i, kde p je počet vzorů trénovací množiny, Ii je vektor excitací vstupní vrstvy tvořené k neurony, Oi je vektor excitací výstupní vrstvy tvořené l neurony a ij , oj jsou excitace j-tého neuronu vstupní resp. výstupní vrstvy. Metoda, která umožňuje adaptaci neuronové sítě nad danou trénovací množinou se nazývá backpropagation, nebo-li metoda zpětného šíření. Na rozdíl od výše popsaného dopředného chodu při šíření signálu neuronové sítě tato metoda adaptace spočívá v opačném šíření informace směrem od vrstev vyšších k vrstvám nižším. Směr šíření metody backpropagation je také znázorněn na obrázku 7 pomocí přerušovaných šipek. Nyní si popíšeme princip této metody zpětného šíření: 1. Vezmeme nejprve vektor Ij i-tého prvku trénovací množiny, kterým excitujeme neurony vstupní vrstvy na odpovídající úroveň. 2. Výše popsaným způsobem provedeme dopředné šíření tohoto signálu až k výstupní vrstvě neuronů. 3. Srovnáme požadovaný stav daný vektorem Oi i-tého prvku trénovací množiny se skutečnou odezvou neuronové sítě.
3.2
Vícevrstvé sítě a metoda backpropagation
19
Obr. 7: Metoda backpropagation
4. Rozdíl mezi skutečnou a požadovanou odezvou definuje chybu neuronové sítě. Tuto chybu pak v určitém poměru, který nazýváme learning rate vracíme zpět do neuronové sítě formou úpravy synaptických vah mezi jednotlivými vrstvami směrem od horních vrstev k vrstvám nižším tak, aby chyba byla při následující odezvě menší. 5. Po vyčerpání celé trénovací množiny se vyhodnotí celková chyba přes všechny vzory trénovací množiny a pokud je tato vyšší než požadovaná chyba celý proces se opakuje znovu.
4
ZPRACOVÁNÍ OBRAZU
4
20
Zpracování obrazu
Obecně můžeme zpracování obrazu chápat jako převod analogového obrazu světa kolem nás do digitální podoby a jeho další zpracování. Celý proces zpracování a rozpoznávání obrazu reálného světa můžeme rozdělit do několika základních kroků. Rozdělení postupu může být v každé literatuře trochu jiné a tak není zcela jednoznačné. Avšak jestli budou uplatněny všechny kroky a v jakém pořadí záleží až na konkrétní aplikaci (Hlaváč, Sedláček, 2005). Posloupnost základních kroků zpracování obrazu je: • Snímání • Digitalizace • Předzpracování • Segmentace • Popis objektů • Klasifikace
4.1
Snímání obrazu
Snímání obrazu můžeme z fyzikálního hlediska chápat jako převod vstupní optické veličiny na elektrický signál spojitý v čase i úrovni. Vstupní veličinou při snímání nemusí být vždy jen jas z kamery nebo skeneru, ale mohou jí být i jiné veličiny, jako jsou intenzita rentgenového záření, tepelná intenzita, nebo ultrazvuk. Pro naše účely budeme dále uvažovat jako vstupní veličinu výhradně jas z kamery (Šonka, Hlaváč, Boyle, 2008).
Obr. 8: Geometrie perspektivního promítání (Hlaváč, Sedláček, 2005)
4.1
21
Snímání obrazu
Z geometrického hlediska lze snímání obrazu definovat jako převod trojrozměrného (3D) obrazu světa kolem nás do dvojrozměrné (2D) podoby. Tento převod je výsledkem perspektivního zobrazení, neboli středového promítání. Toto zobrazení bývá často závislé na vlastnostech snímací optiky. Perspektivní zobrazení je v jednoduchém přiblížení modelováno dírkovou komorou, kterou vidíme na obrázku 8. Nechť x, y, z jsou souřadnice bodu P ve 3D scéně a nechť f je vzdálenost obrazové roviny od středu promítání. Bod promítnutý do 2D obrazové roviny nechť má souřadnice x0 , y 0 . Potom pro perspektivní zobrazení platí: x0 =
xf 0 yf ,y = z z
Na výsledný sejmutý obraz má vliv mnoho různých faktorů. Mezi tyto faktory patří například ozáření snímaného objektu a jeho vlastnosti, tvar, aj. Znalost těchto vlastností nám pak může pomoci při zpětné rekonstrukci 3D obrazu z nasnímané scény. Aby jsme mohli provést snímání jasu z kamery a převést tento jas na elektrický signál, musíme použít fotocitlivé snímače dopadajícího světelného záření (Hlaváč, Sedláček, 2005). Na umístění obrazového snímače v kameře se můžeme podívat na obrázku 9. V současné době jsou nejrožšířenější 2 technologie výroby těchto snímačů: • CCD (Charged Coupled Device) • CMOS (Complementary Metal Oxide Semiconductor)
Obr. 9: Umístění obrazového snímače v síťové kameře (Netcam.cz, 2012)
Každý CCD snímač se skládá z mnoha světlocitlivých buněk, které při reakci se světlem vytváří elektrický náboj. Čím více světla na snímač dopadne, tím větší náboj vznikne. Díky tomu se v připojených kondenzátorech nahromadí energie, která je úměrná dopadajícímu záření. CCD čip pak v podstatě funguje jako analogový posuvný registr. Každý kondenzátor předává svůj získaný náboj do sousedního kondenzátoru. Poslední z kondenzátorů je napojen na výstupní zesilovač, který náboj převádí na elektrické napětí a pomocí A/D převodníku je toto převedeno do digitální podoby. Hlavní výhodou CCD snímačů je především jejich vysoká citlivost a v porovnání s CMOS také malý šum. Jako nevýhody můžeme zmíňit možnost
4.2
Digitalizace obrazu
22
vzájemného ovlivňování pixelů, malý rozsah intenzit a také není možné adresovat jednotlivé pixely (Vojáček, 2006). Nyní přejdeme k popisu CMOS snímače. Každý pixel CMOS čipu obsahuje fotodiodu, která je napojena na tzv. aktivní tranzistor. Podle velikosti dopadajícího záření se na tranzistoru nahromadí elektrická energie. Tranzistor je napojen na čtecí a resetovací obvod. Celý CMOS snímač pak tvoří matice takovýchto detektorů. Díky technologickému pokroku se CMOS snímače kvalitou obrazu přiblížili CCD snímačům, ale stále nejsou vhodné pro kamery, od kterých požadujeme nejvyšší možnou kvalitu obrazu. CMOS snímače umožňují nabídnout nižší cenu za kameru, protože obsahují vše, co je potřeba pro vytvoření kamery kolem nich. Umožňují vytvořit kamery o malých rozměrech. K dispozici jsou velké snímače, které přináší megapixelová rozlišení síťovým kamerám. Nevýhodou může být špatná citlivost na světlo, která ještě stále představuje omezení pro využití CMOS snímačů. Tato nevýhoda není problém pokud bude kamera umístěná v dobře osvětleném prostředí, ale u špatně osvětleného prostředí, může být rozdíl v kvalitě obrazu zřetelný. Výsledkem je velmi tmavý obraz plný šumu. Výhodou CMOS snímačů je také jejich malá spotřeba oproti CCD, větší rozsah intenzit a velká rychlost vyčítání (Netcam.cz, 2012).
4.2
Digitalizace obrazu
Ze snímačů jasu získáme spojitý elektrický signál. Digitalizace je proces převedení tohoto signálu do digitální podoby. Digitální obraz je ekvivalentem spojité obrazové funkce f (x, y), kde x a y jsou souřadnice bodu v obrazové rovině. Digitální obraz je získán vzorkováním obrazu do matice M xN bodů a kvantováním spojité jasové úrovně každého vzorku do K úrovní. Čím jemnější je vzorkování (čím větší je M a N matice) a kvantování, tím lépe je aproximován původní spojitý obrazový signál. Vzorkování spojité funkce musí splňovat Shannonův teorém. Pro zpracování obrazu z něho plyne, že nejmenší detail v digitálním obraze musí být minimálně dvojnásobkem vzorkovacího intervalu. Volba vhodného rozlišení je tedy jeden z nejzásadnějších kroků digitalizace. Při nízkém rozlišení se nám v obraze bude ztrácet informace o detailech a při velkém se bude zvyšovat následná výpočetní náročnost. Většina systémů používá kvantování jasu do K stejných úrovní. Je-li pro reprezentaci informace o obrazovém elementu použito b bitů, je počet úrovní jasu K = 2b . Počet úrovní se volí tak, aby nedocházelo k falešným obrysům. Tento jev pro lidské oko nastává pro počet kvantizačních úrovní K < 50. Tuto hodnotu lze snížit např. použitím nelineárního kvantování (Hlaváč, Sedláček, 2005). Důležitou součástí digitalizace je volba vzorkovací mřížky. Nejčastěji používanými mřížkami jsou mřížky čtvercové nebo hexagonální. Obě mřížky si můžeme prohlédnout na obrázku 10. Čtvercová mřížka vychází z konstrukce většiny snímacích prvků a je díky tomu snadno realizovatelná. Avšak jsou s ní spojeny i problémy s měřením vzdáleností a spojitostí pixelů. Tyto nedostatky řeší hexagonální mřížka, která ale není vhodná zase pro některé jiné operace, jako je např. Fourierova transformace. Podrobnější informace je možné najít v odkazované literatuře (Hlaváč,
4.2
23
Digitalizace obrazu
Sedláček, 2005). Dále budeme uvažovat jen čtvercovou vzorkovací mřížku. V sou-
Obr. 10: Čtvercová a hexagonální mřížka (Hlaváč, Sedláček, 2005)
vislosti s digitálním obrazem a vzorkovacími mřížkami si definujeme další důležité pojmy a vlastnosti. Jednomu vzorkovacímu bodu odpovídá v digitalizovaném obraze obrazový element, pixel. Po uspořádání do vzorkovací mřížky pokrývají pixely celý digitalizovaný obraz. Důležitou vlastností je také vzdálenost dvou obrazových bodů udanými souřadnicemi (x, y) a (h, k). Obecně platí, že vzdálenost dvou bodů je chápána jako Euklidovská vzdálenost DE , definovaná podle následujícího vztahu: DE =
q
(x − h)2 + (y − k)2
Pokud však máme prostor diskretizován, tak definujeme nejprve sousedství bodu a pak vzdálenost bodů v obraze za předpokladu daného sousedství. Při využítí čtvercové diskrétní mřížky můžeme uvažovat 4-sousedství nebo 8-sousedství jak znázorňuje obrázek 11. S tím je spojen další důležitý pojem sousednost pixelů. Dva pixely jsou 4-sousedy, pokud je jejich vzdálenost D4 = 1. Podobně jsou dva pixely 8-sousedy, když D8 = 1. Vzdálenosti bodů jsou pak definovány dle následujících vztahů: D4 = |x − h| + |y − k| D8 = max{|x − h|, |y − k|}
Obr. 11: Okolí okamžitého obrazového elementu (Hlaváč, Sedláček, 2005)
Oblast je pak souvislá množina pixelů navzájem vázaných relací sousedství a dva pixely v obraze, mezi nimiž existuje cesta se nazývají souvislé pixely. Důležitým
4.2
Digitalizace obrazu
24
parametrem obrazu je také jeho barva. Každý pixel v sobě nese informaci o všech barevných složkách. Nejběžněji používané barevné modely jsou: • RGB • CMYK • HSV 4.2.1
RGB
Za zkratkou RGB se skrývá označení tří základních barev, Red (červená), Green (zelená) a Blue (modrá) a můžeme jej vidět na obrázku 12. Způsob užití základních tří složek, tedy červené, zelené a modré vychází z tzv. aditivního míchání barev. V případě modelu RGB nejde o míchání fyzických barev, ale o míchání tří světelných záření. Sloučením červeného, zeleného a modrého světla (každé v možné intenzitě 0 až 255) dojde k sečtení barev, proto se jedná o tzv. aditivní model. Sloučením všech tří barev v plné intenzitě (255,255,255) vzniká barva bílá, nulové hodnoty (0,0,0) utvářejí barvu černou jak vidíte na obrázku vlevo. Nejčastěji se tento model používá v zobrazovacích zařízeních jako jsou TV, LCD, projektory (Žára, 1998).
Obr. 12: Barevné prostory RGB a CMYK (ICT kompetence, 2009)
4.2.2
CMYK
Barevný model CMYK stejně jako RGB vyjadřuje názvy základních barev. Cyan (azurová), Magenta (purpurová), Yellow (žlutá) a blacK (černá). Na rozdíl od barevného prostoru RGB užití spočívá v míchání skutečných barev nebo v jejich simulaci. Bílou barvu tedy získáme v absenci základních barev. Černou barvu získáme podle teorie smícháním všech tří základních barev CMY (protipóly RGB) v maximální intenzitě (Žára, 1998). Tento model se nejčastěji používá v tiskárnách a reprodukčních zařízeních. Při tisku však platí, že dokonale černé barvy smícháním tří CMY nikdy nedosáhneme. Proto se přidává ještě jeden kanál s označením K, který reprezentuje tiskařskou čerň. Model CMY je označován jako subtraktivní model, protože mícháním od sebe barvy odčítáme, tedy omezujeme barevné spektrum, které se odráží od povrchu. Souvislost
4.3
25
Předzpracování obrazu
mezi RGB a CMY vyjadřuje následující vztah:
C 1 R M = 1 − G Y 1 B 4.2.3
HSV
Barevný model nazývaný HSV lépe odpovídá popisu barev, na který je člověk zvyklý (intuitivnímu popisu barev). Model HSV má tři základní parametry: barevný tón (Hue), sytost (Saturation) a jas (Value). Barevný tón určuje převládající spektrální barvu, sytost příměs jiných spektrálních barev a jas příměs bílé barvy (bílého světla). V některých případech se model HSV označuje jako HSB. Pro popis zobrazení barev
Obr. 13: Reprezentace HSV modelu šestibokým jehlanem (Žára, 1998)
v modelu HSV se používá šestiboký jehlan, který vidíme na obrázku 13. Tento jehlan je umístěný do souřadnicového systému takovým způsobem, že vrchol jehlanu je v počátku a osa jehlanu je shodná se svislou osou, která zároveň znázorňuje změny úrovně jasu. Jas i sytost, které jsou umístěny na vodorovné ose, se mění v intervalu < 0, 1 >. Na obvodu podstavy jehlanu se tedy nachází čisté barvy. Barevný tón je definován jako velikost úhlu, která se měří od osy S proti směru hodinových ručiček a barevný tón může nabývat hodnot 0-360◦ . Problémem modelu HSV je přechod mezi černou a bílou barvou, který není plynulý a pohyb barevného tónu se neodehrává po kružnici, ale po šestiúhelníku (Žára, 1998).
4.3
Předzpracování obrazu
Po úspěšném získání obrazu a jeho digitalizaci máme k dispozici digitální obraz pozorované scény. Tento obraz však může být zkreslen díky způsobu snímání nebo nevhodných podmínkách v průběhu snímání. Tuto chybu způsobenou zkreslením je možné opravit, pokud je znám charakter zkreslení. Pro opravu je možné využít korekcí, které jsou jednou z metod předzpracování obrazu. Existuje však velké množství dalších metod, které usnadňují další analýzu obsahu obrazu, identifikaci
4.3
26
Předzpracování obrazu
objektů nebo jen zvýrazňují důležité rysy obrazu pro snažší pozorování člověkem (Šonka, Hlaváč, Boyle, 2008). Základní rozdělení metod předzpracování obrazu dle Hlaváče (Hlaváč, Sedláček, 2005): • geometrické transformace • jasové transformace • filtrace a ostření 4.3.1
Geometrická transformace
Geometrická transformace popisuje transformaci nosiče obrazové funkce f (x, y), tj. souřadnic x, y při rotaci, zvětšení, nebo složitějších zobrazeních. Geometrické transformace vypočtou na základě souřadnic bodů ve vstupním (původním) obraze souřadnice bodů ve výstupním (novém) obraze. Geometrická transformace plošného obrazu je vektorová funkce T , která provede zobrazení bodu x, y do bodu x0 , y 0 . Na obrázku 14 můžeme vidět ukázku geometrické tranformace, kdy je bod po bodu transformována část roviny. Transformace T je definována dvěma složkovými vztahy:
Obr. 14: Geometrická tranformace v rovině (Hlaváč, Sedláček, 2005)
x0 = Tx (x, y), y 0 = Ty (x, y) Transformační souřadnice Tx a Ty mohou být buď známy předem, jako je tomu například v případě rotace, posunu nebo zvětšení obrazu, nebo je možné hledat transformační vztah na základě znalosti původního i transformovaného obrazu. Při hledání tranformace se mnohdy využívá několika známých bodů, které v obou obrazech odpovídají stejnému objektu a lze je snadno najít (Hlaváč, Sedláček, 2005). Geometrická transformace se skládá ze dvou kroků: • Transformace souřadnic bodů - provede vyhledání odpovídajícího bodu ve výstupním obrazu k bodu ve vstupním obrazu s diskrétními souřadnicemi. U vý-
4.3
27
Předzpracování obrazu
stupního bodu musíme počítat se spojitými souřadnicemi, protože poloha výsledného bodu nemusí souhlasit s celočíselnou mřížkou. Tato plošná transformace má tedy bodový charakter. Zavádíme zde formalizmus homogeních souřadnic, které umožňují vyjádřit posun, rotaci a affinní transformaci jako součin jedinou maticí. Po zavedení homogeních souřadnic je pak affinní zobrazení vyjádřeno maticově vztahem: x0 a1 a2 a0 x 0 y b b b = 1 2 0 y 1 0 0 1 1
• Aproximace jasové funkce - provede vyhledání celočíselné hodnoty jasu v celočíselné pozici, která nejlépe odpovídá nově vypočítané neceločíselné poloze x0 , y 0 . Hledá se tedy hodnota jasu každého transformovaného bodu. Transformované souřadnice (x0 , y 0 ) mnohdy leží mimo pravoúhlou vzorkovací mřížku. Je tedy nutné hodnoty jasu z původního obrazu vhodně aproximovat. Nejčastěji používané typy aproximací pro jasovou funkci jsou metody nejbližší soused, lineární interpolace a bikubická interpolace. Metoda nejbližšího souseda přiřadí bodu (x,y) hodnotu jasu nejbližšího sousedního bodu gs v diskrétní mřížce a platí tedy: h1 (x, y) = gs (round(x), round(y)). Aproximace pomocí lineární interpolace získá výslednou hodnotu jasu lineární kombinací nejbližších 4 bodů diskrétní mřížky a platí, že čím je bod dále, tím menší má na výsledný jas vliv. U bikupické iterpolace je pak jasová funkce lokálně interpolována pomocí bikubického polynomu z 16 bodů v okolí (Hlaváč, Sedláček, 2005). 4.3.2
Jasová transformace
Transformace hodnot jasu lze rozdělit na jasové korekce a transformace jasové stupnice. U jasových korekcí závisí jas v bodě výstupního obrazu na jasu odpovídajícího bodu ve vstupním obraze a na jeho blízkém okolí. Jasová korekce umožňuje eliminovat vliv zkreslení jasu při průchodu optickou soustavou. K tomuto zkreslení může docházet například vlivem prachových částic na objektivu, které zabraňují průchodu světla nebo slábnutím světla v optické soustavě vlivem vinětace. Také snímač nemusí být stejně citlivý ve všech svých bodech. Jsou-li uvedené chyby systematické, je možné využít jasové korekce (Hlaváč, Sedláček, 2005). U transformací jasové stupnice je pouze transformována určitá hodnota jasu ve vstupním obraze na jinou výstupní hodnotu bez ohledu na polohu v obraze. Transformace jasové stupnice se oproti jasové korekci netýká jednotlivých pixelů, ale upravuje obraz jako celek a umožňuje upravit jas obrazu např. pro lepší zřetelnost detailů pro člověka. Pokud je však obraz určen k automatické analýze pouze počítačem, nepřináší jasová korekce žádnou novou informaci. Pro zvýšení kontrastu monochromatického obrazu se velmi často používá metoda ekvalizace (vyrovnání) histogramu. Ekvalizace zvýší kontrast pro úrovně jasu blízko maxim histogramu a sníží kontrast blízko minim histogramu. Díky tomu bude histogram vyrovnaný,
4.4
Segmentace obrazu
28
což znamená, že jsou jednotlivé jasové úrovně histogramu zastoupeny zhruba stejně četně. Příklad využití metody ekvalizace histogramu je vidět na obrázku 15 (Hlaváč, Sedláček, 2005).
Obr. 15: Ukázka ekvalizace histogramu (Gerla, Hozman, 2005)
4.3.3
Filtrace a ostření
Filtrace a ostření si kladou za cíl odstranění šumu z digitalizovaného obrazu a zviditelnění špatně rozpoznatelných částí. Rozeznáváme dva základní pohledy na filtraci. Prvním je filtrace v prostorové oblasti, která zpracovává obraz jako lineární kombinaci vstupního obrazu s koeficienty filtru a často s mnohem menším definičím oborem než obraz (lokální filtry). Základním matematickým nástrojem filtrace v prostorové oblasti je konvoluce. Druhým pohledem na filtraci je filtrace ve frekvenční oblasti, která provede nejprve převod obrazu do frekvenční reprezentace, kde se následně filtruje a poté se převádí zpět na obraz. Pro převod se využívá několika technik kterými jsou například Fourierova transformace, diskrétní kosinová transformace nebo vlnková transformace. Filtraci pak zajistí běžné filtry typu dolní, horní a pásmová propusť (Šonka, Hlaváč, Boyle, 2008).
4.4
Segmentace obrazu
Segmentace provádí analýzu obrazu vedoucí k nalezení objektů v obraze. Za objekty se považují části obrazu, které jsou pro další zpracování něčím zajímavé. Může se jednat o určité oblasti či hrany (dle typu úlohy). Zbývající části obrazu jsou považovány za pozadí. Výstupem segmentace by měl být soubor oblastí, které odpovídají objektům zájmu v reálnem světě. Pokud objekty odpovídají realitě přesně, hovoříme o úplné segmentaci. Když ale oblasti neodpovídají přesně objektům, tak tuto segmentaci nazýváme částečnou. Úplná segmentace obecně využívá vyšší úrovně zpra-
4.5
Popis objektů
29
cování, která je založena na znalostech řešeného problému. Částečná segmentace je založena na principu homogenity obrazových vlastností uvnitř daného segmentu (Hlaváč, Sedláček, 2005).
4.5
Popis objektů
V této části zpracování obrazu je úkolem popsat soubor objektů získaných segmentací. Existují dva základní způsoby popisu. Jeden je založen na kvantitativním přístupu, což znamená popis objektů pomocí souboru číselných charakteristik. Těmito charakteristikami může být například velikost objektu, kompaktnost, barevný rozptyl, aj. Druhou možností jak popsat dané objekty je kvalitativní přístup. V tomto přístupu jsou popisovány relace mezi objekty a jejich tvarové vlastnosti. Způsob popisu je zvolen vždy podle toho, k čemu bude dál využit. Ve většině případů je tento popis vstupní informací pro klasifikaci (rozpoznávání) objektů. Výstup je závislý na postupu při klasifikaci (Hlaváč, Sedláček, 2005).
4.6
Klasifikace
Posledním krokem při zpracování obrazu je klasifikace (rozpoznávání obrazu). Úkolem klasifikace je zařazení objektů nalezených v obraze do skupiny předem známých tříd. Metody klasifikace objektů se dělí do dvou základních skupin, které souvisí s výše zmiňovaným způsobem popisu objektů. Jedná se o příznakovou klasifikaci a strukturální klasifikaci (Šonka, Hlaváč, Boyle, 2008). Příznaková klasifikace je spojena s kvantitativním popisem objektů. Využívá příznaky, což jsou skupiny charakteristických čísel objektu popisujících jeho vlastnosti (velikost, střed, poloha, atd.). Klasifikace probíhá na základě učení klasifikátoru a to s trénovací množinou i bez ní. Příkladem často používané metody příznakové klasifikace je shluková analýza, která slouží k třídění jednotek do skupin (shluků) tak, aby jednotky náležící do stejné skupiny měly určité podobné vlastnosti oproti objektům z jiných skupin. Strukturální je spojena s kvalitativnín popisem objektů. Využívá primitiv objektu, tj. objektu jsou přiřazeny základní vlastnosti, které objekt charakterizují. Na tyto vlastnosti jsou pak aplikovány algoritmy rozboru slova popisujícího objekt a kontroly syntaxe pro definovanou gramatiku, jazyk a abecedu.
5
METODIKA POROVNÁVÁNÍ OBJEKTŮ V PROGRAMU MATLAB
5
30
Metodika porovnávání objektů v programu Matlab
V této kapitole si popíšeme implementaci vlastního programu pro rozpoznávání grafických objektů v prostředí Matlab. Na začátku bylo potřeba promyslet části a vzhled celého programu. Proto celý proces implementace začal nejprve hrubým návrhem grafického uživatelského rozhranní.
5.1
Návrh GUI
Při návrhu vlastního programu bylo potřeba zvážit, jakým způsobem bude celý program naimplementován. Jako jedna z možností se nabízela varianta vytvoření skriptů a ovládání programu přes příkazový řádek Matlabu. Nicméně vhodnějším a praktičtějším způsobem bylo vytvoření samostatně spustitelné aplikace s vlastním grafickým uživatelským rozhraním (dále jen GUI). Nejprve založíme nové grafické uživatelské rozhranní programu. To provedeme zvolením File, dále volby New a následně vybereme GUI. Tím se vytvoří soubor typu *.fig, obsahující informace o tomto rozhranní a dále se otevře grafický editor, ve které mmůžeme navrhnout vzhled naší aplikace. Celé rozhranní aplikace se skládá z hlavní obrazovky, která je nazvána jako Axes a slouží obecně k zobrazování různých grafů a průběhů. V našem případě bude zobrazovat náhled na rozpoznávané objekty. Dále se zde nachází textové pole, ve kterém se bude vypisovat název rozpoznávaného předmětu, čímž program ukáže jestli objekt rozpoznal správně. Dalším důležitým prvkem rozhranní aplikace je přepínač režimů, ve kterých se může aplikace nacházet. Podle toho v jakém režimu se aplikace nachází, mění své chování. Jedná se o trénovací a rozpoznávací režim. V trénovacím režimu se provadí načítání obrázků s objekty určených k natrénování neuronové sítě. Program se tedy naučí libovolný počet objektů a jejich názvy. V druhém, rozpoznávacím režimu se načítají obrázky, na kterých provádíme testování již natrénované neuronové sítě. To znamená, že provádíme vlastní rozpoznávání jednotlivých objektů a ověřujeme zda-li program provádí rozpoznávání správně. Součástí rozhranní aplikace jsou také dvě tlačítka, sloužící pro uložení a načtení databáze obrázků objektů, určených k naučení sítě. To umožňuje jednoduše nachystat sadu objektů a poté použít načtení pro rychlé vložení všech objektů do programu, provést na nich natrénování neuronové sítě a zahájit rozpoznávání. Tato funkce ulehčí především zdlouhavé zadávání jednotlivých objektů pro naučení. Následuje množství ovládacích tlačítek sloužících především pro načtení obrázku, identifikaci objektu v něm a přidání do databáze objektů. Takhle lze přidat libovolný počet objektů a potom na nich provést natrénování neuronové sítě. Mezi tyto funkce patří možnost vybrat objekt v obrázku ručně, následně provést jeho ořez, a další předzpracování obrazu, které bude později více popsáno. Obecně jsou dvě možnosti vkládání obrázků, buď otevřením uloženého obrázku v počítači nebo sejmutím z kamery s využitím Image Acquisition Toolboxu v Matlabu. Na vzhled výsledného GUI se můžeme podívat na obrázku 16.
5.2
Popis funkcí aplikace
31
Obr. 16: Náhled na GUI aplikace
5.2
Popis funkcí aplikace
V této podkapitole práce se budeme zabývat popisem jednotlivých funkcí aplikace, které byly již nastíněny v rámci popisu GUI. Zjednodušeně lze říci, že každé tlačítko v GUI spouští určitou funkci aplikace. Jádrem celé aplikace je soubor main.m, jehož základ byl vygenerován Matlabem společně s vytvořením GUI aplikace. Z tohoto hlavního souboru jsou pak v případě potřeby volány další m-soubory obsahující skripty vykonávající určité funkcionality. Spuštěním souboru main.m dojde také ke spuštění celé aplikace. Nejprve bylo potřeba provést inicializaci programu. K tomuto účelu je v souboru main.m Matlabem vygenerována funkce s názvem main OpeningFcn, která je zavolána a provedena ještě před tím než se aplikace stane viditelnou pro uživatele. Do této funkce vepíšeme inicializační příkazy, sloužící pro znepřístupnění tlačítek a jejich funkcí, které na začátku nemá smysl, aby uživatel použil. Jedná se o tlačítka pro výběr, ořez, úpravu a rozpoznání, které nemá smysl použít dokud nebude načten obrázek, který budou tyto funkce dále zpracovávat. K tomuto účelu použijeme příkaz set pro nastavení parametru enable na hodnotu off, čímž dojde k vypnutí objektu tlačítka. Dále je také inicializováno pole do kterého budou ukládány názvy jednotlivých objektů, proměnná pro ukládání celkového počtu načtených objektů a proměnná pro ukládání počtu typů objektů. Celkový náhled na výše popsané
5.2
32
Popis funkcí aplikace
inicializační příkazy můžeme vidět v tomto kódu: h a n d l e s . c n t =1; h a n d l e s . p o c o b j =1; h a n d l e s . jmenaObj= ’ ’ ; set ( h a n d l e s . rozpButton , set ( h a n d l e s . vyberButton set ( h a n d l e s . orezButton , set ( h a n d l e s . pripravaBut
5.2.1
’ enable ’ , ’ enable ’ enable ’ , ’ enable
, ’ , ’
’ off ’ ); , ’ off ’ ); ’ off ’ ); , ’ off ’ );
Načtení obrazu
Po inicializaci a zobrazení GUI aplikace by měl uživatel jako první úkon provést načtení prvního obrázku s objektem pro rozpoznání. Načtení obrázku lze udělat dvojím způsobem. První možností je provést načtení obrázku uloženého v počítači. Druhou možností je sejmutí obrázku s objektem pomocí kamery. Nejprve se podíváme na první možnost. Načtení obrázku uloženého v počítači do naší aplikace provedeme kliknutím na tlačítko načti obrázek. Po kliknutí na toto tlačítko dojde k zavolání funkce loadButton Callback. Tato funkce je zavolána jakmile nastane událost stisknutí tlačítka a má následující podobu: function l o a d B u t t o n C a l l b a c k ( hObject , e ve nt da ta , h a n d l e s ) [ f i l e n a m e , pathname ] = u i g e t f i l e ( { ’ ∗ . bmp ’ ; ’ ∗ . j p g ’ ; ’ ∗ . g i f ’ ; ’ ∗ . ∗ ’ } , ’ Vyber o b r á z e k ’ ) ; S˜= imread ( [ pathname , f i l e n a m e ] ) ; u i w a i t ( msgbox ( ’ T r é n o v a c í data načteny ! ’ , ’ Data načteny ! ’ ) ) ; axes ( h a n d l e s . mainAxes ) ; imshow ( S ) ; h a n d l e s . S˜= S ; set ( h a n d l e s . vyberButton , ’ e n a b l e ’ , ’ on ’ ) ; g u i d a t a ( hObject , h a n d l e s ) ;
Samotné načtení obrazu z grafického souboru provede příkaz imread. Tento příkaz vyžaduje dva parametry, kde jako první parametr zadáme cestu k souboru a jako druhý pametr zadáme samotný název souboru k otevření. Parametr s cestou k souboru není povinné zadávat, nicméně by nebylo příliš praktické, kdyby uživatel aplikace musel pokaždé obrázky ukládat do pracovní složky s programem. Jelikož se jedná o aplikaci s GUI, nebylo by vhodné zadávat údaje o cestě a názvu souboru ručně přes příkazový řádek Matlabu. Proto využijeme příkaz uigetfile, který slouží pro vyvolání standardního okna pro výběr souboru k otevření. V parametrech tohoho příkazu můžeme definovat jaké typy souborů mohou být otevřeny a nadefinovat text titulku tohoto okna. Uživatel nyní může provést výběr souboru
5.2
Popis funkcí aplikace
33
obrazu a zvolit jeho otevření. Obrázek se uloží to pomocné proměnné a dále musíme provést zobrazení jeho náhledu v hlavním okně aplikace. Zobrazení načteného obrazu provedeme příkazem imshow, kterému jako parametr předáme naši proměnnou s obrazem. Nesmíme zapomenout definovat, kde se tento obraz zobrazí, jinak by došlo k otevření obrazu v novém okně. K tomu využijeme příkaz axes a definujeme zobrazení obrazu v objektu s názvem mainAxes v našem GUI. V celé funkci pro načtení obrazu je také příkaz pro zpřístupnění dalšího tlačítka pro výběr, které bude potřeba později k dalšímu zpracování načteného obrazu. Nechybí ani zobrazení dialogového okna sloužícího k informování uživatele o úspěšném načtení obrazu. Toto dialogové okno je vyvoláno pomocí příkazu msgbox, který má jako své parametry text sdělení a titulek okna. Příkaz msgbox bývá často zaobalen v příkazu uiwait, který slouží k pozastavení vykonávání fuknce než si uživatel přečte a potvrdí dialogové okno. Druhou možností je získání obrázku sejmutím z kamery. Pro tento účel byla použita klasická webkamera. Načtení obrázku z webkamery provedeme kliknutím na tlačítko sejmout z kamery. Tím je také spuštěna funkce s názvem kamButton Callback, která reaguje na stisk tohoto tlačítka. Pro tento účel je potřeba nejprve vytvořit objekt reprezentující vstup videa. Tento objekt představuje spojení mezi Matlabem a konkrétním zařízením sloužícím ke snímání obrazu. K vytvoření tohoto objektu slouží příkaz videoinput: function kamButton Callback ( hObject , e ve nt da ta , h a n d l e s ) v i d = v i d e o i n p u t ( ’ w i n v i d e o ’ , 2 , ’ RGB24 640x480 ’ ) ; axes ( h a n d l e s . mainAxes ) ; vidRes = get ( vid , ’ V i d e o R e s o l u t i o n ’ ) ; nBands = get ( vid , ’ NumberOfBands ’ ) ; hImage = image ( zeros ( vidRes ( 2 ) , vidRes ( 1 ) , nBands ) ) ;
Videoinput vyžaduje jako povinný parametr název adaptéru, který je používán ke komunikaci se zařízením ke snímání obrazu, což je v tomto případě webkamera. Název adaptéru v konkrétním počítači můžeme zjistit s využitím příkazu imaqhwinfo, který nám ukáže všechny adaptéry dostupné v našem systému. S použitím tohoto příkazu zjišťujeme, že názvem adaptéru je winvideo, a tento název vkládáme jako parametr příkazu videoinput. Dalším parametrem, který zadáme příkazu videoinput je id zařízení sloužící k identifikaci konkrétního zařízení, které je k dispozici prostřednictvím určitého adaptéru. Pokud není tento parametr zadán dojde k použití prvního dostupného zařízení (id 1), což by v našem případě nefungovalo, protože počítač na kterém aplikace běžela obsahoval ještě televizní kartu, která byla přidělena právě na prvním id. Z tohoto důvodu bylo potřeba zjistit id zařízení webkamery a vložit ho jako parametr příkazu videoinput. Zjištění potřebného id opět provedeme pomocí příkazu imaqhwinfo kde jeho parametrem bude název konkrétního adaptéru.
5.2
Popis funkcí aplikace
34
Jako třetí parametr příkazu videoinput vkládáme požadované rozlišení obrazu, kde jsme zvolili 640x480. To je dostačující pro tuto webkameru, jelikož vyšší rozlišení stejně nedokáže zobrazit. Nyní máme všechny potřebné údaje a můžeme provést zobrazení videa z kamery do náhledového okna naší aplikace. K tomu je potřeba vytvořit objekt obrazu, do kterého bude náhled videa promítán. Samotné zobrazení náhledu se provádí pomocí příkazu preview. Tím dojde ke spuštění kamery a postupnému nabíhání obrazu. Po zapnutí kamery trvá určitou dobu, než se objeví obraz a než dojde k jeho rozjasnění a ustálení. Není tedy možné sejmout obraz z kamery ihned po jejím zapnutí. Z tohoto důvodu je nutné počkat určitý čas před sejmutím obrazu z kamery. Proto je příkazem pause pozastaven běh programu na dobu 4 sekund a teprve po uplynutí této doby je sejmut obraz z kamery pomocí příkazu getsnapshot. Sejmutý obraz je pak zobrazen v náhledovém okně aplikace. Celý postup spuštění náhledu, ustálení obrazu a sejmutí požadovaného snímku z kamery vykonává následující kód: p r e v i e w ( vid , hImage ) ; pause ( 4 ) ; snap=g e t s n a p s h o t ( v i d ) ; imshow ( snap ) ; h a n d l e s . i m g c r o p=snap ; set ( h a n d l e s . pripravaBut , ’ e n a b l e ’ , ’ on ’ ) ; g u i d a t a ( hObject , h a n d l e s ) ;
5.2.2
Výběr a ořez obrazu
Další funkcí naší aplikace je možnost výběru objektu. Tato funkce slouží k výběru objektu v obraze, aby program věděl jaký objekt budeme rozpoznávat. To využijeme v případě výskytu více objektů k naučení v jednom obrazovém souboru. Výběr objektu aktivujeme stiskem tlačítka vyber objekt. Po jeho stisku dojde k volání funkce vyberButton Callback: function v y b e r B u t t o n C a l l b a c k ( hObject , e ve nt da ta , h a n d l e s ) S˜= h a n d l e s . S ; axes ( h a n d l e s . mainAxes ) ; % Oznacovac i f i s f i e l d ( handles , ’ api ’ ) h a n d l e s . a p i . delete ( ) ; r m f i e l d ( handles , ’ api ’ ) ; r m f i e l d ( h a n d l e s , ’ hRect ’ ) ; axes ( h a n d l e s . mainAxes ) ; imshow ( S ) ; end axes ( h a n d l e s . mainAxes ) ; sz = size (S ) ;
5.2
Popis funkcí aplikace
35
h a n d l e s . hRect = i m r e c t ( gca , [ round ( s z ( 2 ) / 2 ) round ( s z ( 1 ) / 2 ) 50 5 0 ] ) ; h a n d l e s . a p i = i p t g e t a p i ( h a n d l e s . hRect ) ; set ( h a n d l e s . orezButton , ’ e n a b l e ’ , ’ on ’ ) ; g u i d a t a ( hObject , h a n d l e s ) ;
Funkce zobrazí výběrový obdélník, sloužící k označení objektu v obraze. Zakliknutím a tažením myši je možné měnit jeho velikost pro správné ohraničení objektu. Jakmile je objekt vhodně vybrán provedeme ořezání kliknutím na tlačítko ořezat. Stisknutím tlačítka pro ořezání dojde zavolání další funkce s názvem orezButton Callback. Funkce pracuje tak, že si nejprve zjistí pozici výběrového obdélníku ohraničujícího objekt a poté provede samotné ořezání obrázku pomocí příkazu imcrop. Jako parametr příkaz vyžaduje obrázek který má být ořezán a v druhém parametru pak předáváme informaci o tom, jak má být obraz ořezán. Náhled ořezaného obrázku opět zobrazíme v hlavním náhledovém okně aplikace. Kód celé funkce pro ořezání vybraného objektu můžeme vidět níže: function o r e z B u t t o n C a l l b a c k ( hObject , e ve nt da ta , h a n d l e s ) handles . loc = handles . api . getPosition ( ) ; a s s i g n i n ( ’ base ’ , ’ api ’ , handles . api ) ; axes ( h a n d l e s . mainAxes ) ; S˜= h a n d l e s . S ; h a n d l e s . i m g c r o p = imcrop ( S , h a n d l e s . l o c ) ; axes ( h a n d l e s . mainAxes ) ; imshow ( h a n d l e s . i m g c r o p ) ; set ( h a n d l e s . pripravaBut , ’ e n a b l e ’ , ’ on ’ ) ; g u i d a t a ( hObject , h a n d l e s ) ;
5.2.3
Pre-processing
Následuje další funkce, s názvem Pre-processing neboli předzpracování objektu. Tato funkce je velice důležitá, protože slouží k poslednímu doladění obrázku s objektem a k jeho uložení do databáze, ze které se pak bude trénovat neuronová síť. Po stisku tlačítka Pre-processing dojde k zavolání funkce pripravaBut Callback. Tato funkce nejprve provede načtení ořezaného obrázku z předchozího kroku a potom celý obrázek převede z barevného obrázku RGB na stupně šedi. Dojde tedy k odstranění informace o barevném tónu a sytosti při zachování jasu obrázku. Tohoto převodu dosáhneme s použitím příkazu rgb2gray, který na vstupu dostane ořezaný obrázek objektu z minulého kroku. Teď když jsme provedli převod obrazu na stupně šedi, následuje další důležitý krok, který dále zjednodušší obrázek. Tímto krokem je prahování. Prahování nebo také anglicky tresholding, lze definovat jako nejjednodušší metodu segmentace obrazu založené na hodnocení jasu každého pixelu. Principem prahování je nalezení tzv.prahu v histogramu, kde prahem rozumíme takovou hodnotu, pro kterou
5.2
Popis funkcí aplikace
36
platí, že všechny hodnoty jasu nižší jak práh odpovídají pozadí obrazu, a všechny hodnoty vyšší jak práh odpovídají popředí obrazu. Použitím prahování dostaneme obrázek obsahující jen čistě černou a bílou barvu, tedy takový obrázek, který bude reprezetován body nabývajícími pouze dvou hodnot 0 a 1. K vlastnímu provedení prahování v Matlabu využijeme dvě funkce. Nejprve budeme potřebovat první funkci s názvem graythresh, která slouží k vypočítání globální prahové hodnoty. Prahem zde bude normalizovaná hodnota intenzity ležící v rozsahu mezi 0 a 1. Funkce graythresh využívá k nalezení prahové hodnoty Otsuho metodu. Poté co nám funkce graythresh vrátí požadovanou prahovou hodnotu obrázku, který dostane na vstupu, přichází na řadu další funkce s názvem im2bw, která provede vlastní prahování obrázku. Získáme tedy binární obrázek, reprezentovaný pouze hodnotami 0 a 1, tedy obrázek obsahující pouze černou a bílou barvu. Takto upravený obrázek je uložen do proměnné a bude dále zpracováván. Nyní se podívejme na část kódu vykonávající výše popsaný převod na stupně šedi a prahování obrazu: function p r i p r a v a B u t C a l l b a c k ( hObject , e ve nt dat a , h a n d l e s ) img crop = handles . img crop ; imgGray = r g b 2 g r a y ( i m g c r o p ) ; prah=g r a y t h r e s h ( imgGray ) ; bw = im2bw ( img crop , prah ) ;
V dřívějších krocích došlo k ořezání obrázku, které mohl provést uživatel ručně, vybráním požadované oblasti. Mnohdy však uživatel nevybere objekt na obrázku dokonale a zůstanou kolem něj různě velké bílé plochy. Z tohoto důvodu dojde dále v rámci funkce předzpracování k automatickému ořezu objektu na obrázku přesně k jeho hranám. Tím dojde i k potřebnému přiblížení objektu na obrázku, aby zabíral co největší plochu a byl dobře rozeznatelný. K tomuto účelu byl založen nový skript s názvem auto orez.m, který vykonává automatický ořez: bw2 = a u t o o r e z (bw ) ; axes ( h a n d l e s . mainAxes ) ; imshow ( bw2 ) ; h a n d l e s . bw2 = bw2 ;
Vstupním parametrem tohoto skriptu je samozřejmě náš zpracovávaný obrázek. Nyní již přejdeme k popisu činnosti tohoto skriptu. Na začátku skriptu nejprve provedeme zjištění a uložení rozměrů obrázku a také inicializaci potřebných proměnných: function bw2 = a u t o o r e z (bw) [ y2pom x2pom ] = s i z e (bw ) ; %z j i s t e n i rozmeru m a t i c e o b r a z k u x1 =1; y1 =1; x2=x2pom ; y2=y2pom ;
5.2
Popis funkcí aplikace
37
Potom následuje první cyklus, který slouží ke zjištění bílé mezery na levé straně obrázku. Cyklus prochází matici obrázku po sloupcích z levé strany a pracuje následujícím způsobem - zatímco bude suma všech hodnot prvků (pixelů) z celého sloupce rovna výšce matice, bude se navyšovat rozměr mezery k odstranění a přejde se na další sloupec. Suma všech pixelů v daném sloupci bude rovna výšce matice obrázku, právě tehdy když je celý tento sloupec tvořen hodnotami 1 (bílá barva). Jakmile se objeví obraz, což znamená, že se ve sloupci objeví 0 (tj. černá barva) cyklus skončí. Tímto způsobem jsme získali požadovanou vzdálenost, kterou je nutno odstranit pro ořez obrázku z levé strany. Tento postup ořezání z levé strany vykonává následující kód: pocB=1; while (sum(bw ( : , pocB))==y2pom ) x1=x1 +1; pocB=pocB+1; end
Podobným způsobem pak provedeme zjištění bílého prostoru nad obrázkem, vpravo od obrázku a pod obrázkem: % h l e d a n i prazdna nad obrazkem pocB=1; while (sum(bw( pocB , : ) ) = = x2pom ) %bw ( c i s l o , : ) j d e po r a d c i c h m a t i c e z h o r a y1=y1 +1; pocB=pocB+1; end % h l e d a n i prazdna v p r a v o od o b r a z k u pocB=x2pom ; while (sum(bw ( : , pocB))==y2pom ) x2=x2 −1; pocB=pocB −1; end % h l e d a n i prazdna pod obrazkem pocB=y2pom ; while (sum(bw( pocB , : ) ) = = x2pom ) y2=y2 −1; pocB=pocB −1; end
Při zjišťování bílého prostoru nad obrázkem procházíme jednotlivé řádky matice obrázku, pro zjištění bílého prostoru vpravo se pohybujeme od pravého okraje obrázku po sloupcích, apod. Tím získáme čtyři potřebné souřadnice, které udávají polohu levého horního rohu a pravého dolního rohu imaginárního označovacího obdélníku, podle kterého bude objekt ořezán. Tento princip můžeme názorně vidět na obrázku 17. Tyto souřadnice jsou následně předány funkci imcrop, která provede vlastní ořez obrázku a výsledný ořezaný obrázek je již výstupem tohoto ořezávacího skriptu: % Orezani o b r a z k u
5.2
Popis funkcí aplikace
38
Obr. 17: Hledání bílých prostorů okolo obrázku pomocí sumarizace bw2=imcrop (bw , [ x1 , y1 , ( x2−x1 ) , ( y2−y1 ) ] ) ;
Dále je potřeba takto zpracovaný obrázek uložit do nějaké vhodné struktury. Pro tento účel byla vytvořena proměnná NNdata. Tato proměnná bude obsahovat matice všech obrázků s objekty. Bude tedy sloužit jako databáze pro uložení všech objektů, které se bude neuronová síť učit. Před vložením do této proměnné je ještě obrázek upraven na předem stanovený rozměr. Je totiž nutné, aby všechny obrázky uložené v této databázi objektů měly stejnou velikost. Po vložení objektu do databáze je také navýšena proměnná uchovávající celkový počet typů objektů, který je v databázi obsažen. Aby se mohla neuronová síť vkládaný objekt lépe naučit, provádíme s každým vkládaným objektem rotaci o 360◦ . Rotace je prováděna po krocích o velikosti 45◦ a každá tato rotace je uložena jako nový obrázek a vložena do proměnné NNdata. Tím pádem bude každý typ objektu mít 8 dalších objektů. Díky tomu se může neuronová síť lépe naučit jak vypadá daný objekt při různém natočení, aby pak v režimu rozpoznávání byla indentifikace objektu správná, přestože bude objekt jinak natočený než byl původní objekt na kterém se neuronová síť učila. Problematiku ukládání objektů a jejich rotací vykonává následující kód: i f get ( h a n d l e s . r a d i o t r e n , ’ v a l u e ’ ) == 1 f o r i ˜= 1 : 8 imshow ( bw2 ) % pause ( 1 ) ; h a n d l e s . NNdata ( : , : , h a n d l e s . p o c o b j )= i m r e s i z e ( bw2 , [ 8 0 , 8 0 ] ) ; bw2 = ( bw2 == 0 ) ; bw2=i m r o t a t e ( bw2 , 4 5 , ’ b i l i n e a r ’ ) ;
5.2
Popis funkcí aplikace
39
bw2 = ( bw2 == 0 ) ; bw2 = a u t o o r e z ( bw2 ) ; h a n d l e s . p o c o b j=h a n d l e s . p o c o b j +1; end else h a n d l e s . NNdata ( : , : , h a n d l e s . c n t )= i m r e s i z e ( bw2 , [ 8 0 , 8 0 ] ) ; end h a n d l e s . c n t=h a n d l e s . c n t +1;
Na začátku kódu vidíme nejprve ověření zda-li jsme v režimu trénování, protože v režimu rozpoznávání se rotace s neznámým objektem provádět nebudou. Poté následuje for cyklus, který vytváří všech 8 rotací vkládaného objektu. V cyklu se nachází imshow pro zobrazení náhledu každé rotace a nepovinný příkaz pause, který se zde nachází za účelem zpomalení. Bez zpomalovacího příkazu pause by se rotace objektu provedly tak rychle, že by nebyly v náhledu vidět. Samotnou rotaci provádí příkaz imrotate, jehož parametrem je obrázek k rotaci, úhel o který se má rotovat a parametr uvádějící interpolační metodu. Před vlastní rotací je ještě obrázek ivertován, jelikož by rotace bílého plátna obrázku způsobila vznik černých oblastí, protože výchozí barvou pozadí je černá. Po dokončení rotace je obrázek invertován opět do původního stavu a ořezán k okraji pomocí výše popsaného skriptu auto orez. Jak už bylo zmíněno funkce předzpracování obrazu je dostupná nejen v trénovacím režimu aplikace, ale samozřejmě i v režimu rozpoznávacím. Při vložení neznámého obrázku určeného k rozpoznání je také nutné provést jeho předzpracování. Z tohoto důvodu musí funkce předzpracování dále obsahovat podmínku, která rozlišuje další chování funkce předzpracování, a to buď pro režim trénování nebo režim rozpoznávání. Tato podmínka je vidět v následujícím kódu: i f get ( h a n d l e s . r a d i o t r e n , ’ v a l u e ’ ) == 1 %pokud j e rezim %t r e n o v a n i d e l e j . . . %Okno pro v e p s a n i nazvu o b j e k t u a˜ u l o z e n i nazvu o b j e k t u do seznamu prompt={ ’ Název o b j e k t u ’ } d e f a n s={ ’ ’ } f i e l d s = { ’ name ’ } i n f o = i n p u t d l g ( prompt , ’ V l o ž t e prosím název o b j e k t u ’ , 1 , d e f a n s ) i f ˜isempty ( i n f o ) i n f o = c e l l 2 s t r u c t ( info , f i e l d s ) myname = i n f o . name u i w a i t ( msgbox ( [ ’ Tento o b j e k t b y l pojmenován j a k o : ’ myname ] , ’ Potvrzení ’ ) ) ; end h a n d l e s . jmenaObj =[ h a n d l e s . jmenaObj ; c e l l s t r (myname ) ] ; %konec b l o k u u i w a i t ( msgbox ( ’ Objekt b y l z a ř a z e n do d a t a b á z e !
5.2
Popis funkcí aplikace
40
V l o ž t e prosím d a l š í o b j e k t nebo p r o v e ď t e t r é n o v á n í ’ , ’ Objekt v l o ž e n ! ’ ) ) ; e l s e %j i n a k j e rezim s i m u l a c e u i w a i t ( msgbox ( ’ Objekt načten , nyní l z e p o u ž í t r o z p o z n á n í . ’ , ’ Objekt v l o ž e n ! ’ ) ) ; set ( h a n d l e s . rozpButton , ’ e n a b l e ’ , ’ on ’ ) ; end set ( h a n d l e s . pripravaBut , ’ e n a b l e ’ , ’ o f f ’ ) ; set ( h a n d l e s . orezButton , ’ e n a b l e ’ , ’ o f f ’ ) ; set ( h a n d l e s . vyberButton , ’ e n a b l e ’ , ’ o f f ’ ) ; g u i d a t a ( hObject , h a n d l e s ) ;
Jako první případ si popíšeme trénovací režim, ve kterém vkládáme do programu známé objekty, které se bude později neuronová síť učit. V tomto režimu dojde nejprve k zobrazení okna s dotazem na název objektu. Ke každému objektu je ukládán jeho název, který ho identifikuje. To je nutné, aby pak mohla aplikace při rozpoznání neznámého objektu, vypsat název indentifikovaného objektu, aby bylo jasně patrné o jaký objekt se jedná. Následně aplikace vypíše potvrzení o správném vložení názvu a sdělení o úspěšném uložení objektu do databáze. Nyní ještě dojde k opětovnému zpřístupňění doposud popsaných tlačítek, aby bylo možné zopakování celého postupu a vložení dalších obrázků s objekty. Druhým případem je režim rozpoznávání, ve kterém se funkce předzpracování chová trochu jinak. Funkce provede pouze informování uživatele o načtení neznámého objektu a povolí použití funkce rozpoznání. 5.2.4
Trénování neuronové sítě
Po zpracování a vložení všech objektů do databáze je potřeba provést natrénování neuronové sítě na těchto objektech. K tomuto účelu slouží funkce trenujButton Callback, která je zavolána po stisku tlačítka Natrénuj. Tato funkce nejprve zkontroluje, jestli databáze obsahuje nějaké objekty, a poté dojde k zavolání skriptu traindata: function t r e n u j B u t t o n C a l l b a c k ( hObject , ev en td at a , h a n d l e s ) h a s F i e l d = i s f i e l d ( h a n d l e s , ’ NNdata ’ ) % True nebo F a l s e . % pokud NNdata e x i s t u j i t r e n o v a n i j e mozne , j i n a k chyba i f hasField NNdata = h a n d l e s . NNdata ; [ NNinput NNtarget ]= t r a i n d a t a ( NNdata , h a n d l e s . cnt , h a n d l e s . p o c o b j ) ;
Skript traindata slouží k vytvoření všech potřebných proměnných, které jsou nutné pro vytvoření a natrénování neuronové sítě. Konkrétně se jedná o proměnnou obsahující vstupní data pro všechny vložené objekty a dále o cílovou proměnnou určující do jaké třídy daný objekt spadá. Nyní přejdeme k popisu skriptu traindata. Skript traindata na vstupu požaduje dva parametry. Prvním parametrem je již zmíněná proměnná NNdata obsahující ma-
5.2
Popis funkcí aplikace
41
tice všech vložených obrázků s objekty sloužících k naučení neuronové sítě. Druhým parametrem je celkový počet objektů v databázi. Skript obsahuje tři zásadní v sobě zanořené cykly, ve kterých provádí vlastní zpracování proměnné NNData. První cyklus slouží pro rozlišení jednotlivých obrázků a jejich matic. Pracuje tedy dokud nejsou zpracovány všechny obrázky v databázi. Další cyklus určuje zopracovávání po řádcích a poslední v něm vnořený cyklus určuje zpracovávání sloupců na daném řádku. Celkový pohled na skript traindata a jeho cykly můžeme vidět v následujícím kódu: function [ NNinput , NNtarget ] = t r a i n d a t a ( x , poctypu , p o c o b j ) obr = x ; poctypu=poctypu −1; p o c o b j=pocobj −1; f o r c n t o u t = 1 : p o c o b j %p o c e t o b j pro n a u c e n i f o r c n t =1:8 f o r c n t 2 =1:8 obrpom=sum( obr ( ( c n t ∗10 −9: c n t ∗ 1 0 ) , ( c n t 2 ∗10 −9: c n t 2 ∗ 1 0 ) , cntout ) ) ; obrpom2 ( ( cnt −1)∗8+ c n t 2 )=sum( obrpom ) ; end end pic NNinput ( cntout , : ) = obrpom2 / 1 0 0 ; end NNinput=pic NNinput ’ ; NNtarget=zeros ( poctypu , p o c o b j ) ; p o c a t e k =1; c i l =8; f o r i =1: poctypu f o r j =1: p o c o b j i f j>=p o c a t e k && j<=c i l NNtarget ( i , j )=1; end end p o c a t e k=p o c a t e k +8; c i l = c i l +8 end
V principu to celkově funguje tak, že postupně procházíme celou matici obrázku po blocích o rozměrech 10x10 a v každém bloku vytváříme sumu ze všech hodnot, které se v daném bloku nachází. Jelikož má každý obrázek dohodnutý stálý rozměr 80x80 je potřeba celkem 64 bloků o velikosti 10x10 pro projití celého obrázku. Z každého bloku získáme hodnotu, která je sumou všech hodnot v daném bloku. Tímto způsobem získáme celkem 64 hodnot, které budou ještě pro úpravu vyděleny hodno-
5.2
Popis funkcí aplikace
42
tou 100. Tyto hodnoty reprezentují jeden objekt a jsou použity jako přijatelný vstup pro neuronovou síť. Tento postup je vyobrazen na obrázku 18. Stejným způsobem se pak zpracují všechny zbývající obrázky, a převedou se tak do tohoto formátu, který je vhodný k použití jako vstup pro neuronovou síť. Po zpracování všech objektů jsou jejich hodnoty uloženy do proměnné NNinput a jsou skriptem předány na výstup.
Obr. 18: Princip tvorby vektoru z matice obrázku
Na výstup je předána také proměnná NNtarget obsahující cílové hodnoty. Tato proměnná je nejprve předvytvořena jednoduchým způsobem pomocí příkazu zeros(M,N), který složí k vytváření nulových matic o rozměrech MxN. Rozměr vytvářené matice bude udávat celkový počet objektů k naučení a počet typů (druhů) objektů. Počet sloupců nám udává celkový počet objektů a počet řádků udává počet druhů objektů (klasifikačních tříd). Následně je celá matice procházena po řádcích pomocí dvou for cyklů a jsou postupně doplňovány jedničky na příslušná místa. To v jakém je jednička řádku v daném sloupci (objektu) udává neuronové síti informaci o jaký objekt se jedná. Víme, že každý typ objektu bude mít právě 8 svých rotací (objektů), které spadají do stejné klasifikační třídy. A proto jsou jedničky do matice doplňovány po osmi. Na každém následujícím řádku se pak posouváme o 8 pozic a vyplňujeme jedničky pro další typ objektu. Nyní jsme získali potřebná vstupní data pro neuronovou síť a vracíme se zpět do funkce trenujButton Callback, ze které bude následně volán další skript s názvem createnn sloužící k vytvoření neuronové sítě a k jejímu natrénování na vstupních datech: [ net , t r ] = c r e a t n n ( NNinput , NNtarget , h a n d l e s . c n t ) h a n d l e s . n e t=n e t ;
5.2
Popis funkcí aplikace
43
Tento skript požaduje na vstupu data z výstupu předchozího skriptu traindata, konkrétně proměnné NNinput a NNtarget a opět také informaci o celkovém počtu (typů) objektů. Existuje několik různých příkazů, které slouží k vytvoření objektu neuronové sítě. V našem případě vytváříme dopřednou (feedforward) neuronovou síť se zpětným šířením (back-propagation) a proto použijeme příkaz newff(). Tento příkaz vyžaduje několik vstupních parametrů. První parametr udává rozsah vstupních hodnot pro neuronovou síť. K tomu je využitý příkaz minmax(NNinput), který zjistí minimální a maximální hodnotu elementů ze vstupních vektorů v proměnné NNinput. Druhý parametr udává počty neuronů v jednotlivých vrstvách sítě. Počet vrstev není omezen, avšak nejčastěji se používají dvě vrstvy, jako v našem případě. S1 značí v našem případě počet neuronů v první skryté vrstvě a S2 počet neuronů ve druhé skryté vrstvě, respektive ve vrstvě výstupní. Otázkou je určení počtu neuronů ve skryté vrstvě. Není vždy pravda, že čím více neuronů, tím lepší výsledek. Sice s rostoucím počtem neuronů ve skryté vrstvě (resp. s růstem počtu skrytých vrstev) roste nelinearita chování sítě, avšak rostou také nároky na proces učení (vyšší doba učení). U příliš rozsáhlé sítě by také mohlo docházet k přeučení (overfitting). Počet neuronů volíme spíše experimentálně, neboť neexistuje obecný postup jak nejlépe zvolit jejich počet. Jedna z používaných heuristik radí, aby neuronů ve skryté vrstvě bylo dvakrát tolik než je ve vstupní vrstvě. Využijeme této znalosti a zvolíme 128 neuronů pro S1. Počet neuronů ve výstupní vrstvě S2 je roven počtu typů objektů, které budeme síť učit. Proto je do proměné S2 uložen celkový počet objektů, který byl předán skriptu na vstupu. Dalším parametrem příkazu newff() udává přenosové funkce neuronů jednotlivých vrstev, kde jsme pro obě vrstvy zvolili logsig. Jedná se o nelineární přenosovou funkci, která je tvořena sigmoidou. tuto funkci můžeme vidět na obrázku 19.
Obr. 19: Přenosová funkce logsig
A posledním parametrem je traingda, který nám udává název trénovací funkce sítě, kde traingd je základní gradientní algoritmus a traingda udává adaptivní rychlost učení. Nyní jsme zadali a popsali všechny potřebné parametry, které jsou potřeba k vytvoření objektu neuronové sítě pomocí příkazu newff(). Vytvořenou síť ukládáme do proměnné s názvem net. Dále je ještě potřeba nastavit určité parametry nově vytvořené neuronové sítě. Nastavili jsme maximální počet epoch, který by ve výchozím nastavení nemusel
5.2
44
Popis funkcí aplikace
stačit. Proto jsme provedli jeho navýšení na 5000 epoch, což by mělo dostačovat i pro větší množství vstupních dat. Dále jsme definovali parametr goal, který udává při jaké hodnotě chybové funkce se trénování ukončí. Tento parametr můžeme určit experimentálně. Parametrem show jsme pak definovali jak často se má chybová funkce vykreslovat. Zvolili jsme hodnotu 20, což znamená vykreslení chybové funkce každých 20 epoch. Posledním parametrem, který jsme nastavili je hodnota chybové funkce, kde jsme zvolili sse. Nyní se podíváme na náhled skriptu createnn, kde vidíme také všechny nastavené parametry neuronové sítě: function [ net , t r ] = c r e a t n n ( arg1 , arg2 , p o c e t ) NNinput = a r g 1 ; NNtarget = a r g 2 ; S1 = 1 2 8 ; S2 = pocet −1; %rovno p o c t u t y p u o b j e k t u n e t = n e w f f ( minmax ( NNinput ) , [ S1 S2 ] , { ’ l o g s i g ’ ’ l o g s i g ’ } , ’ t r a i n g d a ’ ) ; n e t .LW{ 2 , 1 } = n e t .LW{ 2 , 1 } ∗ 0 . 0 1 ; n e t . b{2} = n e t . b { 2 } ∗ 0 . 0 1 ;
n e t . performFcn = ’ s s e ’ ; n e t . trainParam . g o a l = 0 . 0 1 ; n e t . trainParam . show = 2 0 ; n e t . trainParam . e p o c h s = 5 0 0 0 ;
% % % %
Sum−Squared Error performance f u n c t i o n . Sum−s q u a r e d e r r o r g o a l . Č e t n o s t v ý p i s u průběhu t r é n o v á n í Max . p o č e t epoch t r é n o v á n í .
[ net , t r ] = t r a i n ( net , NNinput , NNtarget ) ;
Po nastavení všeho potřebného se provede vlastní proces trénování neuronové sítě pomocí příkazu train, který dostává na vstupu objekt neuronové sítě, vstupní data (NNinput) a cílová data (NNtarget). Výstupem je pak natrénovaná neuronová síť. Po spuštění příkazu train dojde ke spuštění a zobrazení funkce Neural Network Training Tool (nntraintool), které zobrazuje informace o síťi a jejím trénování. Můžeme tu vidět topologii neuronové sítě a počet neuronů v jednotlivých vrstvách, dále shrnutí informací o síťi, které obsahuje název aktuálně použité trénovací funkce sítě a název chybové hodnoty funkce. Také jsou zde infomace o vlastním průběhu učení znázorňující počet proběhlých epoch, celkový čas trénování, výkon, příblížení k cílové chybě, apod. Náhled na nntraintool můžeme vidět na obrázku 20. V neposlední řadě nabízí funkce nntraintool vykreslení několika grafů popisujících průběh učení. Prvním z grafů, který je možno zobrazit je Performance plot (plotperform) zobrazující výkon trénování sítě. Tento graf zobrazuje závislost velikosti chyby na počtu uplynulých epoch. Z průběhu grafu je tedy možné vidět jak rychle klesá chyba v závislosti na uplynulých epochách. Přerušovaná čára v grafu ukazuje cílovou hranici chyby, které chceme dosáhnout. Náhled na tento graf můžeme vidět na obrázku 21. Dalším grafem je Training State plot. Jedná se o graf trénovacích stavů, který zobrazuje závislost parametru rychlosti učení - lr (learning rate) na uplynulých epo-
5.2
Popis funkcí aplikace
45
Obr. 20: Náhled na Neural Network Training Tool
chách nebo podobně jako přechozí graf strmost poklesu chyby v závislosti na uplynulých epochách. 5.2.5
Rozpoznávání objektů
Po dokončení procesu trénování a shlédnutí všech informací v trénovacím rozhranní můžeme nntraintool zavřít a přejít k rozpoznávání neznámých objektů pomocí již naučené neuronové sítě. Nejprve se musíme přepnout do rozpoznávacího režimu naší aplikace. K přepnutí slouží radiobutton, který se nachází v našem rozhranní. Po kliknutí na tento radiobutton dojde k volání funkce radiotest Callback, která vykoná všechny potřebné příkazy spojené s přechodem aplikace do rozpoznávacího režimu: function r a d i o t e s t C a l l b a c k ( hObject , ev en td at a , h a n d l e s ) set ( h a n d l e s . r a d i o t e s t , ’ v a l u e ’ , 1 ) ; set ( h a n d l e s . r a d i o t r e n , ’ v a l u e ’ , 0 ) ; set ( h a n d l e s . r a d i o t r e n , ’ e n a b l e ’ , ’ o f f ’ ) ; % Pokusim s e o d s t r a n i t p o l e s ˜názvem NNdata a˜ net , pokud e x i s t u j e . % N e j p r v e z j i s t i , zda e x i s t u j e p o l e s ˜názvem ”NNdata” a ˜” n e t ” . h a s F i e l d = i s f i e l d ( h a n d l e s , ’ NNdata ’ ) % True or F a l s e . hasField2 = i s f i e l d ( handles , ’ net ’ ) i f h a s F i e l d && h a s F i e l d 2 % Pole e x i s t u j e , mazani . h a n d l e s = r m f i e l d ( h a n d l e s , ’ NNdata ’ )
5.2
Popis funkcí aplikace
46
Obr. 21: Pokles chyby v závislosti na počtu iterací h a n d l e s . c n t =1; %vypnu t r e n rezim set ( h a n d l e s . t r e n u j B u t t o n , ’ e n a b l e ’ , ’ o f f ’ ) ; set ( h a n d l e s . u l o z b u t t o n , ’ e n a b l e ’ , ’ o f f ’ ) ; set ( h a n d l e s . n a c t i b u t t o n , ’ e n a b l e ’ , ’ o f f ’ ) ; else warningMessage = s p r i n t f ( ’ Varování : n e l z e p ř e j í t do r o z p o z n á v a c í h o režimu , nejprve proveďte natrénování s í t ě . ’ ) ; u i w a i t ( warndlg ( warningMessage ) ) ; set ( h a n d l e s . r a d i o t r e n , ’ e n a b l e ’ , ’ on ’ ) ; set ( h a n d l e s . r a d i o t r e n , ’ v a l u e ’ , 1 ) ; set ( h a n d l e s . r a d i o t e s t , ’ v a l u e ’ , 0 ) ; end g u i d a t a ( hObject , h a n d l e s ) ;
Nejprve se provede vizuální změna označení režimů v GUI aplikace. Zatržení se smaže u trénovacího režimu a vytvoří u režimu rozpoznávání, aby uživatel viděl v jakém režimu se právě nachází. Následně funkce ověří jestli existuje proměnná NNdata a proměnná net, reprezentující databázi objektů a objekt neuronové sítě. Ověření se provádí za účelem zjistit jestli byly vloženy do programu nějaké objekty k rozpoznávání a jestli byla vytvořena neuronová síť. Pokud se zjistí, že tyto proměnné neexistují bylo by použití režimu rozpoznávání nesmyslné a funkce provede návrat do režimu trénování. V opačném případě, kdy proměnné existují, byly řádně vloženy objekty k natrénování a vytvořena a natrénována neuronová síď dojde k vyčištění proměnné NNdata, která bude nyní využita jako úložiště pro neznámé objekty k ropoznávání. Tím je dokončen přechod do režimu rozpoznávání. Nyní může uživatel vložit nový obrázek s objektem k rozpoznání. Vložení neznámého objektu se provádí zcela stejným způsobem jak bylo popsáno v režimu tréno-
5.2
Popis funkcí aplikace
47
vání. Stejně tak se tento objekt vyznačí na scéně a provede se jeho ořezání a příprava pomocí příslušných tlačítek. Po dokončení vložení a zpracování obrázku můžeme spustit rozpoznávání a identifikovat neznámý objekt stisknutím tlačítka Rozpoznej. Po stisknutí tohoto tlačítka dojde k zavolání funkce rozpButton Callback, která vykoná vlastní proces rozpoznávání: function r o z p B u t t o n C a l l b a c k ( hObject , ev en td at a , h a n d l e s ) n e t=h a n d l e s . n e t ; NNdata = h a n d l e s . NNdata ; NNinput=simdata ( NNdata , h a n d l e s . c n t ) ; NNoutput=sim ( net , NNinput ) ; NNoutput=compet ( NNoutput ) ; answer=find ( compet ( NNoutput )==1); txtAnswer=h a n d l e s . jmenaObj ( i n t 8 ( answer ) ) ; set ( h a n d l e s . v y s l P o l e , ’ s t r i n g ’ , txtAnswer ) ; h a n d l e s . txtAnswer=txtAnswer ; g u i d a t a ( hObject , h a n d l e s ) ;
Funkce nejprve provede načtení potřebné proměnné NNdata, ve které je již načtený obrázek s neznámým objektem a dále načtení proměnné net, reprezentující objekt neuronové sítě. Následně se provede zavolání skriptu simdata, který slouží k získání vstupního vektoru z načteného obrázku uloženého v proměnné NNdata. Tento skript pracuje podobným způsobem jako dříve popisovaný skript traindata, který sloužil pro získání vstupního vektoru z obrázků k trénování. Skript má opět dva vstupní parametry, jeden pro NNdata a druhý pro počet objektů. Výstupem skriptu bude vektor popisující objekt na obrázku, který bude sloužit jako vstup pro simulaci na neuronové síťi. Po získání vstupního vektoru z obrázku pro rozpoznávání provedeme vlastní simulaci na natrénované neuronové síťi pomocí příkazu sim. Příkaz sim má jako parametr jméno objektu neuronové síťě a zmiňovaný vstupní vektor obsahující vstupní data simulace. Tento vektor je definičním oborem simulace. Tím získáme výstupní vektor s výstupními daty simulace, který určuje o jaký typ objektu se jedná za přepodkladu, že neuronová síť rozpoznala daný objekt správně. Výstupní vektor je tedy oborem hodnot simulace. Tento vektor obsahuje hodnoty, kde podle pořadí (indexu) nejvyšší hodnoty poznáme o jaký typ objektu se jedná. Následně je výstupní vektor zpracován pomocí funkce compet. Jedná se o přenosovou funkci, která převede náš vektor na vektor binární, tedy vektor obsahující pouze hodnoty 1 a 0. Převod probíhá způsobem, kdy nejvyšší hodnota ve vektoru bude nahrazena číslem 1 a všechny nižší hodnoty budou nahrazeny číslem 0. Princip činnosti funkce compet také názorně popisuje obrázek 22. Tím jsme zvýšili přehlednost a jednoznačnost výstupního vektoru simulace. Jak už jsme uvedli, index neboli pořadí nejvyššího čísla ve výstupním vektoru určuje o jaký typ objektu se podle neuronové sítě jedná. Nyní, když je vektor binární, zužuje se problém na hledání indexu čísla jedna. Pro zjištění indexu použijeme příkaz
5.2
Popis funkcí aplikace
48
Obr. 22: Přenosová funkce compet
find, který vrátí číslo indexu, když bude prvek vektoru roven jedné. Po získání čísla indexu jej použijeme jako index pro seznam ukládající jednotlivé názvy objektů. Tento seznam je seřazený stejně jako jednotlivé typy objektů vkládané do aplikace. Nakonec příslušný řetězec s názvem souboru vypíšeme do příslušného místa v GUI a informujeme tak uživatele o jaký objekt se jedná. Tímto jsme provedli rozpoznání neznámého objektu. Nyní lze vkládat další neznámé objekty a rozpoznávat je obdobným způsobem. 5.2.6
Ukládání a načítání trénovacích dat
Jak již bylo zmíněno v úvodním popisu GUI, v této aplikaci se nachází další dvě tlačítka jejichž funkce je ukládání a nahrávání trénovacích dat. Tyto funkce slouží tedy k uložení sady objektů určených k natrénování neuronové sítě. Po vložení všech objektů k natrénování můžeme přejít do rozpoznávacího režimu a provádět rozpoznávání. Avšak po vypnutí aplikace a jejím opětovném zapnutí by jsme museli před rozpoznáváním opět vložit znovu všechny objekty k natrénování. Také v případě, že bychom potřebovali rozšířit databázi trénovacích objektů o další nové objekty, museli by jsme vkládat znovu všechny objekty včetně těch co už tam byly. Díky funkci načtení můžeme jednoduše načíst celou sadu původních objektů a poté k nim přidat pouze nové objekty a případně si potom nově vzniklou sadu objektů opět uložit. Další důležitou funkcí nahrávání a ukládání trénovacích dat je možnost nachystat si více sad objektů pro různé použití aplikace v praxi. Například můžeme uložit sadu objektů obsahující různé matičky a šrouby a uložit si ji do souboru se specifickým názvem. Pak si můžeme vytvořit další sadu pro rozpoznávání etiket určitého zboží. Potom můžeme jednoduše po spuštění aplikace načíst tu sadu objektů, kterou budeme chtít rozpoznávat a využívat jednoduše aplikaci k více účelům. Také při nasazení aplikace na konkrétní problém a pro konkrétního uživatele je možné dodat uživateli společně s programem také soubor s uloženou sadou objektů, kterou pak uživatel pouze načte a může začít ihned používat program k rozpoznávání konkrétních objektů. Nyní přejdeme k popisu obou funkcí. Začneme s funkcí ulozbutton Callback sloužící pro ukládání, která se zavolá po stisku tlačítka uložit. Celá funkce vypadá následujícím způsobem: function u l o z b u t t o n C a l l b a c k ( hObject , e ve nt da ta , h a n d l e s )
5.2
Popis funkcí aplikace
state state state state
49
. NNdata= g e t f i e l d ( h a n d l e s , ’ NNdata ’ ) . c n t= g e t f i e l d ( h a n d l e s , ’ c n t ’ ) . p o c o b j= g e t f i e l d ( h a n d l e s , ’ p o c o b j ’ ) . jmenaObj=g e t f i e l d ( h a n d l e s , ’ jmenaObj ’ )
[ f i l e n a m e , pathname ] = u i p u t f i l e ( { ’ ∗ . mat ’ } , ’ Vyber o b j e k t y ’ ) ; save ( [ pathname , f i l e n a m e ] , ’ s t a t e ’ ) u i w a i t ( msgbox ( ’ T r é n o v a c í data u l o ž e n y ! ’ , ’ Data u l o ž e n y ! ’ ) ) ; g u i d a t a ( hObject , h a n d l e s ) ;
Jak vidíme ze zdrojového kódu funkce, nejprve je provedeno načtení všech proměnných, které budeme chtít uložit. Jedná se o proměnnou NNdata obsahující všechny objekty k naučení, dále o proměnné cnt a pocobj, které ukládají celkový počet objektů a pocet objektů stejného typu a v neposlední řadě ukládáme proměnnou jmenaObj obsahující názvy všech objektů. Všechny tyto proměnné jsou uloženy do struktury state pomocí příkazu getfield, který vrací jejich obsah. Následně je uživateli nabídnuto standardní okno ve kterém může zvolit místo kam se má soubor uložit a provést pojmenování souboru. Po vyplnění těchto údajů a potvrzení tlačítkem uložit dojde k uložení zmiňovaných proměnných do souboru s koncovkou *.mat. O tom, že uložení proběhlo správně je uživatel informován pomocí dialogového okna. K vyvolání zmiňovaného okna pro ukládání slouží příkaz uiputfile, který následně vrací cestu a název souboru příkazu save, který provede vlastní uložení. Druhá funkce s názvem nactibutton Callback slouží pro načítání a je zavolána po stisku příslušného tlačítka načíst. Celá funkce vypadá následujícím způsobem: function n a c t i b u t t o n C a l l b a c k ( hObject , e ve nt da ta , h a n d l e s ) [ f i l e n a m e , pathname ] = u i g e t f i l e ( { ’ ∗ . mat ’ } , ’ Vyber o b j e k t y ’ ) ; load ( [ pathname , f i l e n a m e ] , ’ s t a t e ’ ) u i w a i t ( msgbox ( ’ T r é n o v a c í data načteny ! ’ , ’ Data načteny ! ’ ) ) ; h a n d l e s . NNdata=s t a t e . NNdata ; h a n d l e s . c n t=s t a t e . c n t ; h a n d l e s . p o c o b j=s t a t e . p o c o b j ; h a n d l e s . jmenaObj=s t a t e . jmenaObj ; g u i d a t a ( hObject , h a n d l e s ) ;
Funkce načítání pracuje podobně jako funkce ukládání akorát v opačném sledu. Nejprve se provádí volání standardního okna pro otevírání souborů s využitím příkazu uigetfile. V tomto okně uživatel jednoduše vybere soubor k otevření a provede jeho otevření. Funkce uigetfile následně vrátí název a cestu k souboru. Název a cesta k souboru je následně předána na vstup funkce load, která provede načtení všech zmiňovaných proměnných uložených při ukládání. Uživatel je opět informován o úspěšnosti načtení pomocí dialogového okna.
5.3
5.3
Ošetření chybových událostí
50
Ošetření chybových událostí
Při implementaci programu, byla také uvažována možnost, že bude program ovládán nesprávně. Proto bylo potřeba v programu ošetřit všechny možné chybové stavy, které by mohly nastat neodbornou manipulací s touto aplikací. Částečně je tato problematika řešena pomocí nastavení nedostupnosti určitého tlačítka nebo ovládacího prvku změnou jeho nastavení v GUI editoru Matlabu. Již při zapnutí aplikace je hned v inicializaci rozhranní nastavena nepřístupnost těch tlačítek a ovládacích prvků jejíchž použití by bylo v dané chvíli nesmyslné. Příkladem může být znepřístupnění tlačítek pro zpracování obrazu, když ještě žádný obraz nebyl načten. Také během ovládání aplikace je přístupnost jednotlivých ovládacích prvků obměňována, aby měl uživatel přístupné jen ty ovládací prvky, která má smysl v danou chvíli použít. Samozřejmě ne každou situaci je vhodné řešit pouze pomocí zpřístupňování ovládacích prvků v GUI. Tím pádem je nutné během implementace programu myslet na všechny možné vyjímky a ošetřovat je. Nejlepší metodou je zobrazení okna s chybovou hláškou, která vysvětluje uživateli, proč nemůže v danou chvíli daný krok udělat. Například když uživatel požaduje, hned po zapnutí programu přejít do rozpoznávacího režimu, musí být zastaven a varován, že nemůže provádět rozpoznávání dokud neprovede natrénování neuronové sítě na nějakých vzorových objektech.
5.4
Testování rozpoznávání aplikace
Provedli jsme popsání všech částí naší aplikace pro rozpoznávání objektů a nastavení parametrů neuronové sítě. Nyní musíme ověřit jestli bude aplikace v tomto námi posaném výchozím nastavení správně fungovat a s jakou úspěšností bude objekty rozpoznávat. Jak již bylo zmíněno, jsou dvě možnosti načítání objektů do programu. Buď přímým vkládáním jako obrázky nebo sejmutím pomocí webkamery. Nejprve se zaměříme na první možnost vkládáním obrázků. Výhodou přímého vkládání obrázků oproti webkameře je především dobrá kvalita vstupních obrázků, jejich dobrá rozeznatelnost a tím pádem také vysoká úspěšnost prahování. Pro tento účel provedeme testování aplikace na předem vytvořené testovací skupině objektů. Tato skupina objektů byla vytvořena ve grafickém rastrovém editoru a můžeme ji vidět na obrázku 23. Ze skupiny testovacích objektů na obrázku vidíme, že máme celkem čtyři typy objektů, neboli čtyři typy klasifikačních tříd do kterých budeme neznámé objekty řadit. To odpovídá jednotlivým řádkům obrázku značených písmeny a jedná se o čtverec, trojúhelník, hvězdu a kříž. Dále se v obrázku nachází sloupce značené pomocí číslic. Od každého objektu máme k dispozici jeho 3 varianty. První varianta je vzorová na té se bude především neuronová síť učit jak daný objekt vypadá. První variantu lze také použít k otestování rozpoznávání, které by mělo být vždy určeno správně, jelikož použijeme stejná data jak pro trénování tak pro testování. Jedná se tedy o základní, nejlehčí test pro naši aplikaci. Druhá varianta je kreslena od
5.4
Testování rozpoznávání aplikace
51
Obr. 23: Skupina testovacích objektů
ruky a podobá se původnímu objektu. Tato varianta je vhodná již pro obtížnější otestování rozpoznávání. Třetí varianta je nejen kreslena od ruky, ale také náhodě rotována. Díky tomu bude tato varianta nejtěžší k rozpoznání naší aplikací. Nyní přikročíme k samotnému testování apliakce na této skupině objektů. Během rozpoznávání budeme také měřit čas, aby jsme viděli za jak dlouhou dobu od stisknutí tlačítka rozpoznat nám aplikace vrátí výsledek. K měření času se v matlabu nachází příkazy tic a toc. Tic slouží ke spuštění imaginárních stopek a toc k jejich stopnutí. Umístíme tedy tic na začátek kódu rozpoznávací funkce a toc na její konec. Po natrénování neuronové sítě na výše popsané skupině objektů a zahájení rozpoznávání zjišťujeme, že úspěšnost nebyla úplně stoprocentní. Rozpoznání proběhlo správně na všech objektech kromě hvězdy, která je tvarově nejsložitější. U hvězdy došlo pouze k identifikaci první trénovací varianty, ostatní dvě byly určeny špatně. Bude tedy potřebné provést změnu parametrů neuronové sítě. Základní trénovací hvězda byla rozpoznána úspěšně, kdežto mírně odlišná varianta už ne. Je tedy možné že dochází k přeučení. To znamená, že se neuronová síť učí objekty až příliš do detailu a jakékoliv menší odchylky již netoleruje. Zkusíme tedy snížit počet neuronů ve skryté vrstvě ze 128 na 30. S touto hodnotou je úspěšnost neuronové sítě již mnohem lepší, povedlo se rozpoznat všechny objekty a jejich varianty včetně hvězd. Zároveň jsme pomocí příkazů tic a toc změřili čas rozhodnutí neuronové sítě, který byl poměrně dobrý a pohyboval se s touto sadou objektů cca do 1sec. Nyní otestujeme i druhou variantu rozpoznávání naší aplikace pomocí webkamery. Také zde jsme zvolili zkušební sadu objektů na kterých se bude neuronová síť učit. Jedná se o nůžky, otvírák, klíč a sponku. Při snímání webkamerou je důležité správné nasvětlení scény a zajištění potřebného kontrastu se snímaným objektem.
5.5
Kompilace samostatně spustitelné aplikace
52
To je důležité, aby byl objekt nasnímán správně a byl dobře rozeznatelný. V případě nekvalitního nasnímání objektu by mohlo dojít ke špatnému prahování, což by mělo za následek chybné naučení neuronové sítě a poté i neschopnost aplikace správně rozeznávat objekty. Ukázku dobře a špatně prahovaného obrázku můženme vidět na obrázku 24. Pro nasnímání námi zvolených objektů použijeme bílý podkladový
Obr. 24: Neúspěšné prahování (vlevo) a úspěšné prahování (vpravo)
papír pro zajištění dobrého kontrastu s předměty. Po nasnímání jednotlivých předmětů a naučení neuronové sítě, přecházíme do režimu rozpoznávání a zjišťujeme, že všechny předměty jsou úspěšně rozeznány v případě, že bylo dobře provedeno prahování předmětů a to jak při učení tak při rozpoznávání. Parametry neuronové sítě tedy nebylo nutné pro tuto sadu objektů měnit oproti předchozím rozpoznávaným objektům, bylo však důležité, aby prahování proběhlo správně.
5.5
Kompilace samostatně spustitelné aplikace
Další užitečnou vlastností Matlabu je možnost vytvořit samostaně spustitelnou aplikaci, která může běžet i na počítači na kterém není nainstalován Matlab. Díky tomu může být naše aplikace snadno dostupná pro koncové uživatele, jak také znázorňuje obrázek 25. O tvorbu samostatně spustitelné aplikace s koncovkou *.exe se stará Matlab Compiler. Výhoda Matlab Compileru je, že umožňuje automaticky konvertovat uživatelské programy v Matlabu do samostatných aplikací a softwarových komponent a sdílet je s koncovými uživateli. Kompilaci samostatné aplikace nebo softwarové komponenty lze provádět použitím jediného příkazu nebo předpřipraveného grafického rozhraní (deploytool), snadno je zabalit a distribuovat ke koncovým uživatelům. Aplikace a komponenty vytvořené pomocí Matlab Compileru sice nevyžadují ke svému chodu Matlab, ale využívají runtime engine Matlab Compiler Runtime (MCR). MCR je poskytován společně s Matlab Compilerem a je určen k volné distribuci s vytvořenou aplikací pro uživatele, kteří Matlab nepoužívají. Pro vytvoření spustitelného *.exe souboru z naší aplikace použijeme variantu kompilace pomocí příkazu mcc. Celý příkaz bude vypadat takto: mcc −m main
5.5
Kompilace samostatně spustitelné aplikace
53
Obr. 25: Tvorba aplikace v Matlabu
Parametr -m u příkazu mcc znamená vytvoření samostatně spustitelné aplikace ze souboru main.m. Po zkompilování a spuštění výsledného *.exe souboru si můžeme všimnout, že společně s oknem naší aplikace se otevře ještě další příkazové okno, které nahrazuje Command Window v Matlabu. To se hodí zejména pro ladění, kdy můžeme vidět výpis chyb či jiných upozornění během ovládání aplikace. Pokud by jsme požadovali, aby se spouštělo pouze okno naší aplikace, museli bychom přidat k příkazu mcc ještě parametr -e. Výsledný příkaz pro tvorbu aplikace bez příkazového okna by vypadal takto: mcc −m −e main
Vytvoření samostatně spustitelného programu z naší aplikace má však i své nevýhody. Problémem může být, že nejde využívat některé funkce. Není možné v takto zkompilované aplikaci využívat funkce pro tvorbu a trénování neuronové sítě. Je tedy nutné mít již vytvořenou a natrénovanou neuronovou síť na určitý konkrétní druh objektů a aplikaci používat pouze v režimu rozpoznávání.
6
ZÁVĚR
6
54
Závěr
Cílem této práce stanoveným v počátku bylo navrhnout vhodnou metodiku pro rozpoznávání objektů a naimplementovat aplikaci v programu Matlab realizující toto rozpoznávání. Pro splnění daného cíle práce bylo provedeno seznámení s programem Matlab a všemi jeho částmi potřebnými k vytvoření finální aplikace. Úspěšně jsme také definovali neuronové sítě a jejich topologii potřebnou ke klasifikaci objektů v naší aplikaci. V poslední části teoretické práce jsme popsali základní postupy spojené se zpracováním obrazu. Vlastní práci jsme započali návrhem vhodného grafického prostředí aplikace a navrhnutím jednotlivých funkcí aplikace. Nejprve jsme realizovali načítaní souboru obrazu ze souboru a později i získání obrazu sejmutím pomocí webové kamery. Získání obrazu z kamery bylo z počátku problematické kvůli nízké kvalitě použité kamery, nicméně vhodnou úpravou světelných podmínek a vytvořením dobrého kontrastu se snímaným předmětem a pozadím se povedlo obraz správně sejmout. Dále jsme pokračovali tvorbou potřebných funkcí pro přípravu obrázku a jeho celkové předzpracování, po kterém následoval také převod obrázku vhodnou metodou do vektorové podoby, která je přijatelným vstupem pro neuronovou síť. Pro klasifikaci objektů jsme tedy využili neuronové sítě. Experimentální metodou jsme úspěšně stanovili všechny potřebné parametry pro vytvoření a natrénování neuronové sítě, tak aby neuronová síť prováděla klasifikaci správně a s dobrou úspěšností. Zjistili jsme, že je nutné zajistit přesnou míru naučení neuronové sítě, aby byla naučená dostatečně, ale né zas příliš, aby nedocházelo k přeučení a přílišné závislosti neuronové sítě na detailech objektu. Následně bylo nutné celou aplikaci otestovat na vhodné sadě objektů. Pro tento účel jsme zvolili nejprve sadu nakreslených objektů, která obsahovala různé typy obrazců. Každý typ objektu zastupovaly jak vzorové obrazce pro trénování, tak i obrazce kreslené s určitou mírou zkreslení a s náhodnou rotací pro důkladné otestování aplikace. Po doladění několika parametrů neuronové sítě jsme dosáhli stoprocentní úspěšnosti při rozpoznávání těchto objektů. Druhou částí otestování naší aplikace bylo použití sady reálných objektů a jejich snímání webkamerou. Vzhledem k odladění parametrů neuronové sítě na předchozí testovací sadě objektů, bylo u této sady rozpoznávání rovněž úspěšné a bez další nutnosti ladění. Rozpoznávání objektů proběhlo v poměrně dobrém čase, nicméně u webkamery byl tento čas horší vzhledem k nízké kvalitě webkamery a nutnosti počkat na ustálení obrazu. Závěrem lze říci, že se nám povedlo navrhnout vhodný postup a vytvořit aplikaci schopnou rozpoznávat objekty a tím jsme splnili cíl této práce.
6.1
Možnosti rozšíření
Tuto práci by bylo možné do budoucna rozšířit o vizuálně lepší a propracovanější uživatelské rozhranní, případně provést jeho modifikaci pro nasazení aplikace na konkrétní problém. Dalším nutným rozšířením pro rychlý chod této aplikace je poří-
6.2
Přínos práce
55
zení kvalitní snímací kamery s rychlou odezvou a dobou náběhu. Použitá nekvalitní webkamera velmi komplikovala rozpoznávání a rychlost naší aplikace.
6.2
Přínos práce
Přínosem práce může být zejména využití v průmyslovém odvětví pro podporu výrobního procesu. Příkladem může být být identifikace jednotlivých součástek a jejich třídění podle typů. Místo součástek je možné si představit také další věci. Je možné například rozpoznávat různé velikosti mincí pro automaty nebo provádět třídění lahví podle jejich tvaru, etiket apod.
7
7
56
LITERATURA
Literatura
KARBAN, Pavel. Výpočty a simulace v programech Matlab a Simulink. 1. vyd.. Brno: Computer Press, 2006. 220 s. ISBN 80-251-1301-9. ZAPLATÍLEK, Karel a Bohuslav DOŇAR. MATLAB: tvorba uživatelských aplikací. 1. vyd.. Praha: BEN, 2004. 215 s. ISBN 80-730-0133-0. TUČKOVÁ, Jana, Marek BÁRTŮ a Petr ZETOCHA. Aplikace umělých neuronových sítí při zpracování signálů. 1. vyd.. Praha: ČVUT, 2009. 140 s. ISBN 978-80-01-04400-1. VONDRÁK, Ivo. Umělá inteligence a neuronové sítě. 2. vyd.. Ostrava: Vysoká škola báňská - Technická univerzita, 2000. 140 s. ISBN 80-707-8949-2. HLAVÁČ, Václav a Miloš SEDLÁČEK. Zpracování signálů a obrazů. Vyd. 2.. Praha: ČVUT, 2005, 255 s. ISBN 80-010-3110-1. MAŘÍK, Vladimír. Umělá intelligence I.díl.. Praha: Academia, 1993, 264 s. ISBN 80-200-0496-3. ŠÍMA, Jiří a Neruda R. Teoretické otázky neuronových sítí. Vyd. 1.. Praha: MATFYZ press, 1996, 390 s. ISBN 80-858-6318-9. ŠONKA, Milan, Václav HLAVÁČ a Roger BOYLE. Image processing, analysis, and machine vision. 3rd ed.. Toronto: Thomson, 2008, 829 s. ISBN 9780-495-08252-1. ŽÁRA, Jiří. a kol. Moderní počítačová grafika.. Brno: Computer Press, 1998, 448 s. ISBN 80-722-6049-9. c 1991-2012 [cit. HUMUSOFT [online]. Matlab: Jazyk pro technické výpočty. 2012-01-15]. Dostupné z: http://www.humusoft.cz/produkty/matlab/matlab/. c MathWorks [online]. 1994-2012 http://www.mathworks.com/.
[cit.
2012-01-15].
Dostupné
z:
CHURÝ, Lukáš. Umělá inteligence: neuronové sítě. Programujte.com [online]. 2005 [cit. 2012-02-16]. Dostupné z: http://programujte.com/clanek/2005061201-umela-inteligence-dil-2neuronove-site/. Netcam.cz Obrazové snímače CCD vs. CMOS. Netcam.cz [online]. 2012 [cit. 2012-01-17]. Dostupné z: http://www.netcam.cz/encyklopedie-ipzabezpeceni/obrazove-snimace-ccd-cmos.php. VOJÁČEK, Antonín. Principy a vlastnosti CCD snímačů obrazu. Automatizace.hw.cz [online]. 2006 [cit. 2012-02-17]. Dostupné z: http://automatizace.hw.cz/clanek/2006041001.
7
LITERATURA
57
ICT kompetence Počítačová grafika: Barevný model, DPI. [online]. 2009 [cit. 2012-02-17]. Dostupné z: http://www.kteiv.upol.cz/frvs/ictkubricky/?page=pocitacova-grafika/barevny-model-dpi. GERLA, Václav a Jiří HOZMAN. Microscopy Image Processing Softc 2000-2005 [cit. 2012-02-18]. Dostupné z: ware. MIPS [online]. http://mips.ic.cz/Pages/06c.htm.