Cílem práce je napsat stroj na automatické rozpoznávání dopravních značek.
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:
__file__
(viz init v navazujícím příkladu)Ty nejpodstatnější věci ukazuje následující kód.
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
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í 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í:
Ukázkové řešení je tedy toto:
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í:
# 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
ukazatel = Znacky
kontrola(ukazatel)
0.333333333333