Merge branch 'kuba' of s444426/AIProjekt into master
This commit is contained in:
commit
ca13578946
3
.gitignore
vendored
3
.gitignore
vendored
@ -6,3 +6,6 @@ __pycache__/
|
||||
|
||||
#macOS
|
||||
.DS_Store
|
||||
|
||||
#uczenie
|
||||
dataset/
|
@ -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: <br> `python3 main.py`
|
||||
|
||||
|
||||
## Wykrywanie roślin
|
||||
Podprojekt na osobnym branchu - kuba. Raport - adamski_raport.md
|
||||
|
||||
|
||||
## Raport 1
|
||||
|
||||
### Środowisko agenta
|
||||
|
39
adamski_raport.md
Normal file
39
adamski_raport.md
Normal 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
BIN
imgs/cabbage.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 120 KiB |
BIN
imgs/cauliflower.jpg
Normal file
BIN
imgs/cauliflower.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 MiB |
BIN
imgs/mushroom.jpg
Normal file
BIN
imgs/mushroom.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
BIN
imgs/pumpkin.jpg
Normal file
BIN
imgs/pumpkin.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
45
main.py
45
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()
|
||||
@ -101,6 +127,21 @@ class Game(object):
|
||||
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
|
||||
|
BIN
moj_model.h5
Normal file
BIN
moj_model.h5
Normal file
Binary file not shown.
36
net_training.py
Normal file
36
net_training.py
Normal 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
BIN
ss/adamski1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
BIN
ss/adamski2.png
Normal file
BIN
ss/adamski2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 204 KiB |
Loading…
Reference in New Issue
Block a user