Merge branch 'kuba' of s444426/AIProjekt into master

This commit is contained in:
Jakub Adamski 2020-06-09 09:35:32 +00:00 committed by Gogs
commit ca13578946
12 changed files with 129 additions and 4 deletions

3
.gitignore vendored
View File

@ -6,3 +6,6 @@ __pycache__/
#macOS #macOS
.DS_Store .DS_Store
#uczenie
dataset/

View File

@ -2,6 +2,7 @@
## Spis treści ## Spis treści
* [Uruchomienie](#uruchomienie) * [Uruchomienie](#uruchomienie)
* [Wykrywanie roślin](#wykrywanie-roślin)
* [Raport 1](#raport-1) * [Raport 1](#raport-1)
* [Notatki](#notatki) * [Notatki](#notatki)
@ -14,6 +15,11 @@ Wymagania:
Wpisanie komendy w glownym folderze: <br> `python3 main.py` Wpisanie komendy w glownym folderze: <br> `python3 main.py`
## Wykrywanie roślin
Podprojekt na osobnym branchu - kuba. Raport - adamski_raport.md
## Raport 1 ## Raport 1
### Środowisko agenta ### Środowisko agenta

39
adamski_raport.md Normal file
View File

@ -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. <br>
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. <br>
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/. <br>
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) <br>
![dzialanie](ss/adamski1.png)
## Uruchomienie
Instalacja tensorflow <br>
Byl error z jakas biblioteka, trzeba zainstalować nomkl lub rozwiazanie ad hoc to komenda która pokazuje się przy błędzie. <code>os.environ['KMP_DUPLICATE_LIB_OK']='True'</code>
https://docs.anaconda.com/mkl-optimizations/
## Notatki
Lista obiektów:
- pumpkin/dynia
- cabbage/kapusta
- mushroom/grzyb
- cauliflower/kalafior

BIN
imgs/cabbage.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
imgs/cauliflower.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
imgs/mushroom.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
imgs/pumpkin.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

45
main.py
View File

@ -2,11 +2,20 @@ import pygame, sys
from traktor import Traktor from traktor import Traktor
import dijkstra as di 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): class Game(object):
def __init__(self): def __init__(self):
#to da sie chyba zrobic lepiej
#lokalizacje odpowiednich punktow na planszy #lokalizacje odpowiednich punktow na planszy
lokalizacje = [[0,0], lokalizacje = [[0,0],
[100, 0], [100, 0],
@ -34,6 +43,15 @@ class Game(object):
[300, 400], [300, 400],
[400, 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 #inicjalizacja
pygame.init() pygame.init()
self.pole = pygame.display.set_mode((501,501)) self.pole = pygame.display.set_mode((501,501))
@ -46,8 +64,9 @@ class Game(object):
else: else:
sterowanie = False sterowanie = False
#iohiu;i;gou;ihpiu
while True: while True:
run_classifier = False
#obsługa zdarzń #obsługa zdarzń
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
@ -72,6 +91,12 @@ class Game(object):
self.player.x -= 100 self.player.x -= 100
if self.player.x < 0: if self.player.x < 0:
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: else:
#po spacji wpisujemy punkty #po spacji wpisujemy punkty
if event.type == pygame.KEYDOWN : if event.type == pygame.KEYDOWN :
@ -91,6 +116,7 @@ class Game(object):
self.player.x = lokalizacje[pt][0] self.player.x = lokalizacje[pt][0]
self.player.y = lokalizacje[pt][1] self.player.y = lokalizacje[pt][1]
self.player.punkt = pt self.player.punkt = pt
run_classifier = True
pygame.display.update() pygame.display.update()
@ -101,6 +127,21 @@ class Game(object):
self.rysowanie() self.rysowanie()
pygame.display.flip() 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): def krata(self):
#wymiary #wymiary

BIN
moj_model.h5 Normal file

Binary file not shown.

36
net_training.py Normal file
View File

@ -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')

BIN
ss/adamski1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
ss/adamski2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB