From 7690765a4d09959a3b90d531bcf3937bc962df6c Mon Sep 17 00:00:00 2001 From: linyiLYi <48440925+linyiLYi@users.noreply.github.com> Date: Tue, 28 Mar 2023 15:39:30 +0800 Subject: [PATCH] new training and testing scripts based on cv --- __pycache__/custom_cnn.cpython-38.pyc | Bin 0 -> 1153 bytes __pycache__/custom_sf2_cv_env.cpython-38.pyc | Bin 0 -> 2429 bytes add_custom_rom.py | 3 + convert_image_to_grayscale.py | 17 +++++ custom_cnn.py | 23 +++++++ custom_sf2_cv_env.py | 60 ++++++++++++++++++ images/pattern_lose.png | Bin 0 -> 363 bytes images/pattern_lose_gray.png | Bin 0 -> 235 bytes images/pattern_wins.png | Bin 0 -> 331 bytes images/pattern_wins_gray.png | Bin 0 -> 292 bytes images/sf2screen_fight.png | Bin 0 -> 25845 bytes images/sf2screen_fight_gray.png | Bin 0 -> 20918 bytes images/sf2screen_fight_labeled.png | Bin 0 -> 33792 bytes images/sf2screen_win.png | Bin 0 -> 23160 bytes images/sf2screen_you_lose.png | Bin 0 -> 25832 bytes test_cv_sf2_ai.py | 62 +++++++++++++++++++ test_street_fighter_ai.py | 51 +++++++++++++-- train_cv_sf2_ai.py | 49 ++------------- 18 files changed, 216 insertions(+), 49 deletions(-) create mode 100644 __pycache__/custom_cnn.cpython-38.pyc create mode 100644 __pycache__/custom_sf2_cv_env.cpython-38.pyc create mode 100644 add_custom_rom.py create mode 100644 convert_image_to_grayscale.py create mode 100644 custom_cnn.py create mode 100644 custom_sf2_cv_env.py create mode 100644 images/pattern_lose.png create mode 100644 images/pattern_lose_gray.png create mode 100644 images/pattern_wins.png create mode 100644 images/pattern_wins_gray.png create mode 100644 images/sf2screen_fight.png create mode 100644 images/sf2screen_fight_gray.png create mode 100644 images/sf2screen_fight_labeled.png create mode 100644 images/sf2screen_win.png create mode 100644 images/sf2screen_you_lose.png create mode 100644 test_cv_sf2_ai.py diff --git a/__pycache__/custom_cnn.cpython-38.pyc b/__pycache__/custom_cnn.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9adaf11d4d4726e7c12ce42c2e81586f0189ec41 GIT binary patch literal 1153 zcmZWo&1)1f6i?=Rx4S}16%~~tD(seh--idcIY7s7OsZD*ayv`MzwvL{>U zsaH=$w#WWUxq8~aK=9;y)3vTNkeBz7yx;rEX0ur*uzq}h$UnJ+{6t}Tc_1vq)=NM* z;WQ`lsZumgFNDUWp92vD;bKR)eUH;KdO~`XJKQ~P#J&jnA#U!SIo#*Lu@^@t z#3OMHU_)E$474eW&N^bxmRnk={lsLYWO_GAMe0;2mjwAHY$yfM-+&lm=#U&aeP>8H zAf7su7s3P8}^SMT1dvM*9#A#5ScVlUg?F+wdSSvRd3$-sSk_dv~pXUtsR214jO_2?W8 zu695hH28Hmch&v&-=rY6#?%;S8z=#@D6dTd)}n(5_(z6hM27SnN14JTDMW2K>JA+0 z0g`)HuJG+94ur)5!;vR&O{d2#@aRG47pYYMh1NL7ny=`ydE PIG-Au7SRa$({TR)E_@r_ literal 0 HcmV?d00001 diff --git a/__pycache__/custom_sf2_cv_env.cpython-38.pyc b/__pycache__/custom_sf2_cv_env.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8de06b4b85ddde68971a1342b2b6ff80ec110f0 GIT binary patch literal 2429 zcmaJ@&2QT_6emSVmYq0tx1gT`7HmKVp=b};uoXqIE_IWl*ya>zieW+kP7~>`+LlJj zZerMnp)I;guRABl{x91oOsK;>*$E!pm1s^>qM21nrTiXlX?4yA!c{L^y&yBZ5iNb)T}x6Z9bo-5JawjRf&% z!8Nhy4FE}SoyZYOFG!Qxb;=PFuJE3b$Q8aQLFR7-#~{JA+QnxmkSD z8Sq^8vtFD_Q|+Z%zI!d_Z6$R(?FmzB#eK@^LO zgORG@5tk6o0KB56%z4s_wdVX4`RD8U&7DUuU+)azJTlq2nQa z)}Ys#g+;H$ot?y5mFwmzPevT}xt{H*McAMORbK)iv_^e=9C)bDeCiN<+&ANo|KCBb z9}=4&&xZva1Fckts#gJWvQH;8Ctc^jx(4*X*j*-2<_YH|n>xAQElsRDymY_?yhi9) zQ(FkBsRDgcWhodAsGGfk0#Y~L?dUKtEE%nuAQ|QLw3jNgRNwq&bBo`(x3zk2Ywdeg z10{?P#_f!ysoZaDuW#|St@Smvj2{-{ZWa#&7oENinL2M}N9+_;isNFANWP&_+?5SIrWUS12D|>)4fyA@M_C{D%E3m$)_TxNhZ_mTUvS=OD)V9Cn z_4?-e#s+U}ZhgCcw{Tg@ChNz$)_LbtMkS0nU@!`7xIynEgEgMCW%8KYpi4*6?yfNk z2wjG!MqOLSS5Kqx#2UxALo;Cdv@ZDrbbt#;%EEbWUGBNlbS{!9GIS{Qgg=)$ImOH- zN{?OOi+0&%GG$ig%w>+1xsdVP3uNj|Jm4{C%rJsy$jNL4VHe>Sgg+2|1_<4P)PguY z>_aL57Y%*ugphNNrW+nB8AtD9x_Osv3Ssrw!061$lmxE-Bv#@i?+d&ob1)5l3qc)? zDS^;)^c(})oq&$7oJRP&$;Y_HRDix}xyF+rtNZl8@>|>yzz=PJe_VjC#siO#x%ve9 z5c3!{>I%Z~FjHTE>@%p^UW2qk$1A5OXV*NIl`z%4b%C4kQmBQ2vExpiDT4>H(!K+V zdeE{1l3fvW>OP~K^5gkGV&t8)nc&tW}v6~P{(R3s5UPB2;7;~2_~ z+Zi;|s5;Na1@F torch.Tensor: + return self.cnn(observations) \ No newline at end of file diff --git a/custom_sf2_cv_env.py b/custom_sf2_cv_env.py new file mode 100644 index 0000000..017605b --- /dev/null +++ b/custom_sf2_cv_env.py @@ -0,0 +1,60 @@ +import gym +import cv2 +import numpy as np + +# Custom environment wrapper +class StreetFighterCustomWrapper(gym.Wrapper): + def __init__(self, env, win_template, lose_template, threshold=0.65): + super(StreetFighterCustomWrapper, self).__init__(env) + self.win_template = win_template + self.lose_template = lose_template + self.threshold = threshold + + self.game_screen_gray = None + + self.prev_player_health = 1.0 + self.prev_opponent_health = 1.0 + + # Update observation space to single-channel grayscale image + self.observation_space = gym.spaces.Box( + low=0, high=255, shape=(84, 84, 1), dtype=np.uint8 + ) + + def _preprocess_observation(self, observation): + self.game_screen_gray = cv2.cvtColor(observation, cv2.COLOR_BGR2GRAY) + # Print the size of self.game_screen_gray + # print("self.game_screen_gray size: ", self.game_screen_gray.shape) + # Print the size of the observation + # print("Observation size: ", observation.shape) + resized_image = cv2.resize(self.game_screen_gray, (84, 84), interpolation=cv2.INTER_AREA) + return np.expand_dims(resized_image, axis=-1) + + def _check_game_over(self): + win_res = cv2.matchTemplate(self.game_screen_gray, self.win_template, cv2.TM_CCOEFF_NORMED) + lose_res = cv2.matchTemplate(self.game_screen_gray, self.lose_template, cv2.TM_CCOEFF_NORMED) + if np.max(win_res) >= self.threshold: + return True + if np.max(lose_res) >= self.threshold: + return True + return False + + def _get_reward(self): + player_health_area = self.game_screen_gray[15:20, 32:120] + oppoent_health_area = self.game_screen_gray[15:20, 136:224] + + # Get health points using the number of pixels above 129. + player_health = np.sum(player_health_area > 129) / player_health_area.size + opponent_health = np.sum(oppoent_health_area > 129) / oppoent_health_area.size + + reward = player_health - opponent_health + return reward + + def reset(self): + observation = self.env.reset() + return self._preprocess_observation(observation) + + def step(self, action): + observation, _, _, info = self.env.step(action) + custom_reward = self._get_reward() + custom_done = self._check_game_over() or False + return self._preprocess_observation(observation), custom_reward, custom_done, info \ No newline at end of file diff --git a/images/pattern_lose.png b/images/pattern_lose.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc1190846f2cde63fd2cd6880e54f56617d5553 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^azM<Nn{17EbxddW?X?_wfUrh8W=oX978Pprv}~TZ8qRBx!WKp(I`6M*X8?t z7vrxe286$mswrc2OK9nF$c>ltV{)2P@}R)8W?QDrMYkr;`B(N?v#|ADTfx0S{cZ7= z+ZP#awO4%2D;CyNWo!2^Oxs%XerH@A_s3rGS4xQqZCx{tX_|CLowrsitW$e2=f_gV zLyH%*#^3+A$tvoU?(%-medX+D3LkZMcs9;x(JnuIswU|yo7WD{FYAw87fzosbAWf#1Bk)X)z4*} HQ$iB}@CB9k literal 0 HcmV?d00001 diff --git a/images/pattern_lose_gray.png b/images/pattern_lose_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..3414653e3201b160abe4d536772aac811b38c533 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^azM<<0VEh0Iu6GI$xWUvjv*3~yayNN9yO3?y?B1o z()~f5j?+GfFp7&*_ggz|T)C8Kz2MZDk|m2Tc<_IjJ9%Hm40F?hw#|)>CIzR2CqK+d zdsJg)Tv+F8<0)@%(a@OuK*D0)%Y=k9D=R&R<4eP*o_nun-rD!r)BQN>iybj5?o96D zDp}zL;b~M{Fy~@x`(n8&Nt3OwHOXRLZ&RSCwyb#9Qi;%w0X?fCG$Jx4|EmywdavQc edR`8*{9o*qDYh3PZyRg}dBW4x&t;ucLK6TZpjvbQ literal 0 HcmV?d00001 diff --git a/images/pattern_wins.png b/images/pattern_wins.png new file mode 100644 index 0000000000000000000000000000000000000000..2cfe3dee50c4e5874ed20906a67c5706c75998a4 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^azM<Nn{17EbxddW?X?_wfUrhf)6}h978Pp=T6F%Y&PI&Vdm3fXN|6 z>9L|kcX~nYt*??c)&CtnAB>e+rt?W`L-&&0i_?QQ?VG%%Go$w@=j(>2Q&bk;({6JX zpTAa-Mfu)|eybkAXP@4=alF>(D(=jD>+?K*&${IouOHdGPyF%Pm1gYcl-3;*wb-~i z%VmD>GPy75#@vD8`7OQnuH3Qq>PMdZyl{}u-t5q}_O1KZ9hkc^@t(Q~^J@2m1zgjY z?bv^S`QpTvzoxHl{J_7X;QE*1SAyot3>3e6?~*mX=y!H+!!JSgXAWG~JFVVXyfa_h bUBmEnR?zjtNV__qUl}}I{an^LB{Ts5FmZ)= literal 0 HcmV?d00001 diff --git a/images/pattern_wins_gray.png b/images/pattern_wins_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..6527cc77065f2143afc66f9a69e5bec4fa825afa GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^;y}#F!3HF6e%tO1q!^2X+?^QKos)S9O>_%)r2R7=#&*=dVZs3hwlDaSXBWpF7D~s6|1*C0$eRu_g~k$6i*( z#ZttY;5trwDk5ewx)tb?Fep7FK@)pbZ!6u literal 0 HcmV?d00001 diff --git a/images/sf2screen_fight.png b/images/sf2screen_fight.png new file mode 100644 index 0000000000000000000000000000000000000000..744470a3db1def703a58b2fc4215d66552b2e027 GIT binary patch literal 25845 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 literal 0 HcmV?d00001 diff --git a/images/sf2screen_fight_labeled.png b/images/sf2screen_fight_labeled.png new file mode 100644 index 0000000000000000000000000000000000000000..b4be2f493a7a424e353f834d0fac419d09fd6128 GIT binary patch literal 33792 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

(i*{~s}!H3_X5a3uB$NR@vP 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 j;*Tra%FU`+NDNp(Sh>% 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 literal 0 HcmV?d00001 diff --git a/test_cv_sf2_ai.py b/test_cv_sf2_ai.py new file mode 100644 index 0000000..fc29a8a --- /dev/null +++ b/test_cv_sf2_ai.py @@ -0,0 +1,62 @@ +import time + +import cv2 +import torch +import gym +import retro +import numpy as np +from stable_baselines3 import PPO +from stable_baselines3.common.vec_env import DummyVecEnv + +from custom_cnn import CustomCNN +from custom_sf2_cv_env import StreetFighterCustomWrapper + +def make_env(game, state, seed=0): + def _init(): + win_template = cv2.imread('images/pattern_wins_gray.png', cv2.IMREAD_GRAYSCALE) + lose_template = cv2.imread('images/pattern_lose_gray.png', cv2.IMREAD_GRAYSCALE) + env = retro.RetroEnv(game=game, state=state, obs_type=retro.Observations.IMAGE) + env = StreetFighterCustomWrapper(env, win_template, lose_template) + env.seed(seed) + return env + return _init + +game = "StreetFighterIISpecialChampionEdition-Genesis" +state_stages = [ + "Champion.Level1.ChunLiVsGuile", + "Champion.Level2.ChunLiVsKen", + "Champion.Level3.ChunLiVsChunLi", + "Champion.Level4.ChunLiVsZangief", + # Add other stages as necessary +] + +env = make_env(game, state_stages[0])() + +# Wrap the environment +env = DummyVecEnv([lambda: env]) + +policy_kwargs = { + 'features_extractor_class': CustomCNN +} +model = PPO( + "CnnPolicy", + env, + device="cuda", + policy_kwargs=policy_kwargs, + verbose=1 +) +model.load("ppo_sf2_cnn") + +obs = env.reset() +done = False + +while not done: + timestamp = time.time() + action, _ = model.predict(obs) + obs, rewards, done, info = env.step(action) + env.render() + render_time = time.time() - timestamp + if render_time < 0.0111: + time.sleep(0.0111 - render_time) # Add a delay for 90 FPS + +env.close() \ No newline at end of file diff --git a/test_street_fighter_ai.py b/test_street_fighter_ai.py index c257506..1898d61 100644 --- a/test_street_fighter_ai.py +++ b/test_street_fighter_ai.py @@ -1,11 +1,45 @@ import time +import cv2 import torch import gym import retro +import numpy as np + from stable_baselines3 import PPO from stable_baselines3.common.vec_env import DummyVecEnv + +def check_done(screen, win_template, lose_template, threshold=0.65): + gray_screen = cv2.cvtColor(screen, cv2.COLOR_RGB2GRAY) + win_res = cv2.matchTemplate(gray_screen, win_template, cv2.TM_CCOEFF_NORMED) + lose_res = cv2.matchTemplate(gray_screen, lose_template, cv2.TM_CCOEFF_NORMED) + + if np.max(win_res) >= threshold: + print("You win!") + return True + + if np.max(lose_res) >= threshold: + print("You lose!") + return True + +def get_health_points(screen): + # Get the player's HP + gray_screen = cv2.cvtColor(screen, cv2.COLOR_RGB2GRAY) + player_health_area = gray_screen[15:20, 32:120] + oppoent_health_area = gray_screen[15:20, 136:224] + + # Get health points using the number of pixels above 129. + player_health = np.sum(player_health_area > 129) / player_health_area.size + oppoent_health = np.sum(oppoent_health_area > 129) / oppoent_health_area.size + + # Helper function to get the max and min pixel values. + # max_pixel = np.max(player_health_area) + # min_pixel = np.min(player_health_area) + # avg = (max_pixel + min_pixel) / 2 + + return player_health, oppoent_health + rom_directory = "C:/Users/unitec/Documents/AIProjects/street-fighter-ai" retro.data.Integrations.add_custom_path(rom_directory) @@ -13,26 +47,31 @@ env = retro.RetroEnv( game='StreetFighterIISpecialChampionEdition-Genesis', state='Champion.Level3.ChunLiVsChunLi' ) +# Champion.Level1.ChunLiVsGuile # Champion.Level2.ChunLiVsKen # Champion.Level3.ChunLiVsChunLi - -env = DummyVecEnv([lambda: env]) +# env = DummyVecEnv([lambda: env]) model = PPO("CnnPolicy", env) model.load("trained_models/ppo_sf2_chunli_final") obs = env.reset() -while True: +game_over = False + +win_template = cv2.imread('images/pattern_wins_gray.png', cv2.IMREAD_GRAYSCALE) +lose_template = cv2.imread('images/pattern_lose_gray.png', cv2.IMREAD_GRAYSCALE) + +while not game_over: timestamp = time.time() action, _states = model.predict(obs) obs, rewards, done, info = env.step(action) env.render() + screen = env.unwrapped.get_screen() + get_health_points(screen) + game_over = check_done(screen, win_template, lose_template) render_time = time.time() - timestamp if render_time < 0.0111: time.sleep(0.0111 - render_time) # Add a delay for 90 FPS - if done: - break - obs = env.reset() env.close() \ No newline at end of file diff --git a/train_cv_sf2_ai.py b/train_cv_sf2_ai.py index 68e0968..5036a19 100644 --- a/train_cv_sf2_ai.py +++ b/train_cv_sf2_ai.py @@ -5,57 +5,23 @@ import numpy as np from stable_baselines3 import PPO from stable_baselines3.common.vec_env import DummyVecEnv, SubprocVecEnv from stable_baselines3.common.preprocessing import is_image_space, is_image_space_channels_first -from stable_baselines3.common.torch_layers import BaseFeaturesExtractor import torch import torch.nn as nn -# Custom feature extractor (CNN) -class CustomCNN(BaseFeaturesExtractor): - def __init__(self, observation_space: gym.Space): - super(CustomCNN, self).__init__(observation_space, features_dim=512) - self.cnn = nn.Sequential( - nn.Conv2d(1, 32, kernel_size=8, stride=4, padding=0), - nn.ReLU(), - nn.Conv2d(32, 64, kernel_size=4, stride=2, padding=0), - nn.ReLU(), - nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=0), - nn.ReLU(), - nn.Flatten(), - nn.Linear(3136, self.features_dim), - nn.ReLU() - ) - - def forward(self, observations: torch.Tensor) -> torch.Tensor: - return self.cnn(observations) - -# Custom environment wrapper for preprocessing -class CustomAtariWrapper(gym.Wrapper): - def __init__(self, env): - super().__init__(env) - # self.observation_space = gym.spaces.Box(low=0, high=255, shape=(84, 84, 1), dtype=np.uint8) - - def _preprocess_observation(self, observation): - observation = cv2.cvtColor(observation, cv2.COLOR_BGR2GRAY) - return np.expand_dims(observation, axis=-1) - - def reset(self): - observation = self.env.reset() - return self._preprocess_observation(observation) - - def step(self, action): - observation, reward, done, info = self.env.step(action) - return self._preprocess_observation(observation), reward, done, info +from custom_cnn import CustomCNN +from custom_sf2_cv_env import StreetFighterCustomWrapper def make_env(game, state, seed=0): def _init(): + win_template = cv2.imread('images/pattern_wins_gray.png', cv2.IMREAD_GRAYSCALE) + lose_template = cv2.imread('images/pattern_lose_gray.png', cv2.IMREAD_GRAYSCALE) env = retro.RetroEnv(game=game, state=state, obs_type=retro.Observations.IMAGE) - env = CustomAtariWrapper(env) + env = StreetFighterCustomWrapper(env, win_template, lose_template) env.seed(seed) return env return _init def main(): - # Set up the environment and model game = "StreetFighterIISpecialChampionEdition-Genesis" state_stages = [ @@ -67,12 +33,11 @@ def main(): ] num_envs = 8 - seed = 42 env = SubprocVecEnv([make_env(game, state_stages[0], seed=i) for i in range(num_envs)]) policy_kwargs = { - 'features_extractor_class': CustomCNN + 'features_extractor_class': CustomCNN } model = PPO( @@ -88,5 +53,3 @@ def main(): if __name__ == "__main__": main() - -# missing reward function \ No newline at end of file