Merge pull request 'collecting_garbage' (#32) from collecting_garbage into master

Reviewed-on: #32
This commit is contained in:
Paweł Felcyn 2023-06-03 14:43:15 +02:00
commit b997927e5d
7 changed files with 162 additions and 28 deletions

View File

@ -32,9 +32,10 @@ class Garbage:
self.does_din = does_din
class RecognizedGarbage(Garbage):
class RecognizedGarbage:
garbage_type: GarbageType
src: Garbage
def __init__(self, src: Garbage, garbage_type: GarbageType) -> None:
super().__init__(src.img)
self.garbage_type = garbage_type
self.src = src

View File

@ -1,6 +1,6 @@
from typing import List, Tuple
from agentOrientation import AgentOrientation
from garbage import RecognizedGarbage
from garbage import GarbageType, RecognizedGarbage
from gameContext import GameContext
class GarbageTruck:
@ -22,19 +22,19 @@ class GarbageTruck:
def sort_garbage(self, RecognizedGarbage) -> None:
if RecognizedGarbage.garbage_type == 0:
if RecognizedGarbage.garbage_type == GarbageType.PAPER:
self.paper.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == 1:
elif RecognizedGarbage.garbage_type == GarbageType.PLASTIC_AND_METAL:
self.plastic_and_metal.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == 3:
elif RecognizedGarbage.garbage_type == GarbageType.GLASS:
self.glass.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == 4:
elif RecognizedGarbage.garbage_type == GarbageType.BIO:
self.bio.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == 5:
elif RecognizedGarbage.garbage_type == GarbageType.MIXED:
self.mixed.append(RecognizedGarbage)
def render(self, game_context: GameContext) -> None:

View File

@ -18,32 +18,78 @@ def _read_training_data() -> TrainingData:
line_attributes = values[:-1]
line_class = values[-1]
attributes.append(line_attributes)
classes.append(line_class)
classes.append(line_class.strip())
return TrainingData(attributes, classes)
def _attributes_to_floats(attributes: list[str]) -> list[float]:
output: list[float] = []
if attributes[0] == 'Longitiudonal':
output.append(0)
elif attributes[0] == 'Round':
output.append(1)
elif attributes[0] == 'Flat':
output.append(2)
elif attributes[0] == 'Irregular':
output.append(3)
if attributes[1] == 'Low':
output.append(0)
elif attributes[1] == 'Medium':
output.append(1)
elif attributes[1] == 'High':
output.append(2)
if attributes[2] == "Yes":
output.append(0)
else:
output.append(1)
if attributes[3] == 'Low':
output.append(0)
elif attributes[3] == 'Medium':
output.append(1)
elif attributes[3] == 'High':
output.append(2)
if attributes[4] == 'Low':
output.append(0)
elif attributes[4] == 'Medium':
output.append(1)
elif attributes[4] == 'High':
output.append(2)
if attributes[5] == 'Transparent':
output.append(0)
elif attributes[5] == 'Light':
output.append(1)
elif attributes[5] == 'Dark':
output.append(2)
elif attributes[5] == "Colorful":
output.append(3)
if attributes[6] == 'Low':
output.append(0)
elif attributes[6] == 'Medium':
output.append(1)
elif attributes[6] == 'High':
output.append(2)
if attributes[7] == "Yes":
output.append(0)
else:
output.append(1)
return output
trainning_data = _read_training_data()
X = trainning_data.attributes
Y = trainning_data.classes
le_shape = LabelEncoder()
le_flexibility = LabelEncoder()
le_color = LabelEncoder()
le_shape.fit([x[0] for x in X])
le_flexibility.fit([x[3] for x in X])
le_color.fit([x[4] for x in X])
X_encoded = np.array([
[le_shape.transform([x[0]])[0], x[1], x[2], le_flexibility.transform([x[3]])[0], le_color.transform([x[4]])[0]]
for x in X
])
encoder = OneHotEncoder(categories='auto', sparse=False)
X_encoded = encoder.fit_transform(X_encoded)
model = tree.DecisionTreeClassifier()
model.fit(X_encoded, Y)
encoded = [_attributes_to_floats(x) for x in X]
dtc = model.fit(encoded, Y)
joblib.dump(model, 'model.pkl')

Binary file not shown.

BIN
model.pkl

Binary file not shown.

View File

@ -1,5 +1,9 @@
import joblib
from sklearn.calibration import LabelEncoder
from agentActionType import AgentActionType
import time
from garbage import GarbageType, RecognizedGarbage
from garbageCan import GarbageCan
from turnCar import turn_left_orientation, turn_right_orientation
from garbageTruck import GarbageTruck
from typing import Tuple, Dict
@ -20,9 +24,92 @@ def collect_garbage(game_context: GameContext) -> None:
move_dust_car(path, game_context)
next_position = calculate_next_position(game_context.dust_car)
game_context.grid[next_position] = GridCellType.VISITED_GARBAGE_CAN
game_context.city.cans_dict[next_position].is_visited = True
can = game_context.city.cans_dict[next_position]
can.is_visited = True
_recognize_garbage(game_context.dust_car, can)
pass
def _recognize_garbage(dust_car: GarbageTruck, can: GarbageCan) -> None:
loaded_model = joblib.load('machine_learning/model.pkl')
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]
garbage_type: GarbageType = None
if predicted_class == 'PAPER':
garbage_type = GarbageType.PAPER
elif predicted_class == 'PLASTIC_AND_METAL':
garbage_type = GarbageType.PLASTIC_AND_METAL
elif garbage_type == 'GLASS':
garbage_type = GarbageType.GLASS
elif predicted_class == 'BIO' :
garbage_type = GarbageType.BIO
elif predicted_class == 'MIXED':
garbage_type = GarbageType.MIXED
print(predicted_class)
recognized_garbage = RecognizedGarbage(garbage, garbage_type)
dust_car.sort_garbage(recognized_garbage)
def attributes_to_floats(attributes: list[str]) -> list[float]:
output: list[float] = []
if attributes[0] == 'Longitiudonal':
output.append(0)
elif attributes[0] == 'Round':
output.append(1)
elif attributes[0] == 'Flat':
output.append(2)
elif attributes[0] == 'Irregular':
output.append(3)
if attributes[1] == 'Low':
output.append(0)
elif attributes[1] == 'Medium':
output.append(1)
elif attributes[1] == 'High':
output.append(2)
if attributes[2] == "Yes":
output.append(0)
else:
output.append(1)
if attributes[3] == 'Low':
output.append(0)
elif attributes[3] == 'Medium':
output.append(1)
elif attributes[3] == 'High':
output.append(2)
if attributes[4] == 'Low':
output.append(0)
elif attributes[4] == 'Medium':
output.append(1)
elif attributes[4] == 'High':
output.append(2)
if attributes[5] == 'Transparent':
output.append(0)
elif attributes[5] == 'Light':
output.append(1)
elif attributes[5] == 'Dark':
output.append(2)
elif attributes[5] == "Colorful":
output.append(3)
if attributes[6] == 'Low':
output.append(0)
elif attributes[6] == 'Medium':
output.append(1)
elif attributes[6] == 'High':
output.append(2)
if attributes[7] == "Yes":
output.append(0)
else:
output.append(1)
return output
def move_dust_car(actions: list[AgentActionType], game_context: GameContext) -> None:
for action in actions:

View File

@ -57,7 +57,7 @@ def create_garbage_pieces() -> List[Garbage]:
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]))
Garbage('img', param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7].strip()))
return garbage_pieces