Compare commits

...

2 Commits

Author SHA1 Message Date
MarRac
0f92ffd53f improved decision tree implementation 2024-06-09 21:34:39 +02:00
MarRac
21681b7ef1 tractor moves in loop now 2024-06-09 16:37:41 +02:00
17 changed files with 137 additions and 49 deletions

View File

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

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,6 @@
from NN.neural_network import clear_text_area
from crop_protection_product import CropProtectionProduct
from area.constants import TILE_SIZE, DIRECTION_EAST, DIRECTION_SOUTH, DIRECTION_WEST, DIRECTION_NORTH
from area.constants import TILE_SIZE, DIRECTION_EAST, DIRECTION_SOUTH, DIRECTION_WEST, DIRECTION_NORTH, WIDTH
from area.field import fieldX, fieldY, tiles
import pygame
import time
@ -38,16 +39,19 @@ class Tractor:
self.image = pygame.image.load('resources/images/tractor_left.png').convert_alpha()
def work_on_field(self, tile, ground, plant1):
def work_on_field(self, screen, tile, ground, plant1):
results = []
if plant1 is None:
tile.randomizeContent()
# sprobuj zasadzic cos
print("Tarctor planted something")
results.append("Tarctor planted something")
elif plant1.growth_level == 100:
tile.plant = None
ground.nutrients_level -= 40
ground.water_level -= 40
print("Tractor collected something")
results.append("Tractor collected something")
else:
plant1.try_to_grow(50,50) #mozna dostosowac jeszcze
ground.nutrients_level -= 11
@ -61,6 +65,7 @@ class Tractor:
elif plant1.plant_type == self.spinosad.plant_type:
t = "Tractor used Spinosad"
print(t)
results.append(t)
ground.pest = False
if ground.weed:
# traktor pozbywa się chwastow
@ -71,13 +76,21 @@ class Tractor:
elif plant1.plant_type == self.metazachlor.plant_type:
t = "Tractor used Metazachlor"
print(t)
results.append(t)
ground.weed = False
if ground.water_level < plant1.water_requirements:
ground.water_level += 20
print("Tractor watered the plant")
results.append("Tractor watered the plant")
if ground.nutrients_level < plant1.nutrients_requirements:
ground.nutrients_level += 20
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))
@ -156,6 +169,13 @@ def do_actions(tractor, WIN, move_list):
tractor.rotate_to_left()
tractor.draw_tractor(WIN)
pygame.display.update()
time.sleep(1)
time.sleep(0.5)
#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
from area.constants import WIDTH, HEIGHT, TILE_SIZE
from area.field import drawWindow
from area.tractor import Tractor, do_actions
from area.tractor import Tractor, do_actions, display_work_results
from area.field import tiles, fieldX, fieldY
from area.field import get_tile_coordinates, get_tile_index
from ground import Dirt
from plant import Plant
from bfs import graphsearch, Istate, succ
from astar import a_star
from NN.neural_network import load_model, load_image, guess_image, display_image, display_result
from NN.neural_network import load_model, load_image, guess_image, display_image, display_result, clear_text_area
from PIL import Image
from genetic import genetic_algorithm
@ -30,39 +30,15 @@ def main():
window = drawWindow(WIN)
pygame.display.update()
#getting coordinates of our "goal tile":
tile_index = get_tile_index()
tile_x, tile_y = get_tile_coordinates(tile_index)
if tile_x is not None and tile_y is not None:
print(f"Coordinates of tile {tile_index} are: ({tile_x}, {tile_y})")
else: print("Such tile does not exist")
#mark the goal tile:
tiles[tile_index].image = "resources/images/sampling_goal.png"
image = pygame.image.load(tiles[tile_index].image).convert()
image = pygame.transform.scale(image, (TILE_SIZE, TILE_SIZE))
WIN.blit(image, (tiles[tile_index].x, tiles[tile_index].y))
pygame.display.flip()
#graphsearch activation:
istate = Istate(170, 100, 2) #initial state
goaltest = []
goaltest.append(tile_x) #final state (consists of x and y because direction doesnt matter)
goaltest.append(tile_y)
#Tractor initialization:
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))
print(moves)
tractor.rect.y += fieldY
tractor.tractor_start = ((170, 100))
istate = Istate(170, 100, 2) #initial state
#main loop:
@ -72,7 +48,35 @@ def main():
run = False
time.sleep(1)
# movement based on route-planning (test):
#getting coordinates of our "goal tile":
tile_index = get_tile_index()
tile_x, tile_y = get_tile_coordinates(tile_index)
if tile_x is not None and tile_y is not None:
print(f"Coordinates of tile {tile_index} are: ({tile_x}, {tile_y})")
else: print("Such tile does not exist")
#mark the goal tile:
tiles[tile_index].image = "resources/images/sampling_goal.png"
image = pygame.image.load(tiles[tile_index].image).convert()
image = pygame.transform.scale(image, (TILE_SIZE, TILE_SIZE))
WIN.blit(image, (tiles[tile_index].x, tiles[tile_index].y))
pygame.display.flip()
tractor.tractor_end = ((tile_x, tile_y))
goaltest = [] #final state (consists of x and y because direction doesnt matter)
goaltest.append(tile_x)
goaltest.append(tile_y)
goaltest[0] = tile_x
goaltest[1]=tile_y
#moves = (graphsearch(istate, succ, goaltest, tractor)) #<-------BFS
moves = (a_star(istate, succ, goaltest, tractor))
print(moves)
# movement based on route-planning:
tractor.draw_tractor(WIN)
time.sleep(1)
@ -89,6 +93,7 @@ def main():
image_tensor = load_image(image_path)
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
pygame.display.update()
print(f"The predicted image is: {prediction}")
@ -101,8 +106,9 @@ def main():
goalTile.ground=d1
#getting the name and type of the recognized plant:
p1.update_name(prediction)
#decission tree test:
#decission tree test:
if d1.pest:
pe = 1
else:
@ -131,19 +137,71 @@ def main():
t3 = True
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 = {
'anomalies': [True],
'temp': [17],
'water': [d1.water_level],
'nutri': [d1.nutrients_level],
'pests': [pe],
'weeds': [we],
'ripeness': [p1.growth_level],
'season_autumn': [True], 'season_spring': [False], 'season_summer': [False], 'season_winter': [False],
'weather_heavyCloudy': [False], 'weather_partCloudy': [False], 'weather_precipitation': [False],
'weather_sunny': [True],
'type_cereal': [t1], 'type_fruit': [t2], 'type_none': [t3], 'type_vegetable': [t4]
'anomalies': [a1],
'temp': [temp_n],
'water': [d1.water_level],
'nutri': [d1.nutrients_level],
'pests': [pe],
'weeds': [we],
'ripeness': [p1.growth_level],
'season_autumn': [s1], 'season_spring': [s2], 'season_summer': [s3], 'season_winter': [s4],
'weather_heavyCloudy': [h1], 'weather_partCloudy': [h2], 'weather_precipitation': [h3],
'weather_sunny': [h4],
'type_cereal': [t1], 'type_fruit': [t2], 'type_none': [t3], 'type_vegetable': [t4]
}
df = pd.DataFrame(dane)
df.to_csv('model_data.csv', index=False)
@ -154,8 +212,11 @@ def main():
#work on field:
if predykcje == 'work':
tractor.work_on_field(goalTile, d1, p1)
time.sleep(50)
tractor.work_on_field(WIN, goalTile, d1, p1)
#update the initial state for the next target:
istate = Istate(tile_x, tile_y, tractor.direction)
time.sleep(2)
print("\n")