From edfdbc255f4608116261e05d2b1f7a94d44e86d7 Mon Sep 17 00:00:00 2001 From: Kamila Bobkowska Date: Thu, 7 May 2020 16:06:30 +0000 Subject: [PATCH] implementation for 2nd individual project --- models/Garbagetruck.py | 327 ++++++++++++++++++++++++++++------------- 1 file changed, 222 insertions(+), 105 deletions(-) diff --git a/models/Garbagetruck.py b/models/Garbagetruck.py index 6750311..9ce2d5b 100644 --- a/models/Garbagetruck.py +++ b/models/Garbagetruck.py @@ -1,105 +1,222 @@ -import pygame -import random -from models.dumpster import trash -class GarbageTruck(): - def __init__(self): - self.coor = [0,0] - self.capacity = 5 - self.plastic = 0 - self.paper = 0 - self.mixed = 0 - self.organic = 0 - self.glass = 0 - self.trash=trash() - self.dir = 'R' - self.picture=pygame.image.load('./images/truckR.png') - - def start(self): - self.coor = [random.randint(0,19),random.randint(0,19)] - return self.coor - - def amIFull(self): - #check id garbage truck full - if ( self.plastic==self.capacity and self.paper==self.capacity and - self.glass==self.capacity and self.mixed==self.capacity and - self.organic==self.capacity): - return True - #otherwise see if a category is full - elif self.plastic!=self.capacity: - return False - elif self.paper!=self.capacity: - return False - elif self.glass!=self.capacity: - return False - elif self.mixed!=self.capacity: - return False - elif self.organic!=self.capacity: - return False - - def move(self): - if(self.dir=="R"): - self.coor[0]+=1 - elif(self.dir=="L"): - self.coor[0]-=1 - elif(self.dir=="U"): - self.coor[1]-=1 - elif(self.dir=="D"): - self.coor[1]+=1 - - def turn(self,goal): - if(goal[0]-self.coor[0]==1): - self.dir='R' - self.picture = pygame.image.load('./images/truckR.png') - elif(goal[0]-self.coor[0]==-1): - self.dir='L' - self.picture = pygame.image.load('./images/truckL.png') - elif(goal[1]-self.coor[1]==-1): - self.dir='U' - self.picture = pygame.image.load('./images/truckU.png') - elif(goal[1]-self.coor[1]==1): - self.dir='D' - self.picture = pygame.image.load('./images/truckD.png') - return dir - - ''' #old move - def move(self, coor, moving, size): - if(moving == 0 and coor[0] > 0): - coor[0] = coor[0] - 1 - return(coor) - elif(moving == 1 and coor[1] > 0): - coor[1] = coor[1] - 1 - return(coor) - elif(moving == 2 and coor[0] < size - 1): - coor[0] = coor[0] + 1 - return(coor) - elif(moving == 3 and coor[1] < size - 1): - coor[1] = coor[1] + 1 - return(coor) - else: - return(coor)''' - - def collectingTrash(self, trash, id): - #1st if recognizes the dumpster kind - if trash[id].color==1: - #2nd if check if there is space in the garbage truck and if there is still trash - if self.plastic 0: - self.plastic+=1 - return True - elif trash[id].color==2: - if self.paper 0: - self.paper+=1 - return True - elif trash[id].color==3: - if self.glass 0: - self.glass+=1 - return True - elif trash[id].color==4: - if self.organic 0: - self.organic+=1 - return True - elif trash[id].color==5: - if self.mixed 0: - self.mixed+=1 - return True - else: - return False +import pygame +import random +from models.dumpster import trash + +#libraries used in the CNN part +import os +import numpy as np +import random +import shutil +from keras.models import Sequential +from keras.layers import Conv2D, Flatten, MaxPooling2D, Dense +from keras.preprocessing import image +from keras.preprocessing.image import ImageDataGenerator +import matplotlib.pyplot as plt + + +class GarbageTruck(): + def __init__(self): + self.coor = [0,0] + self.capacity = 5 + self.plastic = 0 + self.paper = 0 + self.metal = 0 + self.cardboard = 0 + self.glass = 0 + self.trash=trash() + self.dir = 'R' + self.picture=pygame.image.load('./images/truckR.png') + + def start(self): + self.coor = [random.randint(0,19),random.randint(0,19)] + return self.coor + + #check id garbage truck full + def amIFull(self): + if ( self.plastic==self.capacity and self.paper==self.capacity and + self.glass==self.capacity and self.metal==self.capacity and + self.cardboard==self.capacity): + print("DUMPSTER TRUCK FULL") + return False + else: + return True + + # used to move in A* + def move(self): + if(self.dir=="R"): + self.coor[0]+=1 + elif(self.dir=="L"): + self.coor[0]-=1 + elif(self.dir=="U"): + self.coor[1]-=1 + elif(self.dir=="D"): + self.coor[1]+=1 + + # used to move in A* + def turn(self,goal): + if(goal[0]-self.coor[0]==1): + self.dir='R' + self.picture = pygame.image.load('./images/truckR.png') + elif(goal[0]-self.coor[0]==-1): + self.dir='L' + self.picture = pygame.image.load('./images/truckL.png') + elif(goal[1]-self.coor[1]==-1): + self.dir='U' + self.picture = pygame.image.load('./images/truckU.png') + elif(goal[1]-self.coor[1]==1): + self.dir='D' + self.picture = pygame.image.load('./images/truckD.png') + return dir + + # main function for an attempt to collect garbage from a dumpster + def collectingTrash(self, trash, id): + if self.amIFull(): + inthedumpster = self.check(trash, id) + self.takingTrash(trash, id, inthedumpster) + + #trying to put a specific piece of trash if possible + def collect(self, trash, id, i): + if i == "plastic": + if self.plastic < self.capacity: + #print("Plastic put into garbage truck") + self.plastic+=1 + return True + else: + #print("No more space in garbage truck") + return False + + elif i == "paper": + if self.paper < self.capacity: + #print("Paper put into garbage truck") + self.paper+=1 + return True + else: + #print("No more space in garbage truck") + return False + + elif i == "glass": + if self.glass < self.capacity: + #print("Glass put into garbage truck") + self.glass+=1 + return True + else: + #print("No more space in garbage truck") + return False + + elif i == "cardboard": + if self.cardboard < self.capacity: + #print("Cardboard put into garbage truck") + self.cardboard+=1 + return True + else: + #print("No more space in garbage truck") + return False + + elif i == "metal": + if self.metal < self.capacity: + #print("Metal put into garbage truck") + self.metal+=1 + return True + else: + #print("No more space in garbage truck") + return False + else: + return False + + def cap(self): + print("In garbage truck:") + print("- Plastic:", self.plastic) + print("- Paper:", self.paper) + print("- Glass:", self.glass) + print("- Cardboard:", self.cardboard) + print("- Metal:", self.metal) + + def takingTrash(self, trash, id, insides): + for i in insides: + if trash[id].kind == i: + #print("This ", i," was correctly sorted") + if self.collect(trash, id, i): + trash[id].empty(i) + + else: + #print("This ", i , "shouldn't be here") + if self.collect(trash, id, i): + trash[id].empty(i) + self.cap() + return True + + def check(self, trash, id): + classifier = Sequential() + classifier.add(Conv2D(32, (3, 3), input_shape=(110, 110, 3), activation = "relu")) + classifier.add(MaxPooling2D(pool_size = (2, 2))) + classifier.add(Conv2D(64, (3, 3), activation = "relu")) + classifier.add(MaxPooling2D(pool_size=(2, 2))) + # this layer in ver 4 + classifier.add(Conv2D(32, (3, 3), activation = "relu")) + classifier.add(MaxPooling2D(pool_size=(2, 2))) + # ----------------- + classifier.add(Flatten()) + classifier.add(Dense(activation = "relu", units = 64 )) + classifier.add(Dense(activation = "softmax", units = 5)) + classifier.compile(optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"]) + + + train_datagen = ImageDataGenerator( + rescale=1./255, + shear_range=0.1, + zoom_range=0.1, + width_shift_range=0.1, + height_shift_range=0.1, + horizontal_flip=True, + vertical_flip=True, + ) + + test_datagen = ImageDataGenerator( + rescale=1./255, + validation_split=0.1 + ) + + train_generator = train_datagen.flow_from_directory( + "Garbage classification\\trainset", + target_size=(110, 110), + batch_size=16, + class_mode='categorical', + #seed=0 + ) + + test_generator = test_datagen.flow_from_directory( + "Garbage classification\\testset", + target_size=(110, 110), + batch_size=16, + class_mode='categorical', + ) + + labels = (train_generator.class_indices) + labels = dict((v,k) for k,v in labels.items()) + test_x, test_y = test_generator.__getitem__(1) + + whatarewe = [] + classifier.load_weights("model_ver_4.h5") + ''' #optional for displaying the trash and what the CNN decided it is + z=1 + ''' + for i in trash[id].trash: + gz = image.load_img(i, target_size = (110,110)) + ti = image.img_to_array(gz) + ti=np.array(ti)/255.0 + ti = np.expand_dims(ti, axis = 0) + prediction = classifier.predict(ti) + whatarewe.append(labels[np.argmax(prediction)]) + ''' #optional for displaying the trash and what the CNN decided it is + ax = plt.subplot(1, len(trash[id].trash), z) + z+=1 + plt.imshow(gz) + ax.set_xticks([]) + ax.set_yticks([]) + plt.title("AI thinks:\n %s" % (labels[np.argmax(prediction)])) + plt.suptitle("dumpster kind: %s" %(trash[id].kind) ) + plt.show(block=False) + plt.pause(3) + plt.close() + ''' + return whatarewe