random recognition added #6

Merged
s473603 merged 1 commits from adding_recognition into master 2023-06-01 15:30:38 +02:00
5 changed files with 75 additions and 43 deletions

View File

@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4"> <module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" /> <orderEntry type="jdk" jdkName="Python 3.9" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
</project> </project>

114
field.py
View File

@ -1,15 +1,14 @@
import asyncio import os
import random import random
import time import time
from heapq import *
from enum import Enum, IntEnum from enum import Enum, IntEnum
from queue import PriorityQueue from queue import PriorityQueue
from collections import deque
from threading import Thread from threading import Thread
from IC3 import tree
import pygame import pygame
#from recognition_v1.proverka import *
from IC3 import tree
pygame.init() pygame.init()
BLACK = (0, 0, 0) BLACK = (0, 0, 0)
@ -17,15 +16,15 @@ WHITE = (200, 200, 200)
BLUE = (46, 34, 240) BLUE = (46, 34, 240)
WINDOW_DIMENSIONS = 900 WINDOW_DIMENSIONS = 900
BLOCK_SIZE = 60 BLOCK_SIZE = 60
ROCKS_NUMBER = 30 ROCKS_NUMBER = 20
VEGETABLES_NUMBER = 20 VEGETABLES_NUMBER = 20
VEGETABLES = ('Potato', 'Broccoli', 'Carrot', 'Onion') VEGETABLES = ('Potato', 'Broccoli', 'Carrot', 'Capsicum')
BOARD_SIZE = int(WINDOW_DIMENSIONS / BLOCK_SIZE) BOARD_SIZE = int(WINDOW_DIMENSIONS / BLOCK_SIZE)
WATER_TANK_CAPACITY = 10 WATER_TANK_CAPACITY = 10
GAS_TANK_CAPACITY = 250 GAS_TANK_CAPACITY = 250
SPAWN_POINT = (0, 0) SPAWN_POINT = (0, 0)
SKLEP_POINT = (14, 14) SKLEP_POINT = (14, 14)
TIMEOUT = 30 TIMEOUT = 1
tractor_image = pygame.transform.scale(pygame.image.load("images/tractor_image.png"), (BLOCK_SIZE, BLOCK_SIZE)) tractor_image = pygame.transform.scale(pygame.image.load("images/tractor_image.png"), (BLOCK_SIZE, BLOCK_SIZE))
rock_image = pygame.transform.scale(pygame.image.load("images/rock_image.png"), (BLOCK_SIZE, BLOCK_SIZE)) rock_image = pygame.transform.scale(pygame.image.load("images/rock_image.png"), (BLOCK_SIZE, BLOCK_SIZE))
@ -33,8 +32,11 @@ potato_image = pygame.transform.scale(pygame.image.load("images/potato.png"), (B
carrot_image = pygame.transform.scale(pygame.image.load("images/carrot.png"), (BLOCK_SIZE, BLOCK_SIZE)) carrot_image = pygame.transform.scale(pygame.image.load("images/carrot.png"), (BLOCK_SIZE, BLOCK_SIZE))
broccoli_image = pygame.transform.scale(pygame.image.load("images/broccoli.png"), (BLOCK_SIZE, BLOCK_SIZE)) broccoli_image = pygame.transform.scale(pygame.image.load("images/broccoli.png"), (BLOCK_SIZE, BLOCK_SIZE))
onion_image = pygame.transform.scale(pygame.image.load("images/onion.png"), (BLOCK_SIZE, BLOCK_SIZE)) onion_image = pygame.transform.scale(pygame.image.load("images/onion.png"), (BLOCK_SIZE, BLOCK_SIZE))
capsicum_image = pygame.transform.scale(pygame.image.load("images/capsicum.png"), (BLOCK_SIZE, BLOCK_SIZE))
unknown_image = pygame.transform.scale(pygame.image.load("images/unknown.png"), (BLOCK_SIZE, BLOCK_SIZE))
gas_station_image = pygame.transform.scale(pygame.image.load("images/gas_station.png"), (BLOCK_SIZE, BLOCK_SIZE)) gas_station_image = pygame.transform.scale(pygame.image.load("images/gas_station.png"), (BLOCK_SIZE, BLOCK_SIZE))
gas_station_closed_image = pygame.transform.scale(pygame.image.load("images/gas_station_closed.png"), (BLOCK_SIZE, BLOCK_SIZE)) gas_station_closed_image = pygame.transform.scale(pygame.image.load("images/gas_station_closed.png"),
(BLOCK_SIZE, BLOCK_SIZE))
sklep_station_image = pygame.transform.scale(pygame.image.load("images/storage_open.png"), (BLOCK_SIZE, BLOCK_SIZE)) sklep_station_image = pygame.transform.scale(pygame.image.load("images/storage_open.png"), (BLOCK_SIZE, BLOCK_SIZE))
sklep_closed_station_image = pygame.transform.scale(pygame.image.load("images/storage_closed.png"), sklep_closed_station_image = pygame.transform.scale(pygame.image.load("images/storage_closed.png"),
(BLOCK_SIZE, BLOCK_SIZE)) (BLOCK_SIZE, BLOCK_SIZE))
@ -76,7 +78,7 @@ def draw_interface():
tractor.gas = GAS_TANK_CAPACITY tractor.gas = GAS_TANK_CAPACITY
if (tractor.x, tractor.y) == SKLEP_POINT: if (tractor.x, tractor.y) == SKLEP_POINT:
tractor.collected_vegetables = {vegetables.POTATO: 0, vegetables.BROCCOLI: 0, vegetables.CARROT: 0, tractor.collected_vegetables = {vegetables.POTATO: 0, vegetables.BROCCOLI: 0, vegetables.CARROT: 0,
vegetables.ONION: 0} vegetables.CAPSICUM: 0}
global sc global sc
sc = pygame.display.set_mode((WINDOW_DIMENSIONS, WINDOW_DIMENSIONS)) sc = pygame.display.set_mode((WINDOW_DIMENSIONS, WINDOW_DIMENSIONS))
@ -90,7 +92,13 @@ def draw_interface():
grid = Grid(BOARD_SIZE, BOARD_SIZE, BLOCK_SIZE) grid = Grid(BOARD_SIZE, BOARD_SIZE, BLOCK_SIZE)
graph1 = Graph(grid) graph1 = Graph(grid)
t2 = Thread(target=close_open, args=(grid,))
t2.setDaemon(True)
t2.start()
fl_running = True fl_running = True
determine_thread = Thread(target=grid.determine)
determine_thread.setDaemon(True)
determine_thread.start()
while fl_running: while fl_running:
draw_grid() draw_grid()
# region events # region events
@ -110,9 +118,6 @@ def draw_interface():
elif event.type == pygame.MOUSEBUTTONDOWN: elif event.type == pygame.MOUSEBUTTONDOWN:
startpoint = (tractor.x, tractor.y, tractor.direction) startpoint = (tractor.x, tractor.y, tractor.direction)
endpoint = get_click_mouse_pos() endpoint = get_click_mouse_pos()
a, c = graph1.a_star(startpoint, endpoint, grid)
b = getRoad(startpoint, c, a)
#movement(tractor, grid, b)
decisionTree(startpoint, endpoint, tractor, grid, graph1) decisionTree(startpoint, endpoint, tractor, grid, graph1)
# a, c = graph1.a_star(startpoint, endpoint) # a, c = graph1.a_star(startpoint, endpoint)
# b = getRoad(startpoint, c, a) # b = getRoad(startpoint, c, a)
@ -122,9 +127,6 @@ def draw_interface():
# graph1.initialize_graph(grid) # graph1.initialize_graph(grid)
class Direction(IntEnum): class Direction(IntEnum):
UP = 0 UP = 0
RIGHT = 1 RIGHT = 1
@ -136,7 +138,8 @@ class vegetables(Enum):
POTATO = 3 POTATO = 3
BROCCOLI = 4 BROCCOLI = 4
CARROT = 5 CARROT = 5
ONION = 6 CAPSICUM = 6
UNKNOWN = 7
class types(Enum): class types(Enum):
@ -145,7 +148,8 @@ class types(Enum):
POTATO = 3 POTATO = 3
BROCCOLI = 4 BROCCOLI = 4
CARROT = 5 CARROT = 5
ONION = 6 CAPSICUM = 6
UNKNOWN = 7
class Grid: class Grid:
@ -154,20 +158,13 @@ class Grid:
self.height = height self.height = height
self.block_size = block_size self.block_size = block_size
self.grid = [[types.EMPTY for col in range(BOARD_SIZE)] for row in range(BOARD_SIZE)] self.grid = [[types.EMPTY for col in range(BOARD_SIZE)] for row in range(BOARD_SIZE)]
self.photo_paths = [['' for col in range(BOARD_SIZE)] for row in range(BOARD_SIZE)]
self.vegetables_locations = []
self.initialize_grid() self.initialize_grid()
self.is_gas_station_closed = True self.is_gas_station_closed = False
self.is_storage_closed = True self.is_storage_closed = False
t2 = Thread(target=self.close_open, args=(self,))
t2.setDaemon(True)
t2.start()
def close_open(self): def add_object(self, x, y, type_of_object):
while True:
time.sleep(TIMEOUT)
self.is_gas_station_closed = bool(random.getrandbits(1))
self.is_storage_closed = bool(random.getrandbits(1))
def add_object(self, x, y, type_of_object: types):
if self.grid[x][y] == types.EMPTY: if self.grid[x][y] == types.EMPTY:
self.grid[x][y] = type_of_object self.grid[x][y] = type_of_object
return True return True
@ -185,7 +182,9 @@ class Grid:
for i in range(VEGETABLES_NUMBER): for i in range(VEGETABLES_NUMBER):
x, y = random.randrange(0, BOARD_SIZE), random.randrange(0, BOARD_SIZE) x, y = random.randrange(0, BOARD_SIZE), random.randrange(0, BOARD_SIZE)
if self.grid[x][y] == types.EMPTY and (x, y) != (0, 0): if self.grid[x][y] == types.EMPTY and (x, y) != (0, 0):
self.add_object(x, y, random.choice(list(vegetables))) if self.add_object(x, y, vegetables.UNKNOWN): # random.choice(list(vegetables)))
self.vegetables_locations.append((x, y))
self.photo_paths[x][y] = get_random_photo_path()
else: else:
i -= 1 i -= 1
for i in range(ROCKS_NUMBER): for i in range(ROCKS_NUMBER):
@ -195,13 +194,27 @@ class Grid:
else: else:
i -= 1 i -= 1
def determine(self):
for x, y in self.vegetables_locations:
if self.grid[x][y] == vegetables.UNKNOWN:
timeout = time.time() + 0.5
while True:
sc.blit(pygame.transform.scale(pygame.image.load(self.photo_paths[x][y]), (BLOCK_SIZE*2, BLOCK_SIZE*2)),
((x * BLOCK_SIZE) - BLOCK_SIZE/2, (y * BLOCK_SIZE) - BLOCK_SIZE/2))
if time.time() > timeout:
break
# time.sleep(1)
random_veg = random.choice(list(vegetables))
while random_veg == vegetables.UNKNOWN:
random_veg = random.choice(list(vegetables))
self.grid[x][y] = random_veg
# self.grid[x][y] = VegebatlesRecognizer.recognize(self.photo_paths[x][y])
class Graph: class Graph:
def __init__(self, grid: Grid): def __init__(self, grid: Grid):
self.graph = {} self.graph = {}
#<<<<<<< HEAD
#=======
# self.initialize_graph(grid) # self.initialize_graph(grid)
# def initialize_graph(self, grid: Grid): # def initialize_graph(self, grid: Grid):
@ -210,7 +223,6 @@ class Graph:
# for direction in Direction: # for direction in Direction:
# self.graph[(x, y, direction)] = get_next_nodes(x, y, direction, grid) # self.graph[(x, y, direction)] = get_next_nodes(x, y, direction, grid)
#>>>>>>> 2287b2b09f973efdd2dec60834b09109e0b221b9
def a_star(self, start, goal, grid: Grid): def a_star(self, start, goal, grid: Grid):
# not finished yet https://www.youtube.com/watch?v=abHftC1GU6w # not finished yet https://www.youtube.com/watch?v=abHftC1GU6w
queue = PriorityQueue() queue = PriorityQueue()
@ -250,7 +262,7 @@ class Tractor:
self.gas = GAS_TANK_CAPACITY self.gas = GAS_TANK_CAPACITY
self.water = WATER_TANK_CAPACITY self.water = WATER_TANK_CAPACITY
self.collected_vegetables = {vegetables.POTATO: 0, vegetables.BROCCOLI: 0, vegetables.CARROT: 0, self.collected_vegetables = {vegetables.POTATO: 0, vegetables.BROCCOLI: 0, vegetables.CARROT: 0,
vegetables.ONION: 0} vegetables.CAPSICUM: 0}
self.image = pygame.transform.scale(pygame.image.load("images/tractor_image.png"), (BLOCK_SIZE, BLOCK_SIZE)) self.image = pygame.transform.scale(pygame.image.load("images/tractor_image.png"), (BLOCK_SIZE, BLOCK_SIZE))
def rot_center(self, direc: Direction): def rot_center(self, direc: Direction):
@ -304,7 +316,6 @@ def get_next_nodes(x, y, direction: Direction, grid: Grid):
def movement(tractor: Tractor, grid: Grid, road): def movement(tractor: Tractor, grid: Grid, road):
print(road)
n = len(road) n = len(road)
for i in range(n - 1): for i in range(n - 1):
aA = road[i] aA = road[i]
@ -366,8 +377,10 @@ def updateDisplay(tractor: Tractor, grid: Grid):
sc.blit(carrot_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) sc.blit(carrot_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5))
elif grid.grid[x][y] == vegetables.BROCCOLI: elif grid.grid[x][y] == vegetables.BROCCOLI:
sc.blit(broccoli_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) sc.blit(broccoli_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5))
elif grid.grid[x][y] == vegetables.ONION: elif grid.grid[x][y] == vegetables.CAPSICUM:
sc.blit(onion_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) sc.blit(capsicum_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5))
elif grid.grid[x][y] == vegetables.UNKNOWN:
sc.blit(unknown_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5))
elif grid.grid[x][y] == types.ROCK: elif grid.grid[x][y] == types.ROCK:
sc.blit(rock_image, (x * BLOCK_SIZE, y * BLOCK_SIZE)) sc.blit(rock_image, (x * BLOCK_SIZE, y * BLOCK_SIZE))
sc.blit(gas_station_image, (SPAWN_POINT[0] * BLOCK_SIZE, SPAWN_POINT[1] * BLOCK_SIZE)) sc.blit(gas_station_image, (SPAWN_POINT[0] * BLOCK_SIZE, SPAWN_POINT[1] * BLOCK_SIZE))
@ -384,8 +397,8 @@ def updateDisplay(tractor: Tractor, grid: Grid):
vegetables_text = font.render( vegetables_text = font.render(
'Potato: ' + str(tractor.collected_vegetables[vegetables.POTATO]) + ' Broccoli: ' + str( 'Potato: ' + str(tractor.collected_vegetables[vegetables.POTATO]) + ' Broccoli: ' + str(
tractor.collected_vegetables[vegetables.BROCCOLI]) + ' Carrot: ' + str( tractor.collected_vegetables[vegetables.BROCCOLI]) + ' Carrot: ' + str(
tractor.collected_vegetables[vegetables.CARROT]) + ' Onion: ' + str( tractor.collected_vegetables[vegetables.CARROT]) + ' Capsicum: ' + str(
tractor.collected_vegetables[vegetables.ONION]), True, WHITE, BLACK) tractor.collected_vegetables[vegetables.CAPSICUM]), True, WHITE, BLACK)
vegetables_textrect = vegetables_text.get_rect() vegetables_textrect = vegetables_text.get_rect()
vegetables_textrect.center = (WINDOW_DIMENSIONS // 2, WINDOW_DIMENSIONS - 30) vegetables_textrect.center = (WINDOW_DIMENSIONS // 2, WINDOW_DIMENSIONS - 30)
sc.blit(vegetables_text, vegetables_textrect) sc.blit(vegetables_text, vegetables_textrect)
@ -512,4 +525,23 @@ def decisionTree(startpoint, endpoint, tractor, grid, graph1):
print("GAME OVER") print("GAME OVER")
def close_open(grid: Grid):
while True:
time.sleep(TIMEOUT)
grid.is_gas_station_closed = bool(random.getrandbits(1))
grid.is_storage_closed = bool(random.getrandbits(1))
def get_random_photo_path():
dir_num = random.randint(1, 4)
image_dir = "test_image_dataset"
if dir_num == 1:
image_dir = "test_image_dataset/Broccoli"
if dir_num == 2:
image_dir = "test_image_dataset/Capsicum"
if dir_num == 3:
image_dir = "test_image_dataset/Carrot"
if dir_num == 4:
image_dir = "test_image_dataset/Potato"
return image_dir + '\\' + random.choice(os.listdir(image_dir))

BIN
images/capsicum.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
images/unknown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB