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로 코드를 쓰고 우분투 앱에서 슈퍼마리오를 돌리는 화면









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

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