4 minute read

En esta semana comenzaremos a familiarizarnos a entrenar con un database de rosbags en pytorch.

Simulación formula1 sigue lineas

Como aún tenemos problemas con la simulación del drone, empezamos a familiarizarnos con la obtención de conjuntos de datos a partir del mismo ejercicio, pero realizado en un vehículo terrestre. Para hacer el seguimiento de líneas, aprovechamos el código de la asignatura de (robótica de servicio)[https://portanova2002.wixsite.com/robotica-movil/blank-1] del año pasado. Solo tuvimos que adaptar el código de Unibotics a ROS.



Rosbags

Para obtener el conjunto de datos, utilizamos el siguiente comando:

ros2 bag record /filtered_img /cmd_vel

Solo guardaremos los temas /filtered_img y /cmd_vel, ya que lo que nos interesa saber es qué velocidades se comandan dependiendo de la imagen; en otras palabras, la entrada sería la imagen y la salida las velocidades del robot.

Al ejecutar el camando tendremos un .yaml con el metadata y un archivo (.db3)[https://file.org/extension/db3] donde estarán todos los datos guardados.

Para ver qué había dentro del .sdb3, nos descargamos la siguiente (aplicación)[https://sqlitebrowser.org/dl/] e investigamos un poco el SQL.



Entrenamiento de redes neuronales

Dataset

El primer paso a la hora de entrenar una red neuronal es generar el conjunto de datos. Ya lo conseguimos con las rosbags; ahora nos queda dejarlo en un formato que pueda leer PyTorch. Esta respuesta la encontramos en (Stack Overflow)[https://stackoverflow.com/questions/73420147/how-to-read-custom-message-type-using-ros2bag], donde se intentan leer mensajes personalizados, pero con la parte de mensajes estándar nos basta. A partir de este código, accedemos a los parámetros que nos interesan: la matriz de la imagen y la velocidad lineal en el eje x junto con la velocidad angular en el eje z.


Formato de la imagen en el dataset

En el tratamiento de imágenes para comprobar si las imágenes eran correctas, se pasó del formato de la imagen cruda a uno de tres canales. Primero se visualizó toda la información que se guarda en la rosbag; al ser la codificación BGR8, se redimensionó la imagen con 3 canales, y el resto de parámetros, como el ancho, la altura o el tipo de dato, los obtenemos directamente de esta estructura. Estas operaciones nos permiten ver la imagen si así lo deseamos.

Se buscó información sobre qué era más óptimo para entrenar una red neuronal: si los datos de la imagen en bruto o en RGB. La imagen en bruto tiene la ventaja de capturar más información que la RGB, pero añade complejidad en el manejo de datos. Además, las imágenes RGB están más extendidas en tareas de visión artificial, por lo que, aunque puedan perder datos, suele ser lo más óptimo.


pyTorch

Después, seguimos leyendo varios tutoriales de PyTorch para familiarizarnos con el sofware. Como por el momento, no sabía qué red neuronal o técnica de aprendizaje automático aplicar, me centré en un estudio un poco más teórico.

Tutorial 1

  • Importar modelos de redes neuronales como LeNet-5, la cual vimos en qué consistía brevemente en la primera semana.
  • Como dataset, usa una imagen de 32x32 con 1 canal de color. Más adelante, deberemos entrar en profundidad en cómo codificar la imagen para que el procesamiento en la red neuronal sea más efectivo.
  • Lo primero que hay que hacer después de cargar las imágenes es convertirlas en tensores y normalizarlas. Las imágenes se redimensionan para que su desviación estándar sea 1, ya que las funciones de activación tienen gradientes más fuertes cuando x = 0.
  • torchvision.datasets.ImageFolder. Una utilidad de esto sería crear un conjunto de datos con diferentes fotos de la línea, etiquetadas con la velocidad resultante del controlador.
  • A la hora de cargar el dataset al modelo, tenemos que tener en cuenta el batch_size, num_workers y shuffle (aleatorizar los datos)
  • (Link)[https://pytorch.org/tutorials/beginner/introyt/introyt1_tutorial.html]

Tutorial 2

  • Los tensores son la principal abstacción de PyTorch. Un tensoe de dimensión 1 es un vector y uno de dimensión 2 una matriz.
  • Es posible manejar datos con la GPU
  • Se puede crear un tensor con numpy
  • (Link)[https://pytorch.org/tutorials/beginner/introyt/tensors_deeper_tutorial.html]


Plataforma tello

También seguimos con los problemas de la semana pasada; lo primero a corregir es el problema de las transformaciones (tfs). Me dí cuenta de que era un fallo al llamar a las funciones de movimiento ya que las llamaba fuera del nodo de ROS. Sin embargo al intentar mover el drone, en la odometría tenía el mismo error por lo que subí un (issue)[https://github.com/aerostack2/aerostack2/issues/347] en el repositorio de aerostack2 en busca de ayuda.



Definiciones

Batch_size
Grupo o conjunto de ejemplos de datos que se procesan juntos en un modelo de aprendizaje automático. Esto se utiliza para acelerar el proceso de entrenamiento al permitir el procesamiento paralelo de ejemplos.
Función de pérdida
Una medida que cuantifica la discrepancia entre las predicciones de un modelo y los valores reales (objetivos) en los datos. Indica qué tan lejos está la salida del modelo de la salida deseada.
Optimizador
Un algoritmo que ajusta los parámetros del modelo durante el entrenamiento para minimizar la función de pérdida. El descenso por gradiente estocástico es una implementación común.
Training epoch
Un ciclo completo a través de todo el conjunto de datos de entrenamiento, donde el modelo procesa y actualiza sus parámetros utilizando cada ejemplo al menos una vez.
Overfitting o sobreentrenamiento:
Ocurre cuando un modelo se ajusta demasiado a los datos de entrenamiento y no generaliza bien a nuevos datos. En lugar de aprender patrones útiles, la red “memoriza” los datos de entrenamiento, lo que resulta en un rendimiento deficiente en datos no vistos.