scieee AI-readable full text Open interactive document viewer

Predicción de sombras de nubes en plantas termosolares mediante visión artificial

Gutiérrez Amor, Carlota

Abstract

En este trabajo se aborda la estimación y predicción de nubes mediante el análisis de imágenes all-sky, orientado a la aplicación en plantas termosolares. Se propone un enfoque híbrido que combina redes neuronales convolucionales (CNN) y algoritmos tradicionales para la segmentación de nubes, junto con técnicas de estimación de flujo óptico y un algoritmo propio para la detección del movimiento de píxeles. El modelo desarrollado se centra en pronosticar la presencia de nubes en un horizonte temporal de 15 minutos. Los resultados muestran que este enfoque mejora significativamente la precisión de las predicciones en comparación con métodos convencionales, especialmente en la parte de segmentación de nubes. La comparativa realizada proporciona una base sólida para investigaciones futuras sobre la estimación de la radiación solar utilizando imágenes all-sky.

Full text

Proyecto Fin de Carrera Ingeniería de Telecomunicación Formato de Publicación de la Escuela Técnica Superior de Ingeniería Autor: F. Javier Payán Somet Tutor: Juan José Murillo Fuentes Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2013 Proyecto fin de Máster Máster en Ingeniería Aeronáutica Predicción de sombras de nubes en plantas termosolares mediante visión artificial Autor: Carlota Gutiérrez Amor Tutor: Carlos Bordons Alba Dpto. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2024 Proyecto fin de Máster Máster en Ingeniería Aeronáutica Predicción de sombras de nubes en plantas termosolares mediante visión artificial Autor: Carlota Gutiérrez Amor Tutor: Carlos Bordons Alba Catedrático de universidad Dpto. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2024 Proyecto fin de Máster: Predicción de sombras de nubes en plantas termosolares mediante visión artificial Autor: Carlota Gutiérrez Amor Tutor: Carlos Bordons Alba El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores: Presidente: Vocal/es: Secretario: acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha: Agradecimientos En primer lugar, quiero expresar mi más sincero agradecimiento a mi tutor, Carlos Bordons Alba, por su guía y apoyo a lo largo de este trabajo. Su experiencia y paciencia han sido fundamentales en el desarrollo de este proyecto. De igual manera, me gustaría agradecer especialmente a Eduardo Fernández Camacho por brindarme la oportunidad de colaborar en el proyecto OCONTSOLAR. Su inspiración, tanto como profesor como investigador, ha dejado una huella profunda en mi trayectoria académica y profesional. Además, su disposición para consultar y revisar mi trabajo de investigación ha sido invaluable para la elaboración de este TFM. A mi familia, especialmente a mis padres y a mi hermana Alejandra, por estar siempre a mi lado. A Luis, por su apoyo durante todos estos años, y por todo lo que aún nos queda por vivir juntos. Carlota Gutiérrez Amor Máster en Ingeniería Aeronáutica Sevilla, 2024 I Resumen En este trabajo se aborda la estimación y predicción de nubes mediante el análisis de imágenes all-sky, orientado a la aplicación en plantas termosolares. Se propone un enfoque híbrido que combina redes neuronales convolucionales (CNN) y algoritmos tradicionales para la segmentación de nubes, junto con técnicas de estimación de flujo óptico y un algoritmo propio para la detección del movimiento de píxeles. El modelo desarrollado se centra en pronosticar la presencia de nubes en un horizonte temporal de 15 minutos. Los resultados muestran que este enfoque mejora significativamente la precisión de las predicciones en comparación con métodos convencionales, especialmente en la parte de segmentación de nubes. La comparativa realizada proporciona una base sólida para investigaciones futuras sobre la estimación de la radiación solar utilizando imágenes all-sky. III XÍndice 4.2 Proyección sobre el Terreno 19 4.3 Predicción del Movimiento 19 5 Detección de nubes 23 5.1 Detección basada en métodos tradicionales 23 5.2 Segmentación mediante aprendizaje automático 26 Introducción a las Redes Neuronales de Convolución en la Segmentación y Clasificación de Imágenes de Nubes y Cielo 26 Red de Clasificación de Imágenes de Cielo 28 Red de segmentación de nubes en imágenes de cielo completo 29 6 Proyección sobre el terreno 33 6.1 Transformación de imagen ojo de pez a plano 33 6.2 Corrección de error de la lente 36 6.3 Región de interés 38 7 Predicción del movimiento 41 7.1 Bibliografía referente a la detección de movimiento 41 7.2 Teoría del Movimiento de Objetos Deformables 43 7.2.1 Modelos Matemáticos 43 7.3 Hipótesis Aplicables al Movimiento de Nubes 43 7.3.1 Hipótesis de Flujo Laminar vs. Turbulento 43 7.3.2 Hipótesis de Movimiento Global Rígido 43 7.3.3 Hipótesis de Movimiento Local y Deformación 44 7.4 Estimación del vector de movimiento 44 7.4.1 Flujo óptico. Método de Lucas-Kanade 44 7.4.2 Flujo óptico. Movimiento de contornos 45 7.4.3 Flujo óptico. Movimiento global 47 7.5 Predicción 47 8 Resultados 49 8.1 Metodología de pruebas 49 8.2 Métricas de Evaluación 49 8.3 Resultados de la Segmentación 50 8.4 Resultados de la Predicción del Movimiento 50 9 Conclusiones y trabajo futuro 55 Apéndice A Códigos 57 A.1 Segmentación de imágenes 57 A.1.1 Primer algoritmo de segmentación (Tratamiento digital de imágenes) 57 A.1.2 Segundo algoritmo de segmentación (CNN) 61 A.2 Flujo óptico 65 Índice de Figuras 73 Índice de Tablas 75 Bibliografía 77 Notación ⌊x⌋Parte entera de x sen Función seno cos Función coseno tg Función tangente arccos Función arco tangente arctan2(y,x) Función arco tangente del plano. Devuelve el ángulo que forma el vector (x,y)con el eje OX. rev Función revolución. Devuelve el ángulo de giro entre 0◦ y360◦sin considerar el número de revoluciones. TP Verdaderos positivos (True Positive). FP Falsos positivos (False Positive). TN Verdaderos negativos (True Negative). FN Falsos negativos (False Negative). XI 1 Introducción E n este trabajo se presenta un estudio sobre la estimación y predicción de nubes mediante el uso de imágenes all-sky, con el objetivo de obtener datos para optimizar el funcionamiento de las plantas termosolares. El enfoque principal es desarrollar y aplicar técnicas precisas para pronosticar la presencia de nubes en un horizonte temporal de 15 minutos, lo cual es crucial para mejorar la integración de la energía solar en la red eléctrica y garantizar la estabilidad y eficiencia de las plantas solares térmicas. 1.1 Motivación La integración de fuentes de energía renovable en las redes eléctricas públicas, con un enfoque particular en la energía solar, enfrenta desafíos significativos debido a su alta variabilidad e incertidumbre en comparación con otras fuentes de energía como la nuclear o los combustibles fósiles. La energía solar no solo está sujeta a variaciones a largo plazo, derivadas de ciclos solares y frentes climáticos, los cuales son relativamente fáciles de prever. También enfrenta fluctuaciones locales a corto plazo, provocadas por nubes opacas, que pueden causar reducciones significativas en la producción de energía, afectar los niveles de voltaje y desencadenar problemas de mantenimiento en las plantas termosolares. Por lo tanto, la precisión en el pronóstico solar a corto plazo es crucial para la integración efectiva de la energía renovable en la red pública [35]. Este documento aborda la necesidad de pronosticar con precisión estas fluctuaciones a corto plazo, empleando técnicas de procesamiento digital de imágenes del cielo para la localización de nubes. La predicción de la radiación solar ha sido objeto de numerosos estudios y ensayos a lo largo de los años, con diversos enfoques y metodologías que buscan mejorar la precisión y la fiabilidad de las estimaciones. Estos estudios suelen centrarse en la estimación directa de la radiación solar utilizando datos meteorológicos, modelos matemáticos y/o técnicas de aprendizaje automático. En el presente trabajo, se ha optado por un enfoque diferente que se aparta de las metodologías tradicionales. En lugar de estimar la radiación solar de manera directa, el enfoque propuesto se centra en la predicción de la posición de las nubes en la atmósfera. La idea fundamental es que, al identificar y modelar la ubicación y el movimiento de las nubes, se puede realizar una inferencia más detallada sobre cómo estas nubes afectan la radiación solar que alcanza la superficie de una planta solar. Este enfoque tiene varias ventajas potenciales. Primero, la cobertura nubosa es un factor crítico que afecta la variabilidad de la radiación solar, y comprender su dinámica puede mejorar la precisión de 1 2Capítulo 1. Introducción las predicciones. Segundo, al modelar la posición de las nubes, es posible realizar simulaciones más realistas sobre cómo la radiación solar se distribuye a lo largo de la superficie de una planta solar, considerando la sombra que las nubes proyectan. El cálculo detallado de la radiación solar basado en la posición de las nubes se considera una extensión lógica del trabajo realizado en esta investigación. Sin embargo, dado que la implementación completa de esta estimación requiere un análisis más profundo y el desarrollo de modelos adicionales, se ha decidido posponer este aspecto específico para futuras investigaciones. En el marco de un próximo trabajo de fin de máster, se explorará y desarrollará este tema con mayor detalle, abordando la integración de los modelos de predicción de nubes con las estimaciones de radiación solar y evaluando su aplicabilidad en entornos reales. Esta investigación se enmarca en el proyecto OCONTSOLAR – Optimal Control of Thermal Solar Energy Systems –. El objetivo central de OCONTSOLAR es implementar flotas de sensores móviles en los sistemas de control, con una aplicación particular en las plantas solares térmicas que utilizan colectores cilindro-parabólicos. Las plantas solares térmicas y las fotovoltaicas, aunque ambas utilizan la energía solar, difieren significativamente en sus tecnologías, eficiencias, costes y aplicaciones. Las plantas solares térmicas, también conocidas como termosolares, concentran la irradiancia solar utilizando espejos o lentes para calentar un fluido, que luego genera vapor para accionar una turbina y producir electricidad. Este sistema es más eficiente a gran escala y puede incorporar sistemas de almacenamiento térmico para generar electricidad incluso cuando no hay sol, como durante la noche o en días nublados [ 23 ]. Sin embargo, requieren más espacio y una infraestructura más compleja que las plantas fotovoltaicas, además de ser más costosas en términos de instalación y mantenimiento. Por otro lado, las plantas fotovoltaicas convierten directamente la irradiancia solar en electricidad utilizando células solares hechas de materiales semiconductores, generalmente silicio. Estas plantas tienen una eficiencia energética menor en comparación con las termosolares, pero sus costes de instalación y mantenimiento son menores, y su modularidad permite una fácil expansión y adaptación a diferentes tamaños de proyectos [ 39 ]. Además, la tecnología fotovoltaica ha experimentado una rápida disminución en los costes de producción y una mejora continua en la eficiencia de las células solares, lo que las hace cada vez más competitivas en el mercado energético. Figura 1.1 Fotografía de la planta fotovoltaica Bhadla Solar Park en India. Imagen obtenida de [ 30 ]. 1.2 Estado del arte 3 Figura 1.2 Fotografía de la planta termosolar de Solana en Arizona, EEUU. Imagen obtenida de [ 1 ]. La predicción del movimiento de nubes en plantas termosolares (energía solar concentrada, CSP) es esencial por varias razones: • Optimización de la Generación de Energía: Las plantas CSP dependen de la irradiancia solar directa para generar energía. Predecir el movimiento de las nubes ayuda a anticipar caídas en la irradiancia solar, lo que puede afectar significativamente la producción de energía. Al prever estas variaciones, los operadores pueden ajustar las operaciones de la planta para mantener una producción óptima de energía. • Reducción del Tiempo de Inactividad: Una predicción precisa del movimiento de las nubes permite a las plantas CSP prepararse para los cambios en la disponibilidad de irradiancia solar. Esta previsión ayuda a minimizar el tiempo de inactividad y a mantener una generación continua de energía incluso cuando se espera que las nubes cubran temporalmente el sol. • Mejora en la Gestión del Almacenamiento de Energía: Las plantas CSP a menudo utilizan sistemas de almacenamiento térmico para almacenar el exceso de calor generado durante los períodos soleados. Predecir la cobertura de nubes ayuda a gestionar estos sistemas de almacenamiento de manera más eficiente, asegurando que la energía esté disponible durante los períodos de baja irradiancia solar. • Mejora de la Estabilidad de la Red: Al predecir los movimientos de las nubes y su impacto en la irradiancia solar, las plantas CSP pueden proporcionar energía más confiable y consistente a la red. Esto ayuda a estabilizar la red y prevenir fluctuaciones en el suministro de energía. • Ahorro de Costes: Una predicción efectiva del movimiento de las nubes puede generar ahorros de costos al optimizar las operaciones de la planta, reducir la necesidad de fuentes de energía de respaldo y mejorar la eficiencia general de la producción de energía. • Beneficios Ambientales: Optimizar el uso de la energía solar mediante predicciones precisas de nubes reduce la dependencia de los combustibles fósiles para la energía de respaldo, disminuyendo así las emisiones de gases de efecto invernadero y promoviendo una producción de energía más limpia. 1.2 Estado del arte El estado del arte en la predicción de sombra de nubes en horizontes temporales cortos se ha apoyado tradicionalmente en métodos de segmentación que se centran en diferenciar los píxeles de nubes 4Capítulo 1. Introducción del cielo despejado mediante el análisis de color. Este enfoque se debe a dos efectos de dispersión de la radiación diferentes que hacen que las nubes se vean blancas y el cielo despejado, azul. La dispersión de Mie es producida por las gotas de agua de las nubes, partículas transparentes de tamaño (entre 0.1 y 10 µm [ 40 ]) comparable con la longitud de onda de la luz visible (entre 400 nm para el azul y 700 nm para el rojo) y con una densidad relativamente alta. Estas partículas reflejan y refractan todas las longitudes de onda visible repetidamente dispersándolas en todas direcciones. Dado que la radiación solar es blanca, las nubes dispersan esta misma radiación recibiendo su color blanco. En contraste, en las capas altas de la atmósfera, la densidad del aire es muy baja. Estas partículas de aire tienen un tamaño muy inferior a la longitud de onda. Estas partículas dispersan la radiación según el efecto Rayleigh con una intensidad proporcional a la cuarta potencia de la inversa de la longitud de onda 1/λ4 . De esta forma, la luz visible de longitud de onda más corta (violeta y azul) es dispersada con mucha más intensidad que las longitudes de onda más largas dando lugar al color azul característico del cielo. Cuando el sol está bajo, la cantidad de luz azul dispersada en todas direcciones es tan elevada que la radiación de longitud de onda más elevada es la que puede atravesar la atmósfera motivo por el cual es sol y el cielo se ven con colores rojos y anaranjados. 1.2.1 Segmentación Algunos estudios, como los de [ 19 ]y[ 14 ], proponen algoritmos basados en umbrales fijos que emplean la relación entre los valores de los canales rojo y azul (cociente R/B=0.6 y B/R=1.4 , respectivamente) para identificar nubes en imágenes de cielo completo. Estos algoritmos clasifican los píxeles cuya relación de los valores de los canales rojo y azul supera un umbral predefinido como nubes, y el resto como cielo despejado. De manera similar, [ 8 ] utiliza la diferencia entre los valores de los canales rojo y azul como una condición de evaluación para detectar nubes, (B−R=30). En [ 11 ] se realiza una mejora sobre este último enfoque considerando un polígono con tres planos en el espacio RGB para la clasificación de píxeles de nubes en imágenes de cielo completo. De esta forma un píxel se clasifica como nube si cumple alguna de las siguientes condiciones: •B−R<20 •B−G<20 •B<60 Otros enfoques, como el desarrollado por [ 33 ], implementa un umbral sobre la saturación como una característica para la identificación de nubes. Sin embargo, estos algoritmos de umbral fijo presentan limitaciones significativas, ya que son altamente dependientes de las características específicas de las cámaras y las condiciones atmosféricas, lo que dificulta su adaptabilidad a diferentes condiciones de cielo. Para abordar estas limitaciones, se han propuesto métodos más avanzados, como el método de umbral híbrido desarrollado por [ 16 ]. Este método, conocido como Hybrid Thresholding Algorithm (HYTA), combina métodos de umbral fijo y adaptativo para mejorar la precisión en la detección de nubes, manteniendo un contraste distintivo incluso con ruido y valores atípicos. Otros métodos, emplean el aprendizaje automático como en [ 17 ], donde se comparan distintos algoritmos para clasificar las imágenes según su nubosidad: árbol de decisión (DT), máquina de 1.2 Estado del arte 5 soporte vectorial (SVM), K vecinos cercanos (KNN) y bosque aleatorio (RF). En este trabajo no se segmentan las imágenes sino que se clasifican en cuatro categorías: cielo despejado, nubes exteriores, nubes interiores o cielo cubierto. De los cuatro métodos empleados, el bosque aleatorio resulta el más preciso, con una precisión del 96.58% en la clasificación. 1.2.2 Predicción del movimiento La predicción del movimiento de nubes a corto plazo se ha abordado desde diferentes enfoques. En [ 22 ] aplicaron el método de flujo óptico Lucas-Kanade para predecir el movimiento de nubes. En [ 35 ] se plantea una forma de predecir la posición de las nubes a muy corto plazo suponiendo un movimiento rígido de las nubes. En [ 7 ] introducen un nuevo modelo llamado MACIN (model for allskyimage-based cloud and direct irradiance nowcasting), validado con datos sintéticos, para la predicción de la irradiancia directa normal (DNI) a nivel intra-hora. En [ 24 ] se introdujo SkyGPT, un modelo que utiliza vídeos sintéticos del cielo generados por VideoGPT, restringido por principios físicos, para generar imágenes futuras del cielo con patrones variados de movimiento de nubes, mejorando la precisión en la previsión solar. En [ 3 ] desarrollaron un método basado en redes neuronales de convolución (CNN) para la predicción de alta resolución del movimiento de nubes a partir de imágenes hemisféricas del cielo. La bibliografía referente a la predicción del movimiento de nubes se retoma y recoge en mayor profundidad en el capítulo 7. 2 Fundamentos teóricos En este capítulo se presentan los fundamentos teóricos esenciales que sustentan la predicción del movimiento de las sombras de las nubes, un aspecto crucial para el desarrollo del modelo propues- to. La predicción de estas sombras requiere una comprensión de varios parámetros y fenómenos interrelacionados. Primero, se aborda la posición solar y el cálculo del tiempo sideral, elementos fundamentales para determinar la dirección y longitud de las sombras proyectadas por las nubes. Estos cálculos son esenciales para establecer el marco temporal y espacial en el que se puede analizar el comportamiento de las sombras. En segundo lugar, se examinan las características de las nubes y los factores que influyen en su movimiento. Este análisis incluye una revisión de la dinámica atmosférica y la influencia de la topografía en el desplazamiento de las nubes. Se pone un énfasis particular en la deformabilidad de las nubes, ya que su capacidad para cambiar de forma bajo diferentes condiciones meteorológicas es un factor crítico para la predicción precisa de las sombras. 2.1 Posición Solar La posición relativa del Sol respecto a la Tierra y las ecuaciones de Euler juegan un papel importante en la modelización del movimiento de la sombra de las nubes. Varios estudios han explorado estos principios y sus aplicaciones en la posicionamiento solar y modelado de sombras. Por ejemplo, en [ 43 ] se define un modelo detallado que utiliza ángulos de elevación solar y coordenadas geográficas para determinar la posición de las sombras solares. De manera similar, [ 42 ] desarrolla modelos para minimizar errores entre longitudes de sombras teóricas y observadas y en [ 4 ] se analiza la compatibilidad de modelos de posición solar con datos topográficos en 3D para la predicción de sombras. La aplicación de la predicción de sombras en plantas termosolares se recoge en [ 31 ] y [ 28 ]. En el primero se aplica el enfoque geométrico para analizar el efecto de las sombras en sistemas de recolección solar y su eficiencia, mientras que en el segundo se predice el movimiento nubes y su impacto en la disponibilidad solar mediante técnicas de procesamiento de vídeo. El tiempo sideral es un sistema de cronometraje que los astrónomos utilizan para rastrear las posiciones de los objetos celestes. A diferencia del tiempo solar, que se basa en la rotación de la 7 14 Capítulo 2. Fundamentos teóricos La complejidad de predecir el movimiento de las nubes debido a su naturaleza deformable ha sido explorada a través de diversas metodologías en la literatura. En [ 27 ] se introduce un método de seguimiento en dos etapas para manejar la frecuente división y fusión de estructuras de nubes, lo que puede utilizarse para predecir eventos de precipitación intensa. En [ 5 ] se propone un método basado en grafos para la predicción del movimiento de nubes, destacando su adaptabilidad para objetos 3D deformables y demostrando resultados superiores sobre métodos base. 3 Instrumentación En este capítulo se introducen los dos instrumentos críticos basados en tierra utilizados para la captura de imágenes del cielo y la monitorización de nubes: la cámara de cielo completo (All-Sky Camera, ASI-16) y el ceilómetro (Lufft CHM 15k). Estos instrumentos ofrecen ventajas significativas sobre los sistemas basados en satélites para ciertas aplicaciones, especialmente en términos de resolución espacial y temporal, rentabilidad y disponibilidad de datos en tiempo real. 3.1 Cámara de cielo completo Las cámaras de cielo completo son herramientas esenciales en el monitoreo meteorológico, equipadas con lentes ojo de pez que capturan una vista completa de 180 grados del cielo. Este campo de visión expansivo permite un monitoreo integral de la cobertura y el movimiento de las nubes en grandes áreas. La alta resolución temporal de las cámaras de cielo completo, que capturan Figura 3.1 Fotografía de la estación meteorológica de la Escuela de Técnica Superior de Ingeniería de la Universidad de Sevilla. Marcados en rojo están la cámara de cielo completo a la izquierda y el ceilómetro a la derecha.. 15 16 Capítulo 3. Instrumentación imágenes a intervalos frecuentes, permite observar cambios rápidos en los patrones de las nubes. Esta capacidad es crucial para la previsión a corto plazo y la toma de decisiones en tiempo real en la gestión de energía solar. 3.1.1 Modelo y tipología de datos El modelo ASI-16 destaca por su robustez y adaptabilidad a condiciones ambientales extremas, con un domo de vidrio de cuarzo revestido, óptica ojo de pez de 180°/360°, un sensor de aproximadamente 4 megapíxeles y un filtro de corte IR para evitar la degradación del sensor por la exposición prolongada al sol. Además, el sistema cuenta con ventilación integrada y calefacción de hasta 60W para minimizar la condensación y eliminar rápidamente gotas de lluvia. La cámara captura imágenes cada minuto con un tamaño de 1536×1536 píxeles. Figura 3.2 Fotografía obtenida por la cámara el 14 de marzo de 2023 a las 13:19:00. 3.2 Ceilómetro Los ceilómetros son instrumentos basados en tierra que utilizan láseres u otras fuentes de radiación para medir la altitud de las bases de las nubes. Proporcionan información precisa sobre la altura y la estructura de las nubes, lo cual es crucial para comprender cómo las nubes impactan la radiación solar. Al añadir una dimensión vertical al monitoreo de nubes, los ceilómetros complementan los datos recolectados por las cámaras de cielo completo. 3.2.1 Modelo y tipología de datos El modelo Lufft CHM 15k es un ceilómetro de backscatter de una longitud de onda que puede detectar múltiples capas de nubes, nubes cirros y capas de aerosoles dentro de un rango operativo de hasta 15 kilómetros. Utiliza un láser Nd de 1064 nm que proporciona un excelente rendimiento de señal, supresión eficiente de la luz diurna y minimización de fluctuaciones de temperatura. El ceilómetro toma medidas cada quince segundos y las almacena al final del día en un archivo .nc obteniendo un total de 5760 instantes de tiempo cada 24 horas. Las medidas realizadas incluyen: 3.2 Ceilómetro 17 • La altura de la base de la nube (CBH) tomando medidas de hasta tres alturas diferentes si las hubiera. •El espesor de las nubes (CDP) para cada una de las alturas existentes. •La cobertura total de nubes (TCC) en tanto por ciento. 4 Contextualización del problema La predicción local y a corto plazo de la posición de la sombra de las nubes constituye un desafío significativo en diversos campos, incluyendo la meteorología, la agricultura y la gestión del tráfico aéreo. Este problema se desglosa en tres fases fundamentales: la detección de nubes, la proyección sobre el suelo y la predicción del movimiento de las nubes. 4.1 Detección de Nubes La detección precisa de nubes es el primer paso crítico en este proceso. Consiste en la segmentación de imágenes capturadas para diferenciar entre áreas cubiertas por nubes y áreas despejadas. Este procedimiento enfrenta múltiples retos técnicos. Las nubes, por su naturaleza, no siempre presentan contornos bien definidos y frecuentemente exhiben bordes difusos debido a variaciones en la concentración de agua condensada. La presencia del sol, visible a través de las nubes, añade una capa adicional de complejidad a la clasificación, especialmente en las proximidades del sol. Además, otros factores como la interferencia de gotas de lluvia o insectos en el campo de visión de la cámara pueden complicar aún más la segmentación precisa. 4.2 Proyección sobre el Terreno La segunda fase crucial es la proyección de las nubes sobre el terreno, la cual permite identificar las áreas específicas que están cubiertas por la sombra de las nubes en contraste con aquellas que reciben radiación solar directa. Esta proyección se realiza utilizando imágenes obtenidas de cámaras de cielo completo. Sin embargo, estas imágenes suelen introducir distorsiones significativas que deben ser corregidas mediante métodos adecuados para asegurar la precisión del análisis. La corrección de estas distorsiones es esencial para garantizar que las sombras proyectadas en el suelo sean representadas con exactitud. 4.3 Predicción del Movimiento La predicción del movimiento de las nubes es el tercer componente esencial de este problema. A diferencia de objetos sólidos que poseen contornos definidos y características fijas, las nubes son entidades fluidas que se desplazan a velocidades variables y en múltiples direcciones. El viento ejerce una influencia dinámica sobre el movimiento de las nubes, alterando constantemente su forma, tamaño e incluso fusionándolas o separándolas en el cielo. Por lo tanto, la determinación precisa del viento y la predicción del movimiento de las nubes requieren modelos que sean capaces de capturar esta naturaleza dinámica y compleja. 19 20 Capítulo 4. Contextualización del problema En resumen, la integración de estos tres aspectos —la detección precisa de nubes, la corrección de distorsiones en las proyecciones sobre el terreno y el modelado del movimiento fluido de las nubes— constituye el núcleo del problema abordado en esta tesis. Este enfoque integral tiene el potencial de mejorar significativamente la precisión de las predicciones locales de la posición de la sombra de las nubes, con aplicaciones prácticas en múltiples sectores. Figura 4.1 Diagrama de flujo del inicio de la segmentación de imágenes. Figura 4.2 Diagrama de flujo de la segmentación de imágenes mediante tratamiento digital de imágenes. 4.3 Predicción del Movimiento 21 Figura 4.3 Diagrama de flujo de la segmentación de imágenes mediante red neuronal de convolución. Figura 4.4 Diagrama de flujo de la predicción del movimiento de nubes. Por último, se ha elaborado un diagrama de flujo general que ilustra la iteración de todos los programas desarrollados, diferenciando entre los métodos tradicionales y los automáticos. Este diagrama proporciona una visión clara de la secuencia de etapas y la interacción entre las distintas fases del proceso. Cada una de estas problemáticas será abordada en detalle en los capítulos correspondientes de esta tesis. En el Capítulo 5 se examina la detección de nubes, el Capítulo 6 se centra en la proyección sobre el terreno, y el Capítulo 7 trata sobre la predicción del movimiento de las nubes. Los resultados se presentan en el Capítulo 8 y las conclusiones y futuras líneas de investigación se discutirán en el Capítulo 9. 5 Detección de nubes 5.1 Detección basada en métodos tradicionales En esta sección se recoge la descripción del algoritmo diseñado a fin de clasificar las zonas nubosas de una imagen obtenida con una cámara de ojo de pez. Este algoritmo recibe como entradas dos imágenes del cielo consecutivas con una diferencia de un minuto y una imagen del cielo despejado de un día cualquiera previo que se usará como base para eliminar los objetos fijos del borde (edificios, antenas, etc). Así mismo, a partir de la imagen de cielo despejado se establece un filtro circular para las imágenes de ojo de pez. (a) Imagen original tomada el 2023/01/09 a las 14:53:00. (b) Imagen previa tomada el 2023/01/09 a las 14:52:00. (c) Imagen usada como filtro tomada el 2023/01/10 a las 12:25:00. Figura 5.1 Imágenes de entrada al algoritmo para clasificar la imagen de cielo el día 2023/01/09 14:53:00. Tras definir el filtro se lee la imagen principal y se realiza su descomposición en sus canales RGB. A fin de minimizar la influencia del sol y evitar su detección como nube, se obtiene la posición del sol a partir del canal rojo mediante un límite de 240 sobre 255 y se eliminan los píxeles de sol, añadiéndolos al filtro. A continuación, se realza la diferencia entre azul y rojo en cada píxel mediante una transformación b−r b+rcomo se propone en [16] y se aplica el filtro descrito anteriormente. 23 30 Capítulo 5. Detección de nubes U-Net modificada, ampliamente reconocida por su capacidad en tareas de segmentación de imágenes. Figura 5.7 Esquema de arquitectura U-Net para segmentación de imágenes. Las imágenes empleadas para el entrenamiento forman un conjunto de 120 imágenes obtenidas con la cámara de cielo completo y sus respectivas imágenes segmentadas manualmente, en total 240 imágenes. Este número es reducido en comparación con lo habitual en el entrenamiento de redes neuronales debido a las limitaciones de gpu y la dificultad de segmentar las nubes a mano el número de imágenes. Sin embargo, se ha investigado en la bibliografía que según [ 21 ] conjuntos de al rededor de 100 imágenes pueden ser suficientes para el entrenamiento de modelos de segmentación. Cada imagen fue leída y preprocesada utilizando la biblioteca OpenCV. El proceso de preprocesamiento incluyó la reducción de tamaño de la imagen a 128x128 píxeles, la conversión de las imágenes a escala de grises, la aplicación de un umbral binario para la detección de contornos, y el cálculo del contorno de mayor área, que se utilizó para crear una máscara circular de las imágenes de cielo completo. Las imágenes preprocesadas se normalizaron dividiendo los valores de píxeles por 255.0, asegurando que los datos de entrada estuvieran en el rango [0, 1]. Se dividieron los datos en conjuntos de entrenamiento y validación utilizando un 90% para entrenamiento y un 10% para validación. La arquitectura de la CNN utilizada se basa en el modelo U-Net, una red de codificador-decodificador simétrica diseñada inicialmente para la segmentación de imágenes biomédicas. La estructura del modelo incluye: • Camino de Contracción: Compuesto por bloques de convolución y max-pooling, que extraen características de bajo nivel de las imágenes. Cada bloque de convolución consiste en dos capas de convolución 2D con activación ReLU, seguidas de una capa de max-pooling. Se aplicó una capa de Dropout para prevenir el sobreajuste. • Camino de Expansión: Compuesto por capas de convolución transpuesta y concatenación, que permiten la reconstrucción de la imagen a partir de las características extraídas. Cada bloque de expansión incluye una capa de convolución transpuesta, seguida de dos capas de convolución 2D con activación ReLU. Las capas de Dropout también se utilizan en el camino de expansión para mejorar la generalización del modelo. • Capa de Salida: Una capa de convolución 2D con activación softmax para la segmentación final en cielo o nube. El modelo se compiló utilizando la función de pérdida de entropía cruzada categórica, adecuada para tareas de segmentación multiclase. El optimizador RMSProp (Root Mean Square Propagation) 5.2 Segmentación mediante aprendizaje automático 31 con una tasa de aprendizaje de 0.001 se utilizó para actualizar los pesos del modelo. El modelo se entrenó durante 40 épocas, con una tasa de aprendizaje inicial y una monitorización de la precisión en los conjuntos de entrenamiento y validación. Durante el entrenamiento, se utilizó una técnica de prefetching y almacenamiento en caché para optimizar el rendimiento, y los datos se dividieron en lotes de tamaño 10. La precisión del modelo se monitorizó a lo largo del entrenamiento, observándose una mejora continua en la precisión tanto en el conjunto de entrenamiento como en el de validación. Al final del proceso de entrenamiento, se alcanzaron niveles de precisión satisfactorios, demostrando la efectividad del modelo en la clasificación de imágenes de nubosidad. El modelo entrenado fue guardado en el formato .keras para su futura implementación y uso en aplicaciones prácticas de análisis meteorológico. (a) Imagen original. (b) Resultado de la red neuronal de convolución entrenada. Figura 5.8 Imágenes original y clasificada del día 2022/03/03 a las 08:45:00. 6 Proyección sobre el terreno La proyección precisa de las sombras de las nubes sobre el terreno es un aspecto crucial para diversas aplicaciones, entre las cuales destaca la estimación de la radiación solar sobre superficies específicas, como las plantas termosolares. Comprender y predecir cómo las sombras se proyectan y se desplazan sobre el terreno permite obtener información para optimizar la captación de energía solar. En este capítulo, se abordan las técnicas necesarias para transformar imágenes capturadas con lentes ojo de pez a un plano utilizable para la proyección de sombras, corrigiendo las distorsiones ópticas inherentes a estas lentes y asegurando una representación precisa del área de interés. Se detalla la corrección de aberraciones ópticas, crucial para evitar errores significativos en la proyección de sombras y en las estimaciones de radiación solar. Además, se define y delimita la región de interés, centrando la atención en las áreas específicas relacionadas con la posición del sol para una proyección precisa de las sombras. Finalmente, se añade la posición del sol como un factor clave en la proyección. La ubicación y el movimiento del sol determinan la dirección y longitud de las sombras proyectadas, y su correcta consideración es esencial para la predicción. Este análisis es particularmente para estimar (en un futuro) la radiación solar incidente en el terreno. 6.1 Transformación de imagen ojo de pez a plano A fin de obtener la sombra proyectada sobre el terreno es necesario convertir previamente la imagen de ojo de pez a plano. 33 34 Capítulo 6. Proyección sobre el terreno Figura 6.1 Esquema transformación ojo de pez a plano. Para realizar dicha transformación se emplea el siguiente algoritmo. Dado un punto de la imagen a una distancia A del centro de la misma, es necesario calcular el valor de la distancia X a la que se encontraría el punto en la imagen si esta fuera plana. Teniendo en cuenta las relaciones A R=sen(θ)(6.1) X R=tg(θ)(6.2) Se obtiene que A=cos(θ)X(6.3) Haciendo uso de la relación trigonométrica cos(θ) = 1 p1+tg2(θ)=p1−sen2(θ) resulta la transformación A=RX √R2+X2X=RA √R2−A2(6.4) Con esta relación la transformación del punto A= (a,b)en la imagen se define como X= (x,y) = Ra √R2−a2−b2,Rb √R2−a2−b2(6.5) Y la transformación inversa A= (a,b) = Rx pR2+x2+y2,Ry pR2+x2+y2!(6.6) De cara al estudio posterior del movimiento de la nube y su predicción de movimiento a futuro (véase el capítulo 7) se recoge en esta sección la transformación del vector de movimiento entre ambas imágenes. Para ver esta transformación se supone una curva en la imagen que pasa por el punto (a,b) , γ(λ)=(a+αλ,b+βλ) . La derivada de esta curva representa el vector de flujo en el punto, γ′(0) = (α,β). 6.1 Transformación de imagen ojo de pez a plano 35 Transformando los puntos de la curva según la expresión anterior, se obtiene la curva η(λ) = R(a+αλ,b+βλ) pR2−(a+αλ)2−(b+βλ)2(6.7) La derivada respecto de λde esta curva es η′(λ) = R(α,β) pR2−(a+αλ)2−(b+βλ)2+R(a+αλ,b+βλ)(aα+α2λ+bβ+β2λ) (R2−(a+αλ)2−(b+βλ)2)3/2(6.8) Evaluada en λ=0se obtiene la transformación del vector del flujo (α,β)⇒R(α,β) √R2−a2−b2+R(a,b)(aα+bβ) (R2−a2−b2)3/2(6.9) En notación vectorial, si se define a= (a,b),α α α= (α,β) α α α⇒R pR2−|a|2α α α+a·α α α R2−|a|2a(6.10) Esta transformación puede comprenderse mejor considerando dos casos: 1. Si α α α⊥a , entonces la transformación del vector de flujo en el punto es Rα α α pR2−|a|2 , es decir, la componente perpendicular varía de la misma forma que transformación para pasar de AaX. 2. En cambio, si α α α||a , entonces la transformación del vector de flujo en el punto es R3α α α q(R2−|a|2)3 , es decir, la componente paralela del vector varía como el cubo de la transformación. Por lo tanto si se supone que las nubes del cielo están en una misma capa y a una altura h se obtiene el viento (vector velocidad en la capa nube) a partir de la transformación a plano del flujo óptico medido entre dos imágenes de la cámara realizando una homotecia de magnitud h/R. (a) Imagen original. (b) Imagen plana. Figura 6.2 Transformación de la origen original (izquierda) a imagen plana (derecha). Imagen obtenida el día 2023/03/08 a las 13:13:00. 36 Capítulo 6. Proyección sobre el terreno 6.2 Corrección de error de la lente En el ámbito del análisis de las imágenes utilizando cámaras de ojo de pez, es crucial identificar y corregir las fuentes de error que afectan la representación de la realidad y la precisión de los datos obtenidos. Los principales factores que contribuyen a estos errores en el presente caso son: • Uso de Ecuaciones Solares Simplificadas de Schlyter: Aunque este factor tiene un impac- to mínimo, las ecuaciones simplificadas para modelar la posición solar pueden introducir pequeñas inexactitudes en la representación de la sombra final y localización del plano de interés. Comparando el resultado utilizando el cálculo de las ecuaciones solares simplificadas de Schlyter [ 32 ] con los datos del Astronomical Applications Department de EEUU [ 25 ] en diferentes instantes de tiempo se obtiene una diferencia de menos de 0.1◦. Tabla 6.1 Comparativa de las ecuaciones solares simplificadas de Schliter con los datos del Astronomical Applications Department para el día 2023/05/01 a las 17:21:16 en Sevilla. Reales Calculados Azimut 253.1◦253.145◦ Elevación 44.5◦44.45◦ • Errores de Retraso en la Captura de Imágenes: Estos errores se producen debido al tiempo de respuesta de la cámara durante la captura de una imagen. Cualquier movimiento de la cámara o del objeto en la escena durante este retraso puede provocar distorsiones en la imagen final. Sin embargo, este no es el principal causante de las distorsiones más significativas. • Compresión en Zonas Periféricas: Este es el principal factor de error en las imágenes de cámaras de ojo de pez. La compresión ocurre porque las lentes de ojo de pez no siguen una relación lineal perfecta en su representación de la realidad. Idealmente, la relación entre la elevación ( ϕ ) del vector tridimensional (3D) y el radio ( r ) en la imagen bidimensional (2D) del ojo de pez es sinusoidal: cos(ϕ(r)) = r(6.11) donde r es el radio del punto en el ojo de pez en coordenadas normalizadas (de 0 a 1 a través del círculo del ojo de pez). Sin embargo, las lentes de ojo de pez reales presentan desviaciones de esta relación idealizada debido a su proceso de fabricación y diseño óptico [2]. Para corregir estas desviaciones, es necesario implementar una función de ajuste que mapee los puntos reales en el ojo de pez a su posición en una lente ideal. Dependiendo de la necesidad de convertir radios normalizados a elevación real o de convertir elevación a radio real. Como espacio de funciones de aproximación se ha considerado uno de la forma: arccos(r) = ϕ+Asen(2ϕ)+Bsen(4ϕ)+Csen(6ϕ)(6.12) Esto supone una corrección a la ecuación del radio teórico dado por la ecuación (6.11) que mantiene fijos el centro de la imagen ( r=0 cuando cos(ϕ) = 0 ) y el perímetro, ya que la amplitud de la cámara es de 180◦(r=1cuando cos(ϕ) = 1). 6.2 Corrección de error de la lente 37 Los resultados experimentales para calcular la corrección de la lente se han obtenido trazando la posición del sol en la imagen y la posición teórica del sol en la imagen a la hora a la que fue tomada la imagen si la lente de la cámara fuera ideal. Un ejemplo se muestra en la figura 6.3. Figura 6.3 Ejemplo de trazado de la posición del sol teórica suponiendo una lente ideal (punto rojo) y la obtenida en la fotografía (punto cian). Imagen del día 2023/03/13 a las 11:35:00. La elevación, calculada a partir del día y la hora de la fotografía, es de 41.17◦ y el azimut de 139.00◦. Con las imágenes de varios días se han obtenido los datos de la deformación de la lente mostrada en la figura 6.4. Los parámetros del ajuste por mínimos cuadrados se recogen en la tabla 6.2. Figura 6.4 Representación de las elevaciones correspondientes al radio de la posición del sol en la imagen frente a la elevación real en el instante de la fotografía.. 38 Capítulo 6. Proyección sobre el terreno Figura 6.5 Triángulo usado para evaluar el ángulo entre el plano de nubes y el plano de terreno. Tabla 6.2 Valores de los coeficientes de las funciones de aproximación. A B C 15.08 3.57 2.26 6.3 Región de interés Para este apartado se realizarán una serie de aproximaciones y se justificará que estas aproximaciones son válidas con gran precisión para los requisitos de una planta solar. En primer lugar, se considera que la irradiancia directa del sol, los rayos solares, son paralelos. Se considera que la superficie de interés es suficientemente pequeña como para que se pueda aproximar la curvatura como nula. Teniendo en cuenta que la planta solar más grande del mundo hasta la fecha, situada en el desierto de Tengger (China), tiene una superficie de 1200km2 [ 30 ]. Suponiendo una parcela cuadrada, el diámetro viene dado por D=√2·1200 =49km . Teniendo en cuenta que el radio de la Tierra es de unos R=6378km , el ángulo de desviación máximo en toda la planta resulta de θ=D R=0.45◦. Una vez validada la aproximación de superficie plana, suponemos que la superficie en la que se encuentran las nubes es paralela a la superficie de la planta. Para ello consideramos un triángulo como el de la figura 6.5. Las nubes suelen encontrarse en una de entre tres capas, una capa baja a una altura de unos 2500m , una capa media a una altura de unos 6500m y una capa alta a una altura de unos 12000m . Considerando la capa alta, la más desfavorable, la longitud del lado AB viene dada por el radio de la Tierra, además, la longitud del lado AC viene dada por el radio de la Tierra más la altura de la 6.3 Región de interés 39 Figura 6.6 Representación de la relación entre el ángulo entre el plano de nubes y el plano del terreno con el ángulo de elevación. capa de nubes. Aplicando el teorema del seno se obtiene la relación 6378 sen(90◦−θ−δ)=6390 sen(90◦+θ)⇒6378 cos(θ+δ)=6390 cos(θ)⇒δ=arccos(0.9981cos(θ))−θ (6.13) En el caso más desfavorable ( θ=0◦ ), resulta un ángulo δ=3.51◦ . Sin embargo, el ángulo entre los planos decrece rápidamente con la elevación. Como se puede observar en la figura 6.6, a partir de una elevación de 6◦el ángulo entre los planos ya es inferior a 1◦. Con estas aproximaciones, el mapa de sombras sobre el terreno es equivalente al plano de nubes en el cielo, como se refleja en la figura 6.7. Figura 6.7 Esquema del modelo de sombras producidas por nubes considerado. De esta forma, la detección de nubes con la cámara de cielo completo permite obtener un plano de nubes que se identifica con un plano de sombras en el terreno cercano a la cámara, donde la posición del sol en el plano de nubes se identifica con la posición de la cámara en el terreno. 46 Capítulo 7. Predicción del movimiento Las dos imágenes son diferentes por lo que pueden tener un número distinto de contornos. Sea n1 (ó n2 ) el número de contornos de la imagen previa(ó actual). Se denota como c1,i (ó c2,j ) el i-ésimo(ó j-ésimo) contorno de la imagen previa(ó actual) ∀i∈{1,...,n1}(ó ∀j∈{1,...,n2}). Cada contorno cx,i es un polígono de kx,i lados definido por kx,i puntos, es decir, píxeles px,i,l de la imagen, ∀x∈{1,2},i∈{1,...,nx},l∈{1,...,kx,i}. Se transforman a plano todos los puntos de los contornos mediante la transformación geométrica definida por (6.5), con R el radio del círculo de la imagen en píxeles. px,i,l→p′ x,i,l , ∀x∈{1,2},i∈ {1,...,nx},l∈{1,...,kx,i}. Sea, P={p′ 1,i,l:i∈{1,...,n1},l∈{1,...,k1,i}} el conjunto de los puntos de contorno de la imagen previa transformados al plano. (a) Imagen de contornos detectados para la nubosidad de día 2023/01/10 a las 11:58:00 junto con los vectores que unen los puntos del contorno con los del contorno siguiente. (b) Imagen de contornos detectados para la nubosidad de día 2023/01/10 a las 12:00:00 junto con los vectores de la imagen de la izquierda desplazados los orígenes al del contorno actual. Figura 7.2 Imágenes del flujo óptico calculado por el algoritmo de movimiento de contornos. (Nótese que los finales de los vectores no definen el contorno de la predicción en el siguiente instante ya que falta transformar a plano los vectores con origen en el contorno previo y antitransformarlos al mover los orígenes al nuevo contorno, lo cual garantiza que ningún punto del nuevo contorno se salga de los límites de la imagen). Para cada punto de contorno de la imagen actual transformado a plano, p′ 2,i,l , se calcula el punto transformado más cercano de la imagen previa. q′ 1,i,l=argm´ ın r′∈P||p′ 2,i,l−r′|| ∀i∈{1,...,n2},l∈{1,...,k2,i}(7.10) 7.5 Predicción 47 La velocidad en este punto se define como la diferencia entre estos puntos entre el tiempo transcurrido entre las imágenes. v′ i,l=(p′ 2,i,l−q′ 1,i,l) t∀i∈{1,...,n2},l∈{1,...,k2,i}(7.11) 7.4.3 Flujo óptico. Movimiento global El algoritmo descrito anteriormente diverge para tiempos largos dando lugar a predicciones carentes de sentido. Un ejemplo se puede observar en la figura 7.3 Figura 7.3 En la imagen se muestra la nubosidad del día 2023/01/09 a las 16:19 en azul. En verde se muestra la predicción mediante el algoritmo descrito por movimiento de contornos desarrollado a partir de las nubosidades obtenidas a las 16:04 y a las 16:05, es decir, una predicción a 14 minutos vista. El color es cyan donde la predicción y la segmentación real se solapan. Por ello se estimó de utilidad calcular también la velocidad media como la media ponderada de las velocidades de los puntos del contorno. V= ∑i,l v′ i,l R+||p′ 1,i,l|| ∑i,l 1 R+||p′ 1,i,l|| (7.12) 7.5 Predicción Se han considerado dos algoritmos para la predicción del movimiento de nubes a un tiempo de T minutos vista. El primer algoritmo asume que el movimiento de las nubes es una traslación rígida sin rotación en el plano con una velocidad constante. Así, el vector V , calculado según la ecuación 7.12, indica la velocidad del movimiento de las nubes y la predicción de la posición de las nubes se obtiene 48 Capítulo 7. Predicción del movimiento trasladando la transformación plana de las nubes según el vector VT y antitransformando de nuevo la imagen a ojo de pez. El segundo algoritmo considera un movimiento de nubes más general, en el que los bordes de las nubes se mueven individualmente dando lugar a variaciones en la forma de las nubes. Como el algoritmo descrito en 7.4.2 diverge a tiempos largos este se ha modificado implementando un filtro lineal. Cada punto del contorno se mueve con una velocidad en el plano dada por un filtro lineal entre 1 y 15 minutos de la siguiente forma. w′ i,l=     v′ i,lsi T≤1 1 14 (T−1)v′ i,l+(15 −T)Vsi 1<T<15 Vsi T≥15 ∀i∈{1,...,n2},l∈{1,...,k2,i}(7.13) La predicción del movimiento del contorno en el plano viene dada por p′ 3,i,l=p′ 2,i,l+wi,lT∀i∈{1,...,n2},l∈{1,...,k2,i}(7.14) Aplicando la transformación inversa (6.6), se obtienen los contornos en la imagen predicha a futuro. p′ 3,i,l→p3,i,l∀i∈{1,...,n2},l∈{1,...,k2,i}. Estos contornos se rellenan como estaban en la imagen actual dando lugar a una predicción a futuro de las zonas nubosas en la imagen. 8 Resultados 8.1 Metodología de pruebas En este capítulo, se presentan los resultados obtenidos a partir de los experimentos realizados para evaluar los algoritmos de segmentación y predicción del movimiento de nubes. Para la segmentación de nubes, se han propuesto dos métodos: uno basado en el procesamiento digital de imágenes y otro utilizando técnicas de inteligencia artificial mediante el entrenamiento de una red neuronal convolucional (CNN). Adicionalmente, se han diseñado dos algoritmos para la predicción del movimiento de las nubes: uno que emplea la velocidad media del viento, asumiendo un movimiento global rígido de las nubes, y otro basado en el movimiento local de los contornos de las nubes. Estos métodos se pueden combinar en un filtro que proporciona la mejor predicción para distintos intervalos de tiempo. Las pruebas se realizaron sobre un conjunto de 115 imágenes segmentadas manualmente, que sirvieron como referencia para evaluar los distintos algoritmos desarrollados. 8.2 Métricas de Evaluación La evaluación de estos métodos se realiza teniendo en cuenta la exactitud, la precisión, la sensibilidad, la especificidad y la puntuación F1. Exactitud =T P +TN T P +FP +TN +FN (8.1) Precisión =TP T P +FP (8.2) Sensibilidad =TP T P +FN (8.3) Especificidad =TN TN +FP (8.4) Puntuación F1 =2·Precisión·Sensibilidad Precisión+Sensibilidad =2·T P 2·T P +FP +FN (8.5) 49 50 Capítulo 8. Resultados 8.3 Resultados de la Segmentación En la tabla 8.1 se recogen las estadísticas de acierto de los distintos algoritmos de segmentación diseñados. En esta tabla, se puede apreciar que en cada iteración se mejoran los resultados de segmentación de nubes, desde el algoritmo de procesamiento digital de imágenes mejorando los métodos tradicionales, hasta el uso combinado de redes neuronales de convolución para la clasificación y segmentación de las imágenes. Tabla 8.1 Resultados de los algoritmos de segmentación implementados. Exactitud Precisión Sensibil. Especific. F1 Algoritmo de segmentación 0.5108 0.7477 0.8728 0.7226 0.8054 CNN clasificación + 0.6538 0.7803 0.8859 0.7637 0.8298 Algoritmo de segmentación CNN clasificación 0.8962 0.8565 0.8942 0.7830 0.8749 + CNN segmentación Los resultados obtenidos de los tres enfoques de segmentación revelan varias observaciones importantes: • El algoritmo de segmentación muestra una exactitud de 0.5108, lo que sugiere que este método tiene limitaciones significativas en la detección precisa de nubes. Sin embargo, su alta sensibilidad de 0.8728 indica que es eficaz para identificar verdaderas áreas nubosas, aunque con un número considerable de falsos positivos, como lo muestra su precisión de 0.7477. • La combinación de CNN para clasificación con el algoritmo de segmentación mejora todos los aspectos de la segmentación. La exactitud se incrementa a 0.6538, la precisión a 0.7803 y la sensibilidad a 0.8859. Esto indica que la CNN para clasificación ayuda a reducir la cantidad de falsos positivos, mejorando la calidad general de la segmentación. • La combinación de CNN para clasificación y segmentación ofrece los mejores resultados, con una exactitud de 0.8962 y una puntuación F1 de 0.8749. Esto demuestra que el uso de CNN tanto para clasificación como para segmentación es altamente efectivo, capturando mejor las características complejas de las nubes y minimizando tanto falsos positivos como falsos negativos. Estos resultados destacan la superioridad de las técnicas basadas en redes neuronales en la segmentación de nubes, mostrando que estas pueden manejar mejor la variabilidad y complejidad de las imágenes meteorológicas. 8.4 Resultados de la Predicción del Movimiento La predicción del movimiento de las nubes se puede realizar simultáneamente para distintos tiempos de predicción. En este caso cada algoritmo se ha evaluado para 15 tiempos de predicción diferentes, desde 1 minuto hasta 15 minutos. También se ha añadido el comportamiento global del algoritmo para todos los tiempos de predicción. Los algoritmos propuestos son el de vector global de la velocidad del viento, que asume que las nubes son un sólido rígido que se traslada en dos dimensiones a una velocidad constante, y el filtro entre el algoritmo de detección de movimiento de bordes local con el anterior, que pondera más los movimientos locales a corto plazo y los globales a largo plazo. Ambos algoritmos se describen en 8.4 Resultados de la Predicción del Movimiento 51 el capítulo 7. En la figura 8.1 se muestra cómo disminuye la exactitud del algoritmo conforme aumenta el tiempo de predicción. Muy pocos casos muestran una exactitud por debajo de 0.6 que suele deberse a los límites de paso de cielo despejado a alguna nube, ya que aparecen nubes que antes no se detectaban y que aumentan de tamaño con rapidez y en cielos totalmente cubiertos que no son clasificados correctamente, ya que en estos casos las nubes detectadas no se detectan correctamente y varían de forma incorrecta. Figura 8.1 Histograma de la exactitud de la predicción del filtro de movimiento global y algoritmo local. 52 Capítulo 8. Resultados Tabla 8.2 Resultados de los algoritmos de predicción del movimiento implementados. Tiempo Exactitud Precisión Sensibil. Especific. F1 1 min 0.9099 0.8506 0.8757 0.9172 0.8629 2 min 0.8548 0.7922 0.8238 0.8483 0.8077 3 min 0.8222 0.7422 0.7943 0.7955 0.7674 4 min 0.8009 0.7051 0.7829 0.7744 0.7419 5 min 0.7714 0.6396 0.7226 0.7885 0.6786 6 min 0.7519 0.6459 0.7038 0.7465 0.6736 7 min 0.7258 0.6271 0.6779 0.7242 0.6515 Estático 8 min 0.7020 0.5944 0.6635 0.7014 0.6271 9 min 0.6820 0.5701 0.6639 0.6769 0.6134 10 min 0.6649 0.5538 0.6706 0.6512 0.6067 11 min 0.6659 0.5560 0.6291 0.6712 0.5903 12 min 0.6745 0.5580 0.6344 0.6828 0.5938 13 min 0.6633 0.5497 0.6731 0.6460 0.6052 14 min 0.6573 0.5476 0.6304 0.6669 0.5860 15 min 0.6614 0.5868 0.6054 0.6816 0.5959 global 0.7313 0.6312 0.7005 0.7292 0.6641 1 min 0.9226 0.8652 0.9048 0.9242 0.8845 2 min 0.8710 0.8079 0.8528 0.8618 0.8297 3 min 0.8427 0.7623 0.8315 0.8124 0.7954 4 min 0.8213 0.7253 0.8171 0.7918 0.7685 5 min 0.7913 0.6614 0.7572 0.8008 0.7060 6 min 0.7700 0.6655 0.7325 0.7613 0.6974 Vector global 7 min 0.7431 0.6422 0.7039 0.7382 0.6717 8 min 0.7151 0.6009 0.6801 0.7141 0.6380 9 min 0.6867 0.5661 0.6691 0.6816 0.6133 10 min 0.6624 0.5332 0.6667 0.6465 0.5925 11 min 0.6691 0.5472 0.6328 0.6746 0.5869 12 min 0.6746 0.5456 0.6328 0.6835 0.5860 13 min 0.6682 0.5230 0.6774 0.6458 0.5903 14 min 0.6592 0.5304 0.6314 0.6635 0.5765 15 min 0.6650 0.5574 0.6108 0.6775 0.5829 global 0.7415 0.6325 0.7168 0.7363 0.6720 1 min 0.9112 0.8639 0.8726 0.9215 0.8682 2 min 0.8506 0.8063 0.8051 0.8503 0.8057 Filtro vector global y algoritmo local 3 min 0.8109 0.7663 0.7556 0.7937 0.7609 4 min 0.7701 0.7129 0.7107 0.7615 0.7118 5 min 0.7372 0.6611 0.6379 0.7804 0.6493 6 min 0.7240 0.6748 0.6303 0.7431 0.6518 7 min 0.6925 0.6419 0.6036 0.7146 0.6222 8 min 0.6838 0.6198 0.6021 0.7093 0.6108 9 min 0.6668 0.5913 0.6033 0.6857 0.5972 10 min 0.6515 0.5696 0.6096 0.6577 0.5889 11 min 0.6512 0.5670 0.5793 0.6741 0.5731 12 min 0.6663 0.5685 0.5918 0.6914 0.5799 13 min 0.6597 0.5283 0.6445 0.6483 0.5806 14 min 0.6588 0.5365 0.6230 0.6656 0.5765 15 min 0.6650 0.5574 0.6108 0.6775 0.5829 global 0.7169 0.6417 0.6545 0.7294 0.6481 8.4 Resultados de la Predicción del Movimiento 53 Además de estos algoritmos, se ha añadido también el comportamiento del algoritmo estático, es decir, suponer que las nubes se mantienen estáticas en la misma posición en la que se observaron por última vez. Este algoritmo permite establecer un criterio para evaluar la actuación de los modelos de predicción desarrollados. Los resultados de las pruebas se recogen la tabla 8.2. Estos resultados muestran que: • En todos los casos, en general, al aumentar el tiempo de predicción disminuyen las métricas de los algoritmos de predicción. Esto era de esperar. El movimiento de las nubes es complejo y no resulta sencillo de predecir. Por tanto, cuanto mayor es el tiempo de predicción, peor es la predicción de los algoritmos. Los casos de mejora son indicativos de que la predicción ha resultado fortuita y por lo tanto supone un límite de la validez de la predicción. Así, el tiempo de predicción máximo de los algoritmos resulta de alrededor de 10 minutos. A partir de entonces el escenario nubes predicho resulta muy diferente del escenario predicho. • El algoritmo usando el vector global de movimiento de nubes, obtiene mejores puntuaciones que el algoritmo estático en todas las métricas hasta los 8 minutos de predicción. Esto indica que aunque su capacidad de predicción también disminuye con el tiempo de predicción, esta es al menos más efectiva que el algoritmo estático. • El uso del filtro de los dos algoritmos desarrollados obtiene unas estadísticas inferiores al uso del vector global individualmente al contrario de lo que se esperaba con el desarrollo del algoritmo. De hecho solo mejora el algoritmo estático para los primeros dos minutos, por lo que no ha resultado un buen método de predicción. (a) Predicción mediante vector global. (b) Predicción mediante el filtro del vector global con el algoritmo local desarrollado. Figura 8.2 En ambas imágenes se muestra la nubosidad del día 2023/03/18 a las 10:13 en azul. En verde se muestran las predicciones mediante los dos algoritmos desarrollados a partir de las nubosidades obtenidas a las 10:09 y a las 10:11 para las 10:13. El color es cyan donde la predicción y la segmentación real se solapan. Estos hallazgos subrayan la importancia de considerar un nuevo enfoque para la predicción precisa del movimiento de nubes. Los modelos propuestos ofrecen resultados poco satisfactorios a medio plazo pero que establecen una base sobre las dificultades que presenta este tipo de predicción para futuras mejoras. 9 Conclusiones y trabajo futuro El presente trabajo se ha centrado en el desarrollo y evaluación de métodos avanzados para la detección y predicción del movimiento de nubes, con el objetivo de mejorar la precisión en la proyección de sombras nubosas en tiempo real. Se han abordado tres aspectos fundamentales: la segmentación de nubes, la proyección de sombras sobre el terreno y la predicción del movimiento de las nubes. En cuanto a la detección de nubes, se ha demostrado que los métodos basados en redes neuronales convolucionales (CNN) tienen un alto potencial para superar a los métodos de tratamiento digital de imágenes para la segmentación de nubes. Las CNN son capaces de captar características complejas de las nubes, mejorando la segmentación en condiciones variables y desafiantes. Los resultados han mostrado una alta exactitud y puntuación F1, confirmando la efectividad de estos métodos en la identificación precisa de áreas nubosas. Para la proyección de sombras sobre el terreno, se ha implementado un sistema que corrige las distorsiones presentes en las imágenes de cámaras de cielo completo. Este sistema asegura que las sombras proyectadas sean representadas con exactitud en el suelo, lo cual es crucial para aplicaciones prácticas en plantas solares. En lo referente a la predicción del movimiento de nubes, se han desarrollado y evaluado dos algoritmos principales: uno basado en la velocidad media del viento y otro que considera el movimiento local de los contornos de las nubes. Aunque ambos métodos han mostrado ser efectivos a corto plazo, se ha observado que la precisión disminuye con el incremento del intervalo de tiempo de predicción, debido a la naturaleza dinámica y compleja de las nubes. La combinación de ambos enfoques, en este caso, no ha proporcionado mejores resultados, abriéndose aquí una clara oportunidad de mejora y trabajo futuro. En resumen, este trabajo ha demostrado que la utilización de técnicas avanzadas de inteligencia artificial y procesamiento de imágenes puede mejorar significativamente la detección y predicción del movimiento de nubes. Los métodos desarrollados ofrecen una base sólida para futuras investigaciones y aplicaciones prácticas en diversas áreas. Aunque los resultados obtenidos son prometedores, existen varias áreas en las que se puede continuar investigando y mejorando. Si bien los métodos basados en CNN han mostrado un rendimiento superior, aún existen desafíos en la segmentación de nubes bajo condiciones extremas, como la presencia de fenómenos meteorológicos severos o iluminación inusual. Futuras investigaciones podrían explorar el uso de arquitecturas más avanzadas, como las redes neuronales profundas (DNN) y las redes generativas adversariales 55 62 Capítulo A. Códigos model_deteccion = models.load_model(’..\\Modelos\\Deteccion.keras’) # Para cada imagen en la ruta seleccionada routes = glob(input_folder + ’\\*11.jpg’) for input_route in routes: image_name = input_route.split(’\\’)[-1] name = image_name.split(".")[0] # Lectura imagen img = cv2.imread(input_route, cv2.IMREAD_COLOR) # Parámetros de imagen y filtros center, radius = image_params(input_route) f = set_filter(img.shape[0:2],center,radius) f3 = cv2.merge([f,f,f]) # Filtrado de la imagen imgf = img*f3 # Clasificación de la imagen categoria = model_clasificacion(np.uint8([imgf])) categoria = list(np.array(categoria)[0,1:]) categoria = categoria.index(max(categoria))+1 # Solo se realiza segmentación si la clasificación no es ni totalmente nublado (1), ni cielo despejado (4) if categoria == 1: deteccion = f*0 elif categoria == 4: deteccion = f*255 else: # Aplicar el modelo de segmentación de imágenes deteccion = model_deteccion(np.uint8([imgf])) deteccion = np.array(deteccion)[0] deteccion = ((deteccion[:,:,-1]>0.5)*255)*f # Guardar los resultados cv2.imwrite(f’{output_folder}\\{name}_a.png’,imgf) cv2.imwrite(f’{output_folder}\\{name}_deteccion.png’,deteccion) Modelo_CNN.py from tensorflow.keras.applications import EfficientNetB1 import numpy as np from tensorflow.keras import layers, Model def create_model(im_shape, out_shape, pretrained = None): # Input layer with the shape of our images inputs = layers.Input(shape=im_shape) A.1 Segmentación de imágenes 63 if pretrained == "EfficientNet": model = EfficientNetB1(input_tensor=inputs, include_top=False, input_shape=im_shape, weights=’imagenet’, drop_connect_rate =0.2) x = model.output name = pretrained else: # We will repeat these block for different number of filters, so we can define it first i=0 def block(inputs, filters, size, drop_out=None): global i i += 1 x = layers.Conv2D(filters, size, padding=’same’, activation=’swish’, name=f’conv{i}’)(inputs) x = layers.MaxPooling2D((2, 2))(x) if drop_out != None: x = layers.Dropout(drop_out)(x) return x # We define the "stem" of the cnn with a convolutional layer with 32 filters # The activation is ’swish’, which usually performs better than the most common "relu" x = layers.Conv2D(32, (3, 3), padding=’same’, activation=’swish’, input_shape=im_shape, name =’stem_conv2d’)(inputs) x = layers.BatchNormalization(name=’stem_bn’)(x) x = layers.Activation(’swish’, name=’stem_activation’)(x) #main "body of the cnn" for i in range(5, 10): if i<9: x = block(x, np.power(2,i), (3,3), drop_out=0.2) else: x = block(x, np.power(2,i), (3,3)) name = "Custom_model" # Classifier, here we use a GlobalAveragePooling instead of flatten the output # as it also allows to reduce # parameters x = layers.GlobalAveragePooling2D(name="avg_pool")(x) x = layers.Dropout(0.3, name="top_dropout")(x) outputs = layers.Dense(out_shape, activation="softmax", name=" predictions")(x) 64 Capítulo A. Códigos # Finally, we define the model by specifying the input and output model = Model(inputs, outputs, name=name) return model def load_trained_model(weights_path, im_shape, out_shape, pretrained = None): model = create_model(im_shape, out_shape, pretrained) model.load_weights(weights_path) return model if __name__ == "__main__": weights_path = ".\\weights\\EfficientnetB1_9.h5" im_shape = (128,128,3) out_shape = 6 pretrained = "EfficientNet" model = load_trained_model(weights_path, im_shape, out_shape, pretrained) Parametros_imagen_circular.py import numpy as np import cv2 def image_params(image_path): img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) _, th = cv2.threshold(img, 10, 255, cv2.THRESH_BINARY) contornos, _ = cv2.findContours(th,cv2.RETR_TREE,cv2. CHAIN_APPROX_NONE) lista_areas = [] for c in contornos: area = cv2.contourArea(c) lista_areas.append(area) cnt = contornos[lista_areas.index(max(lista_areas))] #Calcular centroide del contorno circular (rx, ry), radius = cv2.minEnclosingCircle (cnt) return (rx, ry), radius def set_filter(shape, center, radius): f = np.zeros(shape) x = np.float64(list(range(int(center[0]-radius+1),int(center[0]+ radius)))) y = center[1] + np.sqrt(radius**2-(center[0]-x)**2) for xi,yi in zip(x,y): f[int(xi),int(2*center[1]-yi):int(yi)]=1 return f A.2 Flujo óptico 65 A.2 Flujo óptico import cv2 import numpy as np from OjoAPlano import TransormaPunto, AntiTransormaPunto import copy import math import pandas as pd from glob import glob import os # Tiempos mínimo y máximo para ponderación T_min = 1 T_max = 15 # Tiempo de predicción PredTimes = range(1,16) # Obtención de pares de imágenes para la predicción folder = r’..\TodasClasificadasP2’ images_paths = glob(folder + "\\*00_11.png") princ_imagenes = [im.split("\\")[-1] for im in images_paths] imagenes = [] for im in princ_imagenes: fecha = int(im.replace("_11.png","")) princ_path = f"{folder}\\{im}" if os.path.exists(princ_path): for t in [100,200,300,400]: prev_path = f"{folder}\\{fecha-t}_11.png" if os.path.exists(prev_path): imagenes.append((princ_path, prev_path)) print(f"Image {t/100} minutes before for {fecha}") break else: if t == 400: print(f"No previous image for {fecha}") else: print(f"No image for {fecha}") # Para cada par de imágenes for im_path, prev_im_path in imagenes: name = im_path.split("\\")[-1] prev_name = prev_im_path.split("\\")[-1] # Formato del nombre de las imágenes rest = name[14:] second = name[12:14] minute = int(name[10:12]) hour = int(name[8:10]) 66 Capítulo A. Códigos day = name[:8] prev_minute = int(prev_name[10:12]) prev_hour = int(prev_name[8:10]) #Tiempo entre imágenes de entrenamiento y tiempo de predicción time = (minute-prev_minute)%60 # Cargar las dos imágenes ’previa’ y ’actual’ frame_prev = cv2.imread(prev_im_path, cv2.IMREAD_GRAYSCALE) _, frame_prev = cv2.threshold(frame_prev,150,255,cv2. THRESH_BINARY_INV) frame = cv2.imread(im_path, cv2.IMREAD_GRAYSCALE) origin = copy.deepcopy(frame) _, frame = cv2.threshold(frame,150,255,cv2.THRESH_BINARY_INV) # Cargar imagen de cielo despejado y obtención del filtro im_pathf = r’..\..\Entradas\20230110122500_11.jpg’ imgf = cv2.imread(im_pathf) bf, _, _ = np.double(cv2.split(imgf)) _, filtro = cv2.threshold(bf,100,255,cv2.THRESH_BINARY) filtro = np.uint8(filtro) for i,filt in enumerate(filtro): for j,f in enumerate(filt): if ((len(filtro)/2-i)**2 + (len(filt)/2-j)**2 > (len(filtro) /2)**2): filtro[i,j] = 0 # Obtención del centro y el radio de la imagen centro = int(filtro.shape[0]/2) radio = centro-filtro.any(1).argmax() # Filtro circular para las imágenes filtro_circular = cv2.circle(np.zeros_like(frame),(centro,centro), radio-1,255,-1) # Filtrar imágenes para mantener imagen en el circulo # Suavizado de imagenes # Vuelve a filtrar imágenes para eliminar cualquier color que se haya salido del radio de la imagen frame_prev[filtro_circular==0] = 0 frame_prev = cv2.medianBlur(frame_prev,11) frame_prev[filtro_circular==0] = 0 frame[filtro_circular==0] = 0 frame = cv2.medianBlur(frame,11) frame[filtro_circular==0] = 0 # Obtención de bordes A.2 Flujo óptico 67 contours_prev, _ = cv2.findContours(frame_prev, cv2.RETR_CCOMP, cv2. CHAIN_APPROX_NONE) contours, hierarchy = cv2.findContours(frame, cv2.RETR_CCOMP, cv2. CHAIN_APPROX_NONE) # Cálculo de los puntos del contorno transformados a plano plain_contours_prev = [[TransormaPunto(radio,np.array(point_prev[0])- centro) for point_prev in contour_prev] for contour_prev in contours_prev] plain_contours = [[TransormaPunto(radio,np.array(point[0])-centro) for point in contour] for contour in contours] # Lista de todos los puntos de borde de imagen anterior list_contours_prev = [point_prev for contour_prev in plain_contours_prev for point_prev in contour_prev] # Definición de los puntos del contorno anterior más cercanos a los puntos del contorno actual en el plano print(’Esto lleva rato’) plain_contours_prev_new = [] for i,contour in enumerate(plain_contours): contour_prev_new = [] for j,point in enumerate(contour): contour_prev_new.append(min(list_contours_prev, key=lambda x: math.dist(point,x))) plain_contours_prev_new.append(contour_prev_new) # Velocidad media de los puntos plain_points = np.array([p for contour in plain_contours for p in contour]) plain_norms = np.sqrt(np.sum(plain_points**2,1)) plain_points_prev = np.array([p for contour in plain_contours_prev_new for p in contour]) vel = np.sum(np.transpose(np.transpose(plain_points- plain_points_prev)/(radio+plain_norms)),0)/np.sum(1/(radio+ plain_norms)) prev_hour_text = f’0{prev_hour}’ if prev_hour < 10 else str( prev_hour) prev_minute_text = f’0{prev_minute}’ if prev_minute < 10 else str( prev_minute) hour_text = f’0{hour}’ if hour < 10 else str(hour) minute_text = f’0{minute}’ if minute < 10 else str(minute) for pred_time in PredTimes: # Aplicación del filtro en la velocidad de los contornos if pred_time <= T_min: lamb = 0 elif pred_time >= T_max: lamb = 1 68 Capítulo A. Códigos else: lamb = (pred_time-T_min)/(T_max-T_min) next_minute = (minute + pred_time)%60 next_hour = hour if next_minute < minute: next_hour+=1 next_hour_text = f’0{next_hour}’ if next_hour < 10 else str( next_hour) next_minute_text = f’0{next_minute}’ if next_minute < 10 else str (next_minute) next_name = f"{day}{next_hour_text}{next_minute_text}{second}{ rest}" # Cálculo del contorno futuro a priori plain_contours_pred = [np.array(contour)+pred_time/time*((1-lamb) *(np.array(contour)-np.array(contour_prev))+lamb*vel) for contour,contour_prev in zip(plain_contours, plain_contours_prev_new)] contours_pred = [[[AntiTransormaPunto(radio,point_pred)+centro] for point_pred in contour_pred] for contour_pred in plain_contours_pred] contours_pred = tuple([np.array(c, dtype=np.int32) for c in contours_pred]) frame_pred = cv2.drawContours(np.zeros_like(frame), contours_pred, -1, 255, -1) next_im_path = f’{folder}\{next_name}’ try: # Cargar imagen futura y filtrarla frame_next = cv2.imread(next_im_path, cv2.IMREAD_GRAYSCALE) _, frame_next = cv2.threshold(frame_next,150,255,cv2. THRESH_BINARY_INV) frame_next[filtro_circular==0] = 0 frame_next = cv2.medianBlur(frame_next,11) frame_next[filtro_circular==0] = 0 # Guardar imagen comparando la imagen futura con la predicció n frame_comparative = img2=cv2.merge((frame_next,frame_pred,np. zeros_like(frame))) pred_name = f’{day}{hour_text}{minute_text}00-{prev_hour_text }{prev_minute_text}00-{next_hour_text}{next_minute_text }00_{T_min}-{T_max}{rest}’ im_out_path = f’{folder}\\{pred_name}’ cv2.imwrite(im_out_path,np.uint8(frame_comparative)) # Cálculo de métricas value_pred = frame_pred[filtro_circular!=0] value_next = frame_next[filtro_circular!=0] A.2 Flujo óptico 69 accuracy = (value_next==value_pred).sum()/value_next.shape[0] precision = 1 if (value_next!=0).sum() == 0 else ((value_next >0)*(value_pred>0)).sum()/((value_next!=0).sum()) recall = 1 if (value_pred!=0).sum() == 0 else ((value_next>0) *(value_pred>0)).sum()/((value_pred!=0).sum()) specificity = 1 if (value_pred==0).sum() == 0 else (( value_next==0)*(value_pred==0)).sum()/((value_pred==0). sum()) # Guardar métricas new_row = {"Input": f"{day}_{hour_text}:{minute_text}", "Tmax ": T_max, "Tmin": T_min, "prev_time": time, "pred_time": pred_time, "V_x": vel[0], "V_y": vel[1], "V": np.sqrt(( vel**2).sum()), "accuracy": accuracy, "precision": precision, "recall": recall, "specificity": specificity} try: df = pd.read_excel(f"{folder}\\00Evaluation.xlsx") df.loc[len(df)] = new_row except: print(’No xlsx’) df = pd.DataFrame(new_row,index=[0]) df.to_excel(f"{folder}\\00Evaluation.xlsx",index=False) except Exception as e: print(f"No hay imagen: {e}") OjoAPlano.py import numpy as np import math import sys def OjoAPlano(img,R,theta=0,phi=0,size=1): shape = list(img.shape) # Tamaño de la imagen H = shape[0] W = shape[1] H2 = size*H W2 = size*W shape[0] = H2 shape[1] = W2 # H = Height, W = weight # Conversión a matriz dst = np.zeros(shape) img2 = np.zeros(img.shape) # Mensaje de inicio correcto 70 Capítulo A. Códigos print(’Inicio de la transformacion’) print(’Puede tardar un poco’) for j in range(W2): j2 = j-(W2+1)/2+R*math.tan(theta*math.pi/180)*math.sin(phi*math. pi/180) for i in range(H2): i2 = i-(H2+1)/2-R*math.tan(theta*math.pi/180)*math.cos(phi* math.pi/180) h = R/(R**2+i2**2+j2**2)**(1/2) # Coordenadas de los valores cercanos x, y = i2 * h + (H+1)/2, j2 * h + (W+1)/2 x1 = math.floor(x) y1 = math.floor(y) c1 = img[x1, y1] c2 = img[x1+1, y1] c3 = img[x1+1, y1+1] c4 = img[x1, y1+1] dst[i,j] = c1*(x1+1-x)*(y1+1-y) + c2*(x-x1)*(y1+1-y) + c3*(xx1)*(y-y1) + c4*(x1+1-x)*(y-y1) img2[x1,y1] = c1 # En caso de error sys.stderr.write(’\n’) sys.stderr.flush() return [dst,img2] def CamaraCorreccion(elev): # -------------------------------- # Entradas: # elev: ángulo de elevación real # Salidas: # R: corrección del ángulo de elevación correspondiente de la c ámara # respecto de la aproximación ideal # -------------------------------- R = 0.000059377277351*elev**3 -0.013740492898049*elev**2 + 1.742923873305520*elev + 1.509231417260341 return R A.2 Flujo óptico 71 def TransormaPunto(R,P): return P*R/math.sqrt(R**2-sum(P**2)) def AntiTransormaPunto(R,P): return np.array([round(p) for p in P*R/math.sqrt(R**2+sum(P**2))]) def xy2azimutelev(R, center, x, y): center = np.array(center) direction = center - np.array([x,y]) azimut = math.atan2(direction[0],direction[1]) elev = math.acos(math.sqrt(sum(direction**2))/R) return math.degrees(azimut), math.degrees(elev) def azimutelev2xy(R, center, azimut, elev): center = np.array(center) direction = np.array([np.sin(math.radians(azimut+180)), np.cos(math. radians(azimut+180))]) point = center + R*np.cos(math.radians(elev))*direction return (int(point[0]),int(point[1])) 78 Bibliografía [13] Hisashi KON, The horizontal movement speed of cumulus clouds in a shear flow: A twodimensional numerical experiment, Journal of the Faculty of Science, Hokkaido University. Series 7, Geophysics 7(1981), no. 1, 47–57. [14] Axel Kreuter, Matthias Zangerl, Michael Schwarzmann, and Mario Blumthaler, All-sky imaging: a simple, versatile system for atmospheric research, Applied optics 48 (2009), no. 6, 1091–1097. [15] Yann LeCun, Léon Bottou, Yoshua Bengio, and Patrick Haffner, Gradient-based learning applied to document recognition, Proceedings of the IEEE 86 (1998), no. 11, 2278–2324. [16] Qingyong Li, Weitao Lu, and Jun Yang, A hybrid thresholding algorithm for cloud detection on ground-based color images, Journal of atmospheric and oceanic technology 28 (2011), no. 10, 1286–1296. [17] Xiaotong Li, Baozhu Wang, Bo Qiu, and Chao Wu, An all-sky camera images classification method using cloud cover features, Atmospheric Measurement Techniques Discussions 2021 (2021), 1–17. [18] Min Lin, Qiang Chen, and Shuicheng Yan, Network in network, arXiv preprint arXiv:1312.4400 (2013). [19] Charles N Long, Jeff M Sabburg, Josep Calbó, and David Pagès, Retrieving cloud characteristics from ground-based daytime color all-sky images, Journal of Atmospheric and Oceanic Technology 23 (2006), no. 5, 633–652. [20] Bruce D Lucas and Takeo Kanade, An iterative image registration technique with an application to stereo vision, IJCAI’81: 7th international joint conference on Artificial intelligence, vol. 2, 1981, pp. 674–679. [21] Michael Mommert, Cloud identification from all-sky camera data with machine learning, The Astronomical Journal 159 (2020), no. 4, 178. [22] Román Mondragón, Joaquín Alonso-Montesinos, David Riveros-Rosas, and Roberto Bonifaz, Determination of cloud motion applying the lucas-kanade method to sky cam imagery, Remote Sensing 12 (2020), no. 16, 2643. [23] MJ Montes, A Abánades, JM Martínez-Val, and M Valdés, Solar multiple optimization for a solar-only thermal power plant, using oil as heat transfer fluid in the parabolic trough collectors, Solar energy 83 (2009), no. 12, 2165–2176. [24] Yuhao Nie, Eric Zelikman, Andea Scott, Quentin Paletta, and Adam Brandt, Skygpt: Probabilistic short-term solar forecasting using synthetic sky videos from physics-constrained videogpt, arXiv preprint arXiv:2306.11682 (2023). [25] Astronomical Applications Department of the U.S. Naval Observatory, Altitude and azimuth of the sun or moon during one day, Available on-line at https://aa.usno.navy.mil/data/AltAz (2024). [26] Nobuyuki Otsu et al., A threshold selection method from gray-level histograms, Automatica 11 (1975), no. 285-296, 23–27. [27] Christophe Papin, Patrick Bouthemy, Etienne Mémin, and Guy Rochard, Tracking and characterization of highly deformable cloud structures, Computer Vision—ECCV 2000: 6th European Conference on Computer Vision Dublin, Ireland, June 26–July 1, 2000 Proceedings, Part II 6, Springer, 2000, pp. 428–442. Bibliografía 79 [28] Aleksander Radovan and Željko Ban, Predictions of cloud movements and the sun cover duration, 2014 37th International Convention on Information and Communication Technology, Electronics and Microelectronics (MIPRO), IEEE, 2014, pp. 1210–1215. [29] Prajit Ramachandran, Barret Zoph, and Quoc V Le, Searching for activation functions, arXiv preprint arXiv:1710.05941 (2017). [30] José A. Roca, Las 20 mayores plantas fotovoltaicas del mundo: India manda en el ranking y españa entra en el top 20, Available on-line at https://elperiodicodelaenergia.com/las-10- mayores-plantas-fotovoltaicas-del-mundo/ (2020). [31] Walter P Schimmel Jr, Charles E Hickox, and David O Lee, Tracking and shadowing models for solar collection systems, Tech. report, Sandia Labs., Albuquerque, N. Mex.(USA), 1977. [32] Paul Schlyter, Computing planetary positions-a tutorial with worked examples, Available on-line at http://www stjarnhimlen.se/comp/tutorial.html (2010). [33] Mariza Pereira Souza-Echer, Enio Bueno Pereira, LS Bins, and MAR Andrade, A simple method for the assessment of the cloud cover state in high-latitude regions by a ground-based digital camera, Journal of Atmospheric and Oceanic Technology 23 (2006), no. 3, 437–447. [34] Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdinov, Dropout: a simple way to prevent neural networks from overfitting, The journal of machine learning research 15 (2014), no. 1, 1929–1958. [35] K. Stefferud, J. Kleissl, and J. Schoene, Solar forecasting and variability analyses using sky camera cloud detection & motion vectors, IEEE Power and Energy Society General Meeting (2012). [36] Satoshi Suzuki et al., Topological structural analysis of digitized binary images by border following, Computer vision, graphics, and image processing 30 (1985), no. 1, 32–46. [37] JW Telford and PB Wagner, The measurement of horizontal air motion near clouds from aircraft, Journal of Atmospheric Sciences 31 (1974), no. 8, 2066–2080. [38] Live the Mountain, Identifica los tipos de nubes en tu aventura de montaña, Available on-line at https://www.livethemountain.com/2020/06/07/aprende-a-identificar-los-diferentes-tipos- de-nubes/ (2024). [39] Theocharis Tsoutsos, Niki Frantzeskaki, and Vassilis Gekas, Environmental impacts from the solar energy technologies, Energy policy 33 (2005), no. 3, 289–296. [40] J. Viñas, Las gotas de lluvia, línea]. España: Tecnociencia (2006). [41] Phillip Wood-Bradley, José Zapata, John Pye, et al., Cloud tracking with optical flow for short-term solar forecasting, (2012). [42] JiXiang Zhou, The sun shadow of positioning technology, 2017 5th International Conference on Machinery, Materials and Computing Technology (ICMMCT 2017), Atlantis Press, 2017, pp. 1641–1644. [43] Yinping Zhou, Research on space positioning model based on sun shadow trajectory, (2016).