Saturday, October 14, 2017

openAI gym을 이용해서 슈퍼마리오 설치해서 자동 플레이 하기


윈도우에서 openAI Gym을 이용해서 슈퍼마리오 AI 플레이 만들기


1. 윈도우 서브시스템 리눅스에 openAI Gym 설치하기
http://jinman190.blogspot.ca/2017/10/openai-gym.html

2. openAI gym을 이용해서 슈퍼마리오 설치해서 자동 플레이 하기
지금 여기

3. 슈퍼마리오에 모두를 위한 RL 수업의 딥러닝 코드 붙이기
http://jinman190.blogspot.ca/2017/10/rl.html

4. 슈퍼마리오의 딥러닝 코드 효율적으로 고쳐보기








목표: 슈퍼마리오를 파이썬 코드로 자동 플레이 하기 (랜덤 입력으로)


우선 슈퍼마리오 소스를 openAI gym에 추가 시켜줘야 한다.
gym에는 몇몇 아타리 게임 등이 있는데 슈퍼마리오는 들어있지 않다.

내가 받은 곳은
https://github.com/ppaquette/gym-super-mario

어떤 분이 수정 보완 되었다고 알려주신 링크 (난 이걸로 안했음)
https://github.com/chris-chris/gym-super-mario



위 링크의 설명을 보면... 리눅스에서 우선 gym-pull을 설치하고


$pip install gym-pull

아래 코드를 파이썬에서 실행하면 된다는데

import gym
import gym_pull
gym_pull.pull('github.com/ppaquette/gym-super-mario') # 한번만 실행하면 됨
env = gym.make('ppaquette/SuperMarioBros-1-1-v0') # 안됨

소스 끌어오기는 되는데 게임이 실행되지 않는다.




그냥 어떻게든 직접 해보자.

git에서 직접 소스를 받는다.

야매 프로그래머인 나는 윈도우의 노예이므로 그냥 윈도우용 git 프로그램으로 받는다.

http://github.com/ppaquette/gym-super-mario





우선 위 링크 질의응답 쪽에 써있는대로 fceux를 깔아야 한다.
(일반 패미컴 게임 에뮬레이터)

$ sudo apt-get install fceux





그리고 받은 소스를 gym 환경에 복사해줘야 한다.
만약에 gym을 가상환경 없이 깔았으면
/gym 폴더가 있을텐데

(tensorflow)$ 가상 환경을 켜놓은 채로 깔았으면 다음과 같은 폴더에 gym이 있을 것이다.
/tensorflow/local/lib/python3.5/site-packages/gym


그 곳에 이 슈퍼마리오 소스의 ppaquette_gym_super_mario 폴더를 복사해줘야 한다.
주의: git에서 제일 상위 디렉토리가 아니라 ppaquette_gym_super_mario 폴더

잘못 복사하면 나중에 소스를 실행할 때
No module named 'gym.envs.ppaquette_gym_super_mario' 같은 에러가 뜬다.



윈도우의 c:/gym-super-mario/에 소스를 받았다 치고 ->

가상 환경 없이 깔린 gym이면 이렇게
$ sudo cp -r /mnt/c/gym-super-mario/ppaquette_gym_super_mario ~/gym/gym/envs

가상 환경의 gym이면 이렇게
$ sudo cp -r /mnt/c/gym-super-mario/ppaquette_gym_super_mario /tensorflow/local/lib/python3.5/site-packages/gym/envs/

본인이 받은 소스가 c 드라이브의 어디 있는지 잘 보고 디렉토리를 입력하자
(리눅스에서 받았으면 리눅스의 어디에 받았는지 확인)
주의: /mnt/c/ 까지는 소문자로만 쳐야 함






그리고 이 전 글에서 게임 이름만 바꿔서 랜덤 플레이 소스를 실행해보면

import gym
env = gym.make('SuperMarioBros-1-1-v0')
env.reset()
for _ in range(10000):
    env.render()
    env.step(env.action_space.sample()) # take a random action

에러가 난다 ㅠㅜ
error.UnregisteredEnv('No registered env with id: {}'.format(id))


이 것은 게임 정보를 gym 환경에 추가시켜주지 않아서 나는 에러이다.


이 것을 참고해서 코드를 추가하고 게임을 실행하면 된다.


윗 글에는 gym 환경에 들어가서 파일을 고치라는데 난 보기 쉽게 내가 돌릴 코드에 다 넣었다. (아무데나 추가해도 된다)



자 이제 아래 코드를 실행하면 된다.

import gym
from gym.envs.registration import register
from gym.scoreboard.registration import add_group
from gym.scoreboard.registration import add_task

register(
     id='SuperMarioBros-1-1-v0',
     entry_point='gym.envs.ppaquette_gym_super_mario:MetaSuperMarioBrosEnv',
)

add_group(
     id='ppaquette_gym_super_mario',
     name='ppaquette_gym_super_mario',
     description='super_mario'
)

add_task(
    id='SuperMarioBros-1-1-v0',
    group='ppaquette_gym_super_mario',
    summary="SuperMarioBros-1-1-v0"
)

env = gym.make('SuperMarioBros-1-1-v0')
env.reset()
for _ in range(10000):
    env.render()
    env.step(env.action_space.sample()) # take a random action
중요한 내용은 아니고 고칠 일도 없으니 그냥 복사해서 쓰면 된다.




완성. 10000프레임 실행되고 종료된다.
딥러닝 플레이가 아니라 슈퍼마리오에게 우선 랜덤으로라도 코드에서 입력을 할 수 있는지 확인하기 위한 코드이다.
저 위 코드의 env.step()의 입력을 딥러닝 코드로 바꾸면 되는 것이다.




윈도우용 VS로 코드를 쓰고 우분투 앱에서 슈퍼마리오를 돌리는 화면









No comments:

Post a Comment

슈퍼마리오에 모두를 위한 RL 수업의 딥러닝 코드 붙이기

윈도우에서 openAI Gym을 이용해서 슈퍼마리오 AI 플레이 만들기 1. 윈도우 서브시스템 리눅스에 openAI Gym 설치하기 http://jinman190.blogspot.ca/2017/10/openai-gym.html 2. ope...