Dino – DL: una red neuronal que juega el “Dinosaurio de Chrome”
febrero 6, 2021Índice
Introducción
A todos nos ha aparecido esta imagen cuando perdemos la conexión a Internet:
Si quieren jugar, sin necesidad de desconectarse a internet, pueden hacerlo en este enlace: chrome://dino/
La verdad es que es un juego muy adictivo (he dedicado mucho de mi tiempo xD). Luego de jugar mucho tiempo, me pregunté: ¿Y si dejo a mi ordenador que jugara por mi? ¿Podrá romper mi récord? ¿Cómo podría hacerlo?
En resumen, mi modelo debe ser capaz de tomar una decisión, ya sea saltar o no hacer nada (voy a acotar el problema a estas dos opciones), en función de la imagen actual.
Bueno, dar instrucciones a mi teclado usando Python es muy fácil, ya que tenemos la librería pyautogui. Pero, ¿Cómo mi ordenador sabrá si debe o no SALTAR? Pues necesitamos un modelo que pueda reconocer la imagen automáticamente y predecir si debe o no SALTAR. Exacto, un modelo Deep Learning.
Pero, mi modelo basado en Deep Learning necesita ser entrenado para predecir si debe SALTAR o no. Necesitamos darle datos de entrada.
1. Descargando imágenes
Como he comentado anteriormente, necesitamos datos de entrada para poder entrenar nuestro modelo DL.
El siguiente código Python realiza ese proceso. Este código realiza lo siguiente:
- Realiza captura de pantalla.
- Graba las acciones del teclado.
Bueno, para realizar capturas de pantalla, tenemos que jugar (que aburrido xD).
Para realizar capturas de pantalla hacemos uso de la librería PIL y para grabar las acciones que realizamos con el teclado (solo SALTAR) usamos la librería keyboard.
Luego de tener la lista de imágenes y sus acciones (SALTAR o NADA), hacemos una división 70%-30%, 70% usaremos para entrenar nuestros modelos y el 30% para validar nuestro modelo.
Un ejemplo de imágenes capturadas se pueden encontrar en este enlace.
Listo, conjunto de datos ok. Ahora a entrenar nuestro modelo!!!
2. Entrenando y evaluando el modelo
El siguiente código en Jupyter Notebook explica los pasos que realicé para entrenar el modelo. Es importante tener en cuenta lo siguiente:
Datos desbalanceados
Menos del 20% de las imágenes están asociados a SALTAR. Es un claro ejemplo de datos desbalanceados. Si entrenamos un modelo con estos datos desbalanceados, el modelo se inclinará hacía la clase más representativa, es decir, NADA. Una posible solución es dando mayor peso a la clase menos representativa y menor peso a la clase más representativa.
Transferencia de Aprendizaje
Vamos a aprovechar un modelo que ha aprendido de un gran conjunto de imágenes. Este modelo pre-entrenado es MobileNet.
La principal ventaja de usar modelos preentrenados, es que partimos de un modelo que ha aprendido de millones de imágenes; es un modelo que es capaz de identificar patrones importantes. Lo único que tenemos que hacer es retirar la última capa (cuya salida es de mil neuronas) y añadir una capa con una neurona. Esta neurona estará relacionado con la acción de SALTAR.
La siguiente imagen resume la transferencia de aprendizaje:
Decidí usar MobileNet, ya que quiero que el modelo sea portable (pese poco) y prediga las acciones muy rápido.
Regularización y callbacks
Unas técnicas para que nuestro modelo pueda generalizar y no sobreajustar son:
- Regularización. Añadimos una restricción en forma de regularización a nuestras pesos.
- Callbacks. En este caso usamos:
- parada temprana (early stooping), si vemos que nuestro modelo no mejora la métrica (cross entropía) en nuestro conjunto de validación, detenemos el entrenamiento y nos quedamos con los mejores pesos.
- learning rate: , si vemos que nuestro modelo no mejora la métrica (cross entropía) en nuestro conjunto de validación, reducimos nuestro ratio de aprendizaje.
Otros puntos interesantes que pueden probar:
- Aumento de datos: por ahora el modelo funciona bien si la pestaña de chrome con el juego ocupa toda la pantalla. Pero, ¿Qué pasaría si reducimos, o cambiamos el tamaño de la pestaña del juego? ¿Funcionará igual?
- Otros modelos preentrenados. Si bien MobileNet tiene buenos resultados ¿VGG16 será mejor? ¿Inception?…
- Pueden dejar en los comentarios si tienen otras cosas interesantes 😉
3. ¡A probar!
Luego de entrenar y guardar nuestro modelo, ¡Es momento de probar el modelo!
El siguiente código Python realiza ese proceso. Este código realiza lo siguiente:
- Carga en memoria el modelo entrenado en el paso 2.
- Captura la imagen. Para eso usa la librería PIL.
- Predice la acción (SALTAR o no) usando el modelo.
El siguiente video muestra a nuestro modelo jugando 😀
Y eso es todo, hemos creado un modelo que puede jugar este popular juego.
El código completo lo pueden encontrar en el siguiente enlace: https://github.com/Jazielinho/dino_dl
Todo comentario es bienvenido.
[…] en los pasos que realizamos en la publicación del juego de Dino, realizaremos lo […]
Appreciate it. A lot of info!
En linux tuve que remplazar la librería de
from PIL import ImageGrab
por
import pyscreenshot as ImageGrab
gracias por tu blog, ando aprendiendo mucho
Muchas gracias a ti por tu comentario
Hola, soy nuevo en python, y estoy tratando de correr la app, ya importe las librerias pero aun no me deja correrlo, hay algo mas que tenga que hacer?