Compare commits

..

No commits in common. "0f92ffd53f3c425d83bd4c6097c055aadbd5d7a1" and "43bfb278d09382b081f7de5b2039702b9774a345" have entirely different histories.

17 changed files with 49 additions and 137 deletions

View File

@ -7,7 +7,6 @@ import matplotlib.pyplot as plt
from NN.model import * from NN.model import *
from PIL import Image from PIL import Image
import pygame import pygame
from area.constants import GREY
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
@ -85,22 +84,16 @@ def load_image(image_path):
testImage = testImage.unsqueeze(0) testImage = testImage.unsqueeze(0)
return testImage return testImage
#display the image for prediction next to the field
def display_image(screen, image_path, position): def display_image(screen, image_path, position):
image = pygame.image.load(image_path) image = pygame.image.load(image_path)
image = pygame.transform.scale(image, (250, 250)) image = pygame.transform.scale(image, (250, 250))
screen.blit(image, position) screen.blit(image, position)
#display result of the guessed image (text under the image)
def display_result(screen, position, predicted_class): def display_result(screen, position, predicted_class):
font = pygame.font.Font(None, 30) font = pygame.font.Font(None, 30)
displayed_text = font.render("The predicted image is: "+str(predicted_class), 1, (255,255,255)) displayed_text = font.render("The predicted image is: "+str(predicted_class), 1, (255,255,255))
screen.blit(displayed_text, position) screen.blit(displayed_text, position)
def clear_text_area(win, x, y, width, height, color=GREY):
pygame.draw.rect(win, color, (x, y, width, height))
pygame.display.update()
def guess_image(model, image_tensor): def guess_image(model, image_tensor):
with torch.no_grad(): with torch.no_grad():
testOutput = model(image_tensor) testOutput = model(image_tensor)

View File

@ -1,6 +1,5 @@
from NN.neural_network import clear_text_area
from crop_protection_product import CropProtectionProduct from crop_protection_product import CropProtectionProduct
from area.constants import TILE_SIZE, DIRECTION_EAST, DIRECTION_SOUTH, DIRECTION_WEST, DIRECTION_NORTH, WIDTH from area.constants import TILE_SIZE, DIRECTION_EAST, DIRECTION_SOUTH, DIRECTION_WEST, DIRECTION_NORTH
from area.field import fieldX, fieldY, tiles from area.field import fieldX, fieldY, tiles
import pygame import pygame
import time import time
@ -39,19 +38,16 @@ class Tractor:
self.image = pygame.image.load('resources/images/tractor_left.png').convert_alpha() self.image = pygame.image.load('resources/images/tractor_left.png').convert_alpha()
def work_on_field(self, screen, tile, ground, plant1): def work_on_field(self, tile, ground, plant1):
results = []
if plant1 is None: if plant1 is None:
tile.randomizeContent() tile.randomizeContent()
# sprobuj zasadzic cos # sprobuj zasadzic cos
print("Tarctor planted something") print("Tarctor planted something")
results.append("Tarctor planted something")
elif plant1.growth_level == 100: elif plant1.growth_level == 100:
tile.plant = None tile.plant = None
ground.nutrients_level -= 40 ground.nutrients_level -= 40
ground.water_level -= 40 ground.water_level -= 40
print("Tractor collected something") print("Tractor collected something")
results.append("Tractor collected something")
else: else:
plant1.try_to_grow(50,50) #mozna dostosowac jeszcze plant1.try_to_grow(50,50) #mozna dostosowac jeszcze
ground.nutrients_level -= 11 ground.nutrients_level -= 11
@ -65,7 +61,6 @@ class Tractor:
elif plant1.plant_type == self.spinosad.plant_type: elif plant1.plant_type == self.spinosad.plant_type:
t = "Tractor used Spinosad" t = "Tractor used Spinosad"
print(t) print(t)
results.append(t)
ground.pest = False ground.pest = False
if ground.weed: if ground.weed:
# traktor pozbywa się chwastow # traktor pozbywa się chwastow
@ -76,21 +71,13 @@ class Tractor:
elif plant1.plant_type == self.metazachlor.plant_type: elif plant1.plant_type == self.metazachlor.plant_type:
t = "Tractor used Metazachlor" t = "Tractor used Metazachlor"
print(t) print(t)
results.append(t)
ground.weed = False ground.weed = False
if ground.water_level < plant1.water_requirements: if ground.water_level < plant1.water_requirements:
ground.water_level += 20 ground.water_level += 20
print("Tractor watered the plant") print("Tractor watered the plant")
results.append("Tractor watered the plant")
if ground.nutrients_level < plant1.nutrients_requirements: if ground.nutrients_level < plant1.nutrients_requirements:
ground.nutrients_level += 20 ground.nutrients_level += 20
print("Tractor added some nutrients") print("Tractor added some nutrients")
results.append("Tractor added some nutrients")
clear_text_area(screen, WIDTH-90, 100, 400, 100)
for idx, result in enumerate(results):
display_work_results(screen, result, (WIDTH-90, 100 + idx * 30))
@ -169,13 +156,6 @@ def do_actions(tractor, WIN, move_list):
tractor.rotate_to_left() tractor.rotate_to_left()
tractor.draw_tractor(WIN) tractor.draw_tractor(WIN)
pygame.display.update() pygame.display.update()
time.sleep(0.5) time.sleep(1)
#displays results of the "work_on_field" function next to the field:
def display_work_results(screen, text, position):
font = pygame.font.Font(None, 30)
displayed_text = font.render(text, 1, (255,255,255))
screen.blit(displayed_text, position)
pygame.display.update()

View File

@ -5,14 +5,14 @@ import pandas as pd
import joblib import joblib
from area.constants import WIDTH, HEIGHT, TILE_SIZE from area.constants import WIDTH, HEIGHT, TILE_SIZE
from area.field import drawWindow from area.field import drawWindow
from area.tractor import Tractor, do_actions, display_work_results from area.tractor import Tractor, do_actions
from area.field import tiles, fieldX, fieldY from area.field import tiles, fieldX, fieldY
from area.field import get_tile_coordinates, get_tile_index from area.field import get_tile_coordinates, get_tile_index
from ground import Dirt from ground import Dirt
from plant import Plant from plant import Plant
from bfs import graphsearch, Istate, succ from bfs import graphsearch, Istate, succ
from astar import a_star from astar import a_star
from NN.neural_network import load_model, load_image, guess_image, display_image, display_result, clear_text_area from NN.neural_network import load_model, load_image, guess_image, display_image, display_result
from PIL import Image from PIL import Image
from genetic import genetic_algorithm from genetic import genetic_algorithm
@ -30,25 +30,7 @@ def main():
window = drawWindow(WIN) window = drawWindow(WIN)
pygame.display.update() pygame.display.update()
#getting coordinates of our "goal tile":
#Tractor initialization:
tractor = Tractor(0*TILE_SIZE, 0*TILE_SIZE, 2, None, None)
tractor.rect.x += fieldX
tractor.rect.y += fieldY
tractor.tractor_start = ((170, 100))
istate = Istate(170, 100, 2) #initial state
#main loop:
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
time.sleep(1)
#getting coordinates of our "goal tile":
tile_index = get_tile_index() tile_index = get_tile_index()
tile_x, tile_y = get_tile_coordinates(tile_index) tile_x, tile_y = get_tile_coordinates(tile_index)
if tile_x is not None and tile_y is not None: if tile_x is not None and tile_y is not None:
@ -63,20 +45,34 @@ def main():
pygame.display.flip() pygame.display.flip()
tractor.tractor_end = ((tile_x, tile_y)) #graphsearch activation:
goaltest = [] #final state (consists of x and y because direction doesnt matter) istate = Istate(170, 100, 2) #initial state
goaltest.append(tile_x)
goaltest.append(tile_y)
goaltest[0] = tile_x
goaltest[1]=tile_y
#moves = (graphsearch(istate, succ, goaltest, tractor)) #<-------BFS goaltest = []
goaltest.append(tile_x) #final state (consists of x and y because direction doesnt matter)
goaltest.append(tile_y)
tractor = Tractor(0*TILE_SIZE, 0*TILE_SIZE, 2, None, None)
tractor.rect.x += fieldX
tractor.rect.y += fieldY
tractor.tractor_start = ((istate.get_x(), istate.get_y()))
#tractor.tractor_start = ((istate.get_x(), istate.get_y(), istate.get_direction))
tractor.tractor_end = ((goaltest[0], goaltest[1]))
#moves = (graphsearch(istate, succ, goaltest, tractor))
moves = (a_star(istate, succ, goaltest, tractor)) moves = (a_star(istate, succ, goaltest, tractor))
print(moves) print(moves)
# movement based on route-planning: #main loop:
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
time.sleep(1)
# movement based on route-planning (test):
tractor.draw_tractor(WIN) tractor.draw_tractor(WIN)
time.sleep(1) time.sleep(1)
@ -93,7 +89,6 @@ def main():
image_tensor = load_image(image_path) image_tensor = load_image(image_path)
prediction = guess_image(load_model(), image_tensor) prediction = guess_image(load_model(), image_tensor)
clear_text_area(WIN, WIDTH - 50, 600, 400, 50)
display_result(WIN, (WIDTH - 50 , 600), prediction) #display text under the photo display_result(WIN, (WIDTH - 50 , 600), prediction) #display text under the photo
pygame.display.update() pygame.display.update()
print(f"The predicted image is: {prediction}") print(f"The predicted image is: {prediction}")
@ -107,8 +102,7 @@ def main():
#getting the name and type of the recognized plant: #getting the name and type of the recognized plant:
p1.update_name(prediction) p1.update_name(prediction)
#decission tree test:
#decission tree test:
if d1.pest: if d1.pest:
pe = 1 pe = 1
else: else:
@ -137,71 +131,19 @@ def main():
t3 = True t3 = True
t4 = False t4 = False
weather_n = random.randint(1, 4)
if weather_n == 1:
h1 = True
h2 = False
h3 = False
h4 = False
else:
h1 = False
if weather_n == 2:
h2 = True
h3 = False
h4 = False
else:
h2 = False
if weather_n == 3:
h3 = True
h4 = False
else:
h3 = False
h4 = True
season_n = random.randint(1,4)
if season_n == 1:
s1 = True
s2 = False
s3 = False
s4 = False
temp_n = random.randint(0,22)
else:
s1 = False
if season_n == 2:
s2 = True
s3 = False
s4 = False
temp_n = random.randint(0,22)
else:
s2 = False
if season_n == 3:
s3 = True
s4 = False
temp_n = random.randint(20,39)
else:
s3 = False
s4 = True
temp_n = random.randint(-20, 10)
anomaly_n = random.randint(1, 10)
if anomaly_n == 1:
a1 = True
else:
a1 = False
dane = { dane = {
'anomalies': [a1], 'anomalies': [True],
'temp': [temp_n], 'temp': [17],
'water': [d1.water_level], 'water': [d1.water_level],
'nutri': [d1.nutrients_level], 'nutri': [d1.nutrients_level],
'pests': [pe], 'pests': [pe],
'weeds': [we], 'weeds': [we],
'ripeness': [p1.growth_level], 'ripeness': [p1.growth_level],
'season_autumn': [s1], 'season_spring': [s2], 'season_summer': [s3], 'season_winter': [s4], 'season_autumn': [True], 'season_spring': [False], 'season_summer': [False], 'season_winter': [False],
'weather_heavyCloudy': [h1], 'weather_partCloudy': [h2], 'weather_precipitation': [h3], 'weather_heavyCloudy': [False], 'weather_partCloudy': [False], 'weather_precipitation': [False],
'weather_sunny': [h4], 'weather_sunny': [True],
'type_cereal': [t1], 'type_fruit': [t2], 'type_none': [t3], 'type_vegetable': [t4] 'type_cereal': [t1], 'type_fruit': [t2], 'type_none': [t3], 'type_vegetable': [t4]
} }
df = pd.DataFrame(dane) df = pd.DataFrame(dane)
df.to_csv('model_data.csv', index=False) df.to_csv('model_data.csv', index=False)
@ -212,11 +154,8 @@ def main():
#work on field: #work on field:
if predykcje == 'work': if predykcje == 'work':
tractor.work_on_field(WIN, goalTile, d1, p1) tractor.work_on_field(goalTile, d1, p1)
time.sleep(50)
#update the initial state for the next target:
istate = Istate(tile_x, tile_y, tractor.direction)
time.sleep(2)
print("\n") print("\n")