====== 5. Strojové učení: klasifikace znaků ====== Tato úloha je věnována **klasifikaci znaků**. Termín odevzdání úlohy je v [[https://cw.felk.cvut.cz/BRUTE|BRUTE]], kam řešení i odevzdáte. Hodnocení viz [[.:hodnoceni|hodnoceni]]. Předpokládá se, že studenti požadované metody sami implementují a **nebudou využívat již hotových řešení**. Použitý algoritmus řešení musí odpovídat algoritmu specifikovému v zadání. Úlohu vypracujte v [[courses:b3b33kui:cviceni:python_version|požadované verzi Pythonu]]! Nezapomeňte vyřešit také úlohu [[..:6_ml_vyber:start|výběr optimálního klasifikátoru]] (úloha nenavazuje na klasifikaci znaků). **Poděkování**: 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ů (metodu **//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 vám 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 (**počet kanálů obrázků v datasetu byl opraven**) ===== Specifikace ===== Naprogramujte ''knn.py'' a ''naive_bayes.py'', které budou spouštěny s parametry, viz help níže >> python3 knn.py -h usage: knn.py [-h] (-k K) [-o filepath] train_path test_path Learn and classify image data with a k-NN classifier. positional arguments: train_path path to the training data directory test_path path to the testing data directory optional arguments: -h, --help show this help message and exit -k K number of neighbours (if k is 0 the code may decide about proper K by itself) -o filepath path (including the filename) of the output .dsv file with the results Tedy např. python3 knn.py -k 3 -o classification.dsv ./train_data ./test_data spustí 3-NN klasifikátor. Podobně >> python3 naive_bayes.py -h usage: naive_bayes.py [-h] [-o filepath] train_path test_path Learn and classify image data with a naive bayes classifier. positional arguments: train_path path to the training data directory test_path path to the testing data directory optional arguments: -h, --help show this help message and exit -o filepath path (including the filename) of the output .dsv file with the results Výsledkem klasifikátoru je soubor určený parametrem ''-o'' (výchozí hodnota je ''classification.dsv''), který má stejný formát jako soubor ''truth.dsv''. ==== Omezení ==== * Čas na běh skriptu s klasifikátorem je omezen na 15 s. Za tuto dobu byste tedy měli stihnout trénování i testování klasifikátoru. Tento časový limit by vás nijak významně neměl omezovat, slouží spíš jako pojistka proti chybným implementacím, kde se něco dělá skutečně neefektivně. Pokud chcete při trénování klasifikátoru ladit nějaké parametry opravdu důkladně, doporučujeme to udělat offline. * Skripty s implementovanými klasifikátory nesmí používat internet, ani slídit na disku či jinde. * Při řešení počítáme s tím, že využijete knihovny ''numpy'' a pillow (''PIL''). Využívat jiné knihovny třetích stran jako ''scikit-learn'', ''pandas'', atp., není povoleno, protože na hodnoticím stroji nemusí být nainstalované. Využijte jen standardní knihovnu Pythonu. Pokud byste externí knihovny skutečně k něčemu nutně potřebovali, proberte to co nejdříve se svým cvičícím, který posoudí, zda to je z hlediska předmětu přínosné. Pokud bude váš záměr opodstatněný, zkusíme vašemu přání vyhovět, ale nezaručujeme, že se to podaří. ==== Co odevzdat? ==== Odevzdávat budete ZIP archiv s vašimi moduly ''knn.py'', ''naive_bayes.py'' a případně se všemi moduly, které tyto moduly importují. **Tyto soubory musí být v kořeni archívu, archív nesmí obsahovat žádné adresáře!** ZIP archív (a jen tento soubor) nahrajete do [[https://cw.felk.cvut.cz/BRUTE/|BRUTE]]. ===== Pokyny k vypracování ===== Pokud si nejste jistí, jak úlohu vyřešit, nabízíme následující tipy. Vaše řešení bude patrně zahrnovat následující dílčí kroky: * [[.:argparse|Zpracování argumentů na příkazové řádce]] * [[.:listdir|Procházení obsahu adresáře]] * [[.:readcsv|Načtení .dsv souboru]] * [[.:image|Načtení .png obrázku ve formě čísleného vektoru]] * [[.:dist|Vzdálenost dvou obrázků]]. Pro práci s obrazovými daty silně doporučujeme [[https://numpy.org/doc/stable/reference/generated/numpy.array.html|numpy.array]]. **Tím můžete předejít problémům s časovou neefektivitou řešení** (AE kontroluje, zda kód neběží příliš dlouho). * [[.:numerical_issues|Jak předejít numerickým obtížím]] Můžete zvážit i následující: * Je vhodné mít rozumně navržený průchod daty, 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. ===== 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]].// ====== 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.