3.8 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/dane
Jako dane posłużą nam zgromadzone zdjęcia dojrzałych warzyw. Do trenowania wykorzystujemy 20 zdjęć, a do testów pozostałe 10.
Przebieg
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.
Mając zdjęcie rozmiarów 28x28 pikseli, gdybyśmy analizowali każdy piksel - otrzymamy matrycę o wymiarach 28x28. Nie jest ona wygodna do pracy, dlatego w pierwszej warstwie korzystamy z Flatten, aby "spłaszczyć" ją do listy długości 728.
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.