Metodología: ¿Cómo lo hemos hecho?

La metodología procedimental de este proyecto se basa en la predicción de los campos de velocidad y presión de vehículos a partir de su función de distancia con signo (SDF). Por otro lado, se predice el coeficiente de drag de automóviles a partir de distintas imágenes de su perfil. Para ello, se diseñan dos algoritmos diferentes haciendo uso de redes neuronales convolucionales. El código de programación desarrollado se encuentra en Código de Programación

Herramientas empleadas 

o Python. Python, creado por Guido van Rossum y lanzado por primera vez en 1991, es el lenguaje de programación empleado en este proyecto. Además de ser de código abierto y alto nivel, es conocido por su sintaxis clara, amplio soporte de librerías y legibilidad, así como por su versatilidad, ya que admite programación procedural, orientada a objetos y funcional. Asimismo, es comúnmente utilizado en aprendizaje profundo y ciencia de datos. En el proyecto se empleó su versión 3.11. 

o PyCharm. PyCharm, desarrollado por JetBrains, es el entorno de desarrollo integrado (IDE) utilizado en el proyecto al haber sido creado específicamente para Python. Además, ofrece una amplia gama de características y herramientas que facilitan y agilizan el proceso de programación. Entre ellas destacan el editor de código inteligente, el gestor de proyectos y la depuración o debugging

o GitLab. GitLab es una plataforma de desarrollo de software integrada en PyCharm y basada en web que se centra en el control de versiones a través de Git. Más aún, ofrece una variedad de características que permiten a equipos colaborar, gestionar proyectos y automatizar el desarrollo de software. Especialmente relevante en este proyecto es el control de versiones, lo cual permite recuperar y administrar cambios en el código fuente de manera eficiente. 


Procedimientos

Se siguieron los pasos descritos en la Figura 15 con cada uno de los dos modelos. 

I. Recopilación de datos 

Campos de velocidad y presiones 

Las imágenes empleadas se recuperaron de una base de datos de libre acceso de formato '.npz' publicada en el año 2023 [32]. La base de datos está compuesta por 2013 casos o automóviles representados en 2 dimensiones, compuestos a su vez por 4 clases o canales: función de distancia con signo (SDF, Signed Distance Function), campo de presiones y campos de velocidad en el eje X y en el eje Y. A continuación, se describe brevemente cada canal: 

1. SDF (Figura 16): función matemática que asigna una distancia con un signo, en función de su posición, a cada punto en el espacio con respecto a una superficie o forma geométrica, describe la geometría del vehículo en dos dimensiones [33]. 

2. Campo de presiones (Figura 17): proporciona información sobre la fuerza y distribución de las presiones en la superficie del vehículo, lo cual tiene un impacto directo en la generación de sustentación y carga aerodinámica, drag y otros fenómenos asociados al flujo de aire. 

3. Campo de velocidad (Figuras 18 y 19): ofrece información sobre la distribución de velocidades y los patrones de flujo en la superficie del vehículo tanto en el eje X (de aquí en adelante, 'vel1') como en el Y (en adelante, 'vel2'). Por consiguiente, permite visualizar cómo el flujo de aire se comporta alrededor del automóvil, cómo se generan y disipan las corrientes de aire, y cómo varía la velocidad en diferentes puntos del campo. Esto resulta igualmente crucial para comprender y analizar el comportamiento aerodinámico del vehículo. 

Los campos de presión y velocidad asociados a cada SDF son el resultado de una serie de simulaciones CFD realizadas a partir de las siguientes condiciones prefijadas en relación con el aire: una densidad de 1 kg/m3, una viscosidad de 0 y una velocidad de 54 km/h [32].  

Coeficiente de drag 

Por otro lado, para la predicción del coeficiente de drag, valor que determina la eficiencia aerodinámica de un automóvil (Ecuación 4), se recuperaron los datos de una base de libre acceso perteneciente al Massachusetts Institute of Technology publicada en agosto de 2023 [34]. Esta base contiene 9.760 vehículos en 3 dimensiones en formato '.obj' y sus coeficientes de drag asociados en un archivo '.xlsx'. La condición prefijada para el cálculo de los coeficientes es una velocidad del aire de 40 km/h [34]. 

II. Importación de librerías 

En segundo lugar, se importaron una serie de librerías, archivos importables que contienen código preescrito y funcionalidades previamente implementadas para agilizar la programación [35], resultando en una mayor eficacia en la ejecución del código. Las empleadas durante el proyecto en ambos modelos se exponen a continuación: 

o Keras: ampliamente empleada en aprendizaje profundo, simplifica la construcción, entrenamiento y evaluación de redes neuronales o en este proyecto, redes neuronales convolucionales. Cuenta con una interfaz de alto nivel y modular, lo que permite desarrollar modelos de manera intuitiva y eficiente [36].

o Matplotlib: utilizada para crear visualizaciones y gráficos con un alto grado de personalización. Proporciona una amplia variedad de funciones y herramientas para generar entre otros: gráficos  tradicionales, gráficos interactivos, diagramas, histogramas o dispersiones [37]. En este proyecto, empleada para la visualización de las imágenes y resultados de forma gráfica.

o NumPy: especializada en el análisis de grandes volúmenes datos, es empleada para realizar cálculos numéricos y distintas operaciones matemáticas con mayor eficiencia [38]. En el caso de este proyecto se emplea para el tratamiento de las imágenes en forma matricial en el primer modelo. 

o Os: permite que los programas interactúen y realicen operaciones en el entorno del sistema operativo en el que se ejecutan. Empleada para la creación y manipulación de archivos y directorios [39]. 

o Pillow: centrada en el procesamiento de imágenes, utilizada para cargar, manipular, guardar y procesar imágenes en diferentes formatos [40]. 

o SciencePlots: permite adaptar el estilo de los gráficos creados por Matplotlib a los utilizados en artículos científicos. En este proyecto, se eligió el estilo science.

o MayaVi: centrada en la visualización de gráficos y representación de datos en tres dimensiones. En este proyecto, utilizada en el preprocesamiento de los archivos '.obj' pertenecientes a la base de datos del segundo modelo. 

III. Preprocesamiento de datos 

Se preprocesaron los archivos de las dos bases de datos, obteniendo las imágenes que sirven de entrada para ambos modelos respectivamente. 

Campos de velocidad y presiones 

Primeramente, al presentar la base de datos un formato '.npz' (conjunto de matrices), las imágenes solo se pudieron visualizar a través de la librería Matplotlib. Posteriormente, se recuperaron las 8052 imágenes con un formato '.png' y se las clasificó de acuerdo con su función (training, validation o test) y clase o canal respectivo mediante la librería Pillow. Para ello, se las asignó un nombre siguiendo el criterio anterior: 'Canal_Función_NúmeroImagen', por ejemplo, 'Pressure_Training_1788'. A continuación, se separaron las imágenes por clases y en última instancia por su función, resultando en 12 directorios con el siguiente nombre 'canal_images_función', por ejemplo, 'vel1_images_validation'. El número de imágenes que se asignó a cada función se hizo siguiendo el consenso general en deep learning, destinando un 63% de las imágenes (1277 / 2013) a training, un 20% (398 / 2013) a validation y un 17 % (338 / 2013) a test. Por último y mediante la librería NumPy, se transformó cada imagen a un único numpy array para el entrenamiento del modelo. 

Coeficiente de drag 

En primer lugar, se simplificó y cambió el formato del archivo '.xlsx' (de nombre 'drag_coefficients', Figura 20) a '.csv' para facilitar su posterior procesamiento. Este consistía de dos columnas: 'file', contenía el nombre de los archivos, y 'Cd', su valor asociado. Por otro lado, ya que los archivos de la base de datos presentaban un formato '.obj', no válido como valor de entrada del modelo, mediante MayaVi se realizaron 6 fotos de cada vehículo desde distintos ángulos ([(0, 0), (180, 180), (90, 90), (270, 90), (180, 90), (0, 90)]), esto es, de cada uno de los 9760 archivos para suplir la falta de dimensionalidad y profundidad de una única imagen. Posteriormente, para reducir el coste computacional y complejidad del modelo, se unificaron las 6 imágenes de cada '.obj' en una sola (Figura 21), formando una imagen resultante de 240x270 píxeles y asignándola el mismo nombre que el de su archivo predecesor '.obj' (el mismo que en la columna 'file'). Esto se tradujo en 9760 archivos '.png' (Figura 21) que fueron divididos en 3 directorios atendiendo a su función. De ellas, un 63% (6150 / 9760) se destinaron al entrenamiento 'drag_images_training', un 20% (1975 / 9760) a validación 'drag_images_validation' y un 17% (1635 / 9760) a test 'drag_images_test'. Posteriormente, se crearon 3 DataFrames ('train_generator' (entrenamiento), 'validation_generator' (validación) y 'test_generator' (test)) a partir de las imágenes y archivo '.csv'. Mediante estos, unas estructuras de datos bidimensionales organizadas en filas y columnas, se asoció directamente cada coeficiente de drag a su imagen, ya no solo a su nombre como previamente en el '.csv'. Igualmente, redujeron el coste computacional, optimizando el uso de la memoria. 

IV. Construcción y compilación del modelo 

Posteriormente, se diseñaron y construyeron dos modelos distintos, empleando en ambos casos la librería Keras. El primero, referido a la predicción de los campos de velocidad y presiones, y el segundo, a la predicción del coeficiente de drag

Construcción del primer modelo: campos de velocidad y presiones 

Para la predicción de los campos de velocidad y presiones se optó por una red neuronal convolucional con una estructura U-Net compuesta por un codificador y un decodificador (Figura 22). En primer lugar, el codificador, responsable de la extracción de las características de la geometría del vehículo y de la generación de patrones a partir de las mismas, recibe como input la función de distancia con signo. En cuanto a su estructura, consiste en varias capas ocultas, compuestas a su vez por capas convolucionales de un número de neuronas variables, que tienen como función la extracción de características, y por capas de agrupación máxima que reducen progresivamente el tamaño de las imágenes. Por otro lado, el decodificador se centra en la reconstrucción del perfil aerodinámico del vehículo a partir de las características extraídas por el codificador y en la predicción de los campos de presiones y velocidad. Consta de capas convolucionales y de capas en las que se concatenan, simétricamente, convoluciones anteriores, la primera convolución con la última, la segunda con la penúltima y así sucesivamente. Asimismo y a través de las convoluciones transpuestas, se incrementa el tamaño de las imágenes hasta los 256x600 píxeles. Finalmente, el valor de salida resultante son los campos de presiones y velocidad. En esta ocasión, no se introdujeron capas completamente conectadas en el modelo por el alto coste computacional que suponían y por incurrir estas en cálculos redundantes.

Una vez se definió la arquitectura, se procedió a la elección de las funciones de activación. A continuación, se exponen las que se tradujeron en unos mejores resultados. 

o Swish (Figura 23). De manera algebraica se define como 𝑓(𝑥) = 𝑥 · 𝑠𝑖𝑔𝑚𝑜𝑖𝑑(𝛽 · 𝑥) = 𝑥 / (1+𝑒^−𝛽𝑥), donde β puede ser una constante o un parámetro a optimizar. Asimismo, es continua, no lineal, y a diferencia de la mayoría de las funciones de activación no monótona. Si bien se traduce en unos mejores resultados, es computacionalmente más costosa que las funciones de activación expuestas anteriormente. Empleada en la última capa del modelo [41]. 

o Mish (Figura 23). Inspirada en swish, fue propuesta en el año 2019. Al igual que swish es no monótona, continua y no lineal. Más aún, es infinitamente diferenciable si bien computacionalmente muy costosa. Se define matemáticamente como 𝑓(𝑥) = 𝑥 · tanh(𝑠𝑜𝑓𝑡𝑝𝑙𝑢𝑠(𝑥)) = 𝑥 · tanh(ln(1+𝑒^𝑥 ). Se emplea en las capas convolucionales y de agrupación [42] [43].

Construcción del segundo modelo: coeficiente de drag 

Por otro lado, para la predicción del drag se diseñó una red neuronal convolucional de estructura tradicional (Figura 24), que toma como valor de entrada los DataFrames ya creados. Por lo que se refiere a su estructura, consta de una sucesión de capas convolucionales y de capas de agrupación máxima de número de neuronas variables, que son responsables de la extracción las características aerodinámicas de los valores de entrada. Asimismo y a continuación, la capa flatten reduce la dimensionalidad de las salidas resultantes, ajustándola a las necesidades de la capa completamente conectada o dense. Esta última toma como valor de entrada la salida de la capa flatten y es responsable de producir el output definitivo. Igualmente, se intercaló una capa dropout, la cual inhibe un número de neuronas determinado de modo aleatorio, entre las completamente conectadas para evitar el sobreaprendizaje que se deriva de su sucesión.  

En lo referente a las funciones de activación, se emplearon las ya descritas swish y mish.  

Compilación 

Tras haber construido los modelos, se definieron los parámetros y funciones correspondientes a la fase de compilación. En primer lugar, se definió la tasa de aprendizaje inicial. A continuación, se eligió el error cuadrático medio (MSE) como función de pérdida a la vez que se monitorizó (únicamente en el primer modelo) la exactitud o accuracy, esto es, el número de predicciones correctas partido del número de predicciones totales. Por último, se escogió como optimizador AdaMax, una variante de Adam cuyo segundo momento se calcula siguiendo la norma del supremo, lo que resulta en una mayor estabilidad y mejores resultados en redes profundas. 

V. Entrenamiento 

Primeramente, se establecieron un conjunto de parámetros comunes a ambos modelos: 

o Los datos de entrada y salida para el entrenamiento. En el primer modelo se fijó como valor de entrada el directorio 'sdf_images_training' y como salida los directorios 'vel1_images_training', 'vel2_images_training' y 'pressure_images_training'. Asimismo, se definieron los valores de entrada y salida de la validación, como entrada 'sdf_images_validation' y como salida 'vel1_images_validation', 'vel2_images_validation' y 'pressure_images_validation'. En el segundo modelo, se establecieron como valores de entrada las imágenes del DataFrame 'training_generator' y como salida los valores (coeficientes de drag) asociados. Similarmente, se fijaron las imágenes del DataFrame 'validation_generator' como entrada y los coeficientes de drag asociados como salida. 

o El batch size o tamaño del lote, siendo este el número de ejemplos de entrenamiento que se utilizan por iteración, cuanto mayor es, más memoria se requiere. También se definió el validation batch size

o Las epochs, épocas o iteraciones, esto es, el número de veces que el algoritmo ha procesado todo el conjunto de entrenamiento. De ahí, que su correcta elección determine en gran medida el desempeño del modelo. Se eligió un número de iteraciones totales de 100. 

o Verbose, la cual controla la cantidad de información que se muestra durante el proceso de entrenamiento. Se estableció 'verbose=1', por lo cual se muestra una barra de evolución animada que indica el progreso de las épocas y las métricas de entrenamiento (loss y accuracy) en tiempo real. 

o Callbacks, los objetos utilizados para personalizar y controlar el comportamiento del modelo durante el entrenamiento. Se definieron 4 callbacks: BackUpAndRestore, CSVLogger, EarlyStopping y ReduceLROnPlateau. En primer lugar, BackUpAndRestore posibilita guardar los pesos del modelo, así como el estado del optimizador y tasa de aprendizaje durante el entrenamiento, lo que permite continuar con este en caso de una interrupción. Por otro lado, CSVLogger guarda la evolución de las métricas, loss y accuracy, durante el entrenamiento y validación en un archivo '.csv', permitiendo llevar un registro detallado del rendimiento del modelo en cada iteración. Más aun, EarlyStopping detiene automáticamente el entrenamiento del modelo cuando la función de pérdida deja de mejorar, evitando el sobreaprendizaje o overfitting, ahorrando tiempo y recursos computacionales. Por último, mediante ReduceLROnPlateau se ajusta automáticamente la tasa de aprendizaje del modelo cuando el progreso del entrenamiento se estanca, evitando que este se quede atrapado en mínimos locales y ayudando a mejorar su convergencia. 

Finalmente y una vez entrenado, la arquitectura del modelo fue almacenada en formato '.json'. Igualmente, se guardaron los pesos definitivos en un archivo '.h5', posibilitando recuperar el modelo más adelante.  

Todas las imágenes de la web siguen las licencias Creative Commons.
Creado con Webnode Cookies
¡Crea tu página web gratis! Esta página web fue creada con Webnode. Crea tu propia web gratis hoy mismo! Comenzar