diff --git a/.gitignore b/.gitignore index 5136f10..2e01cc8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ __pycache__/ #macOS -.DS_Store \ No newline at end of file +.DS_Store + +#uczenie +dataset/ \ No newline at end of file diff --git a/README.md b/README.md index 7d52213..75b9e93 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ ## Spis treści * [Uruchomienie](#uruchomienie) +* [Wykrywanie roślin](#wykrywanie-roślin) * [Raport 1](#raport-1) * [Notatki](#notatki) @@ -14,6 +15,11 @@ Wymagania: Wpisanie komendy w glownym folderze:
`python3 main.py` + +## Wykrywanie roślin +Podprojekt na osobnym branchu - kuba. Raport - adamski_raport.md + + ## Raport 1 ### Środowisko agenta diff --git a/adamski_raport.md b/adamski_raport.md new file mode 100644 index 0000000..69e29ec --- /dev/null +++ b/adamski_raport.md @@ -0,0 +1,39 @@ +## Podprojekt Jakub Adamski +Wykrywanie rodzaju rośliny na danym polu, w którym znajduje się traktor. + +## Spis treści +* [Wykorzystana technologia](#wykorzystana-technologia) +* [Dane](#dane) +* [Kod](#kod) +* [Działanie](#działanie) +* [Uruchomienie](#uruchomienie) +* [Notatki](#notatki) + +## Wykorzystana technologia +W projekcie wykorzystuję sieć neuronową. Jest to klasyfikator obiektów, oparty na modelu MobileNetV2. MobileNet to wysoce zoptymalizowana struktura pozwalająca na rozpoznawanie obiektów.
+Składa się z warstw: CNN - convolutional neural network do wyodrębnienia cech charakterystycznych z obrazka oraz jednej warstwy dense, złozonej z 4 neuronow (ilosc obiektow w moim projekcie), które produkują finalny wynik na podstawie wyniku z CNN. + +## Dane +Zgromadzone zdjecia dostepne sa tutaj: [link](https://drive.google.com/open?id=1cs3TE-niBrhXT-23IA9g2rll3Qpk7Xdk). Dane zbierałem za pomocą wyszukiwarki google, następnie pogrupowałem według klas. Ostatnie 20 warstw sieci jest wytrenowana w pliku net_training.py, pierwsze warstwy są uczone na zbiorze danych imagenet - zmienna base_model.
+Do uruchomienia uzywam pakietu keras dostępnego w bibliotece tensorflow. Tensorflow to rozbudowany zestaw narzędzi do machine learningu, keraz to nakładka ułatwijąca uzywanie tego frameworku. + +## Kod +Klasyfikator działa w głównej pętli while w pliku main.py. Uruchamia się gdy traktor (niebieski kwadrat) zmieni swoją lokalizację. Zdjęcia przypisane do danej kratki są dobierane losowo. W finalnej wersji zdjęć będzie więcej - folder imgs/.
+Gdy klasyfikator zakończy swoje działanie, w konsoli pojawia się najbardziej prawdopodobny obiekt znajdujący się na zdjęciu. Zdjęcie pojawia się w osobnym oknie. Po zamknięciu okna mozemy kontynuować sterowanie traktorem za pomocą strzałek. + +## Działanie +![uczenie](ss/adamski2.png)
+![dzialanie](ss/adamski1.png) + +## Uruchomienie +Instalacja tensorflow
+Byl error z jakas biblioteka, trzeba zainstalować nomkl lub rozwiazanie ad hoc to komenda która pokazuje się przy błędzie. os.environ['KMP_DUPLICATE_LIB_OK']='True' +https://docs.anaconda.com/mkl-optimizations/ + + +## Notatki +Lista obiektów: +- pumpkin/dynia +- cabbage/kapusta +- mushroom/grzyb +- cauliflower/kalafior diff --git a/imgs/cabbage.jpg b/imgs/cabbage.jpg new file mode 100644 index 0000000..fcc38ef Binary files /dev/null and b/imgs/cabbage.jpg differ diff --git a/imgs/cauliflower.jpg b/imgs/cauliflower.jpg new file mode 100644 index 0000000..356a365 Binary files /dev/null and b/imgs/cauliflower.jpg differ diff --git a/imgs/mushroom.jpg b/imgs/mushroom.jpg new file mode 100644 index 0000000..b699136 Binary files /dev/null and b/imgs/mushroom.jpg differ diff --git a/imgs/pumpkin.jpg b/imgs/pumpkin.jpg new file mode 100644 index 0000000..192534b Binary files /dev/null and b/imgs/pumpkin.jpg differ diff --git a/main.py b/main.py index ee2ed0e..0573905 100644 --- a/main.py +++ b/main.py @@ -2,11 +2,20 @@ import pygame, sys from traktor import Traktor import dijkstra as di +import matplotlib.pyplot as plt +from tensorflow.keras.preprocessing import image +from tensorflow.keras.models import load_model +from tensorflow.keras.applications import MobileNetV2 +from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions +import numpy as np +import os, random +#u mnie blad z biblioteka +os.environ['KMP_DUPLICATE_LIB_OK']='True' + class Game(object): def __init__(self): - #to da sie chyba zrobic lepiej #lokalizacje odpowiednich punktow na planszy lokalizacje = [[0,0], [100, 0], @@ -34,6 +43,15 @@ class Game(object): [300, 400], [400, 400]] + #ładowanie tablicy ze zdjeciami + imgs = [] + img_dir = './imgs' + for _ in lokalizacje: + imgs.append(img_dir + '/' + random.choice(os.listdir(img_dir))) + + #model do rozpoznawania + model = load_model('moj_model.h5') + #inicjalizacja pygame.init() self.pole = pygame.display.set_mode((501,501)) @@ -46,8 +64,9 @@ class Game(object): else: sterowanie = False - #iohiu;i;gou;ihpiu while True: + run_classifier = False + #obsługa zdarzń for event in pygame.event.get(): if event.type == pygame.QUIT: @@ -72,6 +91,12 @@ class Game(object): self.player.x -= 100 if self.player.x < 0: self.player.x = 0 + + #okreslanie w ktorym punkcie jesteśmy + wsp = [self.player.x, self.player.y] + self.player.punkt = lokalizacje.index(wsp) + run_classifier = True + else: #po spacji wpisujemy punkty if event.type == pygame.KEYDOWN : @@ -91,6 +116,7 @@ class Game(object): self.player.x = lokalizacje[pt][0] self.player.y = lokalizacje[pt][1] self.player.punkt = pt + run_classifier = True pygame.display.update() @@ -100,8 +126,23 @@ class Game(object): self.krata() self.rysowanie() pygame.display.flip() + + if run_classifier: + #wybieranie zdjecia + pt = self.player.punkt + img_path = imgs[pt] + img = image.load_img(img_path, target_size=(224, 224)) + x = image.img_to_array(img) + x = np.expand_dims(x, axis=0) + x = preprocess_input(x) + + #detektor roslin, 5 rezultatow + plt.imshow(img) + preds = model.predict(x) + print("kapusta, kalafior, grzyb, dynia\n {}\n".format(preds) ) + plt.show() - + def krata(self): #wymiary w= 500 diff --git a/moj_model.h5 b/moj_model.h5 new file mode 100644 index 0000000..5736b82 Binary files /dev/null and b/moj_model.h5 differ diff --git a/net_training.py b/net_training.py new file mode 100644 index 0000000..9f94e38 --- /dev/null +++ b/net_training.py @@ -0,0 +1,36 @@ +import matplotlib.pyplot as plt +from tensorflow.keras.preprocessing.image import ImageDataGenerator +from tensorflow.keras.applications import MobileNetV2 +from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions +from tensorflow.keras.layers import Dense +from tensorflow.keras.models import Model +import numpy as np +import os, random + +#podstawa modelu +base_model = MobileNetV2(include_top=False, weights="imagenet", pooling='avg') + +#model +x=base_model.output +preds=Dense(4,activation='softmax')(x) +model=Model(inputs=base_model.input,outputs=preds) + +#tylko ostatnie 20 warstw uczymy +for layer in model.layers[:20]: + layer.trainable=False +for layer in model.layers[20:]: + layer.trainable=True + +#generator obrazkow +train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input) + +train_generator=train_datagen.flow_from_directory('./dataset', target_size=(224,224), color_mode='rgb', batch_size=32, class_mode='categorical', shuffle=True) + + +#uczenie //to dzielenie i podloga +model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy']) +step_size_train=train_generator.n//train_generator.batch_size +model.fit_generator(generator=train_generator, steps_per_epoch=step_size_train, epochs=10) + +#zapis +model.save('moj_model.h5') \ No newline at end of file diff --git a/ss/adamski1.png b/ss/adamski1.png new file mode 100644 index 0000000..16134ab Binary files /dev/null and b/ss/adamski1.png differ diff --git a/ss/adamski2.png b/ss/adamski2.png new file mode 100644 index 0000000..0cf2d13 Binary files /dev/null and b/ss/adamski2.png differ