Descubriendo AWS DeepRacer: Aprendizaje en la Pista de Carreras
Tags: aws, deepracer, machinelearning, iot
Published: 2023-11-06 15:56:11

---
series: Descubriendo AWS DeepRacer
---

Bienvenidos a este episodio donde exploraremos uno de los dispositivos más interesantes en el campo de la **inteligencia artificial** y el aprendizaje automático: **AWS DeepRacer**. 

Vamos a ver cómo funciona y cómo puedes entrenar tu propio modelo para competir en las pistas virtuales y reales.

## ¿Qué es AWS DeepRacer?

AWS DeepRacer es una iniciativa de Amazon Web Services que combina el aprendizaje por refuerzo con vehículos autónomos en miniatura. Se trata de un coche de escala 1/18 que está completamente equipado con sensores y cámaras, lo cual te permite navegar y aprender de su entorno. Pero AWS DeepRacer no es solo un juguete, es una herramienta educativa diseñada para enseñar y experimentar con el aprendizaje por refuerzo, una rama avanzada del aprendizaje automático.

Aquí tenéis el desglose del hardware de DeepRacer:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vcmws3bah2wvoabmzb4g.png)

- **Coche a escala 1**:18 4WD: Un vehículo todo terreno a escala que proporciona la base física para todas las capacidades autónomas.
- **Procesador Intel Atom**: El cerebro del coche, un procesador compacto y eficiente que permite realizar computaciones complejas.
- **Toolkit Intel de OpenVINO**: Una distribución de herramientas para optimizar la inferencia de visión por computadora y el rendimiento del aprendizaje profundo.
- **Cámara estéreo de 4MP**: Proporciona visión binocular para detectar la profundidad y permitir la percepción 3D del entorno. Es capaz de capturar 15 imágenes por segundo, lo que permite realizar un análisis detallado de la situación de carrera.
- **Sensor Lidar de 360 grados con radio de escaneo de 12 metros**: Permite detectar objetos y medir distancias alrededor del coche, fundamental para la navegación y la evitación de obstáculos.
- **Memoria del sistema**: 4 GB de RAM: Memoria suficiente para el procesamiento de datos y la ejecución de algoritmos en tiempo real.
- **Wi-Fi 802.11ac**: Conectividad inalámbrica para comunicación y transferencia de datos.
- **Ubuntu 20.04 Focal Fossa**: Un sistema operativo basado en Linux que proporciona una base sólida para la operación y desarrollo de software.
- **ROS 2 Foxy Fitzroy**: La última versión del Sistema Operativo de Robótica que ofrece un framework para escribir software de robots.

## ¿Cómo Funciona AWS DeepRacer?

AWS DeepRacer utiliza una técnica de inteligencia artificial conocida como **aprendizaje por refuerzo** (Reinforcement Learning - RL). 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hnszxqp1kfaoya129yn7.png)

Probablemente te preguntarás qué diferencias hay entre este tipo de aprendizaje y otros modelos como el aprendizaje Sypervisado y No Supervisado. 

- El **Aprendizaje Supervisado** es como aprender con un libro de texto que tiene las respuestas al final (lo que llamamos en Machine Learning, etiquetas). Sabes exactamente si lo que estás haciendo es correcto o incorrecto basándote en esas respuestas.
- En el **Aprendizaje No Supervisado** es como explorar un nuevo tema por tu cuenta sin una guía específica (es decir, sin etiquetas). Estás tratando de encontrar patrones o estructuras por ti mismo.
- En cambio, el **Aprendizaje por Refuerzo (RL)** es como aprender a jugar a un videojuego. No sabes las reglas al principio, pero a medida que juegas, descubres qué acciones te dan puntos y cuáles te hacer perder.

Si trasladamos esta definición a DeepRacer, en RL, un agente (en este caso, el coche de AWS DeepRacer) toma decisiones y realiza acciones dentro de un entorno (la pista de carreras) para alcanzar un objetivo (terminar la carrera lo más rápido posible).

El coche cuenta con una serie de sensores que le permiten percibir su entorno, pero el verdadero cerebro detrás de las operaciones es el modelo de aprendizaje por refuerzo. Este modelo se entrena mediante simulaciones donde recibe recompensas virtuales por acciones que consideramos correctas, como mantenerse en la pista, y penalizaciones por acciones no deseadas, como salirse de la pista o chocar contra algún objeto.

## Elementos de DeepRacer

Para comprender cómo funciona AWS DeepRacer, es importante definir los componentes fundamentales del aprendizaje por refuerzo que utiliza:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fszr8cvv79tfzja9bjt9.png)

**Agente**
En el contexto de AWS DeepRacer, el agente es el modelo de aprendizaje por refuerzo que "conduce" el coche. El agente es el que toma decisiones basado en la información que recibe del entorno para intentar maximizar su recompensa a lo largo del tiempo. En otras palabras, el agente es el cerebro detrás de las acciones que el coche realiza.

**Entorno**
El entorno es el mundo en el cual el agente opera. En el caso de AWS DeepRacer, el entorno incluye la pista de carreras, las reglas de cómo el coche puede moverse y cualquier obstáculo o desafío que la pista pueda presentar. El entorno es dinámico, lo que significa que cambia con cada acción que el agente toma.

**Estado**
El estado representa la percepción instantánea del agente de su entorno. En DeepRacer, un estado podría incluir la posición del coche en la pista, la velocidad, la orientación y las imágenes captadas por la cámara frontal. Estos estados son utilizados por el agente para decidir qué acción tomar a continuación.

**Acción**
Una acción es una decisión específica tomada por el agente en un estado dado. Para AWS DeepRacer, las acciones pueden incluir acelerar, desacelerar, girar a la izquierda o derecha en diferentes ángulos, entre otras. El conjunto de todas las acciones posibles que el agente puede tomar se denomina "espacio de acción".

**Función de Recompensa**
La función de recompensa es una fórmula que el diseñador del modelo establece para guiar al agente hacia el comportamiento deseado. Esta función otorga una puntuación al agente después de cada acción, basada en el estado actual y la acción realizada. Por ejemplo, si queremos que el coche se mantenga en la pista, la función de recompensa puede dar una puntuación alta cada vez que el agente elige una acción que mantiene al coche en el centro de la pista. Por el contrario, podemos penalizar al agente si el coche se sale de la pista o se choca con un obstáculo.

**Episodio**
Un episodio es una secuencia de estados, acciones y recompensas que termina cuando se alcanza una condición terminal, como completar una vuelta alrededor de la pista o salirse de ella. Cada episodio representa una oportunidad de aprendizaje para el agente, donde puede evaluar su desempeño general basado en la suma de recompensas que recibió y ajustar su estrategia para el siguiente episodio.

Todos estos componentes trabajan en conjunto para crear un **ciclo de aprendizaje** que permite al modelo de DeepRacer mejorar a lo largo del tiempo, aprendiendo de las experiencias pasadas y afinando sus predicciones y elecciones de acciones para maximizar la suma total de recompensas obtenidas.

## Entrenando tu Modelo de AWS DeepRacer

Entrenar un modelo para AWS DeepRacer es un proceso que no es complicado, incluso si no se tiene una gran experiencia en aprendizaje automático. A continuación os detallamos cómo comenzar:

**1. Definición del Problema y Recompensas**
El primer paso es definir claramente el problema y el sistema de recompensas. ¿Qué es lo que quieres que tu coche haga? Por lo general, querrás que complete la pista en el menor tiempo posible, evitando salirse de ella. Se define una función de recompensa que otorga puntos al modelo por comportamientos deseados y penaliza los no deseados.

**2. Entorno de Simulación**
AWS proporciona un entorno de simulación en la nube donde puede entrenar su modelo. Puedes elegir diferentes pistas y condiciones para que tu modelo aprenda en una variedad de entornos virtuales.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8uq9821rtnu6exer61j0.png)

**3. Entrenamiento y Evaluación**
Una vez definido el problema y el entorno, es hora de entrenar tu modelo. Esto se hace a través del servicio **AWS RoboMaker**, que simula las pistas de carrera y permite que el modelo interactúe con ellas. Durante el entrenamiento, se recopilan datos y se ajustan los parámetros del modelo para mejorar su rendimiento.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xe7wzzjrji6hjlafdrh0.png)

A alto nivel, el proceso de aprendizaje en AWS DeepRacer se centra en tres componentes clave: Acción, Recompensa y Estado.

3.1. El **agente** observa el **estado actual** (por ejemplo, una imágen de la pista).
3.2. Basándose en ese estado y en lo que ha aprendido hasta ahora, decide realizar una **acción** (girar a la derecha o izquierda).
3.3. El agente ejecuta esa acción en la simulación, lo que le lleva a un **nuevo estado**.
3.4. El agente recibirá una **recompensa** basada en qué tan buena fue esa acción en ese contexto.
3.5. Con la recompensa recibida, el agente ajusta su comportamiento y mejora sus decisiones futuras.

**4. Iteración y Ajuste**
El aprendizaje por refuerzo es un proceso iterativo. Probablemente necesitarás ajustar tu función de recompensa y reentrenar el modelo varias veces basándote en los resultados que observes.

**5. Pruebas en el Mundo Real**
Una vez satisfecho con el modelo en la simulación, puedes descargarlo y cargarlo en un coche DeepRacer físico (utilizando OpenVino). Ahora estás listo para poner a prueba tu modelo en una pista de carreras real.

## **Hiperparámetros**

En el contexto de AWS DeepRacer y el aprendizaje por refuerzo en general, los hiperparámetros son configuraciones que gobiernan cómo se entrena el modelo de inteligencia artificial. Estos hiperparámetros son ajustes que se hacen antes del entrenamiento y no se modifican durante el proceso de aprendizaje. Son cruciales porque tienen un gran impacto en la velocidad y la calidad del entrenamiento del modelo.

Aquí hay algunos ejemplos de hiperparámetros en AWS DeepRacer:

**1. Tasa de aprendizaje (Learning Rate):**
Es uno de los hiperparámetros más importantes. Determina cuánto se actualizan los pesos de la red neuronal en cada paso de entrenamiento. Un valor muy alto puede hacer que el entrenamiento sea inestable, mientras que un valor muy bajo puede hacer que el entrenamiento sea muy lento y posiblemente quede atrapado en mínimos locales.

```
learning_rate = 0.0003
```
**2. Ratio de descuento (Discount Factor):**
También conocido como gamma, este hiperparámetro afecta cuánto valor futuro se considera en las recompensas. Un valor cercano a 1 hará que el agente considere las recompensas futuras casi tanto como las inmediatas, mientras que un valor más bajo hará que el agente favorezca recompensas a corto plazo.

```
discount_factor = 0.99
```

**3. Número de épocas (Number of Epochs):**
Indica cuántas veces el algoritmo de aprendizaje trabajará en todo el conjunto de datos de entrenamiento. Un epoch más alto podría significar un modelo mejor entrenado, pero también más tiempo de entrenamiento y el riesgo de sobreajuste.

```
num_epochs = 10
```
Los hiperparámetros deben ser cuidadosamente seleccionados y a menudo se requiere de una fase de prueba y error u otros métodos para encontrar el conjunto de hiperparámetros que funcione mejor para el problema específico y el conjunto de datos. En la consola de DeepRacer, AWS proporciona una interfaz para configurar fácilmente estos hiperparámetros antes de comenzar el proceso de entrenamiento.

## **Exploración vs Explotación**

La función de Exploración vs. Explotación es un concepto clave en el aprendizaje por refuerzo, que es la base del entrenamiento de modelos en AWS DeepRacer. Este concepto aborda el dilema entre explorar nuevas acciones para descubrir cuáles podrían llevar a mejores recompensas a largo plazo, frente a explotar el conocimiento actual para maximizar la recompensa en el corto plazo. En el contexto de AWS DeepRacer, esto se traduce en cómo el coche decide entre seguir una estrategia que ya sabe que funciona bien y probar nuevos caminos o estrategias que podrían resultar en un mejor tiempo de vuelta o una conducción más eficiente.

**Exploración**
La exploración implica probar acciones que no se han probado antes o no se han probado mucho. El propósito de la exploración es recopilar más información sobre el entorno. En AWS DeepRacer, esto podría significar tomar curvas de forma diferente o variar la velocidad en diferentes partes de la pista para encontrar una estrategia óptima que no se haya descubierto aún.

**Explotación**
La explotación utiliza la información recopilada hasta el momento para tomar decisiones que se cree que maximizarán la recompensa. En AWS DeepRacer, esto significa utilizar el conocimiento adquirido sobre qué acciones llevan al mejor desempeño en la pista para intentar dar la vuelta más rápida posible.

**Balance entre Exploración y Explotación**
En las primeras etapas del entrenamiento de un modelo de DeepRacer, generalmente se pone un mayor énfasis en la exploración para asegurarse de que el modelo tenga una comprensión amplia del espacio de acciones. Conforme se recopila más información y el modelo comienza a converger hacia un buen comportamiento, el enfoque puede cambiar hacia la explotación para perfeccionar la estrategia.

Demasiada exploración puede significar que nunca se optimiza suficientemente para encontrar la mejor ruta, mientras que demasiada explotación puede hacer que el modelo se quede atascado en un mínimo local y no encuentre una estrategia de conducción que podría ser significativamente mejor.

## **Arquitectura DeepRacer**

AWS DeepRacer integra una suite de servicios de AWS para proporcionar una experiencia de aprendizaje y competición en inteligencia artificial completa y en tiempo real, incluyendo:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hjc2d4qcmo89m6hj17fk.png)

**- Amazon SageMaker:** es el corazón del entrenamiento del modelo. Permite entrenar el modelo usando imágenes y datos de la pista.
**- Amazon RoboMaker:** simula el entorno de la pista y el vehículo. Permite al modelo "conducir" en un entorno virtual antes de ser probado en un vehículo a escala.
**- Amazon S3:** se utiliza para almacenar datos y modelos. Las imágenes de la pista, los datos de entrenamiento y los modelos entrenados se guardan aquí.
**- Amazon Kinesis Video Streams:** Una vez que el vehículo está en movimiento, Kinesis Video Streams captura y transmite vídeo en tiempo real mientras el vehículo navega por la pista.
**- Amazon CloudWatch:** monitorea y registra las métricas y logs del proceso de entrenamiento y de las carreras. Nos permite ver cómo está aprendiendo el modelo y cómo se desempeña.

## **Función de Recompensa**

La función de recompensa en AWS DeepRacer es la **CLAVE** para guiar al agente (el coche) en cómo debe comportarse en la pista. Para programar esta función utilizaremos Python-3.

**¿Dónde puedes programar la función de recompensa?**

Puedes programar y editar la función de recompensa directamente en la consola de AWS DeepRacer. AWS proporciona un editor de código integrado donde puedes escribir y modificar el código de tu función de recompensa. Este entorno está basado en la nube y te permite probar la función de recompensa mediante simulaciones virtuales.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dav1gd155hk7nbuhqdzh.png)

**¿Puedo programar la función de recompensa en mi entorno local?**
Sí, es posible escribir y probar la función de recompensa de AWS DeepRacer en tu entorno local. Sin embargo, hay algunas consideraciones a tener en cuenta:

**1. Entorno de Desarrollo Local**: Puedes escribir la función de recompensa usando tu editor de texto o IDE favorito en tu portátil o computadora de casa. Esto solo involucra la redacción del código de la función en Python.

**2. Simulación y Pruebas:** Aunque puedes escribir la función localmente, para probarla efectivamente necesitas un entorno que simule la pista de DeepRacer y la interacción del vehículo con ella. AWS ofrece este entorno de simulación a través de AWS RoboMaker, y mientras es posible configurar una simulación de RoboMaker de manera local, hacerlo es complejo y requiere una configuración detallada. 

En resumen, para el desarrollo de la función de recompensa, sí puedes trabajar localmente, pero para una prueba efectiva de cómo se desempeña la función en la pista, generalmente necesitarías usar la consola de AWS y sus servicios asociados.

**¿Qué parámetros puedo utilizar en mi función de recompensa?**

Tenéis disponible la siguiente lista de parámetros que podréis utilizar en vuestra función de recompensa:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/11z8z5tydzij02437jpu.png)

**Ejemplos de funciones de recompensa**

Veamos ahora algunos ejemplos de funciones de recompensa. El código de tu función debe definir y devolver un valor numérico (normalmente entre 0 y 1) que representa qué tan bien la acción tomada por el agente cumple con el objetivo deseado. A continuación, os presentamos algunos ejemplos de funciones de recompensa para diferentes comportamientos en la pista:

**1. Recompensa por mantenerse dentro de los límites de la pista:**

```
def reward_function(params):
    '''
    Example of rewarding the agent to stay inside the two borders of the track
    '''
    
    # Read input parameters
    all_wheels_on_track = params['all_wheels_on_track']
    distance_from_center = params['distance_from_center']
    track_width = params['track_width']
    
    # Give a very low reward by default
    reward = 1e-3

    # Give a high reward if no wheels go off the track and
    # the agent is somewhere in between the track borders
    if all_wheels_on_track and (0.5*track_width - distance_from_center) >= 0.05:
        reward = 1.0

    # Always return a float value
    return float(reward)
```

**2. Recompensa por mantenerse cerca del centro:**

```
def reward_function(params):
    '''
    Example of rewarding the agent to follow center line
    '''

    # Read input parameters
    track_width = params['track_width']
    distance_from_center = params['distance_from_center']

    # Calculate 3 markers that are at varying distances away from the center line
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width

    # Give higher reward if the car is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1.0
    elif distance_from_center <= marker_2:
        reward = 0.5
    elif distance_from_center <= marker_3:
        reward = 0.1
    else:
        reward = 1e-3  # likely crashed/ close to off track

    return float(reward)
```

**3. Recompensa por evitar zig-zaguear en pista:**

```
def reward_function(params):
    '''
    Example of penalize steering, which helps mitigate zig-zag behaviors
    '''
    # Read input parameters
    distance_from_center = params['distance_from_center']
    track_width = params['track_width']
    abs_steering = abs(params['steering_angle']) # Only need the absolute steering angle
    # Calculate 3 marks that are farther and father away from the center line
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width
    # Give higher reward if the car is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1.0
    elif distance_from_center <= marker_2:
        reward = 0.5
    elif distance_from_center <= marker_3:
        reward = 0.1
    else:
        reward = 1e-3  # likely crashed/ close to off track
    # Steering penality threshold, change the number based on your action space setting
    ABS_STEERING_THRESHOLD = 15 
    # Penalize reward if the car is steering too much
    if abs_steering > ABS_STEERING_THRESHOLD:
        reward *= 0.8
    return float(reward)
```
Cada función de recompensa puede ser tan simple o compleja como necesitéis, y a menudo involucrará una combinación de varios factores para alentar múltiples comportamientos deseables. Además, después de programar vuestra función, deberéis probarla y perfeccionarla en función de los resultados de las simulaciones. Tenéis que encontrar el balance adecuado que permita a vuestro modelo de DeepRacer desempeñarse óptimamente en la pista.



## **Conclusión**
AWS DeepRacer ofrece una forma práctica de adentrarse en el mundo del aprendizaje por refuerzo. No sólo proporciona una plataforma para aprender y experimentar con IA, sino que también ofrece la posibilidad de participar en la **[liga AWS DeepRacer](https://aws.amazon.com/deepracer/league/)**, donde fans de todo el mundo compiten con los modelos que han entrenado.

En el siguiente episodio nos adentraremos en un ejemplo práctico de cómo entrenar nuestro primer modelo.