Warning
This page is located in archive.

Cvičení na (příznakové) rozpoznávání

Autoři textu: Tomáš Svoboda, Tomáš Werner, David Hurych a další1)
Úprava: Tibor Strašrybka2)

Toto je podpůrný text pro blok cvičení na (příznakové) rozpoznání, rozhodování za neurčitosti, v rámci bakalářského předmětu A3B33KUI (původně X33KUI). Přiřazení jednotlivých příkladů k prvnímu či druhému seminárnímu cvičení je pouze orientační, není závazné. Pro zájemce o hlubší znalost lze doporučit knihy [1, 3], které jsou dobře čitelné i pro bakalářského studenta. Česká kniha [5] jde více do hloubky a je výborná pro skutečné porozumění, i když vyžaduje větší úsilí při studiu. K dostání je i její anglické vydání [6]. Pro praktické použití statistického rozpoznávání doporučujeme volně dostupný toolbox pro Matlab [4].

1 Seminární cvičení 1

1.1 Bayesovské rozhodování

Příklad 1.1

Je známé rozdělení pravděpodobnosti výšky těla mužů a žen (viz tabulka). Odhadněte, zda člověk s výškou 168 cm (tj. L) je muž nebo žena.

$$ \begin{array}{c||l|l|l|l|l|l||c} \begin{subarray}{c} x \\ \text{cm} \end{subarray} & \begin{subarray}{c} \text{XS} \\ \text{(0–100)} \end{subarray} & \begin{subarray}{c} \text{S} \\ \text{(100–125)} \end{subarray} & \begin{subarray}{c} \text{M} \\ \text{(125–150)} \end{subarray} & \begin{subarray}{c} \text{L} \\ \text{(150–175)} \end{subarray} & \begin{subarray}{c} \text{XL} \\ \text{(175–200)} \end{subarray} & \begin{subarray}{c} \text{XXL} \\ \text{(200-}\infty\text{)} \end{subarray} & \sum \\ \hline \hline P(x|\text{muž}) & 0.05 & 0.15 & 0.2 & 0.25 & 0.3 & 0.05 & \boldsymbol 1 \\ \hline P(x|\text{žena}) & 0.05 & 0.1 & 0.3 & 0.3 & 0.25 & 0.0 & \boldsymbol 1 \\ \hline \end{array} $$

Příklad 1.2

Řešte úlohu za předpokladu, že změřený člověk byl náhodně vybrán ze společnosti, ve které je 60 % mužů a 40 % žen.

Příklad 1.3

Jak byste zjistili podmíněné pravděpodobnosti $P(x|s)$ případně apriorní $P(s)$?

Příklad 1.4

Můžeme při měření pouhé výšky člověka dosáhnout nulové chyby rozhodování, tj. nikdy se nesplést? Pro jaké lidi bude odhad podle výšky člověka zvláště špatný?

Příklad 1.5

Navrhni klasifikátor, který pomocí dvou vhodně vybraných měření na člověku odhadne, zda je to muž nebo žena. Diskutujte vhodnost možných měření.

Příklad 1.6

Máme pytel starých mincí v různém stádiu opotřebení, mince stejných hodnot tedy mohou být různě veliké. Hodnota mince je nicméně okem čitelná. Máme za úkol roztřídit mince v pytli podle jejich hodnoty měřením hmotnosti mincí. Víme, že v pytli jsou mince o hodnotě 1, 2 a 5 Kč. Tedy $s \in \{1,2,5\}$. Jako ztrátovou funkci rozhodování zvolte

$$l(s, d) = |h_d - h_s|$$

kde $h_s$ je hodnota mince $s$ a $h_d$ je naše rozhodnutí o hodnotě mince.
Máme k dispozici jednoduché rychle měřící váhy, které váží s přesností 5 gramů. Rozmyslete strategii třídění (rozhodování), která povede k minimalizaci ztráty a ruční práce. Ruční práce je tu zmíněna proto, že mohu pytel roztřídit ručně, pokud požaduji absolutní přesnost. To ovšem už není možné např. v automatu na nápoje, který akceptuje mince různé hodnoty. Diskutujte vliv množství ruční práce na celkovou ztrátu způsobenou chybnými rozhodnutími.
Zkusíme odhadnout pravděpodobnou hmotnost jednotlivých hodnot mincí na základě experimentu. Náhodně vybereme 100 mincí, zvážíme je a zaznamenáme jejich hodnoty. Vytvoříme tak trénovací multimnožinu3). Po zvážení trénovací multimnožiny máme k dispozici tabulku

$$ \begin{array}{c|rrrrr|c} s/x & \text{5 g} & \text{10 g} & \text{15 g} & \text{20 g} & \text{25 g} & \sum \\ \hline \text{1 Kč} & 15 & 10 & 3 & 0 & 0 & \boldsymbol{28} \\ \text{2 Kč} & 7 & 13 & 16 & 6 & 1 & \boldsymbol{43} \\ \text{5 Kč} & 0 & 1 & 2 & 11 & 15 & \boldsymbol{29} \\ \hline \sum & 22 & 24 & 21 & 17 & 16 & \boldsymbol{100} \\ \end{array} $$

Kolik je možných strategií? Váha navážila 10 gramů, do jaké třídy minci zařadíte?

Příklad 1.7

Dostanete ČB obrázek o rozměrech 10×10 pixelů, z nichž každý může nabývat 256 hodnot intenzity. Jako příznaky zvolte intenzity jednotlivých pixelů. Kolik bude příznaků? Jak velká je množina možných měření? Kolik je možných strategií?
O obrázku víte, že je na něm zobrazeno jedno z písmen $S = \{A,...,Z\}$. Jak byste reprezentovali a odhadli pravděpodobnosti $P(\vec{x}|s)$?

Příklad 1.8

Navrhněte klasifikátor pro řešení předchozího příkladu, který předpokládá, že příznaky jsou podmíněně nezávislé.

2 Seminární cvičení 2

Příklad 2.1

Dokažte, že pro ztrátovou funkci

$$ l(s,d) = \cases{ 0 & \text{když $d = s$} \cr 1 & \text{když $d \neq s$} } $$ je strategie minimalizující střední riziko stejná jako strategie maximalizující aposteriorní pravděpodobnosti $P(s|\vec{x})$.

2.1 Klasifikátor podle nejbližšího souseda

Příklad 2.2

Napište vzorcem klasifikátor, který odhadne pohlaví člověka metodou prvního nejbližšího souseda (1-NN) při dvou příznacích výška a věk. Změní se klasifikátor, když budeme měrit výšku v jiných jednotkách?

Poznámka: 1-NN je přes svou jednoduchost poměrně dobrý klasifikátor. Dá se ukázat, že asymptoticky (tj. když se velikost trénovací multimnožiny blíží $\infty$) je pravděpodobnost chybné klasifikace nejvýš dvakrát horší než v případě, kdy známe skutečné pravděpodobnosti [2].

2.2 Lineární klasifikátor

Další možností, jak se vyhnout odhadování a reprezentaci pravděpodobností, je konstruovat přímo diskriminační funkce $g_s(x)$4). Jedna z možností je lineární klasifikátor, kdy předepíšeme diskriminační funkce ve tvaru:

$$g_s(\vec{x})=\vec{w}_s^{\top}\vec{x}+b_s$$

kde $\vec{w}_s$ je vektor vah a skalár $b_s(x)$ je posunutí5). Objekt $\vec{x}$ je zařazen do takové třídy $s$, jejíž hodnota diskriminační funkce $g_s(\vec{x})$ je vyšší než všech ostatních tříd. Úloha učení klasifikátoru se pak mění na optimalizační úlohu, kde hledáme takové parametry lineárních diskriminačních funkcí, které minimalizují nějaké kritérium, např. počet chybných rozhodnutí na trénovací multimnožině.

Příklad 2.3

Dokažte, že u lineárního klasifikátoru je množina příznakových vektorů klasifikovaná do jediné třídy konvexní.

Příklad 2.4

Lze pro trénovací multimnožinu na obrázku 1 dosáhnout lineárním klasifikátorem nulové trénovací chyby? Pokud ano, nakreslete, jak může vypadat rozdělení příznakového prostoru lineárním klasifikátorem tak, aby byla nulová trénovací chyba.

Trénovací multimnožina v příznakovém prostoru dimenze 2 a pro 4 třídy.

Obrázek 1: Trénovací multimnožina v příznakovém prostoru dimenze 2 a pro 4 třídy.

3 Programovací úloha – rozpoznání alfanumerických znaků

3.1 Problém

Úkolem je klasifikace některých písmen na registračních značkách automobilů. Předpokládáme, že značka byla již nalezena, viz obrázky 5 a 6. Obrázky písmen jsou normalizovány na velikost 10×10 pixelů. K dispozici máte trénovací data, která byla náhodně vybrána. Jasové hodnoty pixelu jsou přerovnány do řádkových vektorů po sloupcích, viz obrázek 3. Co řádek ve vstupním textovém souboru, to jeden obrázek. Soubor train.txt obsahuje příznakové vektory, soubor train_labels.txt pak odpovídající označení tříd. Obrázky jsou pouze pro náhledy, rozhodující jsou data v textových ASCII souborech. Výsledkem klasifikace bude textový soubor s označením příslušnosti ke třídě. Co řádek to jedno písmeno.
Je dobré si uvědomit, že to je obvykle vše, co dá zákazník k dispozici. Poté, co připravíte kód, zákazník, kterého v tomto případě představuje cvičící, přinese testovací data, na kterých vaši práci ohodnotí. Testovací data budou v souborech test.txt, respektive test_labels.txt. Doporučujeme odsimulovat rozdělením dat, která máte k dispozici na trénovací a testovací množinu.

3.2 Zadání samostatné práce

Implementujte následující algoritmy a použijte pro řešení výše uvedeného problému.

Klasifikátor podle nejbližšího souseda Implementujte klasifikátor podle nejbližšího souseda. Ověřte jeho bezchybnost na trénovací množině.

Bayesovská klasifikace Implementujte naivní Bayesův klasifikátor. Předpokládejte podmíněnou nezávislost intenzit v jednotlivých pixelech. V rámci každé třídy tedy platí:

$$P(\vec{x}|s)=P(x_1|s) \cdot P(x_2|s) \dotsc P(x_n|s)$$

kde $x_i$ označuje intenzitu v $i$-tém pixelu.

3.3 Vzorové řešení – perceptronový algoritmus

K dispozici máte vzorové řešení jednoho možného klasifikátoru – perceptronu. Příklad použití je dobře vidět ve funkci main v MainFrame.java.

Obecná třída classifier obsahuje metody pro I/O operace load_matrix pro načtení příznakových vektorů, load_labels pro načtení označení správné klasifikace a pro vyhodnocení úspešnosti klasifikace, count_confusion. Každý jednotlivý klasifikátor je speciální třída, která dědí z tříd classifier. Základní metody jsou learn() a classify().

Příklady normalizovaných obrázků písmen z registračních značek automobilů.

Obrázek 2: Příklady normalizovaných obrázků písmen z registračních značek automobilů.

Pixely jsou v řádkovém vektoru organizovány po sloupcích. Nejprve první sloupec, pak druhý, atd. Je zřejmé, že tmavé sloupce písmene J, které jsou na obrázku vpravo, jsou na konci vektoru dat.

Obrázek 3: Pixely jsou v řádkovém vektoru organizovány po sloupcích. Nejprve první sloupec, pak druhý, atd. Je zřejmé, že tmavé sloupce písmene J, které jsou na obrázku vpravo, jsou na konci vektoru dat.

Třídní diagram

Obrázek 4: Třídní diagram

4 Popis podpůrných kódů

4.1 Třída Classifier

Třída obsahuje metody a datové struktury společné pro všechny klasifikátory. Všechny konkrétní třídy reprezentující jednotlivé klasifikátory (bayes, nearest neighbor, perceptron) z ní dědí.

metody třídy Classifier

load_matrix(String fileName) - metoda slouží k načtení trénovacích nebo testovacích dat ze souboru, s názvem předaným ve vstupním parametru, do proměnné matrix.

load_labels(String fileName) - metoda slouží k načtení popisku k trénovacím nebo testovacím datům. Název souboru je předán jako vstupní parametr.

count_confusion() - metoda nejprve zkontroluje, zdali jsou již spočteny výsledky klasifikace. Jako parametr metodě předáme název souboru, ve kterém jsou uloženy správné popisky (labely), které chceme porovnat se spočítaným výsledkem. Program data ze souboru načte pomocí metody load_labels() a zkontroluje, jestli mají oba vektory stejný počet prvků. Po přípravné fázi (vynulování table) proběhne výpočet confusion table.

4.2 Rozhraní ClassifierInterface

Toto rozhraní předepisuje povinnost implementace metod learn() a classify(). Každý konkrétní klasifikátor musí implementovat tato rozhraní.

4.3 Třída MainFrame

MainFrame je hlavní třida, která obsahuje metodu main() v níž můžeme vytvářet instance konkrétních klasifikátorů a volat jejich metody pro učení a klasifikaci dat. Třída také obsahuje metody pro serializaci/deserializaci objektů-klasifikátorů a tím umožnuje uložit/načíst tyto objekty i s jejich naučenými parametry. Není tedy nutné před každou klasifikací spouštet časově náročné učení klasifikátoru.

metody třídy MainFrame

main()

saveClassifier(String fileName, Classifier c) - metoda umožnuje serializovat (uložit do souboru) instanci konkrétního klasifikátoru c do souboru filename.

loadClassifier(String fileName) - metoda umožnuje deserializovat (načíst uloženou instanci) klasifikátor ze souboru fileName do proměnné konkrétního klasifikátoru.

4.4 Třída Perceptron

Konkrétní implementace klasifikátoru Perceptron. Třída dědí z třídy Classifier a implementuje rozhraní ClassifierInterface.

metody třídy Perceptron

learn() - metoda nejprve zkontroluje, zdali jsou načtená data v proměnné matrix a labels, aby měla s čím pracovat. Potom obsahuje přípravnou fázi, ve které je nalezen počet možných klasifikací, Klasifikace jsou namapovány na čísla a je vynulována matice w a vektor b s parametry klasifikátoru. Potom následuje část zajišťující samotné učení klasifikátoru dle algoritmu:

  1. Nastav $\vec{w}_y=\vec{0}$ a $b_y=0$ pro všechna $y \in Y$ ($Y$ - množina možných klasifikací).
  2. Mezi trénovacími vzory najdi libovolný špatný klasifikovaný vzor. Pokud takový vzor neexistuje, skonči, protože parametry určují klasifikátor s nulovou trénovací chybou.
  3. Nechť $\vec{x}_t,y_t$ je špatně klasifikovaný vzor a ˆ$\hat{y}$ je klasifikace $\vec{x}_t$ pomocí aktuálního klasifikátoru. Adaptuj parametry klasifikátoru tak, že
    $ \eqalign{ \vec{w}_{y_t} &= \vec{w}_{y_t} + \vec{x}_t \cr b_{y_t} &= b_{y_t} + 1 \cr \vec{w}_{\hat{y}} &= \vec{w}_{\hat{y}} - \vec{x}_t \cr b_{\hat{y}}&= b_{\hat{y}} - 1 } $
  4. Pokračuj krokem 2.

classify() - metoda nejprve zkontroluje, jestli je klasifikátor již naučen a zda souhlasí datové struktury. Pokud je vše v pořádku, proběhne samotná klasifikace dle vzorce

$$\hat{y}=\arg \max\limits_{y \in Y} \vec{x}_t^\top\vec{w}_y+b_y$$

a výsledek je uložen do result_labels a vypsán na standardní výstup.

4.5 Třída NN

Třída pro klasifikátor nearest neighbor připravená k implementaci. Výsledek klasifikace musí být uložen do vektoru result_labels (aby mohla být vypočtena confusion table).

4.6 Třída Bayes

Třída pro Bayesův klasifikátor připravená k implementaci. Výsledek klasifikace musí být uložen do vektoru result_labels (aby mohla být vypočtena confusion table).

5 Hodnocení

  • Implementace klasifikátoru podle nejbližšího souseda (1-NN): [0–3 body].
  • Implementace Bayesovského klasifikátoru za předpokladu nezávislosti podmíněných pravděpodobností: [0–6 bodu]
  • Bezchybná funkcionalita6) i na dodaných testovacích datech: [0–1 bod].
  • Bonusové body za efektivní, zajímavou implementaci, kódy navíc [0–1 bod].

Reference

[1]

Christopher M. Bishop. Pattern Recognition and Machine Learning. Springer Science+Bussiness Media, New York, NY, 2006.

[2]

T.M. Cover and P.E. Hart. Nearest neighbor pattern classification. IEEE Transactions on Information Theory, 13(1):21–27, January 1967.

[3]

Richard O. Duda, Peter E. Hart, and David G. Stork. Pattern classification. Wiley Interscience Publication. John Wiley, New York, 2nd edition, 2001.

[4]

Vojtěch Franc and Václav Hlaváč. Statistical pattern recognition toolbox for Matlab. Research Report CTU–CMP–2004–08, Center for Machine Perception, K13133 FEE. Czech Technical University, Prague, Czech Republic, June 2004. http://cmp.felk.cvut.cz/cmp/software/stprtool/index.html.

[5]

Michail I. Schlesinger and Václav Hlaváč. Deset přednášek z teorie statistického a strukturního rozpoznávání. CVUT, Prague, Czech Republic, 1999.

[6]

Michail I. Schlesinger and Václav Hlaváč. Ten Lectures on Statistical and Structural Pattern Recognition. Kluwer Academic Publishers, Dordrecht, The Netherlands, 2002.

Příklady z praxe

Příklad automatické lokalizace textu v obrazech. Více informací na [[http://cmp.felk.cvut.cz/~zimmerk/lpd/index.html|http://cmp.felk.cvut.cz/~zimmerk/lpd/index.html]].

Obrázek 5: Příklad automatické lokalizace textu v obrazech. Více informací na http://cmp.felk.cvut.cz/~zimmerk/lpd/index.html.

Příklad komerční aplikace na rozpoznávání registračních značek ve videu. Demonstrační videa lze nalézt na adrese http://cmp.felk.cvut.cz/cmp/courses/X33KUI/Videos/RP_recognition a viděli jste také demonstraci algoritmu během prvního, demonstračního, cvičení.

Obrázek 6: Příklad komerční aplikace na rozpoznávání registračních značek ve videu. Demonstrační videa lze nalézt na adrese http://cmp.felk.cvut.cz/cmp/courses/X33KUI/Videos/RP_recognition a viděli jste také demonstraci algoritmu během prvního, demonstračního, cvičení.

1)
Text částečně vychází ze staršího učebního textu autorů V. Franc, T. Pajdla a T. Svoboda, taktéž se inspiruje některými úlohami předmětu X33RPZ. Některá data poskytnuta laskavostí firmy Eyedea Recognition. Autoři také velmi děkují Jiřímu Matasovi za podnětné diskuse.
2)
V případě dotazů kontaktujte svého cvičícího, pokud si nejste cvičícím jisti, pište na vostapav@fel.cvut.cz.
3)
Multimnožina proto, že vzory, např. mince o hodnotě 2 Kč a hmotnosti 5 g se mohou vyskytovat vícenásobně.
4)
Diskriminační funkce existují pochopitelně i pro Bayesovský klasifikátor. Rozmyslete.
5)
V přednášce je použito malinko odlišné značení $g_s(\vec{x})=\vec{b}_s^\top\vec{x}+c_s$.
6)
Pozor, nemyslí se bezchybná klasifikace. Jde spíše o ověření, zda se váš program vyrovná s takovou trivialitou jako změna počtu příznakových vektorů či tříd.

courses/a3b33kui/cviceni/02_03_04.txt · Last modified: 2017/03/01 01:51 by xnovakd1