Projekt 5 — Dopravní značky (Traffic)
Nejnovější verze Pythonu, kterou bys měla v kurzu používat, je Python 3.12. U tohoto projektu je to zvlášť důležité kvůli spolupráci s TensorFlow.
Napiš AI, která rozpozná dopravní značku na fotografii.
$ python traffic.py gtsrb
Epoch 1/10
500/500 [==============================] - 5s 9ms/step - loss: 3.7139 - accuracy: 0.1545
Epoch 2/10
500/500 [==============================] - 6s 11ms/step - loss: 2.0086 - accuracy: 0.4082
Epoch 3/10
500/500 [==============================] - 6s 12ms/step - loss: 1.3055 - accuracy: 0.5917
Epoch 4/10
500/500 [==============================] - 5s 11ms/step - loss: 0.9181 - accuracy: 0.7171
Epoch 5/10
500/500 [==============================] - 7s 13ms/step - loss: 0.6560 - accuracy: 0.7974
Epoch 6/10
500/500 [==============================] - 9s 18ms/step - loss: 0.5078 - accuracy: 0.8470
Epoch 7/10
500/500 [==============================] - 9s 18ms/step - loss: 0.4216 - accuracy: 0.8754
Epoch 8/10
500/500 [==============================] - 10s 20ms/step - loss: 0.3526 - accuracy: 0.8946
Epoch 9/10
500/500 [==============================] - 10s 21ms/step - loss: 0.3016 - accuracy: 0.9086
Epoch 10/10
500/500 [==============================] - 10s 20ms/step - loss: 0.2497 - accuracy: 0.9256
333/333 - 5s - loss: 0.1616 - accuracy: 0.9535
Kdy úlohu dokončit
Jak získat pomoc
- Ptej se prostřednictvím Ed!
- Ptej se v kterékoli komunitě CS50!
Východiska
Při vývoji autonomních aut je jednou z hlavních výzev počítačové vidění, které umožňuje vozidlům chápat prostředí z digitálních obrázků. Patří sem zejména rozpoznávání a rozlišování značek: stop, omezení rychlosti, dej přednost a dalších.
Pomocí TensorFlow zde vytvoříš neuronovou síť klasifikující dopravní značky z obrázků. Potřebuješ označenou datovou sadu: obrázky už rozdělené podle značek, které zachycují.
Takových sad existuje více, ale my použijeme German Traffic Sign Recognition Benchmark, GTSRB, s tisíci obrázků 43 druhů dopravních značek.
Začínáme
- Stáhni dodaný kód z https://cdn.cs50.net/ai/2023/x/projects/5/traffic.zip a rozbal jej.
- Stáhni datovou sadu projektu a rozbal ji. Vzniklou složku
gtsrbpřesuň do složkytraffic. - Ve složce
trafficspusťpip3 install -r requirements.txt. Nainstaluje závislosti:opencv-pythonpro obrázky,scikit-learnpro funkce strojového učení atensorflowpro neuronové sítě.
Porozumění zadání
Ve složce gtsrb najdeš 43 podsložek číslovaných 0 až 42. Každá představuje kategorii, tedy typ značky, a obsahuje obrázky tohoto typu.
V traffic.py přijímá main jako argumenty příkazového řádku složku dat a volitelně název souboru pro uložení modelu. load_data načte data a štítky, které se rozdělí do trénovací a testovací sady. Potom get_model vytvoří zkompilovanou neuronovou síť a ta se natrénuje na trénovacích datech. Model se vyhodnotí na testovacích datech a při zadaném názvu souboru se uloží na disk.
Funkce load_data a get_model musíš implementovat.
Specifikace
V traffic.py dokonči load_data a get_model.
load_datapřijmedata_dir, cestu ke složce dat, a vrátí pole obrázků a jejich štítky.- Můžeš předpokládat, že
data_dirobsahuje jednu složku pro každou kategorii, číslovanou0ažNUM_CATEGORIES - 1. V každé jsou soubory obrázků. - Pomocí OpenCV-Python, modulu
cv2, načti obrázek jakonumpy.ndarray, vícerozměrné polenumpy. Aby vstoupily do sítě, musí mít všechny obrázky stejnou velikost. Změň proto jejich šířku naIMG_WIDTHa výšku naIMG_HEIGHT. - Vrať tuple
(images, labels).imagesje seznam všech obrázků sady, každý jako správně velkénumpy.ndarray.labelsje seznam celých čísel kategorií odpovídajících obrázků vimages. - Funkce musí být nezávislá na platformě a fungovat v každém operačním systému. macOS odděluje části cest znakem
/, Windows znakem\. Podle potřeby použijos.sepaos.path.joinmísto pevného oddělovače své platformy.
- Můžeš předpokládat, že
get_modelmá vrátit zkompilovaný model neuronové sítě.- Vstup má tvar
(IMG_WIDTH, IMG_HEIGHT, 3), tedy obrázek se šířkouIMG_WIDTH, výškouIMG_HEIGHTa3hodnotami každého pixelu pro červenou, zelenou a modrou. - Výstupní vrstva má mít
NUM_CATEGORIESjednotek, jednu pro každou kategorii značek. - Počet a typ mezilehlých vrstev volíš sama. Můžeš experimentovat s:
- různými počty konvolučních a poolingových vrstev;
- různými počty a velikostmi filtrů konvolučních vrstev;
- různými velikostmi poolingu;
- různými počty a velikostmi skrytých vrstev;
- dropoutem.
- Vstup má tvar
- V samostatném souboru README.md alespoň v jednom či dvou odstavcích popiš experimenty. Co jsi zkusila? Co fungovalo dobře? Co nefungovalo? Čeho sis všimla?
Velká část projektu spočívá v prozkoumávání dokumentace, zkoušení možností cv2 a tensorflow a pozorování výsledků.
V traffic.py neupravuj nic kromě funkcí určených zadáním. Můžeš přidat pomocné funkce a importy standardní knihovny Pythonu, případně numpy či pandas, pokud je znáš, ale žádné jiné moduly třetích stran. Pro testování jiných hodnot můžeš upravit globální proměnné na začátku souboru.
Tipy
- Pravidla syntaxe tvorby vrstev najdeš v oficiálním přehledu TensorFlow Keras. Pomoci může také zdrojový kód přednášky.
- Pro načtení a změnu velikosti obrázků může pomoci dokumentace OpenCV-Python.
- Po změně velikosti obrázku
imgověř rozměry výpisemimg.shape. Při správné změně jsou(30, 30, 3), předpokládáme-liIMG_WIDTHiIMG_HEIGHTrovné30. - Pro cvičení s menší sadou si můžeš stáhnout upravenou sadu s pouhými 3 druhy značek místo 43.
Testování
Chceš-li vyhodnotit správnost kódu, můžeš po nastavení check50 spustit následující příkaz. Není to povinné: při odevzdání podle kroků na konci zadání proběhnou stejné testy na našem serveru. V každém případě kód také sama zkompiluj a otestuj!
check50 ai50/projects/2024/x/traffic
Následujícím příkazem vyhodnotíš styl kódu pomocí style50.
style50 traffic.py
Pamatuj, že kromě standardní knihovny Pythonu nesmíš importovat žádné moduly mimo ty, které jsou zde výslovně povoleny. Jinak nebude fungovat check50 a ani submit50 nebude moci práci ohodnotit, protože používá check50. Pokud se to stane, patrně jsi importovala zakázaný modul nebo nepovoleně upravila dodaný kód. Existují nástroje, které některé projekty velmi zjednodušují, ale to zde není cílem: učíš se principům na nižší úrovni. Pokud zde jejich použití nepovolujeme, použít je nemůžeš.
Jak odevzdat
- Otevři tento odkaz, přihlas se účtem GitHub a klikni na Authorize cs50. Pak zaškrtni souhlas s přístupem učitelů k odevzdaným pracím a klikni na Join course.
- Nainstaluj Git a případně nainstaluj
submit50. - Pokud máš nainstalované
submit50, spusťsubmit50 ai50/projects/2024/x/trafficJinak pomocí Gitu odešli práci do
https://github.com/me50/USERNAME.git, kdeUSERNAMEje tvoje jméno na GitHubu, na větevai50/projects/2024/x/traffic.
Při přímém odevzdání přes Git místo submit50 nepřikládej složku gtsrb. Je příliš velká a automatickému hodnocení by téměř jistě vypršel časový limit. submit50 ji automaticky vynechá.
Práce by měla být ohodnocena do pěti minut. Svůj postup pak můžeš sledovat na https://cs50.me/cs50ai!