podprojekt-kuba

This commit is contained in:
Jakub Adamski 2020-05-12 18:25:47 +02:00
parent fa7f01244f
commit 8b7aac315e
8 changed files with 92 additions and 3 deletions

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

42
adamski_raport.md Normal file
View File

@ -0,0 +1,42 @@
## Podprojekt Jakub Adamski
Wykrywanie rodzaju rośliny w danym polu, na 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 duzej ilosci neuronow, 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. <br>
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.
## 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
W finalnej wersji łączącej wszytkie podprojekty mozna dodatkowo dołączyć walidację otrzymanego wyniku na podstawie nazwy zdjęcia. <br>
![ss]("./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 ok - spaghetti_squash
- cabbage/kapusta ok - head_cabbage
- mushchroom/grzyb ok - mushroom
- cauliflower/kalafior ok - cauliflower
- ziemniak NIE ROZPOZNAL
- marchewka NIE ROZPOZNAL

BIN
imgs/cabbage.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 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,19 @@ 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.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 +42,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 = MobileNetV2(input_shape=None, alpha=1.0, include_top=True, weights="imagenet", input_tensor=None, pooling=None, classes=1000)
#inicjalizacja #inicjalizacja
pygame.init() pygame.init()
self.pole = pygame.display.set_mode((501,501)) self.pole = pygame.display.set_mode((501,501))
@ -46,8 +63,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 +90,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 +115,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 +126,22 @@ 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)
decoded = decode_predictions(preds, top=1)
print(decoded)
plt.show()
def krata(self): def krata(self):
#wymiary #wymiary

BIN
ss/adamski1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 KiB