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/adamski_raport.md b/adamski_raport.md index 3fb947c..7a2fe83 100644 --- a/adamski_raport.md +++ b/adamski_raport.md @@ -1,5 +1,5 @@ ## Podprojekt Jakub Adamski -Wykrywanie rodzaju rośliny w danym polu, na którym znajduje się traktor. +Wykrywanie rodzaju rośliny na danym polu, w którym znajduje się traktor. ## Spis treści * [Wykorzystana technologia](#wykorzystana-technologia) @@ -11,19 +11,19 @@ Wykrywanie rodzaju rośliny w danym polu, na którym znajduje się traktor. ## 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 duzej ilosci neuronow, które produkują finalny wynik na podstawie wyniku z CNN. +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 -Trenowanie klasyfikatorów od zera jest bardzo czasochłonne. Zazwyczaj zajmuje nawet kilka dni, nie wspominając o zgromadzeniu bardzo duzej ilosci zdjęć - najlepiej klika milionów.
-Z tego powodu wykorzystuję, gotową, wytrenowaną sieć na zbiorze danych imagenet. Do uruchomienia urzywam 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. +Zgromadzone zdjecia dostepne sa tutaj: [link](). 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 -W finalnej wersji łączącej wszytkie podprojekty mozna dodatkowo dołączyć walidację otrzymanego wyniku na podstawie nazwy zdjęcia.
-![ss]("./ss/adamski1.png") +![uczenie]("./ss/adamski2.png")
+![dzialanie]("./ss/adamski1.png") ## Uruchomienie @@ -34,9 +34,7 @@ https://docs.anaconda.com/mkl-optimizations/ ## Notatki Lista obiektów: -- pumpkin/dynia ok - spaghetti_squash -- cabbage/kapusta ok - head_cabbage -- mushchroom/grzyb ok - mushroom -- cauliflower/kalafior ok - cauliflower -- ziemniak NIE ROZPOZNAL -- marchewka NIE ROZPOZNAL +- pumpkin/dynia +- cabbage/kapusta +- mushroom/grzyb +- cauliflower/kalafior diff --git a/imgs/cabbage.jpg b/imgs/cabbage.jpg index 866dc1d..fcc38ef 100644 Binary files a/imgs/cabbage.jpg and b/imgs/cabbage.jpg differ diff --git a/main.py b/main.py index 6c79501..0573905 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ 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 @@ -49,7 +50,7 @@ class Game(object): imgs.append(img_dir + '/' + random.choice(os.listdir(img_dir))) #model do rozpoznawania - model = MobileNetV2(input_shape=None, alpha=1.0, include_top=True, weights="imagenet", input_tensor=None, pooling=None, classes=1000) + model = load_model('moj_model.h5') #inicjalizacja pygame.init() @@ -138,8 +139,7 @@ class Game(object): #detektor roslin, 5 rezultatow plt.imshow(img) preds = model.predict(x) - decoded = decode_predictions(preds, top=1) - print(decoded) + print("kapusta, kalafior, grzyb, dynia\n {}\n".format(preds) ) plt.show() 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 index 56369ba..16134ab 100644 Binary files a/ss/adamski1.png 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