SzIProjekt/Jonas-neural-network.md

2.9 KiB

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

Przebieg


Uczenie modelu przebiega w pliku net_trainign.py. Korzystam z architektury MobileNetV2.

Wpierw tworzę bazę modelu - importuję model MobileNet2 i "odrzucam" 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.