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