diff --git a/docs/_posts/2023-12-28-Semana-9.md b/docs/_posts/2023-12-28-Semana-9.md index 87c6497..8b5de6b 100644 --- a/docs/_posts/2023-12-28-Semana-9.md +++ b/docs/_posts/2023-12-28-Semana-9.md @@ -5,69 +5,51 @@ categories: tags: - ROS2 - Aprendizaje automático - --- - ## Índice -1. [Navegación autónoma de un drone para localizar un transmisor de radiofrecuencia](#navegación-autónoma-de-un-drone-para-localizar-un-transmisor-de-radiofrecuencia) +1. [Navegación autónoma de un dron para localizar un transmisor de radiofrecuencia](#navegación-autónoma-de-un-dron-para-localizar-un-transmisor-de-radiofrecuencia) 1.1 [ANAIV: Algoritmos de navegación autónoma basados en vecindad](#anaiv-algoritmos-de-navegación-autónoma-basados-en-vecindad) 1.2 [Navegación autónoma por aprendizaje automático](#navegación-autónoma-por-aprendizaje-automático) - 2. [A Reduction of Imitation Learning and Structured Prediction to No-Regret](#a-reduction-of-imitation-learning-and-structured-prediction-to-no-regret) - 3. [Obtención de datasets](#obtención-de-datasets) - ---- --- -## Navegación autónoma de un drone para localizar un transmisor de radifrecuencia -Encontré este tfg en el linkdin del departemento y me pareció interesante leerlo ya que también era sobre navegación autonoma de drones con aprendizaje automático. - - -Además también es interesante el enfoque de localización de radiofrecuencias además de otros algoritmos de navegacioón autónoma. +## Navegación autónoma de un dron para localizar un transmisor de radiofrecuencia +Encontré este TFG en el LinkedIn del departamento y me pareció interesante leerlo, ya que también trata sobre la navegación autónoma de drones con aprendizaje automático. -* **ANAIV:** Algoritmos de navegación autonoma basados en vecinidad +Además, también es interesante el enfoque de localización de radiofrecuencias, además de otros algoritmos de navegación autónoma. - * **Métodos para comandar al drone:** Conjunto de funciones encargadas del movimiento +* **ANAIV:** Algoritmos de navegación autónoma basados en vecindad + * **Métodos para comandar al dron:** Conjunto de funciones encargadas del movimiento. + * **Métodos de tolerancia:** Establecen un margen aceptable entre la posición del dron y el objetivo deseado. + * **Métodos de conversión:** Transforman las coordenadas entre los distintos sistemas de referencia. + * **Algoritmos:** Conjunto de métodos que se necesitan para llevar a cabo una tarea. - * **Métodos de tolerancia:** Establecen un margen aceptable entre la posición del drone y el objetivo deseado. +La navegación autónoma por aprendizaje automático se realiza mediante Q-learning, dado una tabla Q de estados y acciones de modo que si el dron toma una decisión, se usará un sistema de recompensas; en este caso, los estados son las posiciones del dron y el mapa de calor. - * **Métodos de conversión:** Transforma las coordenadas entre los distintos sistemas de referencia. - - * **Algoritmos:** Conjunto de métodos que se necesitan para llevar una tarea a cabo - - -La navegación autónoma por aprendizaje automático se hacer por Q learning, dada una tabla Q de estados ya acciones de mmodo que si al drone tomar una decisión, donde se usará un sistema de recommpensas, en este caso los estados son las posiciones del drone y el mapa de calor. - -Otro enfoque interesante es la convinación de VFF junto a Q-learning para que el drone a la vez que está buscando la radio frecuencia pueda esquivas obstáculos. +Otro enfoque interesante es la combinación de VFF junto a Q-learning para que el dron, al mismo tiempo que está buscando la radiofrecuencia, pueda esquivar obstáculos. ---- --- ## A Reduction of Imitation Learning and Structured Prediction to No-Regret -In imitation learning, we may not necessarily know or ob- -serve true costs C(s, a) for the particular task. Instead, -we observe expert demonstrations and seek to bound J(π) -for any cost function C based on how well π mimics the -expert’s policy π ∗ . - +En el aprendizaje por imitación, es posible que no conozcamos u observemos los costos reales C(s, a) para la tarea específica. En su lugar, observamos demostraciones de expertos y buscamos acotar J(π) para cualquier función de costo C, basándonos en qué tan bien π imita la política del experto π∗. ---- --- -## Obtención de dtasets -Una vez conseguido el piloto experto usamos el siguiente comando para grabar los topics que necesitamos para nuestro entrenamiento: +## Obtención de datasets +Una vez conseguido el piloto experto, usamos el siguiente comando para grabar los topics que necesitamos para nuestro entrenamiento: ```bash ros2 bag record -o ros_bag_name /drone0/motion_reference/twist /drone0/sensor_measurements/frontal_camera/image_raw + ``` -Una vez grabados los datasets en distintos circuitos en ambos sentidos, cada dataset se guardó en una carpeta diferente para poder elegir que circuito procesar. +Una vez grabados los datasets en distintos circuitos en ambos sentidos, cada dataset se guardó en una carpeta diferente para poder elegir qué circuito procesar. -A la hora de cargar los datos me di cuenta que el ordenador se aceleraba mucho y se tardaba bastante solo en leer los datos de las rosbags, un solo circuito tardaba 30 segundos, pero si el programa leía de todas las pruebas del piloto experto, el ordenador se quedaba colgado. +Al cargar los datos, me di cuenta de que el ordenador se aceleraba mucho y tardaba bastante solo en leer los datos de las rosbags; un solo circuito tardaba 30 segundos. Sin embargo, si el programa leía de todas las pruebas del piloto experto, el ordenador se quedaba colgado. -Aprovechando que teníamos un ejemplo de datasets con drones en el siguiente (repositorio)[https://github.com/tii-racing/drone-racing-dataset] comprobé la manera estandar en que la gente guarda sus datasets, también así haciendo mas genérico el programa. Se vió como se guardan las imágenes en formato jpg y los labels en .txt por lo que se siguió la misma práctica. \ No newline at end of file +Aprovechando que teníamos un ejemplo de datasets con drones en el siguiente [repositorio](https://github.com/tii-racing/drone-racing-dataset) comprobé la manera estándar en que la gente guarda sus datasets. Así se volvió más genérico el programa. Se observó cómo se guardan las imágenes en formato jpg y los labels en .txt, por lo que se siguió la misma práctica. \ No newline at end of file diff --git a/src/drone_driver/src/3dplot.py b/src/drone_driver/src/3dplot.py index 8559a9a..91f58b9 100644 --- a/src/drone_driver/src/3dplot.py +++ b/src/drone_driver/src/3dplot.py @@ -4,7 +4,7 @@ import os from PIL import Image from imblearn.over_sampling import RandomOverSampler - +from skimage.transform import resize # Sets the label to a velocity def updateNumAngular(value): @@ -134,16 +134,28 @@ def getLabelDistribution(labels): return positiveAngVels, negativeAngVels -def oversample_data(images, labels): +def oversample_data(images, labels, downsample_label=2, downsample_factor=0.5): # Flatten images flattened_images = [image.flatten() for image in images] - # Oversample using RandomOverSampler + # Identify the indices of the specified label + downsample_indices = [i for i, label in enumerate(labels) if label == downsample_label] + + # Calculate the number of samples to keep after downsampling + num_samples_to_keep = int(len(downsample_indices) * downsample_factor) + + # Randomly select samples to keep + selected_indices = np.random.choice(downsample_indices, size=num_samples_to_keep, replace=False) + + # Combine selected and non-selected indices + indices_to_keep = list(set(selected_indices) | set(i for i in range(len(labels)) if i not in downsample_indices)) + + # Use RandomOverSampler only for the selected indices ros = RandomOverSampler(random_state=42) - X_resampled, y_resampled = ros.fit_resample(flattened_images, labels) + X_resampled, y_resampled = ros.fit_resample(np.array(flattened_images)[indices_to_keep], np.array(labels)[indices_to_keep]) # Reshape back to the original format - #X_resampled = [resampled_image.reshape(images[0].shape) for resampled_image in X_resampled] + # X_resampled = [resampled_image.reshape(images[0].shape) for resampled_image in X_resampled] return X_resampled, y_resampled