Projekt v PythonuZdroj ↗

Projekt 5 — Dopravní značky (Traffic)

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

Do 2027-06-30T23:59:00+00:00.

Jak získat pomoc

  1. Ptej se prostřednictvím Ed!
  2. 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 gtsrb přesuň do složky traffic.
  • Ve složce traffic spusť pip3 install -r requirements.txt. Nainstaluje závislosti: opencv-python pro obrázky, scikit-learn pro funkce strojového učení a tensorflow pro 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_data přijme data_dir, cestu ke složce dat, a vrátí pole obrázků a jejich štítky.
    • Můžeš předpokládat, že data_dir obsahuje jednu složku pro každou kategorii, číslovanou 0 až NUM_CATEGORIES - 1. V každé jsou soubory obrázků.
    • Pomocí OpenCV-Python, modulu cv2, načti obrázek jako numpy.ndarray, vícerozměrné pole numpy. Aby vstoupily do sítě, musí mít všechny obrázky stejnou velikost. Změň proto jejich šířku na IMG_WIDTH a výšku na IMG_HEIGHT.
    • Vrať tuple (images, labels). images je seznam všech obrázků sady, každý jako správně velké numpy.ndarray. labels je seznam celých čísel kategorií odpovídajících obrázků v images.
    • 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žij os.sep a os.path.join místo pevného oddělovače své platformy.
  • get_model má vrátit zkompilovaný model neuronové sítě.
    • Vstup má tvar (IMG_WIDTH, IMG_HEIGHT, 3), tedy obrázek se šířkou IMG_WIDTH, výškou IMG_HEIGHT a 3 hodnotami každého pixelu pro červenou, zelenou a modrou.
    • Výstupní vrstva má mít NUM_CATEGORIES jednotek, 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.
  • 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 img ověř rozměry výpisem img.shape. Při správné změně jsou (30, 30, 3), předpokládáme-li IMG_WIDTH i IMG_HEIGHT rovné 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

Jak odevzdat

  1. 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.
  2. Nainstaluj Git a případně nainstaluj submit50.
  3. Pokud máš nainstalované submit50, spusť
    submit50 ai50/projects/2024/x/traffic
    

    Jinak pomocí Gitu odešli práci do https://github.com/me50/USERNAME.git, kde USERNAME je tvoje jméno na GitHubu, na větev ai50/projects/2024/x/traffic.

Práce by měla být ohodnocena do pěti minut. Svůj postup pak můžeš sledovat na https://cs50.me/cs50ai!

Poděkování

Data poskytli J. Stallkamp, M. Schlipsing, J. Salmen a C. Igel. The German Traffic Sign Recognition Benchmark: A multi-class classification competition. In Proceedings of the IEEE International Joint Conference on Neural Networks, strany 1453–1460. 2011.