2 minute read

Estratificación del dataset

Para modelar los estados de conducción se definió una estratificación conjunta steer × throttle, generando 20 clases discretas.

Clasificación del steer

Clase Descripción
0 fuerte izquierda
1 suave izquierda
2 recto
3 suave derecha
4 fuerte derecha

Clasificación del throttle

Clase Descripción
0 muy lento
1 lento
2 medio
3 muy rápido

Cada muestra se asigna a una clase:

class_20 = steer_class × 4 + throttle_class

Esto permite diferenciar estados como:

  • recto + velocidad alta
  • giro suave + velocidad media
  • giro fuerte + desaceleración

Distribución natural del dataset

El análisis inicial mostró una fuerte concentración en:

  • conducción recta
  • velocidades medias y altas

Mientras que los estados críticos estaban pobremente representados:

  • giros fuertes
  • recuperación de carril
  • bajas velocidades

Este patrón es coherente con conducción humana continua.


Balanceo en caliente

Se utilizó WeightedRandomSampler en PyTorch para modificar la probabilidad de selección de muestras durante el entrenamiento.

Principios:

  • no eliminar datos reales
  • no duplicar físicamente el dataset
  • aumentar la exposición del modelo a estados críticos

Así, el dataset permanece intacto, pero el modelo observa una distribución controlada en cada batch.


Distribución objetivo de conducción

Se definió una distribución inspirada en conducción realista:

Tipo de conducción Frecuencia objetivo
fuerte izquierda 4–6 %
suave izquierda 12–18 %
recto 50–60 %
suave derecha 12–18 %
fuerte derecha 4–6 %

Esto mantiene el comportamiento natural dominante en recta, pero incrementa la presencia de:

  • giros
  • correcciones
  • transiciones dinámicas

Cálculo de pesos

Para cada clase se calculó:

peso = frecuencia_objetivo / frecuencia_real

Luego se aplicó clipping de pesos para evitar inestabilidad:

  • peso mínimo
  • peso máximo

Esto previene:

  • batches dominados por eventos extremos
  • sobre-ajuste en clases raras

Función de pérdida multi-salida

El modelo PilotNet fue entrenado para predecir:

  • steer
  • throttle

Se utilizó una pérdida ponderada:

loss = w_steer · MSE_steer + w_throttle · MSE_throttle

Configuración:

Parámetro Valor
steer_loss_weight 3
throttle_loss_weight 1

Esto prioriza la estabilidad lateral de la trayectoria.


Influencia de la frecuencia de muestreo del dataset

Se entrenaron modelos PilotNet con datasets recuperados a:

  • 20 Hz
  • 10 Hz
  • 5 Hz
  • 1 Hz

Observaciones

  • El modelo entrenado a 20 Hz es el único que logra completar trayectorias de forma estable.
  • Presenta aún un comportamiento ligeramente embrioso (oscilaciones suaves), pero sin zigzagueo severo.
  • Los modelos entrenados con frecuencias menores muestran conducción aparentemente continua, pero terminan saliéndose del carril y colisionando.

Esto sugiere que:

  • una alta resolución temporal es crítica para aprender la dinámica lateral
  • la reducción excesiva de frecuencia degrada la capacidad de recuperación del modelo