======= Strojové učení ======= Tato úloha se skládá z části věnované **klasifikaci znaků** a **výběr optimálního klasifikátoru**. Termín odevzdání úlohy je v [[https://cw.felk.cvut.cz/upload/|Upload Systému]]. Obě části se odevzdávají (samostatně) do upload systému. Hodnocení viz [[.:hodnoceni|hodnoceni]]. Předpokládá se, že studenti požadované metody sami implementují a **nebudou využívat již hotových řešení**. ====== Klasifikace znaků ====== /*podekovani??*/ Některá data poskytnuta laskavostí firmy [[http://www.eyedea.cz|Eyedea Recognition]]. Jiná data z nejrůznějších veřejných zdrojů. ==== Problém ==== Úkolem je navrhnout a naprogramovat klasifikátory/rozpoznávače znaků (k-nejbližších sousedů a naivní bayesovský klasifikátor). Vstupem je malý šedotónový obraz jednoho ručně napsaného znaku - písmeno nebo číslice - výstupem je rozhodnutí o třídě, tedy rozpoznání znaku na obrazu. K dispozici máte trénovací data, soubor obrazů s informací o správné klasifikaci. 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í. Doporučujeme odsimulovat rozdělením dat, která máte k dispozici, na trénovací a testovací množinu. Váš výsledný kód bude v rámci AE ozkoušen na nových datech. ==== Data ==== Obrazy jsou ve formátu png v jednom adresáři, kde je i soubor ''truth.dsv'' ([[https://en.wikipedia.org/wiki/Delimiter-separated_values|dsv format]]). Jména souborů nemají s obsahem nic společného. Soubor truth.dsv má na každém řádku ''jmeno_souboru.png:znak'', např. ''img_3124.png:A''. Oddělovačem je znak '':'', který se v názvu souboru nevyskytuje. Jména souborů obsahují pouze písmena, číslice a znak podtržítko. * {{ :courses:b3b33kui:cviceni:strojove_uceni:train_1000_10.zip |}} 10x10 obrazy, 20 tříd, 50 vzorů pro každou. * {{ :courses:b3b33kui:cviceni:strojove_uceni:train_1000_28.zip |}} 28x28 obrazy, 10 tříd, 100 vzorů pro každou * {{ :courses:b3b33kui:cviceni:strojove_uceni:train_700_28.zip |}} 28x28 obrazy, 10 tříd, různé počty vzorů pro třídy ==== Specifikace ==== Naprogramujte ''classifier.py'', který bude spouštěn s parametry, viz help níže >> python3.8 classifier.py -h usage: classifier.py [-h] [-k K] [-b] train_path test_path Learn and Classify image data positional arguments: train_path Path to the training data test_path Path to the testing data optional arguments: -h, --help show this help message and exit -k K run K-NN classifier, if K is 0 the code may decide about proper K by itself -b run Naive Bayes classifier -o name name (with path) of the output dsv file with the results Tedy např. python3 classifier.py -k 3 -o classification.dsv ./train_data ./test_data spustí 3-NN klasifikátor. Výsledkem klasifikátoru je soubor ''classification.dsv'' stejného formátu jako ''truth.dsv'', který je umístěný v adresáři s testovacími obrázky. ==== Struktura řešení ==== Pro ty co případně tápou, si dovolíme navrhnout následující výchozí body. * Je vhodné mít rozumně navržený průchod data, zvažte použítí generátoru. Příklad pro úlohu [[https://cw.fel.cvut.cz/b201/courses/b4b33rph/cviceni/spam/krok2|spam-ham]] * Pro analýzu výsledku se vám bude hodit výpočet [[https://cw.fel.cvut.cz/b201/courses/b4b33rph/cviceni/spam/krok3|matice záměn]] (confusion matrix) nebo alespoň výpočet počtu klasifikačních chyb. * Pro zacházení s obrazovými daty se vám může hodit [[https://matplotlib.org/stable/tutorials/introductory/images.html|matplotlib.image]] a [[https://numpy.org/doc/stable/reference/generated/numpy.array.html|numpy.array]], ale můžete volit libovolně. Jen nezapomeňt včas otestovat v Brute, zda není vaše knihovna příliš exotická. ===== Příklady použití ===== {{:courses:be5b33kui:labs:machine_learning:02_03_04_obr5.png?800|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. 3: //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]].// {{:courses:be5b33kui:labs:machine_learning:02_03_04_obr6.png?800|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. 4: //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|http://cmp.felk.cvut.cz/cmp/courses/X33KUI/Videos/RP_recognition]].// ====== Výběr optimálního klasifikátoru ====== Při řešení praktických úloh strojového učení máme často k dispozici více klasifikátorů a musíme se rozhodnout který je nejvhodnější pro danou úlohu. V zip balíčku je soubor (odkaz je níže), se kterým budete při řešení úlohy pracovat. Předpokládá se, že k řešení úlohy bude použit Python. Do odevzdávacího systému se odevzdává **pdf report** a implementace související s částí **Hlavně bezpečně**. Celková délka reportu by měla být rozhodně **kratší než dvě strany A4**. **Doporučená délka reportu je jedna strana A4.** Mějme 5 různých natrénovaných binárních klasifikátorů. Výsledek klasifikace každého z klasifikátorů je závislý na hodnotě parametru $\alpha$. Výsledek klasifikace daného klasifikátoru lze tedy vyjádřit jako funkci $C(\bf x, \alpha) \in \{0,1\}$, kde $\bf x$ je vektor náležící vzorku který chceme klasifikovat. Všechny klasifikátory pustíme na testovací množině $X = \{{\bf x}_0, {\bf x}_1, \dots, {\bf x}_{99} \}$. Zároveň vyzkoušíme všechny přípustné hodnoty parametru $\alpha\in\{\alpha_0, \alpha_1, \dots, \alpha_{49}\}$. Pro klasifikátor $i\in\{1,2, \dots,5\}$ dostane tabulku s hodnotami $C_i(\bf x_j,\alpha_k)\in \{0,1\}$, kde $j \in \{0, 1,.., 99\}$, $k \in \{0, 1,.., 49\}$ (viz //C1//, //C2//, //C3//, //C4//, //C5// v {{ :courses:b3b33kui:cviceni:strojove_uceni:classif_result_tables.zip |classif_result_tables.zip}}). Dále máme k dispozici skutečnou příslušnost vzorků $\bf x_0, \bf x_1, \dots, \bf x_{99}$ z testovací množiny (viz //GT// v ''classif_result_tables.zip''). === Výběr vhodného parametru === V této části předpokládejme, že klasifikátory slouží k binární klasifikaci obrázků (např. jestli je na obrázku pes). Pro klasifikátor 1 (tabulka //C1//) určete která hodnota parametru $\{\alpha_0, \alpha_1, \dots, \alpha_{49}\}$ je nejvhodnější. Uvědomte si, že zatím nevíte pro jakou konkrétní úlohu bude daný klasifikátor použit a proto je nutné použít dostatečně obecnou úvahu. Tedy použitá úvaha by neměla použití klasifikátoru eliminovat na jednu konkrétní úlohu. V krátkém **pdf reportu** vaší volbu parametru zdůvodněte (užijte pojmy jako např. sensitivita, falešně pozitivní, ROC křivka atd.). Do reportu také vykreslete ROC křivku a na této křivce znázorněte bod, který odpovídá optimální hodnotě parametru. === Přísně tajné! === Nyní si představte, že jste agent/ka 00111 a chcete k zabezpečení velmi tajných dokumentů použít svůj otisk prstu. Jedná se o velmi citlivá data, takže pokud nebudou kvalitně zabezpečena, tak bude lepší je zničit. K odemčení dat je vždy dostatek času. K dispozici máte 5 natrénovaných klasifikátorů (s různými hodnota parametru $\alpha$). Vstupem klasifikátoru je sken otisku prstu a v případě že se jedná o váš otisk prstu, tak požadovaným výstupem klasifikátoru je hodnota 1 (dojde k odemčení dat), jinak hodnota 0. Všechny klasifikátory byly otestovány na testovací množině $X$ pro všechny hodnoty parametru $\alpha$. Výsledky testu pro jednotlivé klasifikátory jsou uloženy v tabulkách //C1//, //C2//, //C3//, //C4//, //C5// (viz výše). K dispozici je také skutečná příslušnost jednotlivých otisků prstů (viz //GT//). Vyberte vhodný klasifikátor a jeho parametr $\alpha$. V **pdf reportu** uveďte svoji volbu a vysvětlete podle jakých kritérií byla provedena. === Hlavně bezpečně === Tato část navazuje na předchozí část **Přísně tajné!**. Váš kolega, také agent, se nabídne, že vám poskytne svůj klasifikátor, který je opět závislý na parametru $\alpha$. Protože není jisté jestli se nejedná o dvojitého agenta, tak bude dobré nejdříve zjistit jestli je klasifikátor lepší než klasifikátor vybraný v předchozí části. Z bezpečnostních důvodů bude muset rozhodnutí provést předem vytvořená funkce. Vstupem funkce bude tabulka //C6// s výsledky klasifikace na testovací množině pro různé parametry $\alpha$ (ve stejném f formátu jako //C1//, //C2//, atd.) a případně dalšími parametry dle uvážení. Výstupem funkce bude rozhodnutí, zda je nový klasifikátor lepší než ten z předchozí části (''True'' pokud je klasifikátor lepší, jinak ''False''). V **pdf reportu** vysvětlete podle jakých kritérií se bude funkce rozhodovat a odevzdejte také řešící funkci. ====== Relevantní zdroje ====== Christopher M. Bishop. //Pattern Recognition and Machine Learning.// Springer Science+Bussiness Media, New York, NY, 2006. T.M. Cover and P.E. Hart. Nearest neighbor pattern classification. //IEEE Transactions on Information Theory,// 13(1):21–27, January 1967. Richard O. Duda, Peter E. Hart, and David G. Stork. //Pattern classification.// Wiley Interscience Publication. John Wiley, New York, 2nd edition, 2001. 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. Michail I. Schlesinger and Václav Hlaváč. //Ten Lectures on Statistical and Structural Pattern Recognition.// Kluwer Academic Publishers, Dordrecht, The Netherlands, 2002.