SzIProjekt/Jonas-neural-network.md

85 lines
3.5 KiB
Markdown

# Sztuczna inteligencja - projekt zespołowy - Autonomiczny Traktor
autorzy: Aleksandra Werda, Natalia Wiśniewska, Kinga Jagodzińska, Aleksandra Jonas
## Podprojekt: rozpoznawanie warzyw przy użyciu sieci neutronowych
Korzystamy z dodatkowych modułów: ***tensorflow - keras***, ***numpy*** oraz ***matplotlib***.
### Zbiór uczący/dane
Jako dane posłużą nam zgromadzone zdjęcia dojrzałych warzyw. Do trenowania wykorzystujemy 20 zdjęć, a do testów pozostałe 10.
***
Rozpoczynamy od załadowania **dataset**, który zawiera zdjęcia warzyw. Nie chcemy uczyć się na wszystkich dostępnych zdjęciach, bo nie mamy pewności, że dany obraz nie został po prostu "zapamiętany". Dlatego uczymy się na części dostępnych zdjęć, a później przeprowadzamy testy na tych, które nie zostały wykorzystane do procesu uczenia.
```
data = "./dataset"
(train_images, train_labels), (test_images, test_labels) = data.load_data()
```
Każde zdjęcie ma przypisaną etykietę z przedziału 0-4, a więc tworzę listę definiującą co każda z nich reprezentuje.
```
class_names = ['pomidorek', 'rzodkiewa', 'papryka', 'salata', 'marchew']
```
Aby nie operować na dużych liczbach, dzielę wszystkie wartości przez 255.
```
train_images = train_images/255.0
test_images = test_images/255.0
```
Następnie kształtuję model definiując jego kolejne warstwy. Pierwsza warstwa jest warstwą *wejścia*.
Trzecia warstwa jest warstwą wyjścia, dlatego:
```
activation = "softmax"
```
co daje nam pewność, że dla wszystkich wyjściowych neuronów ich prawdopodobieństwa sumują się do 1 szacowane będą sumować się do 1.
```
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28,28)),
keras.layers.Dense(128, activation="relu"),
keras.layers.Dense(10, activation="softmax")
])
```
Trenujemy naszą sieć. Aby dostać lepsze rezultaty ustawiamy wartość **epochs=5**. To oznacza, że dany obraz zobaczymy 5 razy, aby kolejność w jakiej zdjęcia będą się pojawiać nie miała dużego wpływu.
```
model.fit(train_images, train_labels, epochs=5)
```
Chcemy sprawdzić jak nasza sieć sprawdzi się na zbiorze testowym - zdjęciach, które nie zostały użyte w procesie uczenia.
```
prediction = model.predict(test_images)
```
Następnie interpretujemy otrzymane wyniki przy pomocy funkcji *argmax*, która zwróci nam największe prawdopodobieństwo, a tym samym przewidywany wynik.
```
for i in range(5):
plt.grid(False)
plt.imshow(test_images[i], cmap=plt.cm.binary)
plt.xlabel("Actual:" + class_names[test_labels[i]])
plt.title("Prediction" + class_names[np.argmax(prediction[i])])
plt.show
```
##
Na potrzeby projektu sami sterujemy traktorem przy pomocy strzałek oraz spacji. Gdy po przejściu na kolejne pole, wciśniemy spację - zbadamy obraz, który prezentuje rosnące tam warzywo.
```
if event.key == pygame.K_SPACE:
pozycja = [self.player.x, self.player.y]
zdj = image.load_img(zdjecia[pozycja], target_size=(144, 144))
prediction = model.predict(zdj)
print(prediction)
```
### Wykorzystanie rozpoznawania warzyw do zbierania plonów
Na etapie integracji projektu względem podprojektów pozostałych członków zespołu, wykorzystamy nasze sieci neuronowe do zbierania dojrzałych warzyw.
Każde warzywo ma określony czas dojrzewania. Agent po zbadaniu jakie warzywo znajduje się na danym polu, będzie mógł sprawdzić ile czasu mu potrzeba, aby po tym czasie zebrać plony.
### [Zdjęcia/obrazy](https://drive.google.com/drive/folders/1K1kQuW9v7DpPivggSR5uHwH5jEVEjmmZ?usp=sharing)