76 lines
2.9 KiB
Markdown
76 lines
2.9 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 neuronowych
|
|
|
|
Korzystamy z dodatkowych modułów: ***tensorflow - keras***, ***numpy*** oraz ***matplotlib***.
|
|
|
|
### 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)
|
|
|
|
|
|
|
|
## Przebieg
|
|
***
|
|
Uczenie modelu przebiega w pliku **net_trainign.py**. Korzystam z architektury MobileNetV2.
|
|
|
|
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.
|
|
|
|
```
|
|
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)
|
|
```
|
|
|
|
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.
|
|
|
|
```
|
|
preds = Dense(4, activation='softmax')(x)
|
|
```
|
|
|
|
Następnie uczę pozostałe warstwy.
|
|
|
|
```
|
|
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)
|
|
|
|
```
|
|
|
|
Wyuczony model zapisuję w pliku **neural_model.h5**.
|
|
|
|
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.
|
|
|
|
```
|
|
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)
|
|
|
|
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()
|
|
|
|
```
|
|
|
|
### 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.
|
|
|