{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Rozpozn\u00e1v\u00e1n\u00ed dopravn\u00edch zna\u010dek" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "C\u00edlem pr\u00e1ce je napsat stroj na automatick\u00e9 rozpozn\u00e1v\u00e1n\u00ed dopravn\u00edch zna\u010dek.\n", "\n", "\n", "![zn1](http://147.228.240.61/zdo/IS3d_id13277_ff7741-FL_1_131030_00067306-1.jpg)\n", "![zn2](http://147.228.240.61/zdo/P1_id13258_ff7546-FL_1_131030_00066180-1.jpg)\n", "![zn3](http://147.228.240.61/zdo/Z3_id18972_ff2347-FL_1_131030_00020439.jpg)\n", "![zn3](http://147.228.240.61/zdo/P2_id14368_ff74-FL_1_131030_00002530.jpg)\n", "\n", "\n", "\n", "\n", "* [Tr\u00e9novac\u00ed data](http://147.228.240.61/zdo/)\n", "* [Pr\u016fb\u011b\u017en\u00e9 v\u00fdsledky](http://nbviewer.ipython.org/github/mjirik/ZDO2014semestralky/blob/master/table.ipynb)" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Jakou podobu m\u00e1 m\u00edt \u0159e\u0161en\u00ed?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "C\u00edlem va\u0161\u00ed pr\u00e1ce je skript v jazyce python, kter\u00fd bude posouzen automatick\u00fdm vyhodnocen\u00edm. Proto je pot\u0159eba db\u00e1t na p\u0159edepsanou formu. Hlavn\u00ed skript mus\u00ed obsahovat t\u0159\u00eddu Znacky. Ta m\u00e1 povinnou funkci rozpoznejZnacku(). \n", "\n", "Ve webov\u011b dostupn\u00e9 podob\u011b lze studovat podrobnosti (nep\u0159\u00edli\u0161 dob\u0159e) [funguj\u00edc\u00edho \u0159e\u0161en\u00ed](https://github.com/mjirik/ZDO2014sample_solution)\n", "\n", "Na\u010d je pot\u0159eba d\u00e1t pozor:\n", "\n", "* class Znacky\n", "* funkce rozpoznejZnacku()\n", "* p\u0159\u00edpadn\u00e9 datov\u00e9 soubory je nutn\u00e9 adresovat relativn\u011b pomoc\u00ed `__file__` (viz init v navazuj\u00edc\u00edm p\u0159\u00edkladu)\n", "* demo re\u017eim\n", "\n", "Ty nejpodstatn\u011bj\u0161\u00ed v\u011bci ukazuje n\u00e1sleduj\u00edc\u00ed k\u00f3d. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Znacky:\n", " \"\"\"\n", " M. Ji\u0159\u00edk\n", " I. Pirner\n", " P. Zimmermann\n", " \n", " Takto bude vytvo\u0159eno va\u0161e \u0159e\u0161en\u00ed. Mus\u00ed obsahovat funkci 'rozpoznejZnacku()', \n", " kter\u00e1 m\u00e1 jeden vstupn\u00ed parametr. T\u00edm je obraz. Doba trv\u00e1n\u00e1 funkce je \n", " omezena na 1 sekundu. Tato funkce rovn\u011b\u017e mus\u00ed obsahovat \n", " uk\u00e1zkov\u00fd re\u017eim. V n\u011bm je pomoc\u00ed obr\u00e1zk\u016f vysv\u011btleno, jak cel\u00e1 v\u011bc pracuje.\n", " \"\"\"\n", " def __init__(self):\n", " # Na\u010d\u00edt\u00e1n\u00ed natr\u00e9novan\u00fdch parametr\u016f klasifik\u00e1toru ze souboru atd.\n", " \n", " # Soubory je nelze na\u010d\u00edtat pomoc\u00ed prost\u00e9 cesty\n", " # Je pot\u0159eba adresovat relativn\u011b k poloze aktu\u00e1ln\u00edmu skriptu\n", " # vyzkou\u0161et je to mo\u017en\u00e9 spu\u0161t\u011bn\u00edm skriptu z jin\u00e9ho ne\u017e aktu\u00e1ln\u00edho adres\u00e1\u0159e\n", " # python ../projects/zdo/mujsuperskript.py\n", " \n", " ## cesta ke skriptu\n", " # path_to_script = os.path.dirname(os.path.abspath(__file__))\n", " ## spojen\u00ed s relativn\u00ed cestou\n", " # classifier_path = os.path.join(path_to_script, \"../data/data.pkl\")\n", " pass\n", " \n", " def rozpoznejZnacku(self, image, demo=False):\n", " \n", " # N\u011bjak\u00fd moc chytr\u00fd k\u00f3d\n", " if image.shape[0] > 10:\n", " retval = 'P2'\n", " else:\n", " retval = 'C4a'\n", " \n", " if demo:\n", " print \"V\u00fdpisy parametr\u016f, obr\u00e1zky atd.\"\n", " \n", " return retval" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "import glob\n", "import os\n", "\n", "# nacitani z adresare\n", "def readImageDir(path):\n", " dirs = glob.glob(os.path.join(os.path.normpath(path) ,'*'))\n", " labels = []\n", " files = []\n", " for onedir in dirs:\n", " #print onedir\n", " base, lab = os.path.split(onedir)\n", " if os.path.isdir(onedir):\n", " filesInDir = glob.glob(os.path.join(onedir, '*'))\n", " for onefile in filesInDir:\n", " labels.append(lab)\n", " files.append(onefile)\n", " \n", " return files, labels\n", " \n", "\n", "files, labels = readImageDir('/home/mjirik/data/zdo2014/zdo2014-training/')\n", "print \"pocet souboru \", len(files)\n", "print 'prvnich 3 soubory \\n', files[0:3]\n", "print 'prvnich 3 labely \\n', labels[0:3]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "pocet souboru 17055\n", "prvnich 3 soubory \n", "['/home/mjirik/data/zdo2014/zdo2014-training/E4/E4_id24095_ff14882-131030_00098832-3.jpg', '/home/mjirik/data/zdo2014/zdo2014-training/E4/E4_id24095_ff14888-131030_00098861-1.jpg', '/home/mjirik/data/zdo2014/zdo2014-training/E4/E4_id24082_ff23056-131031_00160483-1.jpg']\n", "prvnich 3 labely \n", "['E4', 'E4', 'E4']\n" ] } ], "prompt_number": 14 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Vyhodnocen\u00ed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vyhodnocen\u00ed bude prob\u00edhat hromadn\u011b. Pythonovsk\u00e9 (a p\u0159\u00edpadn\u00e9 jak\u00e9koliv dal\u0161\u00ed) soubory musej\u00ed b\u00fdt v adres\u00e1\u0159i, kter\u00fd je zabalen do zipu a zve\u0159ejn\u011bn kdekoliv na s\u00edti. \n", "\n", "\n", "\n", "Pro vyhodnocen\u00ed:\n", "\n", "1. Vytvo\u0159te zip se skriptem a zve\u0159ejn\u011bte jej kdekoliv na internetu\n", "2. Za\u0161lete cvi\u010d\u00edc\u00edmu n\u00e1sleduj\u00edc\u00ed informace:\n", " 1. Ve\u0159ejn\u011b dostupn\u00e9 url k zip souboru\n", " 2. Jm\u00e9no adres\u00e1\u0159e v zipu\n", " 3. Jm\u00e9no hlavn\u00edho skriptu\n", " 4. Kr\u00e1tk\u00e9 pojmenov\u00e1n\u00ed t\u00fdmu\n", " \n", "Uk\u00e1zkov\u00e9 \u0159e\u0161en\u00ed je tedy toto:\n", "\n", "1. Uk\u00e1zkov\u00fd zip je [zde](https://github.com/mjirik/ZDO2014sample_solution/archive/master.zip)\n", "2. Informace pot\u0159ebn\u00e9 pro spu\u0161t\u011bn\u00ed:\n", " 1. https://github.com/mjirik/ZDO2014sample_solution/archive/master.zip\n", " 2. 'ZDO2014sample_solution-master'\n", " 3. 'ZDO2014sample_solution'\n", " 4. 'sample M. Jirik'\n", "\n", "\n", "Tyto informace budou vlo\u017eeny do [seznamu \u0159e\u0161en\u00ed](http://nbviewer.ipython.org/github/mjirik/ZDO2014semestralky/blob/master/solutions_list.ipynb?create=1). Jeho ve\u0159ejn\u00e1 podoba nebude aktualizov\u00e1na, tak\u017ee se adresu s va\u0161\u00edm \u0159e\u0161en\u00edm t\u00edmto zp\u016fsobem nikdo nedov\u00ed.\n", "\n", "V\u00fdsledky budou vyhodnoceny dvakr\u00e1t t\u00fddn\u011b. Ve\u0159ejn\u011b dostupn\u00fd je [vyhodnocovac\u00ed skript](http://nbviewer.ipython.org/github/mjirik/ZDO2014semestralky/blob/master/vyhodnoceni.ipynb) i s [pr\u016fb\u011b\u017en\u00fdmi v\u00fdsledky](http://nbviewer.ipython.org/github/mjirik/ZDO2014semestralky/blob/master/table.ipynb).\n", "\n", "Pro pot\u0159eby va\u0161eho testov\u00e1n\u00ed lze pou\u017e\u00edt n\u00e1sleduj\u00edc\u00ed vyhodnocov\u00e1n\u00ed:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Zjednodu\u0161en\u00e1 podoba kontroly\n", "\n", "import signal\n", "\n", "import skimage\n", "import skimage.io\n", "import numpy as np\n", "\n", "\n", "# na windows nefunguje knihovna contextlib\n", "# v kodu je proto n\u00e1hrada od M. \u010cerven\u00e9ho pomoc\u00ed time\n", "import time\n", "\n", " \n", "def kontrola(ukazatel):\n", " studentske_reseni = ukazatel() # tim je zavol\u00e1n v\u00e1\u0161 konstruktor __init__\n", " \n", " obrazky = ['http://147.228.240.61/zdo/P2_id14368_ff74-FL_1_131030_00002530.jpg',\n", " 'http://147.228.240.61/zdo/Z3_id18972_ff2347-FL_1_131030_00020439.jpg',\n", " 'http://147.228.240.61/zdo/P1_id13258_ff7546-FL_1_131030_00066180-1.jpg'\n", " ]\n", " reseni = ['P2', 'Z3', 'P1']\n", " \n", " vysledky = []\n", " \n", " for i in range(0, len(obrazky)):\n", " cas1 = time.clock()\n", " im = skimage.io.imread(obrazky[i])\n", " result = studentske_reseni.rozpoznejZnacku(im) \n", "\n", " cas2 = time.clock() \n", "\n", " if((cas2 - cas1) >= 1.0):\n", " print \"cas vyprsel\"\n", " result = 0\n", "\n", " vysledky.append(result)\n", " \n", " hodnoceni = np.array(reseni) == np.array(vysledky)\n", " skore = np.sum(hodnoceni.astype(np.int)) / np.float(len(reseni))\n", " \n", " print skore\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "ukazatel = Znacky\n", "kontrola(ukazatel)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0.333333333333\n" ] } ], "prompt_number": 16 } ], "metadata": {} } ] }