Gfootball

Los avances recientes en el campo del aprendizaje por refuerzo han sido sustentados en entornos virtuales de aprendizaje como los videojuegos, donde nuevos algoritmos e ideas pueden ser probado rápidamente de manera segura y reproducible. En este sentido, Google ha presentado un nuevo entorno de investigación basado en el fútbol, un nuevo sistema de aprendizaje reforzado donde los agentes pueden entrenar y simular un partido de fútbol en un sistema 3D. El entorno resultante es desafiante, fácil para usar, personalizar y, además, está disponible bajo licencia de software libre.

Aparte de todo ello, Google nos ha proporcionado un formato capaz de crear experimentos multijugador y multiagente, es decir, capaz de realizar competiciones como https://www.kaggle.com/c/google-football/overview, una liga de IA dónde puedes ganar hasta 6000$ con tu algoritmo !!!!!

Dicho esto, en este artículo os vamos a enseñar como instalar este entorno, poder ejecutarlo, experimentar con él y jugar un partido contra vuestra propia IA.

1.Instalación

La instalación de este juego solamente puede realizarse en sistemas Linux o Mac siguiendo los siguientes comandos:

Linux

   sudo apt-get install git cmake build-essential libgl1-mesa-dev libsdl2-dev \
   libsdl2-image-dev libsdl2-ttf-dev libsdl2-gfx-dev libboost-all-dev \
   libdirectfb-dev libst-dev mesa-utils xvfb x11vnc libsdl-sge-dev python3-pip
   

Mac OS X

Para realizar esta instalación, es necesario tener instalado brew, un programa de instalación va explicando paso a paso el proceso, qué es lo que va a hacer y se toma una pausa para confirmar antes de empezar con cada uno de los pasos.

Una vez instalado, se deben ejecutar los siguientes comandos:

     brew install git python3 cmake sdl2 sdl2_image sdl2_ttf sdl2_gfx boost boost-python3
   
   

Para instalar pygame, además, será necesario los siguientes paquetes:

     brew install sdl sdl_image sdl_mixer sdl_ttf portmidi
   
   

Posteriormente, ya se puede utilizar la librería con nuestro proyecto con el siguiente comando:

     pip3 install gfootball
   
   
Por último, y como test, podemos realizar una partida contra la IA base del juego:
 python3 -m gfootball.play_game --action_set=full
   

Ya está. Os aparecerá una imagen como la siguiente:

Ejemplo de visualización del juego
   de fútbol de google para entrenar ia de google
1 Ejemplo de visualización del juego de fútbol de google para entrenar IA del google.

Guía de comandos:

  • FLECHA ARRIBA: corre hacia arriba.
  • FLECHA ABAJO: corre hacia abajo.
  • FLECHA A LA IZQUIERDA; corre hacia la izquierda.
  • FLECHA DERECHA:corre hacia la derecha.
  • S: pase corto en el modo de ataque, presión en el modo de defensa.
  • A: pase alto en el modo de ataque, deslizándose en el modo de defensa.
  • D: tiro en el modo de ataque, presión del equipo en el modo de defensa.
  • W: pase largo en el modo de ataque, presión del portero en el modo de defensa.
  • Q: cambia el jugador activo en el modo de defensa.
  • C: regate en el modo de ataque.
  • E: sprint.

El resultado será parecido al que podéis encontrar en el siguiente video: https://youtu.be/YKv3WTZcV28

2.Implementa tu IA para el concurso

En este apartado nos centraremos en el código necesario para implementar la IA. Dentro del proyecto https://github.com/al118345/OpenAi_Examples existe una carpeta llamada code encontraremos un paquete llamado gfootball todos los proyectos dedicados a este proyecto ( https://github.com/al118345/OpenAi_Examples/tree/master/code/gfootball

En una primera aproximación, se ha querido experimentar un poco con la representación de los jugadores, la pelota, su posición en el campo y qué valores representan cada uno de ellos.

Para llevar a cabo este objetivo, hemos utilizado el entorno "GFootball-11_vs_11_kaggle-SMM-v0" donde se utiliza el contenedor SMMWrapper para devolver cuadros que muestran las posiciones del equipo, la posición de la pelota y la posición actual del jugador activo.

Estas tramas pueden ser utilizadas por una red neuronal convolucional, pero primero requieren un procesamiento que podría consistir en:

  • Reorganización Las capas convolucionales 2D suelen esperar una entrada con la forma (None, x, y, c), donde c es el canal de color. Necesitamos dividir la matriz de observación (x, y, 4) en 4 matrices.
  • Escalada El rango de datos es 0 -> 255. Es necesario escalar a 0 -> 1.
  • Añadiendo tiempo Los marcos estáticos no transmiten dirección o velocidad, solo posición. Podemos agregar información temporal a cada fotograma de dos maneras:
    • Recordar los n fotogramas anteriores y entregarlos a la red en la forma (None, x, y, n_buffer).
    • Recordar el fotograma anterior y calcular la diferencia entre este y el último fotograma.

Sin entrar mucho más en este apartado, podemos ver en la siguiente imagen un ejemplo de esta representación. En la parte superior se representa ambos equipos y en la inferior la pelota y la posición del jugador activo en cada jugada.

Ejemplo de visualización de un partido
      de fútbol de gfootball distribuida por los diferentes componentes del juego
2 Ejemplo de visualización de un partido de fútbol de gfootball distribuida por los diferentes componentes del juego.

El código utilizado lo podéis encontrar en la siguiente url https://github.com/al118345/OpenAi_Examples/blob/master/code/gfootball/__init__.py

3-Visualizar un agente.

Ahora bien, ¿qué pasa si quieres visualizar un agente?. Para ello he implementado la subcarpeta ejemplo_test_agente_envideo ( link ) que está compuesta por los siguientes ficheros:

  • template.py: Ejemplo de agente completamente aleatorio. Utilizo este algoritmo como test, entiendo que un agente aleatorio es perfecto para comparar comportamientos.
  • submission.py: Ejemplo de agente inteligente. Es un ejemplo de cómo implementar un agente proponiendo una strategy de golpear a portería cuando estás cerca, pasar cuando estás en medio del campo o en tu área
  • __init__.py: Fichero compuesto por el siguiente código:
         from kaggle_environments import make
         env = make("football", configuration={"save_video": True, "scenario_name": "11_vs_11_kaggle","logdir": "." ,
           "render": True, "running_in_notebook": False})
         output = env.run(["submission.py","template.py"])[-1]
         print('Left player: reward = %s, status = %s, info = %s' % (output[0]['reward'], output[0]['status'], output[0]['info']))
         print('Right player: reward = %s, status = %s, info = %s' % (output[1]['reward'], output[1]['status'], output[1]['info']))
         env.render(mode="human", width=800, height=600)
       

    Este ejemplo tiene como elemento importante la configuración del entorno. Mediante el configuración "save_video": True y "logdir": "." podemos generar una carpeta con un fichero .webm dónde se almacena de forma visual el comportamiento del agente.

    Por último, la línea output = env.run(["submission.py","template.py"])[-1] sirve para informar al juego de qué agente estará en la partida. En la parte izquierda el agente inteligente y en la derecha el random en mi caso.

El resultado de esta implementación lo podéis consultar en la url https://youtu.be/YKv3WTZcV28 y para más información esta disponible Documentación kaglle sobre la librería kaggle_environments

Código de ejemplo

En el repositorio https://github.com/al118345/OpenAi_Examples he dejado disponible el código utilizado en este proyecto y el siguiente video https://www.youtube.com/watch?v=ME2FxGIzG7E explicativo: