diff --git a/machine_learning/photos_not_from_train_set/14.jpg b/machine_learning/photos_not_from_train_set/14.jpg new file mode 100644 index 0000000..2e5addd Binary files /dev/null and b/machine_learning/photos_not_from_train_set/14.jpg differ diff --git a/machine_learning/photos_not_from_train_set/15.jpg b/machine_learning/photos_not_from_train_set/15.jpg index 2e5addd..7932e36 100644 Binary files a/machine_learning/photos_not_from_train_set/15.jpg and b/machine_learning/photos_not_from_train_set/15.jpg differ diff --git a/machine_learning/photos_not_from_train_set/16.jpg b/machine_learning/photos_not_from_train_set/16.jpg index 7932e36..ed7479e 100644 Binary files a/machine_learning/photos_not_from_train_set/16.jpg and b/machine_learning/photos_not_from_train_set/16.jpg differ diff --git a/machine_learning/photos_not_from_train_set/17.jpg b/machine_learning/photos_not_from_train_set/17.jpg index ed7479e..6d169e5 100644 Binary files a/machine_learning/photos_not_from_train_set/17.jpg and b/machine_learning/photos_not_from_train_set/17.jpg differ diff --git a/machine_learning/photos_not_from_train_set/18.jpg b/machine_learning/photos_not_from_train_set/18.jpg index 6d169e5..86e73d1 100644 Binary files a/machine_learning/photos_not_from_train_set/18.jpg and b/machine_learning/photos_not_from_train_set/18.jpg differ diff --git a/machine_learning/photos_not_from_train_set/19.jpg b/machine_learning/photos_not_from_train_set/19.jpg index 86e73d1..4bb75af 100644 Binary files a/machine_learning/photos_not_from_train_set/19.jpg and b/machine_learning/photos_not_from_train_set/19.jpg differ diff --git a/machine_learning/photos_not_from_train_set/20.jpg b/machine_learning/photos_not_from_train_set/20.jpg index 4bb75af..868cb9c 100644 Binary files a/machine_learning/photos_not_from_train_set/20.jpg and b/machine_learning/photos_not_from_train_set/20.jpg differ diff --git a/machine_learning/photos_not_from_train_set/21.jpg b/machine_learning/photos_not_from_train_set/21.jpg index 868cb9c..249a027 100644 Binary files a/machine_learning/photos_not_from_train_set/21.jpg and b/machine_learning/photos_not_from_train_set/21.jpg differ diff --git a/machine_learning/photos_not_from_train_set/7.jpg b/machine_learning/photos_not_from_train_set/7.jpg new file mode 100644 index 0000000..e09c474 Binary files /dev/null and b/machine_learning/photos_not_from_train_set/7.jpg differ diff --git a/movement.py b/movement.py index e726f90..27aee02 100644 --- a/movement.py +++ b/movement.py @@ -2,7 +2,7 @@ import joblib from sklearn.calibration import LabelEncoder from agentActionType import AgentActionType import time -from garbage import GarbageType, RecognizedGarbage +from garbage import Garbage, GarbageType, RecognizedGarbage from garbageCan import GarbageCan from turnCar import turn_left_orientation, turn_right_orientation from garbageTruck import GarbageTruck @@ -14,6 +14,12 @@ import pygame from bfs import find_path_to_nearest_can from agentState import AgentState +import tensorflow as tf +from keras.models import load_model +import keras.utils as image +from keras.optimizers import Adam +import numpy as np + def collect_garbage(game_context: GameContext) -> None: while True: @@ -30,11 +36,12 @@ def collect_garbage(game_context: GameContext) -> None: pass def _recognize_garbage(dust_car: GarbageTruck, can: GarbageCan) -> None: - loaded_model = joblib.load('machine_learning/model.pkl') + tree_model = joblib.load('machine_learning/model.pkl') + optimizer = Adam(learning_rate=0.001) + neural_model = load_model('machine_learning/neuralModel.h5', compile=False) + neural_model.compile(optimizer=optimizer) for garbage in can.garbage: - attributes = [garbage.shape, garbage.flexibility, garbage.does_smell, garbage.weight, garbage.size, garbage.color, garbage.softness, garbage.does_din] - encoded = attributes_to_floats(attributes) - predicted_class = loaded_model.predict([encoded])[0] + predicted_class = predict_class(garbage, tree_model, neural_model) garbage_type: GarbageType = None if predicted_class == 'PAPER': garbage_type = GarbageType.PAPER @@ -50,6 +57,35 @@ def _recognize_garbage(dust_car: GarbageTruck, can: GarbageCan) -> None: recognized_garbage = RecognizedGarbage(garbage, garbage_type) dust_car.sort_garbage(recognized_garbage) +def predict_class(garbage: Garbage, tree_model, neural_model) -> str: + if garbage.img is None: + return predict_class_from_tree(garbage, tree_model) + return predict_class_from_neural_model(garbage, neural_model) + +def predict_class_from_tree(garbage: Garbage, tree_model) -> str: + attributes = [garbage.shape, garbage.flexibility, garbage.does_smell, garbage.weight, garbage.size, garbage.color, garbage.softness, garbage.does_din] + encoded = attributes_to_floats(attributes) + return tree_model.predict([encoded])[0] + +def predict_class_from_neural_model(garbage: Garbage, neural_model) -> str: + img = image.load_img(garbage.img, target_size=(150, 150)) + img_array = image.img_to_array(img) + img_array = np.expand_dims(img_array, axis=0) + img_array /= 255. + + predictions = neural_model.predict(img_array) + prediction = np.argmax(predictions[0]) + if prediction == 0: + return "BIO" + if prediction == 1: + return "GLASS" + if prediction == 2: + return "MIXED" + if prediction == 3: + return "PAPER" + if prediction == 4: + return "PLASTIC_AND_METAL" + def attributes_to_floats(attributes: list[str]) -> list[float]: output: list[float] = [] if attributes[0] == 'Longitiudonal': diff --git a/startup.py b/startup.py index 6cc7222..25f1cee 100644 --- a/startup.py +++ b/startup.py @@ -36,12 +36,19 @@ def create_city() -> City: streets = create_streets() trashcans = create_trashcans() bumps = create_speed_bumps() - garbage_pieces = create_garbage_pieces() + garbage_pieces = create_garbage_pieces_witout_imgs() garbage_pieces_counter = 0 for s in streets: city.add_street(s) for t in trashcans: - for i in range(4): + for _ in range(4): + t.add_garbage(garbage_pieces[garbage_pieces_counter]) + garbage_pieces_counter = garbage_pieces_counter + 1 + city.add_can(t) + garbage_pieces = create_garbage_pieces_with_images() + garbage_pieces_counter = 0 + for t in trashcans: + for _ in range(3): t.add_garbage(garbage_pieces[garbage_pieces_counter]) garbage_pieces_counter = garbage_pieces_counter + 1 city.add_can(t) @@ -50,16 +57,21 @@ def create_city() -> City: return city -def create_garbage_pieces() -> List[Garbage]: +def create_garbage_pieces_witout_imgs() -> List[Garbage]: garbage_pieces = [] with open('machine_learning/garbage_infill.csv', 'r') as file: lines = file.readlines() for line in lines[1:]: param = line.strip().split(',') garbage_pieces.append( - Garbage('img', param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7].strip())) + Garbage(None, param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7].strip())) return garbage_pieces +def create_garbage_pieces_with_images() -> list[Garbage]: + garbage_pieces = [] + for i in range(1, 22): + garbage_pieces.append(Garbage('machine_learning/photos_not_from_train_set/' + str(i) + '.jpg', None, None, None, None, None, None, None, None)) + return garbage_pieces def create_streets() -> List[Street]: streets = []