From dc411fae42cba04c7283f6085719da1fdcd23538 Mon Sep 17 00:00:00 2001 From: XsedoX Date: Tue, 17 May 2022 22:54:56 +0200 Subject: [PATCH] neural network sprawny wraz z interfejsem --- algorithms/bfs.py | 4 +- .../neural_network/data/test/grass/grass1.png | Bin 0 -> 814 bytes .../neural_network/data/test/grass/grass2.png | Bin 0 -> 820 bytes .../neural_network/data/test/grass/grass3.png | Bin 0 -> 789 bytes .../neural_network/data/test/grass/grass4.png | Bin 0 -> 1061 bytes .../neural_network/data/test/sand/sand.png | Bin 0 -> 760 bytes .../data/test/tree/grass_with_tree.jpg | Bin 0 -> 2229 bytes .../neural_network/data/test/water/water.png | Bin 0 -> 725 bytes algorithms/neural_network/learnedNetwork.pt | Bin 0 -> 36375 bytes algorithms/neural_network/neural_network.py | 22 +++++ .../neural_network_interface.py | 91 ++++++++++++++++++ .../neural_network/watersandtreegrass.py | 28 ++++++ common/constants.py | 21 ++++ common/helpers.py | 33 ++++++- logic/health_bar.py | 2 +- requirements.txt | Bin 32 -> 72 bytes 16 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 algorithms/neural_network/data/test/grass/grass1.png create mode 100644 algorithms/neural_network/data/test/grass/grass2.png create mode 100644 algorithms/neural_network/data/test/grass/grass3.png create mode 100644 algorithms/neural_network/data/test/grass/grass4.png create mode 100644 algorithms/neural_network/data/test/sand/sand.png create mode 100644 algorithms/neural_network/data/test/tree/grass_with_tree.jpg create mode 100644 algorithms/neural_network/data/test/water/water.png create mode 100644 algorithms/neural_network/learnedNetwork.pt create mode 100644 algorithms/neural_network/neural_network.py create mode 100644 algorithms/neural_network/neural_network_interface.py create mode 100644 algorithms/neural_network/watersandtreegrass.py diff --git a/algorithms/bfs.py b/algorithms/bfs.py index b2ed3d3..959a684 100644 --- a/algorithms/bfs.py +++ b/algorithms/bfs.py @@ -51,7 +51,7 @@ def graphsearch(initial_state: State, map, goal_list, fringe: List[Node] = None, explored_states = set() fringe_states = set() - # root Node + # train Node fringe.append(Node(initial_state)) fringe_states.add((initial_state.row, initial_state.column, initial_state.direction)) @@ -71,7 +71,7 @@ def graphsearch(initial_state: State, map, goal_list, fringe: List[Node] = None, parent = element.parent while parent is not None: - # root's action will be None, don't add it + # train's action will be None, don't add it if parent.action is not None: actions_sequence.append(parent.action) parent = parent.parent diff --git a/algorithms/neural_network/data/test/grass/grass1.png b/algorithms/neural_network/data/test/grass/grass1.png new file mode 100644 index 0000000000000000000000000000000000000000..dd88981000986fbc15705347f8a75c36427a8fb8 GIT binary patch literal 814 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 literal 0 HcmV?d00001 diff --git a/algorithms/neural_network/data/test/sand/sand.png b/algorithms/neural_network/data/test/sand/sand.png new file mode 100644 index 0000000000000000000000000000000000000000..51c072d3fd2e1089a5d1351017482452e143c044 GIT binary patch literal 760 zcmVEX>4Tx04R}tkv&MmKp2MKrb>%c9PA+CkfAzR@TZ8QRIvyaN?V~-2a`+xph-iL z;^HW{799LptU9+0Yt2!cN#j!sUBE>hxmNufoIcO3Wd-uJ%TeFq55DpSp#2|(2> zBb|tgx%{dac!eK9nv;l0%+!;a#VkC>*FAiEzl-uL@47!nzfv$6;1h}Gm~L3a8^kl4 zmd<&fILykDLVQj|xiA_WmL>ZqU!3sKrNQcR@jJnrEicKj)F$>gel zkz)ZhsE`~#_#gc4ty!F&a+5-Fp!dbLKSqJTF3@V&_V=-Ew@v{6GjOGK{Iw=9`$>AE zqeYH@fo_CX>@2HM@dakSAh-}0002bNkl=`QlX-P51_2#t5$`BrMi&)CRpK*y65!HB=bA>^}FA_ z_cQgF27ntP3zh+fVGx8KFin81zdl}-6(1+eNy^d+1A|w}O@nw-u)lw-JThDs9J(BN z1K@S38eJyC13;ISrH>5s6RwVaM`$?&1TfL#2@6%4%#4)^Sroido?Zcz3EmU_xYmOOv6`LU=vGZ{%cU(6|y|zDBExLwG;J?s`-p!acNJJ&Av&aiSUH z2m)Up73q)8#z$C~I1Q_(VU1R=Lp}?Uk4u~`4dusIPvSTlze{6XYBs9PEc6Mj!wmqOXaL(z0QQ>6z9AcJhuv2J zqEN3wI{>P70L)E9xno{&ZYBzN*|-1e^P+#I>);Orj?*s^26{;*NirBD+tSj4Y0b8_ zwqjdZacp>8jtymFWyPJzrEK|jc6Qb?>>XzE9e8{@KAi+3Pz-})ktB=HvEuOmw3to- z#YBU5AutMX3L_}YWCVfv#+e&IHvSm+IPi;d|csy8irO_rhy?PaU{6Jj@wVY!AwA{Pn_*<%i~tiq$E9 z&veK05rY#KjQ~fTc}amG%%FIrEng%?JWNE7k+^$qN#3$Y+s3qOw>h7*8(4N?)9sCU zaN}!mOaCHd^NL&7ze$vwd)T}8tF}#d+w?r%US&O*d9W_TclZ#in4FK8T+op*)PHgs z6A%=SA&MYvJ-HI!!d5dKIld9ZJf}4)dyYT>O0S?R)#`1v{*-giapa}hg^ z_;JhM=`kD#1|{MlZi7S`p(<;AZ05&l{;04rgJfycKi0+PCY;_UGlo34(!C<`;6cR` z&!;J`Rpl>yCTBLL#aH|i5-wN#^(=Xe_pQ<~w`Ml$!gsf2U5>+hm<6nU=kIUCZ1=$@ zb}z}7{5LzXZ~Ti@QlaYui?!8Nf*G+^g|Tt*&PSMsC+55z?h~Vp zj@g&m60$J}?~F+v$gwz{JaO{VV)wrPl)Id`h`7wVYrgv2zFz$W?;G>FFeg-`kfN6z zBgmHpr%Q|F zzJ?DDS9}m=o(_~5^S$CqcJ!)fjrQ`19QH0l-p%_t)o~@V?9n-n)!oiLCr8Kn4sdQ+E*V$Y1}JRn->Ycc zTrs=9Ih+v02YIM>ef}Uiof?r2b^iu#Tei|STFgb0#u(E^jZq>%liq-~$k5s~x#j4* zKHSwBw|V6av8&G%h44Jn&O9q|aJw8ZpOnwqk-$IR-u|zpKO1WzqWLy0A@h^2FOu2? z*@S(PRc^R6?z^RBCSU8?uP9tj?i`sI`E+|}t>O723rfJ2cRDC%eP30v`_jh+*|RtH zbD}D~6$pRLw^>+4vhxDH1Zx@o#vQlrbuMAD2UgY884I?y5Jds@Z+2+=!h0G!il6A5 t4l>^lb>Agw?-i4m+9-iov90Ojq?RxnZ^_e)(4!^4EGtTBzLIb1{U5@ai~#@u literal 0 HcmV?d00001 diff --git a/algorithms/neural_network/data/test/water/water.png b/algorithms/neural_network/data/test/water/water.png new file mode 100644 index 0000000000000000000000000000000000000000..28b45dbf7d3fea77e2cd46492821efe4925d7a14 GIT binary patch literal 725 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 BAR_HEIGHT_MULTIPLIER = 0.1 + +#NEURAL_NETWORK +learning_rate = 0.001 +batch_size = 7 +num_epochs = 10 + +device = torch.device('cuda') +classes = ['grass', 'sand', 'tree', 'water'] + +setup_photos = transforms.Compose([ + transforms.Resize(36), + transforms.CenterCrop(36), + transforms.ToPILImage(), + transforms.ToTensor(), + transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) +]) + +id_to_class = {i: j for i, j in enumerate(classes)} +class_to_id = {value: key for key, value in id_to_class.items()} diff --git a/common/helpers.py b/common/helpers.py index dd13e31..22e44b7 100644 --- a/common/helpers.py +++ b/common/helpers.py @@ -1,5 +1,7 @@ import pygame -from common.constants import GRID_CELL_PADDING, GRID_CELL_SIZE, COLUMNS, ROWS +from common.constants import GRID_CELL_PADDING, GRID_CELL_SIZE, COLUMNS, ROWS, classes, class_to_id +import csv +import os def draw_text(text, color, surface, x, y, text_size=30, is_bold=False): @@ -12,6 +14,35 @@ def draw_text(text, color, surface, x, y, text_size=30, is_bold=False): textrect.topleft = (x, y) surface.blit(textobj, textrect) +def createCSV(): + train_csvfile = open('./data/train_csv_file.csv', 'w', newline="") + writer = csv.writer(train_csvfile) + writer.writerow(["filename", "type"]) + + train_data_path = './data/train' + test_data_path = './data/test' + + for class_name in classes: + class_dir = train_data_path + "/" + class_name + for filename in os.listdir(class_dir): + f = os.path.join(class_dir, filename) + if os.path.isfile(f): + writer.writerow([filename, class_to_id[class_name]]) + + test_csvfile = open('./data/test_csv_file.csv', 'w', newline="") + writer = csv.writer(test_csvfile) + writer.writerow(["filename", "type"]) + + for class_name in classes: + class_dir = test_data_path + "/" + class_name + for filename in os.listdir(class_dir): + f = os.path.join(class_dir, filename) + if os.path.isfile(f): + writer.writerow([filename, class_to_id[class_name]]) + + test_csvfile.close() + train_csvfile.close() + def print_numbers(): display_surface = pygame.display.get_surface() diff --git a/logic/health_bar.py b/logic/health_bar.py index c362fc7..0b8bc3a 100644 --- a/logic/health_bar.py +++ b/logic/health_bar.py @@ -46,7 +46,7 @@ class HealthBar: def heal(self, amount): if self.current_hp + amount < self.max_hp: self.current_hp += amount - elif self.current_hp + amount > self.max_hp: + elif self.current_hp + amount >= self.max_hp: self.current_hp = self.max_hp def show(self): diff --git a/requirements.txt b/requirements.txt index ad0de46619b5df1cbd8dab59cea17c01eb068d7e..f2fe57ad66272085c593d049ce04679e14e97b0b 100644 GIT binary patch delta 45 ncmY%Jn4q9h!jR8U#E{I8!NAMF#em?IF=R3n193h>9#{qd(PIcl delta 4 LcmeZJn4kav0>l9s