Rozpoznávání dopravních značek

Cílem práce je napsat stroj na automatické rozpoznávání dopravních značek.

zn1 zn2 zn3 zn3

Jakou podobu má mít řešení?

Cílem vaší práce je skript v jazyce python, který bude posouzen automatickým vyhodnocením. Proto je potřeba dbát na předepsanou formu. Hlavní skript musí obsahovat třídu Znacky. Ta má povinnou funkci rozpoznejZnacku().

Ve webově dostupné podobě lze studovat podrobnosti (nepříliš dobře) fungujícího řešení

Nač je potřeba dát pozor:

  • class Znacky
  • funkce rozpoznejZnacku()
  • případné datové soubory je nutné adresovat relativně pomocí __file__ (viz init v navazujícím příkladu)
  • demo režim

Ty nejpodstatnější věci ukazuje následující kód.

In [13]:
class Znacky:
    """
    M. Jiřík
    I. Pirner
    P. Zimmermann
    
    Takto bude vytvořeno vaše řešení. Musí obsahovat funkci 'rozpoznejZnacku()', 
    která má jeden vstupní parametr. Tím je obraz. Doba trváná funkce je 
    omezena na 1 sekundu. Tato funkce rovněž musí obsahovat 
    ukázkový režim. V něm je pomocí obrázků vysvětleno, jak celá věc pracuje.
    """
    def __init__(self):
        # Načítání natrénovaných parametrů klasifikátoru ze souboru atd.
        
        # Soubory je nelze načítat pomocí prosté cesty
        # Je potřeba adresovat relativně k poloze aktuálnímu skriptu
        # vyzkoušet je to možné spuštěním skriptu z jiného než aktuálního adresáře
        # python ../projects/zdo/mujsuperskript.py
        
        ## cesta ke skriptu
        # path_to_script = os.path.dirname(os.path.abspath(__file__))
        ## spojení s relativní cestou
        # classifier_path = os.path.join(path_to_script, "../data/data.pkl")
        pass
    
    def rozpoznejZnacku(self, image, demo=False):
        
        # Nějaký moc chytrý kód
        if image.shape[0] > 10:
            retval = 'P2'
        else:
            retval = 'C4a'
            
        if demo:
            print "Výpisy parametrů, obrázky atd."
        
        return retval
In [14]:
import glob
import os

# nacitani z adresare
def readImageDir(path):
    dirs = glob.glob(os.path.join(os.path.normpath(path) ,'*'))
    labels = []
    files = []
    for onedir in dirs:
        #print onedir
        base, lab = os.path.split(onedir)
        if os.path.isdir(onedir):
            filesInDir = glob.glob(os.path.join(onedir, '*'))
            for onefile in filesInDir:
                labels.append(lab)
                files.append(onefile)
        
    return files, labels
    

files, labels = readImageDir('/home/mjirik/data/zdo2014/zdo2014-training/')
print "pocet souboru ", len(files)
print 'prvnich 3 soubory \n', files[0:3]
print 'prvnich 3 labely \n', labels[0:3]
pocet souboru  17055
prvnich 3 soubory 
['/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']
prvnich 3 labely 
['E4', 'E4', 'E4']

Vyhodnocení

Vyhodnocení bude probíhat hromadně. Pythonovské (a případné jakékoliv další) soubory musejí být v adresáři, který je zabalen do zipu a zveřejněn kdekoliv na síti.

Pro vyhodnocení:

  1. Vytvořte zip se skriptem a zveřejněte jej kdekoliv na internetu
  2. Zašlete cvičícímu následující informace:
    1. Veřejně dostupné url k zip souboru
    2. Jméno adresáře v zipu
    3. Jméno hlavního skriptu
    4. Krátké pojmenování týmu

Ukázkové řešení je tedy toto:

  1. Ukázkový zip je zde
  2. Informace potřebné pro spuštění:
    1. https://github.com/mjirik/ZDO2014sample_solution/archive/master.zip
    2. 'ZDO2014sample_solution-master'
    3. 'ZDO2014sample_solution'
    4. 'sample M. Jirik'

Tyto informace budou vloženy do seznamu řešení. Jeho veřejná podoba nebude aktualizována, takže se adresu s vaším řešením tímto způsobem nikdo nedoví.

Výsledky budou vyhodnoceny dvakrát týdně. Veřejně dostupný je vyhodnocovací skript i s průběžnými výsledky.

Pro potřeby vašeho testování lze použít následující vyhodnocování:

In [15]:
# Zjednodušená podoba kontroly

import signal

import skimage
import skimage.io
import numpy as np


# na windows nefunguje knihovna contextlib
# v kodu je proto náhrada od M. Červeného pomocí time
import time

        
def kontrola(ukazatel):
    studentske_reseni = ukazatel() # tim je zavolán váš konstruktor __init__
    
    obrazky = ['http://147.228.240.61/zdo/P2_id14368_ff74-FL_1_131030_00002530.jpg',
             'http://147.228.240.61/zdo/Z3_id18972_ff2347-FL_1_131030_00020439.jpg',
             'http://147.228.240.61/zdo/P1_id13258_ff7546-FL_1_131030_00066180-1.jpg'
             ]
    reseni = ['P2', 'Z3', 'P1']
    
    vysledky = []
    
    for i in range(0, len(obrazky)):
        cas1 = time.clock()
        im = skimage.io.imread(obrazky[i])
        result = studentske_reseni.rozpoznejZnacku(im)           

        cas2 = time.clock()   

        if((cas2 - cas1) >= 1.0):
            print "cas vyprsel"
            result = 0

        vysledky.append(result)
            
    hodnoceni = np.array(reseni) == np.array(vysledky)
    skore = np.sum(hodnoceni.astype(np.int)) / np.float(len(reseni))
    
    print skore
In [16]:
ukazatel = Znacky
kontrola(ukazatel)
0.333333333333