SzIProjekt/Jonas-neural-network.md

76 lines
2.9 KiB
Markdown
Raw Normal View History

2020-06-03 11:21:57 +02:00
# Sztuczna inteligencja - projekt zespołowy - Autonomiczny Traktor
autorzy: Aleksandra Werda, Natalia Wiśniewska, Kinga Jagodzińska, Aleksandra Jonas
2020-06-03 11:45:03 +02:00
## Podprojekt: rozpoznawanie warzyw przy użyciu sieci neuronowych
2020-06-03 11:21:57 +02:00
Korzystamy z dodatkowych modułów: ***tensorflow - keras***, ***numpy*** oraz ***matplotlib***.
2020-06-10 10:37:26 +02:00
### Zbiór uczący
Zbiór uczący składa się z 30 zdjęć dla każdego warzywa, które zgromadziłam przy pomocy wyszukiwarki.
[Zdjęcia/obrazy](https://drive.google.com/drive/folders/1K1kQuW9v7DpPivggSR5uHwH5jEVEjmmZ?usp=sharing)
2020-06-03 11:21:57 +02:00
2020-06-03 11:22:25 +02:00
## Przebieg
2020-06-03 11:21:57 +02:00
***
2020-06-10 10:37:26 +02:00
Uczenie modelu przebiega w pliku **net_trainign.py**. Korzystam z architektury MobileNetV2.
2020-06-03 11:21:57 +02:00
2020-06-10 10:37:26 +02:00
Wpierw tworzę bazę modelu - importuję model MobileNet2 i "odrzuam" ostatnie warstwy. Dzięki temu pierwsze warstwy wytrenowane zostaną na zb. danych **imagenet**, a pozostałe uczę sama.
2020-06-03 11:21:57 +02:00
```
2020-06-10 10:37:26 +02:00
podstawa_modelu = MobileNetV2(include_top=False, weights="imagenet", pooling='avg')
x = podstawa_modelu.output
preds = Dense(4, activation='softmax')(x)
model = Model(inputs=podstawa_modelu.input, outputs=preds)
2020-06-03 11:21:57 +02:00
```
2020-06-10 10:37:26 +02:00
Ostatnią warstwę zdefiniowałam z parametrem *activation=softmax* dla 4 klas - odpowiadają one wybranym przeze mnie warzywom. Funkcja **softmax** zapewnia, że wszystkie wartości w tej warstwie sumują się do 1.
2020-06-03 11:21:57 +02:00
```
2020-06-10 10:37:26 +02:00
preds = Dense(4, activation='softmax')(x)
2020-06-03 11:21:57 +02:00
```
2020-06-03 11:45:03 +02:00
2020-06-10 10:37:26 +02:00
Następnie uczę pozostałe warstwy.
2020-06-03 11:45:03 +02:00
2020-06-03 11:21:57 +02:00
```
2020-06-10 10:37:26 +02:00
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=20)
2020-06-03 11:21:57 +02:00
```
2020-06-10 10:37:26 +02:00
Wyuczony model zapisuję w pliku **neural_model.h5**.
2020-06-03 11:21:57 +02:00
2020-06-10 10:37:26 +02:00
Wykorzystuję go w pliku **main.py** w momencie wciśnięcia spacji na dowolnym polu. Czytam położenie agenta oraz przypisaną do tego pola etykietę, aby następnie ją rozpoznać. Na końcu wyświetlam największą wartość - przewidywane warzywo dla danego pola.
2020-06-03 11:21:57 +02:00
```
2020-06-10 10:37:26 +02:00
if event.key == pygame.K_SPACE:
obecne_polozenie_agenta = [self.player.x, self.player.y]
self.player.obecne_pole = punkty_pola.index(obecne_polozenie_agenta)
pt = self.player.obecne_pole
img_path = warzywa_etykiety[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)
2020-06-03 11:21:57 +02:00
2020-06-10 10:37:26 +02:00
preds = model.predict(x)
preds = np.asarray(preds)
szacunek = preds[preds < 1.0].max()
ind = np.where(preds == szacunek)
print(preds)
print(szacunek)
print(ind)
plt.show()
2020-06-03 11:21:57 +02:00
```
### 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.