From 7d762e234f02403ed40daf0c303848d7d65f61fd Mon Sep 17 00:00:00 2001 From: Sara Kowalska Date: Mon, 4 May 2020 11:28:59 +0200 Subject: [PATCH] Raaport - Rozpoznawanie talerzy Sara Kowalska --- Raporty/plansza_menu.png | Bin 0 -> 27058 bytes Restaurant/Sara/image_classification.py | 3 - Restaurant/main.py | 6 +- Rozpoznawanie talerzy Sara Kowalska.md | 159 ++++++++++++++++++++++++ 4 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 Raporty/plansza_menu.png create mode 100644 Rozpoznawanie talerzy Sara Kowalska.md diff --git a/Raporty/plansza_menu.png b/Raporty/plansza_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd50ae8aae31ad91656a0aa3c4de1b9854e1698 GIT binary patch literal 27058 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 ```python +> model = Sequential() +> model.add(Conv2D(32, (2, 2), input_shape=input_shape)) +> model.add(Activation('relu')) +> model.add(MaxPooling2D(pool_size=(2, 2))) +> +> model.add(Conv2D(32, (2, 2))) +> model.add(Activation('relu')) +> model.add(MaxPooling2D(pool_size=(2, 2))) +> +> model.add(Conv2D(64, (2, 2))) +> model.add(Activation('relu')) +> model.add(MaxPooling2D(pool_size=(2, 2))) +> ``` + +Jako pierwszą do modelu dołączam warstwę **operacji splotu** (**konwolucji**), która polega na przesuwaniu filtru (mnożenie przez macierz, tutaj 2x2, splot = 32) wzdłuż obrazu, aby dla każdego jego fragmentu obliczyć splot między nim a filtrem (ekstrakcja cech). Z tą warstwą dodany jest również format wejścia (dodany raz, odczytywany jest przez wszystkie kolejne warstwy). + +Następnie dodana zostaje funkcja aktywacji - **ReLU**: f(x) = x+ = max(0, x), x - dane wejściowe, która zeruje negatywne wartości (korzystamy z niej, ponieważ w wyniku spodziewamy się uzyskać prawdopodobieństwo, które nie może być ujemne). + +Kolejna zostaje załadowana warstwa **MaxPooling2D**, która zmienia rozdzielczość obrazka. Jest ona podobna do zastosowania filtru, z tym że tutaj nie stosujemy mnożenia, a wyciągamy największą wartość z wycinka obrazka. Dodatkowo tu "okno" operacji przesuwa się o swoją szerokość, a nie jak w Conv2D o 1. punkt , dzięki czemu zmniejszamy rozmiar danych w sieci oraz liczbę trenowanych cech. + +W ten sam sposób załadowane zostają kolejne dwie sekwencje warstw (w 3. zwiększamy splot na 64). + +> ```python +> model.add(Flatten()) +> model.add(Dense(64)) +> model.add(Activation('relu')) +> model.add(Dropout(0.5)) +> model.add(Dense(1)) +> model.add(Activation('sigmoid')) +> ``` + +Kolejną dodaną warstwą jest **Flatten()**, która spłaszcza macierze do wektorów oraz warstwa **Dense(64)** - jest to warstwa z 64 neuronami. Po raz kolejny dodajemy funkcję **ReLU**, w celu wyzerowania wartości negatywnych. + +Następnie poprzez dodanie warstwy **Dropout(0.5)** losowo odrzucamy 50% danych, aby uniknąć przeuczenia sieci. + +Następnie dodajemy warstwę **Dense(1)** z 1. neuronem - standardowo na wyjściu liczba neuronów powinna odpowiadać liczbie klas (wektor zer i jedynek wskazujący, który z neuronów powinien zostać aktywowany), jednak ze względu na to, iż w naszym przypadku mamy tylko dwie klasy (food oraz dirty), możemy zastosować podejście z jednym neuronem - 1. elementowe wyjście (0 dla klasy dirty, 1 dla klasy food). + +Na końcu dodajemy funkcję aktywacyjną **sigmoid**, która "upycha" wartości w przedział [0, 1], co pozwala na generowanie wartości, które możemy zinterpretować jako prawdopodobieństwo. + +> ```python +> model.compile(loss='binary_crossentropy', +> optimizer='rmsprop', +> metrics=['accuracy']) +> ``` + +Następnym krokiem jest kompilacja modelu. Ponieważ mamy do czynienia z problemem klasyfikacji binarnej (tylko dwie klasy), wybraną funkcją straty jest **binary_crosentropy** (binarna entropia krzyżowa). Wykorzystałam optymalizator **rmsprop** oraz przy pomocy parametru *metrics* dodałam monitorowanie dokładności. + +> ```python +> train_datagen = ImageDataGenerator( +> rotation_range=45, +> width_shift_range=0.3, +> height_shift_range=0.3, +> rescale=1./255, +> shear_range=0.25, +> zoom_range=0.1, +> horizontal_flip=True) +> +> validation_datagen = ImageDataGenerator(rescale=1. / 255) +> ``` + +Następnie przygotowuję generatory, odpowiednio **train_datagen** dla danych uczących oraz **validation_datagen** dla danych testowych. Dla dobrego uczenia na wszystkich zdjęciach musimy zastosować parametr *rescale=1. / 255*. Dodatkowo, ponieważ głębokie uczenie najlepiej sprawdza się dla dużych zbiorów danych (a mój zbiór nie jest bardzo liczny), korzystam ze strategii augumentacji danych - na każdym zdjęciu treningowym generator losowo stosuje dostępne parametry, dzięki temu w każdej epoce uczenia (epoka - iteracja na wszystkich próbkach) w zestawie treningowym dostajemy nowe dane, zbliżone do oryginalnych, jednak przez sieć traktowane jak nowy, inny zbiór. + +> ```python +> train_generator = train_datagen.flow_from_directory( +> train_data_dir, +> target_size=(img_width, img_height), +> batch_size=batch_size, +> class_mode='binary') +> +> validation_generator = validation_datagen.flow_from_directory( +> validation_data_dir, +> target_size=(img_width, img_height), +> batch_size=batch_size, +> class_mode='binary') +> +> model.fit_generator( +> train_generator, +> steps_per_epoch=nb_train_samples // batch_size, +> epochs=epochs, +> validation_data=validation_generator, +> validation_steps=nb_validation_samples // batch_size) +> +> model.save_weights('model_food_dirty.h5') +> ``` + +Ostatnim krokiem jest załadowanie danych z odpowiednich folderów do generatora - **train_generator** i **validation_generator** (ładujemy zdjęcia na ustalonym rozmiarze w trybie binarnym - 2 klasy) oraz uruchomienie uczenie modelu **model.fit_generator** (batch_size - rozmiar pojedynczej partii danych = 16; 20 epok, liczba kroków w ramach jednej epoki obliczana jest przez ilość danych treningowych/testowych przez rozmiar partii). + +Na końcu zapisuję wagi modelu w pliku *model_food_dirty.h5*. + + + +## Integracja z projektem + +W funkcji *main()* tworzę model sekwencyjny o parametrach uczonego przeze mnie wcześniej modelu oraz ładuję wagi nauczonego modelu. + +> ```python +> img_classify = Sequential() +> makeImgClassificator(img_classify) +> img_classify.load_weights('Sara/model_food_dirty.h5') +> ``` + +Zdjęcie! + +Po wybraniu na ekranie głównym opcji *Rozpoznawanie talerzy*, uruchomiona zostaje funkcja *Classify()*, która inicjuje przykładowy początkowy stan restauracji (dodanie kilku klientów, przypisanie im stołów i talerzy) oraz nakazuje agentowi podejście do każdego z klientów i sprawdzenie czy posiadany przez niego talerz jest pusty czy pełny poprzez funkcję *predictAndShowImg()*: + +> ```python +> def predictAndShowImg(plate): +> img_width, img_height = 256, 256 +> plate.draw() +> test_image = load_img(plate.img, target_size=(img_width, img_height)) +> test_image = img_to_array(test_image) +> test_image = test_image.reshape((1,) + test_image.shape) +> +> result = img_classify.predict(test_image) +> print(result) +> if (result == [1.]): +> messagebox.showinfo("Rozpoznanie", "Talerz pełny.") +> return 1 +> else: +> messagebox.showinfo("Rozpoznanie", "Talerz pusty.") +> return 0 +> ``` + +Funkcja ta przyjmuje jako argument obiekt talerz (plate) danego klienta, wyświetla odpowiednie zdjęcie (w domyślnej przeglądarce systemowej) i za pomocą **img_classify.predict(test_image)** przekazuje wytrenowanej sieci zdjęcie do rozpoznania. W zależności od werdyktu wyświetlane jest okno z odpowiednią informacją. + +Dodatkowo, jeżeli sieć rozpozna pusty talerz, agent zostaje wysłany do kuchni przed odwiedzeniem kolejnego stolika (imitacja odnoszenia brudnego talerza). + +Ponieważ na chwilę obecną program nie posiada innych dostępnych projektów do uruchomienia, po zakończeniu trasy wyświetlany jest stosowny komunikat, a aplikacja zostaje wyłączona. \ No newline at end of file