Full text
Equation Chapter 1 Section 1 Trabajo de Fin de Grado Ingeniería de Tecnologías Industriales Desarrollo e implementación de un sistema de reconocimiento de señales de tráfico en entornos simulados y reales Autor: Juan Feijóo Rodríguez Tutor: Francisco Rodríguez Rubio Dpto. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2024
Trabajo de Fin de Grado Ingeniería de Tecnologías Industriales Desarrollo e implementación de un sistema de reconocimiento de señales de tráfico en entornos simulados y reales Autor: Juan Feijóo Rodríguez Tutor: Francisco Rodríguez Rubio Catedrático de Universidad Dpto. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2024
Trabajo de Fin de Grado: Desarrollo e implementación de un sistema de reconocimiento de señales de tráfico en entornos simulados y reales Autor: Juan Feijóo Rodríguez Tutor: Francisco Rodríguez Rubio El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha:
A mis padres, Natalia y Jorge.
Agradecimientos En primer lugar, he de agradecer a mi tutor, Francisco R.Rubio, de quien guardo especial cari˜no, la confianza depositada a lo largo de este curso. Su amabilidad y apoyo, sin duda, han facilitado mucho la realizaci´on de este trabajo. Agradecer tambi´en a los compa˜neros del Grupo de Investigaci´on y del Departamento de Ingenier´ıa de Sistemas y Autom´atica, el haberme sentido muy bien acogido durante la duraci´on de la Beca de Colaboraci´on. Especialmente a mis compa˜neros de despacho, comidas y caf´es por su paciencia con mis dudas de L A T EX y sus consejos. A mis amigos, tanto a los que ya conoc´ıa como a los nuevos han ido surgiendo en el Grado, y que han hecho de este periodo universitario una etapa muy agradable de mi vida. Por ´ultimo, a mi familia, especialmente a mi madre Natalia, a mi padre Jorge y a mi hermano peque˜no Jaime, por su comprensi´on y cari˜no. Juan Feij´oo Rodr´ıguez Sevilla, julio 2024
4.5.1. Introducci´on a las redes neuronales de varias capas (MLP) . . . . . . . . . . . . . 82 4.5.2. Implementaci´on de la red neuronal . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.5.3. Implementaci´on del optimizador para la red neuronal . . . . . . . . . . . . . . . 87 4.5.4. Resultados del entrenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.5.5. Generaci´on sint´etica de las serigraf´ıas de entrenamiento . . . . . . . . . . . . . . 94 4.6. Ejemplos y resultados en im´agenes de la simulaci´on . . . . . . . . . . . . . . . . . . . . . 99 4.7. Ejemplos y resultados en im´agenes reales . . . . . . . . . . . . . . . . . . . . . . . . . . 105 5. Conclusiones y an´alisis de resultados 117 5.1. Futuras mejoras del algoritmo de percepci´on . . . . . . . . . . . . . . . . . . . . . . . . . 117 6. Anejo de programas 121 6.1. Ejemplos representativos del repositorio de se˜nales . . . . . . . . . . . . . . . . . . . . . 121 6.1.1. Ejemplo de se˜nal cuadrangular: paso peatones ....................121 6.1.2. Ejemplo de se˜nal circular: velocidad m´axima 30 Km/h ...............124 6.1.3. Ejemplo de se˜nal triangular: Peligro resalte .....................131 6.2. Programas de visi´on en MatLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Referencias 157
Nomenclatura Introducci´on HUD: Head-Up Display TSR: Traffic Sign Recognition CCD: Coupled Charge Device CMOS: Complementary Metal-Oxide Semiconductor GPU: Graphic Processing Unit IJCNN: International Joint Conference on Neural Networks ADAS: Advanced Driving Assistance Systems Modelado del mundo de simulaci´on OGRE: Object-Oriented Graphics Rendering Machine ODE: Open Dynamics Engine NASA: National Aeronautics and Space Administration DARPA: Defense Advanced Research Projects Agency ARIAC: Agile Robotics for Industrial Automation Competition XML: eXtensive Markup Language URDF: Unified Robot Description Format SDF: Simulation Description Format COLLADA: COLLAborative Design Activity GUI: Graphic User Interface DAE: Digital Asset Exchange PDF: Portable Document Format UTF-8: Unicode Transformation Format (4bytes) ASCII: American Standard Code for Information Interchange URL: Uniform Resource Locator Modelado del Robot ROS: Robotic Operative System BSD: Berkeley Software Distribution OSRF: Open Source Robotics Foundation LTS: Long Time Support RVIZ: Ros VIsualiZation tool LIDAR: Laser Imaging Detection And Ranging CPU: Central Processing Unit RAM: Random-Access Memory 1
Algoritmo de reconocimiento de se˜nales de tr´afico MatLab: Matrix Laboratory FORTRAN: FORmula TRANslating system RGB: Espacio de color Red Green Blue HSV: Espacio de color Hue Saturation Value CIE: Comisi´on Internacional de la Iluminaci´on (Commission Internationale de l’´ Eclairage) VGA: Video Graphics Array (8 bit) CGA: Color Graphics Adapter (2 bit) EGA: Enhanced Graphics Adapter (4 bit) UHD: Ultra High Definition LUT: Look Up Table GDL o g.d.l: Grados De Libertad ROI: Region Of Interest BW: Black and White (aplicado a im´agenes binarizadas) SVM: Support Vector Machine RBF: Radial Basis Function SIFT: Scale-Invariant Feature Fransform SURF: Speeded-Up Robust Features CNN: Convolutional Neural Network MLP: MultiLayer Perceptron DNN: Deep Neural Network MCDNN: Multi-Column Deep Neural Network HU: Hidden Unit ReLU Rectified Linear Unit SGD: Stocastic Gradient Descent GD: Gradient Descent MSE: Mean Squared Error AdAM: Adaptive Moment Estimation Conclusiones y an´alisis de los resultados DtB: Distance to Borders ANPR : Automatic Number Plate Recognition 2
Notaci´on La notaci´on empleada en este documento est´a especialmente enfocada al ´ambito de la percepci´on visual, por ello, y por algunos convenios y abusos de notaci´on empleados, se considera esclarecedor recopilar los significados de aquellas expresiones m´as usadas e importantes: max(a1,a2,...,an) : Elemento de mayor m´odulo entre las entradas a1, a2, . . . , an. min(a1,a2,...,an) : Elemento de menor m´odulo entre las entradas a1, a2, . . . , an. cos,sen,tan : Funciones trigonom´etricas directas coseno, seno y tangente. Entrada en radianes. cosd,send,tand : Funciones trigonom´etricas directas coseno, seno y tangente. Entrada en grados sexagesimales [0,360]. arccos,arcsen,arctan : Funciones trigonom´etricas inversas con salidas en radianes. floor(x) = ⌊x⌋: Funci´on suelo, truncado a la parte entera de x. ceil(x) = ⌈x⌉: Funci´on techo, Funci´on suelo m´as una unidad de x. round(x) = ⌊x⌉: Funci´on redondeo al entero m´as cercano de xpor la regla 5/4. ⊕: Operador morfol´ogico de dilataci´on. ⊖: Operador morfol´ogico de erosi´on. ⊙: Producto elemento a elemento matricial (producto de Hadamard). arg max u η(u) : Argumento para el cual se alcanza el valor m´aximo de la funci´on η(u). arg min u η(u) : Argumento para el cual se alcanza el valor m´ınimo de la funci´on η(u). AT: Transpuesta de la matriz o vector A. An×m: Matriz Ade tama˜no mfilas y ncolumnas. 1n×m: Matriz de unos con dimensiones n×m. 0n×m: Matriz de ceros con dimensiones n×m. rand(1) : Escalar aleatorio equidistribuido en el intervalo [0,1]. rand(n) : Vector columna de nelementos aleatorios y equidistribuidos en el intervalo [0,1]. rand(n,m) : Matriz de dimensiones n×m, de elementos aleatorios y equidistribuidos en el intervalo [0,1]. Ai: Vector columna de las salidas de la capa i. ai k: Elemento kdel vector Ai. Bi: Vector columna de los b´ıas de la capa i. bi j: Elemento jdel vector Bi. wij : Vector columna de pesos de la neurona jde la capa i, respecto a la capa i−1. wij k: Ponderaci´on de la neurona kde la capa i−1 en la entrada de la neurona jde la capa i. Wi: Matriz de pesos de la capa i. ∇J(θ) = ∂J ∂θ : Por abuso de notaci´on, derivada parcial de Jrespecto a θ.θes un array cualquiera. P(X∈Xk) : Probabilidad por unidad de que Xpertenezca a la clase Xk. 3
´ Indice de figuras Introducci´on Figura 1 : Esquema general del trabajo Figura 2 : Ejemplo de se˜nal antigua Figura 3 : Ejemplo de se˜nal antigua Figura 4 : Ejemplos de se˜nalizaci´on en diferentes pa´ıses Figura 5 : Percepctr´on Mark I Figura 6 : Diagrama simplificado de una neurona electr´onica Figura 7 : Evoluci´on de las GPUs Figura 8 : Representaci´on art´ıstica de un sistema de TSR y su HUD Modelado del mundo de simulaci´on Figura 9 : Logo y esquema interno de Gazebo Figura 10 : Ejemplos de se˜nales verticales cuadradas Figura 11 : Ejemplos de se˜nales verticales triangulares Figura 12 : Ejemplos de se˜nales verticales circulares Figura 13 : Explosi´on de las partes de una se˜nal modelada Figura 14 : Ejemplo de ´arbol de directorios de una se˜nal cuadrada Figura 15 : Campos y significado de un archivo .material gen´erico Figura 16 : Campos y significado de un archivo .config gen´erico Figura 17 : Campos y significado de un archivo .sdf gen´erico Figura 18a : Ejemplo de ´arbol de directorios de una se˜nal triangular Figura 18b : Logo de Blender Figura 19 :´ Areas de trabajo en Blender Figura 20 : 1 º Paso en la creaci´on de un “molde” triangular Figura 21 : 2 º Paso en la creaci´on de un “molde” triangular Figura 22 : 3 º Paso en la creaci´on de un “molde” triangular Figura 23 : 4 º Paso en la creaci´on de un “molde” triangular Figura 24 : Mapa de proyecci´on de texturas Figura 25 : Aplicaci´on del mapa de proyecci´on a una imagen Figura 26 : Comparaci´on de la se˜nal modelada con un documento t´ecnico Figura 27 : Campos y significado de un archivo .dae 5
Figura 28 : Ejemplo de ´arbol de directorios de una se˜nal circular Figura 29 : Modelado del bloque frontal de una se˜nal circular en Blender Figura 30 :´ Arbol de directorios del repositorio de se˜nales creado Figura 31 : Vistas frontales de 3 ejemplos de se˜nales modelados en el trabajo Figura 32 : Vistas posteriores de 3 ejemplos de se˜nales modelados en el trabajo Figura 33 : Vista del conjunto entero de se˜nales modelado en el trabajo Figura 34 : Interfaz gr´afica con Gazebo para incluir modelos en un mundo Figura 35 : Navegaci´on en Gazebo con un rat´on ´optico Figura 36 : Vista a´erea del mundo my world.world sin se˜nales Figura 37 : Vista a´erea del mundo my world reducido.world sin se˜nales Figura 39 : Vistas a nivel del suelo del mundo my world reducido.world sin se˜nales Modelado del robot Figura 40 : Vistas reales del Robot empleado con sus partes Figura 41 : Logotipo de ROS Noetic Ninjemys Figura 42 : Sistema de comunicaciones y archivos en ROS Figura 43 : Archivo launcher para uno de los mundos de simulaci´on Figura 44 : Muestra de las modificaciones sobre un archivo .material Figura 45 : Muestra de las modificaciones sobre un archivo .dae Figura 46 : Muestra de las modificaciones sobre un archivo .sdf Figura 47 :´ Arbol de directorios de la carpeta oculta de Gazebo Figura 48 : Estructura del ´arbol de directorios del modelo del robot en ROS Figura 49 : Informaci´on en terminal tras ejecutar rosbot description rosbot rviz gmapping.launch Figura 50 : Ventana de visualizaci´on de RVIZ Figura 51 : Informaci´on en terminal tras ejecutar rosbot navigation rosbot teleop.launch Figura 52 : Diagrama de grafos con las interacciones de los programas en ejecuci´on Figura 53 : Vistas cercanas del modelo del robot en el mundo de simulaci´on Figura 55 : Perspectiva global desde la c´amara de Gazebo Figura 56 : Perspectiva local desde la c´amara del ROSbot 6
Algoritmo de reconocimiento de se˜nales de tr´afico Figura 57 : Logo de MatLab Figura 58 : Esquema general de las etapas del algoritmo de percepci´on Figura 59 : Estructura del segmentador de color propuesto Figura 60 : Curvas de sensibilidad de los conos Figura 61 : Representaci´on tridimensional de los espacios RGB y HSV Figura 62 : Sistema de ajuste propuesto para el segmentador de color Figura 63 : Representaci´on de las funciones de transformaci´on propuestas Figura 64 : Ejemplos de pares de entrenamiento de im´agenes de simulaci´on Figura 65 : Ejemplos de pares de entrenamiento de im´agenes reales Figura 66 : Desviaciones respecto al ´optimo para pseudo gaussianas en im´agenes simuladas Figuras 67, 68 : Desviaciones respecto al ´optimo para segmentos rectos en im´agenes simuladas Figuras 69, 70 : Desviaciones respecto al ´optimo para segmentos rectos en im´agenes reales Figura 71 : Ejemplo de segmentaci´on por color mostrando los pasos intermedios Figura 72 : Estructura interna del clasificador de formas y extractor de serigraf´ıas Figura 73 : Programa de bajo nivel con las implementaciones de la acreci´on y la erosi´on Figura 74 : Ejemplos con las etapas de preprocesamiento sobre una imagen segmentada de simulaci´on Figura 75 : Visualizaci´on del proceso de etiquetado de regiones conexas Figura 76 : Ejemplos de extracci´on de formas originales y rellenas Figura 77 : Esquema con los puntos importantes del tri´angulo sint´etico a representar Figura 78 : Ejemplos de la clase tri´angulos sint´etica generada Figura 79 : Esquema con los par´ametros de la elipse a representar Figura 80 : Ejemplos de la clase c´ırculos sint´etica generada Figura 81 : Ejemplos de cada una de los subgrupos de la clase rechazo Figura 82 : Ejemplos de los pasos seguidos para la obtenci´on de la m´ascara de extracci´on Figura 83 : Ejemplos de correcta extracci´on de las serigraf´ıas Figura 84 : Ejemplos de incorrecta extracci´on de las serigraf´ıas al no erosionar la m´ascara Figura 85 : Diagrama de interconexi´on de las neuronas en una red Figura 86 : Representaci´on de algunas funciones de activaci´on Figura 87 : Conjunto de se˜nales reconocibles por el programa Figura 88 : Representaci´on art´ıstica de la superficie de coste en 3D e interpretaciones geom´etricas del SGD y del GD 7
Figura 89 : Evoluci´on de la funci´on de coste en diferentes entrenamientos Figura 90 : Evoluci´on de la tasa de acierto en diferentes entrenamientos Figuras 91, 92 : Conjunto de serigraf´ıas original clasificado manualmente para el entrenamiento Figuras 93,94 : Ejemplos de la generaci´on del conjunto ampliado de entrenamiento final Figuras 95, 96, 97, 98, 100 : Ejemplos de correcta identificaci´on en el mundo de Gazebo Figuras 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 : Ejemplos de correcta identificaci´on en im´agenes reales Figuras 118,119, 120 : Ejemplos de fallos en la identificaci´on en im´agenes reales Conclusiones y an´alisis de resultados Figura 121 : Ejemplos reales de se˜nales con degradaci´on del color y oclusiones Figura 122 : Ejemplos reales de agrupaciones dobles de se˜nales Figura 123 : Ejemplos reales de se˜nales con serigraf´ıas deterioradas 8
´ Indice de tablas Modelado del mundo de simulaci´on Tabla 1 : Cuadro comparativo entre SDF y URDF Modelado del Robot - Algoritmo de reconocimiento de se˜nales de tr´afico Tabla 2 : Par´ametros ´optimos del filtro de color con funciones pseudo gaussianas y un conjunto de entrenamiento de im´agenes de Gazebo Tabla 3 : Par´ametros ´optimos del filtro de color con funciones de segmentos rectos y un conjunto de entrenamiento de im´agenes de Gazebo Tabla 4 : Par´ametros robustos del filtro de color con funciones pseudo gaussianas y un conjunto de entrenamiento de im´agenes de Gazebo Tabla 5 : Par´ametros ´optimos del filtro de color con funciones de segmentos rectos y un conjunto de entrenamiento de im´agenes reales Tabla 6 : Par´ametros robustos del filtro de color con funciones de segmentos rectos y un conjunto de entrenamiento de im´agenes reales Tabla 7 : Distribuci´on muestral (media µy desviaci´on t´ıpica σ) de los 7 momentos de Hu para cada conjunto de formas rellenas. Tabla 8 : Convenio de etiquetas seguido para el conjunto de se˜nales de entrenamiento Tabla 9 : Comparativa de la efectividad de la MLP en funci´on de las dimensiones de cada una de sus capas Conclusiones y an´alisis de resultados - Anejo de programas Tabla 10 : Comparativa de los tiempos de ejecuci´on de la funci´on propuesta para calcular los 7 Momentos de Hu en funci´on del tama˜no de las entradas (MatLab) 9
2. Modelado del mundo de simulaci´on El objeto de este apartado es explicar como se ha creado el mundo de simulaci´on, sus componentes y el motivo de la estructura escogida (desde el punto de vista del c´odigo). Adem´as, en caso de que otros usuarios de la comunidad quisieran llevar a cabo proyectos similares o modificar este, el presente documento conforma una gu´ıa detallada para tal fin.4 Actualmente, en el mundo de la rob´otica m´ovil, se ha comenzado a implantar la pr´actica de generar un gemelo virtual del robot a probar, y realizar numerosas simulaciones como fase inicial en el desarrollo de un proyecto [32], estando nuevamente la enorme potencia de c´alculo de los ordenadores modernos detr´as de esta innovaci´on. Las ventajas son muchas: permite evaluar algoritmos de forma sencilla, evita problemas de compatibilidad y comunicaci´on (c´odigo desarrollado en la misma m´aquina), ahorra tiempo y dinero, pues los ensayos pueden llevarse a cabo m´as r´apidamente y sin riesgos, y adem´as, permite dise˜nar el primer prototipo real teniendo en cuenta los problemas vistos en simulaci´on. 2.1. Introducci´on Gazebo Gazebo es un software de simulaci´on de c´odigo abierto cuyo desarrollo comenz´o en 2002 por Dr. Andrew Howard y su estudiante Nate Koenig. Emplea por defecto la m´aquina de f´ısica ODE y para el rendering en 3D hace uso de OGRE. Ha sido el programa escogido para llevar a cabo las simulaciones en competiciones recientes organizadas por instituciones como NASA, DARPA, ARIAC y empresas como Toyota. A ra´ız de esta amplia acogida que ha tenido en la comunidad, el framework de ROS lo ha integrado para que pueden trabajar conjuntamente, simbiosis muy valiosa para el desarrollo de proyectos de simulaci´on. Una de las principales razones por las que se emplea el sistema operativo Linux es que Gazebo est´a bien establecido para trabajar sobre ´el, en particular sobre las distros de Ubuntu, Debian, Fedora, Arch y Gentoo (Ubuntu es la m´as documentada) mientras que su soporte en Windows no es oficial y en macOS a´un es reciente. Es conveniente que la versi´on de Gazebo sea compatible con la de ROS (se entrar´a en detalle en futuros apartados), y ambos han de poseer versiones estables en el sistema operativo base. Por ello y a pesar de la escisi´on de la rama de desarrollo de Gazebo en Classic y Garden (anterior Ignition), se ha preferido trabajar con la rama m´as antigua: Gazebo Classic. Figura 9: Izquierda: Logo de Gazebo. Derecha: Esquema tosco de los bloques principales de Gazebo y sus correspondientes interacciones. Se observa como Gazebo es realmente un nexo de uni´on de otros programas y archivos de la comunidad permitiendo intercambiarlos siempre que haya compatibilidad (p.e: sustituir los motores originales de f´ısicas o renderizado 3D por otros). 4Es recomendable visitar la Wiki de Gazebo Classic y su comunidad para mayor informaci´on [7] . 17
Gazebo a su vez posee dos partes diferenciadas que pueden funcionar independientemente: gzserver:Gazebo Server. Comprende el n´ucleo de Gazebo, es el encargado de interpretar los archivos y simular su din´amica y los sensores. Cuando funciona solo no ofrece interpretaci´on visual de lo que est´a simulando y se denomina comportamiento en modo headless. gzclient:Gazebo Client. Es el encargado de comunicarse con gzserver y proveer una visualizaci´on de la simulaci´on. En lo que respecta a esta secci´on se va a trabajar con ambas partes, lo cual puede hacerse resumidamente con el siguiente comando en terminal.5 1gazebo path_carpeta_mundos/nombre_archivo_mundo.world --verbose Para esta secci´on conviene distinguir entre dos tipos de archivos empleados por Gazebo: Formato de Archivo Acr´onimo Descripci´on SDF Simulation Description Format Empleado para especificar las caracter´ısticas de los objetos presentes en el mundo como formas, texturas, geometr´ıa visual y colisi´on, etc. URDF Universal Robot Description Format Empleado para describir adecuadamente el robot, posee mas etiquetas que SDF pues incluye m´as informaci´on (los robots poseen muchas m´as opciones en comparaci´on con el attrezzo), como din´amica, pares cinem´aticos, sensores, texturas, opciones de simulaci´on de motor de f´ısica, geometr´ıa visual y colisi´on, etc. Cuadro 1: Tipos de archivo principales empleados por Gazebo. En este apartado, puesto que se est´a modelando el mundo sobre el que se va a simular el comportamiento del robot, el tipo de archivo que se emplea es el SDF. A su vez pueden distinguirse dentro de esta subcategor´ıa dos tipo de archivos: World files: Por convenio con extensi´on .world. Reunen informaci´on sobre los objetos del mundo, pero no los describen expl´ıcitamente, sino que indican d´onde se encuentran dentro la estructura de directorios del proyecto6. Adem´as, especifican elementos como las fuentes de luz o las condiciones atmosf´ericas. Model files: Por convenio con extensi´on .sdf. Reunen informaci´on sobre el modelo en s´ı: geometr´ıa, inercias, masa, colisi´on, texturas, etc. Tambi´en pueden referenciar a otros archivos .sdf, usar scripts de texturizado, o importar meshes. Esto es lo que se har´a en el apartado de creaci´on de la biblioteca de se˜nales, ya que es una pr´actica recomendada en la creaci´on de material para la comunidad por sus m´ultiples ventajas: Optimizaci´on de c´odigo (reutilizaci´on de archivos → menor espacio de memoria y menor tiempo ejecuci´on), modularidad (intercambio archivos compatibles para alterar funcionalidades), legibilidad, formas geom´etricas complejas (uso de software m´as avanzado de modelado 3D), etc. 5Entre el enorme rango de terminales que existen se recomienda bash (por defecto en distros de Linux), o zsh (m´as avanzado pero requiere instalaci´on), y se recomienda un multiplexor (p.e tmux) para trabajar m´as c´omodamente. 6Si el proyecto se ejecuta en una m´aquina con conexi´on internet, se pueden referenciar repositorios online mediante enlaces http para la carga de modelos. 18
2.2. Biblioteca de modelos de se˜nales Este es sin duda un apartado cr´ıtico dentro de la creaci´on del mundo de simulaci´on. Mientras que el resto de objetos presentes en el fichero .world son meramente relleno visual para proveer al algoritmo de percepci´on de im´agenes realistas, las se˜nales son los objetos que han de ser identificados, por lo que un buen modelado tiene un prop´osito doble: por una parte, una se˜nal realista proporcionar´a sets de entrenamiento ´utiles cuando se desarrolle el programa de reconocimiento, y adicionalmente, permitir´a simular escenarios realistas con las ventajas que presenta un entorno virtual (rapidez, inexistencia de problemas de hardware, automatizaci´on de ensayos, control sobre las condiciones: ruidos, perturbaciones, caracter´ısticas de la c´amara). El conjunto de se˜nales verticales a modelar estar´a basado en la norma vigente sobre se˜nales de tr´afico espa˜nolas: Real Decreto 1428/2003 del 21 de noviembre, y se tendr´an en cuenta las dimensiones dadas por otro documento oficial: Se˜nales verticales de circulaci´on Tomo 1.Caracter´ısticas de Las Se˜nales, Marzo 1992, el cual es un compendio de planos acotados con las se˜nales verticales m´as importantes. Tras una minuciosa b´usqueda se ha concluido que no existe un conjunto de se˜nales espa˜nolas modelado con anterioridad, o al menos no est´a disponible en plataformas de c´odigo abierto de las cuales descargarlo. Por ello, el prop´osito de este subapartado es explicar c´omo se han generado estos objetos tridimensionales y se han recopilado en una biblioteca, detallando su estructura y c´omo se ha incorporado en el .world. 2.2.1. Tipos de se˜nales Lo primero es hacer una peque˜na clasificaci´on de las se˜nales que se van a modelar, pues en funci´on de ello van a tener una estructura de ficheros diferente. La clasificaci´on est´a basada en la forma geom´etrica de las se˜nales del subconjunto con el que se va a trabajar. Esto est´a relacionado con la proyecci´on de texturas como se ver´a m´as adelante. Se˜nales cuadrangulares: Se˜nales de indicaciones generales: Emplazamiento de un ´area de Parking, paso de peatones, calle sin salida,etc. Figura 10: Ejemplos Se˜nales cuadrangulares empleadas en el trabajo. Se˜nales triangulares: Se˜nales de peligro: curva peligrosa hacia la derecha/izquierda, glorieta, sem´aforo, resalte,etc. Se˜nales de advertencia: ceda el paso. 19
Figura 11: Ejemplos Se˜nales triangulares empleadas en el trabajo. Se˜nales circulares: Se˜nales de obligaci´on: Sentido obligatorio delante/derecha/izquierda, alumbrado de corto alcance,etc. Se˜nales de prohibici´on: limite de velocidad de 10,20,30,...,120 Km/h, prohibido girar derecha/izquierda. Se˜nales de fin de prohibici´on: fin de prohibiciones. Se˜nales de prohibici´on de entrada: entrada prohibida,etc. 20
Figura 12: Ejemplos Se˜nales circulares empleadas en el trabajo. Las im´agenes de estas p´aginas han sido extra´ıdas del pdf del Real Decreto anteriormente mencionado, sin embargo como puede apreciarse la calidad es muy pobre, por lo que en la versi´on definitiva de la biblioteca se ha preferido trabajar con las im´agenes proporcionadas por el repositorio de Wikipedia de se˜nales espa˜nolas de trafico verticales, las cuales, a pesar de no ser oficiales cumplen las caracter´ısticas de dise˜no. Este repositorio ofrece diferentes resoluciones (en la biblioteca se ha escogido la m´as alta con lo que ninguna textura est´a por debajo de calidad 800x800 px), distintos formatos7png, jpg, tif, webp, bmp,... Y adem´as incluye el canal alpha (transparencia, tambi´en conocido como el 4 º canal →RGBα) el cual puede ser de utilidad para proyectar la texturas sobre objetos complejos 8(las im´agenes son siempre rectangulares, mientras que los objetos de proyecci´on no tienen por qu´e serlo, y el uso de este canal αpuede servirnos de m´ascara para seleccionar qu´e se proyecta y qu´e no). Sin embargo, aunque por defecto se emplean las texturas de pictogramas normalizados, si fuera necesario por cualquier usuario de la biblioteca usar el set del Real Decreto (que ofrece ventajas como un menor tama˜no o su estatus oficial), se ha mantenido su carpeta con el nombre pictogramas - normalizados ant, por lo que ´unicamente habr´ıa que intercambiarlos, siendo la ´ultima la que no se usa (ant →antigua). 7Existen muchos formatos para documentos iconogr´aficos, pero es preferible emplear los que no realizan una compre- si´on con p´erdidas, por ello en este trabajo se usa siempre png (Portable Network Graphics). 8Tampoco es una ventaja decisiva pues si fuese necesario podr´ıa a˜nadirse con un editor fotogr´afico como Gimp. 21
2.2.2. Partes de se˜nales A continuaci´on se va a dividir una se˜nal en 3 bloques esenciales que conformar´an el conjunto se˜nal. Estos bloques corresponden al nivel de link en el archivo .sdf que describe cada se˜nal individualmente. Dependiendo de la geometr´ıa de la se˜nal estos bloques estar´an completamente definidos usando las geometr´ıas primitivas de Gazebo (cilindro, cubo y esfera) o ser´an meshes importados alojados en un directorio diferente. Poste vertical: Puede modelarse de forma precisa como si fuera un tubo de secci´on rectangular. Su textura es la del acero galvanizado. Chapa met´alica posterior: Se trata de la parte de atr´as de la se˜nal, tambi´en con textura de acero galvanizado. El motivo de que se considere un objeto diferente al de la chapa anterior es meramente para desvincular la proyecci´on de dos texturas diferentes en un mismo objeto, lo cual aporta legibilidad en el c´odigo y como se ver´a m´as adelante, facilita una estructura de la biblioteca de las se˜nales m´as elegante y compacta reutilizando bloques. Chapa met´alica anterior: Sobre ella se proyectar´a la serigraf´ıa correspondiente a la se˜nal de tr´afico que estemos representando, p.e. un anillo circular externo rojo sobre un fondo blanco con el l´ımite num´erico de velocidad [Km/h] en tipograf´ıa gruesa de color negro. Figura 13: Explosi´on en los 3 bloques mencionados para una se˜nal terminada en Gazebo. 22
2.2.3. Se˜nales cuadrangulares En este apartado se ver´a la estructura de archivos del modelo de una se˜nal cuadrangular. Se trata del ´unico modelo de se˜nal que puede realizarse empleando exclusivamente las herramientas de modelado que nos ofrece Gazebo. Esto es debido a que las primitivas son paralelep´ıpedos con proyecciones de texturas sin recortes o deformaciones. Figura 14: ´ Arbol de directorios de una se˜nal cuadrangular (p.e Paso Peatones). La carpeta materials posee informaci´on referente a la proyecci´on de texturas; dentro de ella en el apartado de scripts se hallan los archivos que configuran la proyecci´on de texturas nombre.material con las opciones que ofrece el renderizador por defecto de Gazebo: OGRE (Object-Oriented Graphics Rendering Engine). El apartado texturas particulares es recomendable no emplearlo ya que complica el cambio de im´agenes origen para la proyecci´on, pero en caso de que fuera necesario un archivo readme.txt explica como hacer uso de ´el. 1material nombre_material _1/ Diffuse 2{ 3receive_shadows on 4%Habilitar sombras 5technique 6{ 7pass 8{ 9texture _ unit 10 { 11 path _ relativo _ imagen . png / jpg 12 %Origen del path : este archivo 13 %Formatos soportados png , jpg 14 scale x y 15 %Escalado vertical y horizontal ejes de la imagen 16 } 17 } 18 } 19 } 20 21 material nombre_material _2/ Diffuse 22 { 23 ... 24 } Figura 15: Partes del c´odigo en un archivo de configuraci´on de texturas, pueden incluirse m´ultiples materiales en un mismo file .material o separarse en m´ultiples files. En este trabajo se ha escogido la primera opci´on. 23
En el primer nivel de profundidad de la estructura de la se˜nal, existen siempre 3 archivos: model.config,model.sdf y un readme.txt. En el primero de ellos se especifica informaci´on general para su uso en la comunidad, y se modifica o define por primera vez el nombre de la se˜nal que se ver´a posteriormente en la ventana de edici´on del mundo cuando se incluya la biblioteca. 1<?xml version =" 1.0"?> 2<model > 3<name>Nombre identificador de la senal en la GUI de Gazebo </ name> 4<version>1.0 </ version> 5<sdf version =" 1.6"> archivo al que afecta este . config </ sdf > 6<author> 7<name>Nombre del creador </ name> 8</ author> 9<description> 10 Breve descriptcion 11 </ description> 12 13 ... Otros campos 14 </ model > Figura 16: Campos y su significado de un archivo model.config. Es importante incidir en que en este trabajo se ha evitado dentro de lo posible el uso del car´acter ˜n para evitar problemas de compatibilidad (se˜nal →senal). Puesto que los archivos xml usan la codificaci´on UTF-8 en la que la ˜n s´ı tiene codificaci´on (11000011 10110001 →0xC3 0xB1 ) no tendr´ıa que haber problemas, pero as´ı se mantiene retrocompatibidad con ASCII en caso de que fuera necesario por alg´un programa m´as antiguo. Tampoco se han incluido acentos (incluso en los comentarios) para prevenir problemas con la interpretaci´on de caracteres especiales, pr´actica muy recomendada en los c´ırculos de desarrollo de software. El archivo readme.txt contiene una detallada lista de las modificaciones que ha ido sufriendo la biblioteca a lo largo de sus versiones (en este trabajo se ha considerado terminada en la versi´on 3, de ah´ı la coletilla de su nombre →v3 9), as´ı como informaci´on complementaria a la ofrecida en este documento para su uso. Finalmente, el archivo model.sdf es el principal donde se realizan las llamadas a los diferentes archivos de la se˜nal, y donde est´an definidas las primitivas, o se referencian los modelos 3D importados (meshes). Tal como se coment´o al comienzo de este apartado, las se˜nales cuadrangulares no importan meshes porque la proyecci´on de una textura rectangular sobre una primitiva rectangular est´a soportada por Gazebo. Si la textura fuera cuadrangular (siempre lo va a ser porque se trata de im´agenes rasterizadas), pero nos interesase proyectarla sobre otra figura geom´etrica recortando los bordes sobrantes, tendr´ıamos que modelar el objeto y modo de proyecci´on en otro software y despu´es importarlo. Si se intentase usar el script de OGRE el resultado no es el esperado, ya que intenta transformar la morfolog´ıa de la superficie en un rect´angulo, empleando a menudo transformaciones fuertemente no lineales. Una soluci´on podr´ıa ser realizar la transformaci´on inversa sobre el archivo de textura con un programa externo para llevar a cabo la proyecci´on. Esto presenta m´ultiples inconvenientes: dificultad del conocimiento preciso de la transformaci´on interna de OGRE, resoluci´on variable (transformaciones no lineales →fen´omenos de compresi´on), dificultad en la previsualizaci´on e intercambio archivos fuente de proyecci´on (cada vez que queramos cambiar la serigraf´ıa anterior hay que transformarla). 9Existen otras alternativas para el control de versiones (como git para los usuarios de Linux), pero se ha considerado demasiado complejo para el desarrollo de la biblioteca. 24
1<?xml version =’1.0 ’?> 2<sdf version =’ 1.7 ’> 3<model name=’ Nombre_modelo ’> 4<link name=’link_0’> 5<pose>Posici ´on del elemento link_0 [x y z rotx roty rotz]</ pose> 6<visual name =’visual’> 7<pose>Deriva relativa parte visual [x y z rotx roty rotz]</pose> 8<geometry > 9Primitiva del cubo 10 <box > 11 <size>Dimension_X Dimension_Y Dimension_Z</size> 12 </box > 13 </ geometry > 14 <material > 15 <lighting >1 </ lighting > 16 <script> 17 <uri >model://path_relativo_file_scripts</uri > 18 Origen del path: la ubicacion del repositorio de se~nales . 19 <name> nombre_material_0 / Diffuse </ name> 20 </ script> 21 <shader type=’pixel ’/> 22 <emissive >0 0 0 1 </ emissive > ( negro opaco ) 23 Especifica el color emitido por el material en RGBAlpha 24 </ material > 25 <transparency>0 </ transparency> 26 Opcion de transparencia deshabilitada 27 <cast_shadows>1 </ cast_shadows> 28 Opcion de simulacion de sombras habilitada 29 </ visual> 30 <collision name =’ collision ’> 31 <pose>deriva relativa modelo colision [x y z rotx roty rotz ]</pose> 32 <geometry > 33 Definicion de la geometria de colision . Generalmente se emplea la primitiva del cubo incluso para formas complejas para aliviar calculos en la simulaci ´on, esto se denomina bounding box . 34 </ geometry > 35 </ collision > 36 ... 37 <link name=’link_n’> 38 ... 39 </ link > 40 <joint name =’link_0_JOINT_1’ type=’fixed ’> 41 <parent> link_padre </ parent> 42 <child > link_hijo </ child > 43 <pose>Deriva relativa [x y z rotx roty rotz ]</ pose> 44 </ joint > 45 <joint name =’link_1_JOINT_0’ type=’fixed ’> 46 ... 47 </ joint > 48 <static>1 </ static> 49 Nos permite no simular su dinamica lo cual es conveniente para objetos inmoviles 50 <allow_auto_disable >1</ allow_auto_disable > 51 Controla si se permite que el motor de f ´ı sica desactive autom ´a ticamente partes del modelo para mejorar el rendimiento . Aunque como no hay dinamica que simular , este paso es redundante . 52 </ model > 53 </sdf > Figura 17: Esqueleto del c´odigo de un archivo model.sdf para una se˜nal con las correspondientes explicaciones. Existen muchas m´as etiquetas pero no son ´utiles para nuestro prop´osito. 25
55 <library_materials> 56 <material id=" Textura_anterior_triangular - material " name=" Textura_anterior_triangular"> 57 <instance_effect url ="#Textura_anterior_triangular -effect"/> 58 </ material > 59 </ library_materials> 60 <library_geometries > 61 Informacion numerica sobre el mesh . 62 Los nombres comenzaran siempre por circle porque son la base de construccion de las 63 se~nales circulares y triangulares (caso degenerado ). 64 <geometry id="Circle - mesh" name="Circle"> 65 <mesh> 66 <source id=" Circle - mesh - positions " > 67 <float_array id=" Circle -mesh - positions - array " count =" numero ␣ elementos ␣ array " > array coordenadas de los vertices 68 Informacion organizacion del array , en este caso coordenadas 3D : 69 <technique_common> 70 <accessor source ="# Circle -mesh - positions - array " count = " numero ␣ agrupaciones " stride=" elementos ␣ agrupacion " > 71 Significado fisico coordenadas: ternas XYZ 72 <param name="X" type=" float "/> 73 <param name="Y" type=" float "/> 74 <param name="Z" type=" float "/> 75 </ accessor > 76 </ technique_common> 77 </ source> 78 <source id=" Circle - mesh - normals " > 79 Idem pero para las normales a los puntos del mesh 80 </ source> 81 <source id=" Circle -mesh -map -0"> 82 Idem pero definiendo el conjunto de puntos que caracterizan a la mascara UV map que gobierna la proyeccion de las texturas 83 </ source> 84 <vertices id=" Circle -mesh - vertices "> 85 Referencia a los ya definidos mesh positions (1 era entrada geometry /mesh ) 86 </ vertices > 87 <triangles material =" Textura_anterior_triangular - material " count ="numero␣ elementos ␣ array " > 88 Referencia a las coordenadas vertices , las normales , y el mapa UVmap para definir la sectorizacion en triangulos del mesh . 89 </ triangles > 90 </ mesh> 91 </ geometry > 92 </ library_geometries > 93 <library_visual_scenes> 94 Libreria con los nodos de escena: 95 Objeto: mesh con textura aplicada por UVMap 96 Camara 97 Fuente luminica 98 </ library_visual_scenes> 99 <scene > 100 Etiqueta de la escena definida por el archivo 101 </ scene > 102 </ COLLADA> Figura 27: Explicaci´on del contenido y funci´on de los campos de un archivo mesh.dae para la creaci´on de un elemento anterior o posterior de una se˜nal. 32
2.2.5. Se˜nales circulares En este apartado se ver´a la estructura de archivos del modelo de una se˜nal circular. Realmente ya se han explicado todas las partes, pues se trata de una estructura muy similar a la de las se˜nales triangulares. Figura 28: ´ Arbol de directorios de una se˜nal circular (p.e: Velocidad m´axima 80 Km/h). Figura 29: Mesh circular originario en Blender de la serigraf´ıa delantera. En el cuadro de propiedades se pueden especificar las rotaciones, translaciones y escalados. La ´unica diferencia que existe respecto a la anterior estructura de se˜nales triangulares es que solamente existe un mesh. Esto es porque la parte posterior de este tipo de se˜nales tienen la textura de la chapa galvanizada proyectada mediante el lenguaje de scripts de Gazebo en el fichero senal vertical.material. Aqu´ı se puede apreciar como esto no supone un problema apreciable para esta textura (la granularidad del acero galvanizado es muy alta), pero habr´ıa hecho inviable la proyecci´on de la serigraf´ıa anterior. Y de ah´ı que se haya tenido que usar Blender. Naturalmente podr´ıa haberse mantenido exactamente la misma estructura que para las triangulares y haber empleado un mesh para la chapa, pero as´ı se ha aprovechado para ilustrar el efecto que tiene proyectar texturas sobre formas no cuadrangulares en Gazebo. Esto puede verse en las figuras ilustrativas del siguiente apartado Estructura General Biblioteca de se˜nales, en la vista posterior de la se˜nal circular, en la que el grano del acero galvanizado est´a orientado seg´un una espiral que parte del centro del c´ırculo. 33
2.2.6. Estructura General de la Biblioteca de se˜nales Hasta ahora se han tratado las estructuras particulares que componen cada se˜nal, sin embargo, estas han de estar organizadas en un ´arbol m´as grande que adem´as provea los archivos a los que se aluden en sus c´odigos, principalmente, las im´agenes que se proyectan en las formas geom´etricas de las se˜nales. Figura 30: ´ Arbol de directorios general de biblioteca senales v3, muchos apartados no se han desplegado completamente por ser enormes p.e: senales, pictogramas normalizados, pictogramas normalizados ant y otros por haberse mostrado muestras anteriormente p.e todos los ´arboles de las senales. 34
Figura 31: Vistas frontales de los tres tipos de se˜nales en Gazebo. Figura 32: Vistas posterior-laterales de los tres tipos de se˜nales en Gazebo. 35
Figura 33: Muestra del conjunto de se˜nales de la biblioteca senales v3 modelado en este trabajo. El octaedro verde que se aprecia en la parte inferior de la imagen, es un foco de luz puntual que muestra el efecto de las sombras y la luz sobre las se˜nales. 2.3. Creaci´on de mundos de simulaci´on Para crear el mundo de simulaci´on conviene antes que nada referenciar y ubicar adecuadamente la biblioteca senales v3. Est´a debe estar al mismo nivel en el ´arbol de directorios que el archivo .world que lanza Gazebo. Adem´as hay que proporcionar su path absoluto, para que en la creaci´on del mundo Gazebo nos permita insertar los elementos contenidos en el repositorio, y en el uso normal de este el fichero .world pueda encontrar las se˜nales y cargarlas. El path absoluto debe estar apuntando a la carpeta de senales, para que al leer su contenido solamente encuentre estructuras interpretables por el parseador propio de Gazebo. Esta es la modificaci´on que separa la anterior versi´on biblioteca senales v2, en la que no hay una separaci´on de niveles entre las estructuras de las se˜nales y las carpetas con otros contenidos como las im´agenes. Esto ´unicamente ralentizaba la carga de los modelos y generaba errores y advertencias en el log file de Gazebo, pero era una pr´actica poco limpia y por ello se modific´o. Los paths pueden incluirse de varias formas: Modificando la variable de entorno que almacena los paths (es la forma m´as antigua, pero se mantiene por retrocompatibilidad.) Modificando el archivo ini.gui que preconfigura los paths y posee m´as opciones del lanzamiento de las simulaciones. Empleando el interfaz gr´afico (GUI) que ofrece Gazebo cuando lo abrimos, en el apartado insert, que adem´as de incluir modelos de repositorios, permite mediante una ventana emergente navegar con un explorador de archivos en nuestra m´aquina para encontrar las bibliotecas e incluirlas. El procedimiento recomendado es usar la variable de entorno. 36
1export GAZEBO_MODEL_PATH = path_abs / biblioteca_senales_v3 / senales : $ GAZEBO_MODEL_PATH Esta l´ınea puede ejecutarse directamente desde terminal con lo que tendr´a validez de forma temporal, o puede incluirse al final del archivo oculto de configuraci´on del terminal que se est´e empleando para que la inclusi´on sea autom´atica. Este archivo suele estar en $ HOME/.nombre terminalrc1415. Si se emplease la otra forma con el ini.gui, es preferible vaciar la variable de entorno anterior. Este archivo se encuentra en la carpeta oculta en el siguiente lugar: $ HOME/.gazebo/ini.gui , y suele ofrecer opciones como habilitar o deshabilitar el acceso a repositorios en l´ınea, la posici´on de la c´amara del observador cuando se inicia la simulaci´on, los paths de los repositorios locales de los modelos... model path yfile path suplen estas funciones antes relegadas a las variables de entorno. Si hemos a˜nadido bien las rutas de los repositorios, estos se mostrar´an en la interfaz gr´afica de Gazebo, y accediendo a ellos desplegaremos la lista de objetos que est´an en ellos contenidos. Gazebo permite referenciar URLs a bibliotecas en la red, si bien esto puede resultar interesante en sistemas distribuidos en los que se quieren centralizar servicios o se tienen restricciones de memoria, en nuestro caso se preferir´a trabajar con repositorios descargados y alojados en la memoria de nuestro ordenador. Al descargar Gazebo se incluyen algunos de ellos, los cuales se suelen ubicar en $ HOME/.gazebo/models,en /usr/share/gazebo-version gazebo/models o en otro path dependiendo de la instalaci´on. Por otra parte existen numerosas bibliotecas en Github de las que se pueden importar modelos a las anteriores carpetas y adem´as se puede visitar la p´agina que Gazebo tiene dedicada como portal para compartir modelos y/o mundos [14]. En nuestro caso, el resto de objetos que no son las se˜nales: plano de asfalto, postes telef´onicos, postes de luz, edificios (casas, comercios, estaciones de servicio, supermercado, oficina postal, comisaria,...) aceras, hidrantes, ´arboles (pinos y abetos), fuentes, coches... Est´an ubicados en $ HOME/.gazebo/models. Figura 34: Interfaz gr´afica del usuario con Gazebo para incluir modelos en un mundo. 14Se recomienda usar zsh frente a bash, en ambos casos sus archivos de preconfiguraci´on son .zshrc,.bashrc . En Linux los archivos ocultos son precedidos por un ”.” , por lo que si se usan comandos como ls se ha de especificar que estos aparezcan. 15 $ HOME es id´entico a ˜. 37
En cualquier caso, para crear un archivo .world se recomienda lanzar Gazebo sin especificar ning´un tipo de archivo. De esta forma nos encontraremos con un mundo vac´ıo sobre el cual, accediendo a los diferentes repositorios de objetos que hayamos referenciado previamente, los iremos a˜nadiendo y ubicando como prefiramos, algunos shortcuts ´utiles para facilitar esta tarea son: r key: Dibuja sobre el objeto se˜nalado 3 ejes de rotaci´on [Rotx, Roty, Rotz], que pueden modificarse manualmente con el rat´on o en el cuadro de propiedades del objeto (en radianes), para mayor precisi´on. t key: Dibuja sobre el objeto se˜nalado 3 ejes de translaci´on [Transx, Transy, Tranz], que pueden modificarse manualmente con el rat´on o en el cuadro de propiedades del objeto (en metros), para mayor precisi´on. s key: Dibuja sobre el objeto se˜nalado 3 ejes de escalado [Escx, Escy, Escz], que pueden modificarse manualmente con el rat´on o en el cuadro de propiedades del objeto (en metros), para mayor precisi´on. Este tipo de ´ordenes solo es v´alido para las primitivas de Gazebo: esfera, cilindro y cubo, no sirve para los meshes importados. Ctrl+C: y Ctrl+V : Copia un objeto, el efecto en el archivo .world es que se referencia al mismo objeto en el repositorio pertinente, pero autom´aticamente se le asignan a las copias del original, el sufijo clone numero clon, de tal forma que son independientes y se pueden rotar y trasladar desvinculadamente. Ctrl+r: Para resetear las posiciones de los objetos a la ´ultima versi´on guardada. Muy ´util, pues no existe comando Ctrl+z para deshacer las ´ultimas acciones. Figura 35: Movimientos del rat´on para navegar en Gazebo al crear un mundo. M´as informaci´on al respecto puede encontrarse en [13]. En este trabajo se han creado dos archivos .world en los que se ha modelado una peque˜na ciudad. my world.world: Mundo muy completo con un tama˜no de ≈989KBytes (sin se˜nales). my world reducido.world: Mundo reducido para sistemas con menores recursos, con un tama˜no vac´ıo ≈190KBytes y ocupando ≈213KBytes cuando se han incorporado se˜nales. Es decir, presenta una reducci´on de 5el tama˜no del mundo original. En ´el se han incorporado ´unicamente los elementos que se vislumbrar´ıan en la calle principal. En este trabajo, puesto que no se van a usar constelaciones con m´ultiples Robots o se van a poner a prueba algoritmos de mapeo, localizaci´on y seguimiento, la calle principal ofrece escenarios con variaciones m´as que suficientes para probar el sistema de percepci´on implementado. 38
Por ello en este trabajo se va a emplear como escenario de pruebas el my world reducido.world, y como se puede comprobar en las capturas tomadas desde la propia avenida, no quedan huecos sin utiler´ıa desde esa perspectiva aunque en las im´agenes a´ereas pueda parecer un poco escueto. Figura 36: Vista a´erea del mundo my world.world sin se˜nales. Se aprecia desde arriba que los archivos mundo poseen adem´as especificaciones sobre las condiciones atmosf´ericas cambiantes, en este caso nubes que cambian su posici´on y las sombras proyectadas en tiempo de ejecuci´on. Figura 37: Vista a´erea del mundo my world reducido.world sin se˜nales. 39
Figura 39: Vistas desde el inicio y la mitad de la calle del mundo my world reducido.world sin se˜nales. 40
3. Modelado del Robot Hasta ahora se ha tratado el problema de modelar y construir un mundo virtual en la plataforma de simulaci´on Gazebo. El objetivo de este apartado es exponer c´omo incorporar en este escenario un robot m´ovil equipado con sensores para la visi´on. El robot escogido es un ROSbot2 de Husarion, que ha sido modelado de antenamo por sus fabricantes y posee una amplia documentaci´on en la plataforma de ROS, tanto para la versi´on b´asica [15], como para la Pro [16]. La elecci´on de este robot se basa fundamentalmente en su amplio uso en el campo de la docencia, tanto a nivel real, como simulado. Figura 40: Modelo ROSbot2. 3.1. Introducci´on a ROS ROS, por sus siglas en Ingl´es, Robotic Operative System es un meta-sistema operativo que facilita la experimentaci´on y evaluaci´on de algoritmos en el campo de la rob´otica. Hasta su aparici´on, era com´un para el investigador tener que re-implementar manualmente todo tipo de programas de bajo nivel (control PID de los motores, servicios de temporizaci´on, protocolos de comunicaci´on, etc) para realizar los experimentos necesarios, lo cual era costoso (en tiempo y dinero), poco eficiente, y requer´ıa un amplio abanico de conocimientos de hardware y de software. Figura 41: Logo de ROS Noetic Ninjemys. En busca de una soluci´on a estos problemas, un grupo de investigadores en 2007 en la Universidad de Stanford comenz´o a desarrollar la semilla de ROS: PR1, reuniendo todo tipo de programas habituales en el campo, y procurando proporcionar un sistema con los bloques fundamentales que permitiesen una f´acil ampliaci´on por el usuario. Desde finales de 2007 el grupo de Willow Garage continu´o su desarrollo creando PR2, y desde 2013 OSRF ha sido el principal contribuidor, aportando versiones de ROS anualmente. En 2015 se produjo una bifurcaci´on en el paradigma de programaci´on con la incorporaci´on de ROS 2, una rama de desarrollo de ROS que cubr´ıa algunas de las necesidades m´as recientes (p.e. control de enjambres), y resolv´ıa problemas previos cambiando por completo algunas estructuras internas. ROS se caracteriza por trabajar sobre sistemas operativos de tipo Linux, en especial sobre las distros de Ubuntu, y por su naturaleza abierta (licencia BSD), lo que ha permitido la creaci´on de una fuerte comunidad que aporta soluciones reutilizables para otros desarrolladores. 41
Sin embargo, puesto que estamos interesados tambi´en en mover el ROSbot por el mundo creado, es necesario ejecutar una instrucci´on que coordine el control de bajo nivel de las ruedas en base a la informaci´on recibida por teclado: 1roslaunch rosbot_navigation rosbot_teleop . launch Figura 51: Informaci´on mostrada al ejecutar el anterior comando. Nos indica con qu´e teclas se mueve el ROSbot y c´omo incrementar o decrementar las velocidades por defecto. Figura 52: Diagrama de flujo de informaci´on proporcionado al ejecutar rqt graph cuando se han ejecutado las dos instrucciones anteriores. 48
Figura 53: Vistas del modelo del ROSbot en el mundo de Gazebo. Arriba: en my world.world. Abajo en my world reducido.world A pesar de las buenas prestaciones de los ordenadores modernos, la simulaci´on de un robot, su entorno, y los flujos de informaci´on de sus sensores, poseen unos requerimientos que fuerzan las m´aquinas hasta sus l´ımites. En particular, la simulaci´on del sensor de la c´amara RGB supone el grueso de la carga computacional por la elevada tasa de actualizaci´on (en torno a 25-35 fps) y la alta resoluci´on impuesta. Figura 54: Informaci´on dada por la funci´on htop sobre el nivel de trabajo de la CPU y la RAM cuando se lanza la simulaci´on completa. El ordenador en cuesti´on sobre con el que se ha realizado este trabajo es un HP Pavilion 15-cs3000 con un procesador core i7 de 10th generaci´on, una frecuencia de reloj de 1.30 GHz y 8GBytes de RAM. 49
Figura 55: Perspectiva “privilegiada” de Gazebo mostrando el mundo, las se˜nales y el robot en simulaci´on. Figura 56: Imagen de la misma escena anterior pero capturada con la perspectiva del ROSbot por la c´amara RGB del mismo. 50
4. Algoritmo de reconocimiento de se˜nales de tr´afico En este apartado se desarrolla e implementa el algoritmo que procesa las im´agenes para identificar en ellas las se˜nales de tr´afico. La primera decisi´on que se ha de tomar es el lenguaje de programaci´on sobre el que se va a trabajar. Una opci´on podr´ıa ser C++ o Python apoyados en la librer´ıa OpenCV en un nodo de ROS para procesar la informaci´on proveniente de la c´amara simulada. Sin embargo, existen ser´ıas desventajas que contraindican dicha decisi´on: la simulaci´on y el procesamiento de las im´agenes requieren demasiada potencia computacional por lo que habr´ıa problemas de latencia, mostrar gr´aficas y resultados intermedios es menos natural, se complican los ensayos con im´agenes reales, etc. Por ello se ha decidido finalmente implementar los programas en MatLab, lenguaje muy preparado para tareas de visi´on y sobre el que existe una amplia literatura (v´ease [18]). Adem´as est´a muy extendido en el mundo acad´emico, facilitando la transferencia y la replicabilidad de los resultados obtenidos, y es el entorno en el que se ha impartido la asignatura de Sistemas de Percepci´on del grado. 4.1. Introducci´on MatLab MatLab (MATrix LABoratory) es un entorno de programaci´on especializado originariamente en el c´alculo matricial, pero que despu´es se ha desarrollado para acomodar funciones (agrupadas en Toolboxes) de otros campos como el an´alisis de sistemas, procesamiento de imagen, tratamiento de se˜nal, etc. Por ello es actualmente una de las plataformas dominantes en el ´ambito acad´emico. Figura 57: Logo de MatLab. Fue creado a principios de 1970 por Cleve Moller y escrito en FORTRAN, comprendiendo un conjunto de funciones que permit´ıan su uso como calculadora matricial. Puesto que el autor dejaba copias en las universidades que visitaba, su uso comenz´o a volverse popular en el entorno acad´emico. En 1984 junto con John N.Lit decidieron reprogramarlo en C y venderlo, desde entonces MathWorks ha proseguido su desarrollo como producto comercial, y entre otros avances, ha desarrollado desde la d´ecada de 1990 un compilador propio para MatLab. Existen alternativas de c´odigo abierto que son compatibles y muy similares en interfaz a MatLab, como GNU Octave. Sin embargo, puesto que la Universidad de Sevilla (US) ofrece licencia campus, el algor´ıtmo de reconocimiento se explicar´a siguiendo el c´odigo en MatLab. El c´odigo escrito busca ser de bajo nivel para que pueda ser transcrito sin grandes a˜nadidos a cualquier otro lenguaje. Por ello, herramientas como bucles implicitos o funciones de alto nivel ((find)...) han sido evitadas. Sin embargo otras funciones necesarias para trabajar con archivos de imagen, conversiones de tipos (p.e: RGB →Gray, RGB →HSV,...), umbralizaci´on bimodal de Otsu, etiquetado regiones conexas, etc, son aportadas por el Toolbox (Visi´on por Computador). Podr´ıan ser programadas manualmente a mano pues no entra˜nan especial dificultad 17, aunque probablemente las implementaciones no sean tan ´optimas como las hechas por MathWorks. 18 17El etiquetado de regiones es una excepci´on y su programaci´on eficiente requiere un fuerte conocimiento de teor´ıa de conjuntos o de algor´ıtmos de crecimiento, dependiendo de la t´ecnica usada. 18MatLab hace uso de la computaci´on vectorizada para acelerar los c´alculos, e incluso puede hacer uso de la GPU del ordenador del usuario (si hubiese) con el fin de acelerar los c´alculos. 51
4.2. Esquema general del programa de percepci´on El prop´osito del algor´ıtmo de percepci´on es mediante una imagen de entrada, reconocer las se˜nales que en ella est´en presentes y mostrarlas al usuario resalt´andolas e indicando el tipo en un formato HUD (Head Up Display), mediante unas se˜nales prototipo. Esto puede servir de ayuda al conductor facilitando y complementando la informaci´on que ´el mismo percibe, con lo que se pueden prevenir potenciales accidentes derivados del reparto de atenci´on que el conductor debe hacer en todo momento. Adem´as este tipo de sistemas puede permitir que personas con ciertas dificultades visuales puedan optar a la conducci´on. Finalmente, tal como se coment´o en la introducci´on, un algor´ıtmo de identificaci´on de las marcas viales podr´ıa llegar a formar parte de un sistema mayor de decisi´on activa. Actualmente existen algor´ıtmos muy competentes basados en redes neuronales que ofrecen resultados muy buenos. Por ello el objetivo de este TFG no es el de superar estos resultados, sino implementar el sistema haciendo uso de t´ecnicas tradicionales de tal forma que ninguna parte del programa sea transparente, (con modelos de machine learning grandes se pierde la noci´on de c´omo internamente est´a llevando a cabo la clasificaci´on, segmentaci´on, etc). La ´unica parte en la que se involucran t´ecnicas de Machine Learning es en la clasificaci´on de las serigraf´ıas, pero el modelo de red es extremadamente peque˜no y para mostrar como funciona se ha programado manualmente, as´ı como el algor´ıtmo de entrenamiento basado en descenso de gradiente con momento de Nesterov. Naturalmente los resultados no son perfectos, pero el proceso de creaci´on de estos programas ha servido para comprender mejor estas t´ecnicas y para demostrar que siguen siendo viables incluso para tareas tan complejas como esta. Figura 58: Estructura general del programa de reconocimiento de las se˜nales. El bloque de degradaci´on de la imagen sirve para probar el sistema bajo condiciones no ideales y cambiantes sin necesidad de cambiar los par´ametros del sensor de la c´amara del robot. En los futuros apartados se tratar´an los bloques con mayor detenimiento. Se han agrupado sus funciones en 3 grandes conjuntos: Segmentador Color. Clasificador Formas. Clasificador Serigraf´ıas. 52
4.3. Segmentador por color El color y la forma son las caracter´ısticas m´as distintivas del conjunto de se˜nales acogido a la Convenci´on de Viena. Puesto que la forma es un rasgo que se suele tratar en matrices l´ogicas, es conveniente aplicar primero una segmentaci´on por color. Otro motivo adicional en favor de este orden es que el color suele ser, en la mayor´ıa de escenarios, la caracter´ıstica m´as restrictiva, por lo que se evita trabajar innecesariamente al resto de procesos posteriores. En lo que respecta a este apartado se explicar´a el proceso y la sintonizaci´on de sus par´ametros para la segmentaci´on con zonas rojas. Para llevarse a cabo con otros colores, el procedimiento es id´entico. Figura 59: Estructura interna del segmentador de color. Ahora las im´agenes de entrada y salida representan solamente las entradas y salidas parciales de este apartado. 4.3.1. Cambio del espacio de color RGB a HSV Existen muchas formas de describir un color, sin embargo, para nuestro prop´osito es necesaria una descripci´on cuantitativa. Afortunadamente existen m´ultiples espacios de color Rnque nos permiten especificar un color un´ıvocamente. Figura 60: Curvas de sensibilidad normalizadas de los conos S,M,L. En discontinuo, la de los bastones. Condensar las impresiones fotom´etricas es posible debido a una serie de experimentos llevados a cabo por la CIE19 en los a˜nos 1920 que corroboraron que los ojos eran capaces de distinguir distintas frecuencias e intensidades del espectro electromagn´etico debido a 3 est´ımulos procedentes de 3 tipos de conos: L (Rojo), M (Verde), S (Azul), adem´as fueron capaces de extraer las curvas de excitaci´on de estas c´elulas [19]. A ra´ız de estos experimentos m´ultiples espacios de color fueron postulados con tal de poder describir todos los colores visibles por el ser humano, la mayor´ıa en R3, pues es el n´umero de est´ımulos que el ojo percibe. El espacio RGB es un espacio aditivo muy empleado en R3, que si bien no es capaz de reproducir el espacio de color entero (para hacerlo algunos de los elementos de las ternas RGB habr´ıan de ser negativos 19Commission internationale de l’´eclairage, fundada en 1913. Famosa por uno de los primeros espacios de color completos CIE 1931. 53
y ello no es posible porque no se puede sustraer una fuente de luz), se adapta muy bien a los procedimientos de captura de im´agenes y de muestra de las mismas por displays. Este es el formato de entrada de las im´agenes que acepta el algor´ıtmo. El espacio de color RGB suele tener cada canal discretizado en un rango de [0,255], por lo que con 8 bits o un byte se puede representar un elemento de cada canal. Esto resulta en hasta 28·3≈ 16,78 ·106colores posibles, siendo este es el formato m´as extendido (VGA); existen tambi´en otros rangos m´as estrechos de discretizaci´on pero que pertenecen a ´epocas en la que las tarjetas gr´aficas ten´ıan prestaciones m´as limitadas (CGA, EGA, o monocromo), y m´as recientemente formatos con mayor granularidad como UHD. En todo caso en lo que respecta a este trabajo se trabajar´a siempre con elementos de las matrices RGB de tipo uint8 20 Un problema del espacio de color RGB es que el tipo de color, la intensidad, y el grado de pureza del color, son dependientes y por tanto para evaluarlos hay que acceder a los 3 canales. El espacio HSV (Hue, Saturation, Value), resuelve este problema desacoplando la informaci´on. En nuestro caso estaremos ´unicamente interesados en los valores de los canales H y S, desechando el canal V que est´a m´as relacionado con la claridad ambiente. Figura 61: Representaciones de los espacios de color RGB y HSV. Dado el dominio circular de H, la representaci´on del espacio es cil´ındrica El nombre de sus componentes en espa˜nol es H (Tono o cromacidad), S (Saturaci´on, medida del grado de blanco que no posee el color en cuesti´on), V (Valor o Brillo), y sus ecuaciones son las siguientes: V= m´ax(R, G, B) S= 1 −3·m´ın(R, G, B) R+G+B H= arc cos "0,5·[(R−G)+(R−B)] p(R−G)2+ (R−B)·(G−B)# Estas ecuaciones corresponden a la transformaci´on topol´ogica de un espacio cuadrado en un cono invertido (de ah´ı que el t´ermino H tenga un arccos para deshacer la proyecci´on). Normalmente sus valores se escalan entre [0,255] (nosotros usaremos este rango) o entre [0,1], incluyendo H que debe ser convertido de radianes o grados sexagesimales a este nuevo intervalo de trabajo. En MatLab, a pesar de que ser´ıa sencillo implementar una funci´on propia, se usa la nativa rgb2hsv. 20Unsigned Integer 8 bit representation. 54
4.3.2. Planteamiento como problema de optimizaci´on Una vez que se tienen los canales H y S, hay que realizar alg´un tipo de selecci´on de los valores que queremos seleccionar. Un primer m´etodo ser´ıa fijar unos intervalos [Hmin, Hmax] y [Smin, Smax] y todos aquellos puntos de la imagen que cumplieran simultaneamente las 2 condiciones ser´ıan p´ıxeles blancos (1s) y el resto negros (0s). Si bien este procedimiento ser´ıa v´alido, se ha planteado y ejecutado otro mucho m´as complejo pero con la ventaja de no tener que fijar ning´un tipo de par´ametro de antemano, ser ´optimo, y facilitar la implementaci´on de estos programas en sistemas que trabajen con im´agenes reales. La idea es realizar una transformaci´on de histograma a cada canal H, S dadas por unas funciones con un determinado n´umero de grados de libertad o hiperpar´ametros, a continuaci´on los valores realzados de cada elemento en el canal H y S se multiplican entre s´ı (producto matricial de Hadamard) resultando una ´unica matriz que puede ser interpretada como una imagen monocroma o grayscale. Finalmente analizando su histograma y realizando una binarizaci´on por el m´etodo de Otsu se obtiene una imagen final con 1s en los puntos m´as brillantes y 0s con el resto de ellos. Puede interpretarse esta t´ecnica como una umbralizaci´on suave (en tanto que as´ı lo son las funciones de transformaci´on), y posee las ventajas de seguir segmentando la imagen, incluso cuando grandes regiones de la misma poseen valores muy cercanos a las firmas crom´aticas de las se˜nales que se quieren detectar. La determinaci´on de estos hiperpar´ametros se realiza optimizando una funci´on de coste evaluada en un conjunto de entrenamiento para el que se han segmentado manualmente las im´agenes. Figura 62: Esquema con el mecanismo de sintonizaci´on de los par´ametros de las funciones de realce para los canales H y S. Se han propuesto dos tipos de funciones de realce: segmentos rectos: posee 3 par´ametros: µsg,σsg ymsg (tambi´en llamada slopesg). Se trata de un filtro de tipo paso banda con ca´ıdas de pendiente no infinita en las esquinas de corte. pseudo gaussiana: posee 2 par´ametros: µpg yσpg. Se trata de un filtro paso banda ideal suavizado, dado por la forma de la funci´on f(x) = e−x2, aunque como se puede apreciar, no cumple la condici´on de R+∞ −∞ f(x) = 1, y de ah´ı el prefijo “pseudo” para distinguirla de la campana de Gauss. 55
Puesto que tanto el rango de entrada de las funciones como su salida var´ıa en un rango discreto, se han escrito unos programas que generan unas LUTs 21 (Look Up Tables) correspondientes. Estas se emplean accediendo a los elementos contenidos en forma vectorial, siendo los ´ındices de entrada las entradas de la funci´on y el valor almacenado en sus casillas, el valor de salida. Estos valores deben ser redondeados ya que se est´a trabajando con n´umeros enteros en el intervalo [0, rango −1]. 0 50 100 150 200 250 300 Entrada 0 50 100 150 200 250 300 salida LUTsegmentos rectos 0 50 100 150 200 250 Entrada 0 50 100 150 200 250 300 salida LUTpseudo distribucion gaussiana m Figura 63: Representaci´on gr´afica de las funciones de transformaci´on anteriormente mencionadas. Los programas que generan estas LUTs comienzan suponiendo µ= 0, y copian sim´etricamente los valores obtenidos para [0, rango/2−1] en [rango/2, rango −1]. A continuaci´on realizan tantos shifts sucesivos en los elementos de los vectores como indique µsuponiendo una cola circular, copiando los elementos que pasan del ´ındice 0 al ´ındice rango −1. Por otra parte los programas comprueban que se cumplan una serie de restricciones que impedir´ıan generar una LUT incoherente. El incumplimiento de estas restricciones se puede notificar mediante un error en terminal o mediante un flag con valor -1 (herencia de los protocolos de anomal´ıas de C). Esto ser´a de enorme utilidad para el optimizador, pues ha de encontrar los valores ´optimos sujetos a una serie de restricciones. µ∈[0,rango −1] σ≥1 m≥1 σsg + 2m≤rango −1 si segmentos rectos σpg ∈[1,rango −1] si pseudo gaussiana Sin embargo, es cierto que incumplir este tipo de restricciones es complicado puesto que los intervalos iniciales de variaci´on dados al optimizador se introducen manualmente, y se procurar´a que 21Usar LUTs adem´as acelera enormemente la velocidad de ejecuci´on del programa , pues a pesar de que se usan F IL ·COL·2 veces, ´unicamente se calculan una vez, con la ventaja de que el acceso de memoria suele ser muy r´apido si el compilador ha detectado su uso intensivo y la ha ubicado en una posici´on privilegiada. 56
sean coherentes. A´un as´ı, si la segmentaci´on fuese con otros colores podr´ıan f´acilmente incumplirse, generando errores posteriores si no se hubiese previsto un mecanismo de notificaci´on. La funci´on a optimizar premia que la segmentaci´on autom´atica coincida con la segmentaci´on manual de entrenamiento y penaliza que no coincidan. Se pueden ponderar estos resultados con ayuda de un hiperpar´ametro λ: uCanal H = [µ, σ, m]uCanal S = [µ, σ, m] si segmentos rectos uCanal H = [µ, σ]uCanal S = [µ, σ] si pseudo gaussiana u= [uT Canal H;uT Canal S] uoptimo = arg max u η(u)η(u) = 1 Ntraining Ntraining X k=1 [λ·αk−βk] s.a restricciones anteriores αk= FIL X i=1 COL X j=1 (pauto ij ·pmanual ij )βk= FIL X i=1 COL X j=1 (pauto ij ·(1 −pmanual ij )) pauto ij : Elemento en la fila i, columna jde la matriz binaria segmentada por el algoritmo propuesto. pmanual ij : Elemento en la fila i, columna jde la matriz binaria segmentada por el usuario en el conjunto de entrenamiento. (pauto ij ·(1 −pmanual ij )): Si el elemento de la imagen original kha sido incorrectamente segmentado este t´ermino valdr´a 1, en c.c 0. βk: Contador con el n´umero de elementos segmentados incorrectamente de la imagen k. (pauto ij ·pmanual ij ): Si el elemento de la imagen original kha sido correctamente segmentado este t´ermino valdr´a 1, en c.c 0. αk: Contador con el n´umero de elementos segmentados correctamente de la imagen k. FIL,COL: Dimensiones de las matrices. Esta ser´a la notaci´on est´andar en el resto del TFG. Ntraining: N´umero de conjuntos de entrenamiento: im´agenes de entrenamiento (RGB) + m´ascaras segmentadas manualmente (BW). Dividir la funci´on de rendimiento entre este valor ´unicamente normaliza y evita p´erdidas de precisi´on cuando los sets son muy grandes. Un problema de la funci´on η(u) anterior es que, a pesar de servir para la optimizaci´on, no muestra claramente el rendimiento para una f´acil interpretaci´on. Por ello se ha recurrido finalmente a otra versi´on m´as elaborada que describe un porcentaje de correcta clasificaci´on, lo cual es independiente del tama˜no y contenido de la imagen introducida y posee una interpretaci´on muy clara en t´erminos humanos. η(u) = 100 Ntraining Ntraining X k=1 λ·αk−βk λ·αk [ %] Notes´e que esta funci´on considera que el n´umero de p´ıxeles clasificados correctamente van ponderados por el hiperpar´ametro λpor lo que la interpretaci´on del rendimiento del segmentador no es tan directa como podr´ıa pensarse. 57
Figura 68: Desviaciones de los par´ametros sobre el ´optimo en un canal manteniendo los del otro constantes y en el ´optimo. El punto rojo representa el ´optimo. 64
4.3.5. Valores ´optimos de funciones Segmentos Rectos en escenarios reales En este apartado se resuelve el problema de optimizaci´on para im´agenes reales usando las funciones de segmentos rectos, ya que ofrecen m´as flexibilidad y eficiencia, y ser´an las que finalmente se implementen en el programa de reconocimiento final. Sin embargo, deben destacarse dos diferencias respecto al anterior: Esta vez el set de entrenamiento est´a compuesto por im´agenes reales, y como la casu´ıstica encontrada es mucho mayor, tambi´en lo es el conjunto de entrenamiento. Se han tratado de incorporar la mayor´ıa de casos posibles jugando con grados de libertad: Im´agenes tomadas a distintas horas del d´ıa: la percepci´on del color por la c´amara depende fuertemente de la hora del d´ıa. Im´agenes tomadas con distintas condiciones atmosf´ericas: la presencia de nubes impacta tambi´en en la percepci´on del color de la c´amara. El valor de ponderaci´on posee un valor m´as elevado λ= 10. Es decir, se fuerza a´un m´as a que las se˜nales se segmenten con seguridad. La motivaci´on de este cambio tiene su base en la enorme cantidad de tonos rojos que no pertenecen a las se˜nales encontrados en el set de entrenamiento. Cuadro 5: Valores ´optimos en la ´ultima iteraci´on del m´etodo de bisecci´on. Canal H Canal S µ σ m µ σ m 254 5 7 188 56 12 ηm´aximo ≈49,734 % 0 5 10 15 slope canal H 38 40 42 44 46 48 50 Medida eficacia [%] Efecto desviaciones optimas de LUTsegmentos rectos Canal H 0 5 10 15 20 25 slope canal S 42 43 44 45 46 47 48 49 50 Medida eficacia [%] Efecto desviaciones optimas de LUTsegmentos rectos Canal S Figura 69: Desviaciones sobre el ´optimo de la longitud del tramo de descenso men ambos canales. La inspecci´on de las gr´aficas de desviaci´on sobre los valores ´optimos lleva a las mismas conclusiones de robustez comentadas en el caso simulado pero esta vez aplicadas a σH. Cuadro 6: Valores m´as robustos finalmente empleados en los escenarios reales. Canal H Canal S µ σ m µ σ m 254 10 10 175 70 10 ηexperimental ≈45 % 65
Figura 70: Desviaciones de los par´ametros sobre el ´optimo en un canal manteniendo los del otro constantes y en el ´optimo. El punto rojo representa el m´aximo. 66
4.3.6. Ejemplo de segmentaci´on por color Figura 71: Proceso, paso por paso, del sistema de segmentaci´on de color propuesto sobre una imagen real. Fotograf´ıa tomada de una captura street-view de Google Maps. 67
68
4.4. Clasificador de formas El objetivo de esta secci´on es explicar y justificar la estructura y los m´etodos escogidos para el clasificador de formas. Sus entradas son las m´ascaras binarias dadas por el filtro de color y la imagen original en escala de grises, y sus salidas son las n serigraf´ıas normalizadas detectadas junto con informaci´on sobre la ubicaci´on de las se˜nales, los bounding boxes o el tipo al que pertenecen (en este trabajo nos centraremos en distinguir 3 clases: circulares, triangulares y otros no clasificados). Imagen entrada (RGB) Mascara segmentada automáticamente filtro color (BW) Apertura adaptativo Cierre adaptativo Etiquetado regiones conexas Número elementos por etiqueta Criba tamaño regiones Etiquetas regiones mayores Bounding boxes Extracción formas Cálculo descriptores Clasificador geométrico mínima distancia Mascara extracción serigrafía Operadores morfológicos Forma rellena Forma “hueca” Binarización Otsu Operadores morfógicos Centrado serigrafia (BW) Normalización resolución Serigrafías normalizadas (Escala Grises) Resoluciones horizontal y vertical -Triángulos -Círculos -No clasificados -Medida normalizada agujero de la forma -Momentos de Hu Figura 72: Estructura interna del clasificador de formas y extractor de serigraf´ıas. 4.4.1. Eliminaci´on de motas y relleno de huecos El primer paso es eliminar cualquier mota espuria que el segmentador de color haya podido aceptar como color deseado. Al tratarse de conjuntos aislados se usa la operaci´on morfol´ogica: Apertura, con una m´ascara rectangular adaptativa seg´un la calidad de la imagen (lo que finalmente se traduce en mayor densidad de p´ıxeles para representar un mismo objeto), el uso de m´ascaras cuyo tama˜no se adapta a la resoluci´on anis´otropa (separaci´on en resoluci´on vertical y horizontal) de la imagen ser´a rutina para el resto de operadores morfol´ogicos que se empleen. El siguiente paso es el cierre de regiones que est´an muy cerca de estar conexas y la eliminaci´on de huecos en estas regiones, para ello se usar´a la operaci´on Cierre forzando que la m´ascara empleada sea 69
de dimensiones superiores a la de apertura. Matem´aticamente los operadores morfologicos de apertura ◦y cierre •son composici´on de otros operadores b´asicos llamados erosi´on ⊖y dilataci´on ⊕: Iapertura =Ioriginal ◦mascara = (Ioriginal ⊖mascara)⊕mascara Icierre =Ioriginal •mascara = (Ioriginal ⊕mascara)⊖mascara 1%CODIGO DE BAJO NIVEL PARA LAS FUNCIONES DE EROSION Y DILATACION 2mascara =[0 1 0; 31 1 1; 41 1 0; 51 0 0; 60 1 0]; % Ejemplo de mascara binaria con dimensiones de tama ~no impar 7[FIL , COL ]= size ( I_original ); %I_original es la entrada entera o logica 8I_erosion = zeros ( FIL , COL ); 9I_dilatacion = zeros ( FIL , COL ); 10 L=( length ( mascara (1 ,:) ) -1) /2; 11 W=( length ( mascara (: ,1) ) -1) /2; 12 for i=1+L:FIL -L 13 for j=1+W:COL -W 14 k=0; 15 for i_vecindad =-L :+ L 16 for j_vecindad =-W :+ W 17 if mascara ( i_vecindad +L+1 , j_vecindad +W +1) ==1 18 k=k+1; 19 aux (k)= I_original (i+ i_vecindad ,j+ j_vecindad ); 20 end 21 end 22 end 23 I_erosion (i ,j)= min ( aux (1: k)); % si erosion --> operador min 24 I_dilatacion (i ,j)= max (aux (1: k)); % si dilatacion --> operador max 25 end 26 end Figura 73: Programa de bajo nivel con las implementaciones de los operadores de erosi´on ⊖y dilataci´on ⊕(tambi´en llamada acreci´on). En nuestro caso las m´ascaras para realizar la apertura y el cierre iniciales son de tipo rectangular, con tama˜no proporcional a las resoluciones de cada eje, y redondeados al entero m´as pr´oximo. Las m´ascaras son arrays llenos de 1s, pues experimentos con otras m´ascaras m´as elaboradas han demostrado tener resultados pr´acticamente iguales. m´ascaraapertura = 1 1 ··· 1 1 1 ··· 1 . . .. . ..... . . 1 1 ··· 1 n×m m´ascaracierre =m´ascaraapertura 1 1 1(n+1)×(m+1) Con dimensiones de la 1 º matriz dada por la siguiente regla emp´ırica que se ha inferido tras m´ultiples experimentos: [n, m]=(round([0,0025 ·FIL; 0,0015 ·COL]))T Como las im´agenes suelen tener formatos m´as anchos que altos, el coeficiente de COL es menor. 70
Figura 74: Arriba: Ejemplo de imagen de simulaci´on segmentada por el filtro de color. Centro: Resultado de apertura adaptativa. Abajo: Resultado de apertura y cierre adaptativos. 71
4.4.2. Etiquetado y discriminaci´on por tama˜no Con las matrices dadas tras la aplicaci´on de los operadores morfol´ogicos, el siguiente paso es reunir todos aquellos p´ıxeles que pertenecen a una misma regi´on conexa con vecindad 8 (aquellos separados diagonalmente se consideran tambi´en, como en un movimiento de un rey en ajedrez). Figura 75: Visualizaci´on del proceso de etiquetado. En MatLab usaremos bwlabel(I,8). Es una operaci´on muy compleja para programarse a bajo nivel como se comentaba en la introducci´on. Afortunadamente tanto en MatLab como en OpenCV se halla disponible. A continuaci´on se crea el vector, cuyo ´ındice es la etiqueta que accede al elemento con el n´umero de p´ıxeles que pertenecen a ella. Tomando como ejemplo el caso simplificado mostrado en la figura superior quedar´ıa: Numero pixeles etiqueta = [6,6,3,2] Posteriormente se recorre este vector y aquellos componentes que superen un cierto umbral (tama˜no de la regi´on), tendr´an sus correspondientes etiquetas almacenadas en otro vector: Umbral = 5 Etiquetas ord max = [1,2,0,0] N maximos = 2 Puesto que MatLab requiere prelocalizaci´on de arrays para que el c´odigo se ejecute r´apidamente y no da facilidades en la administraci´on din´amica de memoria, se ha recurrido a generar el vector Etiquetas ord max de la misma longitud que Numero pixeles etiqueta, pero con una variable adicional N maximos que ´ındica a futuros apartados hasta que ´ındice recorrerlo. Para nuestro algor´ıtmo de percepci´on el umbral que se toma es tambi´en funci´on de la resoluci´on de la imagen introducida y tiene la siguiente expresi´on (como se compara no es necesario redondear): Umbral tamano = 150 800 ·1360 ·FIL ·COL Para las im´agenes de la anterior p´agina esta criba reduce el n´umero de etiquetas de 73 a solamente 4. Esto supone un ahorro enorme de computaci´on si la detecci´on recayera solamente en los clasificadores posteriores. Es curioso destacar que a pesar de ser ´este uno de los procedimientos m´as sencillos del algoritmo, es uno de los que m´as tiempo lleva en comparaci´on con el resto. 72
4.4.3. Bounding boxes y extracci´on de formas El siguiente paso es la extracci´on de cada una de las regiones conexas que han logrado sortear todas las restricciones impuestas. Para ello se recorre la matriz con las etiquetas originales en busca de aquellas que pertenecen a las componentes no nulas del vector Etiquetas ord max y se generan peque˜nas submatrices del tama˜no de cada una de las regiones independientes. Adem´as se almacenan en 4 variables (que se van actualizando cuando se recorre la matriz de las etiquetas), las coordenadas i,j m´aximas y m´ınimas de la regi´on en la matriz original. De esta forma podremos recuperar peque˜nos parches de la imagen RGB transformada a Gris original. La variable que recopila esta informaci´on es: bounding box = Regi´on 1: imin −margen imax + margen jmin −margen jmax + margen . . . Regi´on Nmax :imin −margen imax + margen jmin −margen jmax + margen Nmax×4 N´otese que cada bounding box se ha ampliado con una variable margen, que en nuestro caso toma el valor margen = 6. Esto es muy importante porque posteriormente se dilatar´an las regiones y para ello hay que preveer un espacio para ello. Por otra parte las regiones extra´ıdas son dilatadas (la dilataci´on facilita que la regi´on adem´as de ser conexa tenga una subregi´on interna separada del exterior), rellenadas y erosionadas de nuevo para restablecer en su contorno la forma original. De este proceso se han obtenido dos matrices que caracterizan la regi´on segmentada: pblob original ypblob relleno = funci´on relleno {pblob original ⊕mascara}⊖mascara La funci´on de MatLab que realiza el relleno es imfill. Figura 76: Algunos ejemplos de la extraccion de pblob original ypblob relleno. 73
4.4.7. Extracci´on y normalizaci´on de serigraf´ıas Una vez superada la fase de clasificaci´on, se procede con la extracci´on de los s´ımbolos si el blob pertenece a las clases tri´angulos oc´ırculos. Para ello es necesario construir una m´ascara que extraiga la serigraf´ıa interna de la se˜nal, excluyendo los bordes. La m´ascara se construye a partir de operaciones con el blob original y con la forma rellena. Adem´as, para evitar con seguridad restos de los bordes de la se˜nal, se erosiona adaptativamente (en funci´on del tama˜no relativo de la se˜nal en la imagen) la m´ascara. Este paso es de suma importancia para asegurar que el posterior centrado se lleve a cabo correctamente. mascara extracci´on = (¯pblob original ∩pblob relleno)⊖1n×m n=ceil imax −imin 25 m=ceil jmax −jmin 25 Figura 82: Algunos ejemplos de pblob original (izqda), pblob relleno (ctro) y mascara extracci´on (dcha). La m´ascara de extracci´on se aplica a la imagen RGB convertida en escala de grises seg´un: serigrafiaij = mascara extracci´onij ·Imagen Grislk ∀[i, j] [l, k]∈R Siendo Rla regi´on del bounding box de la forma en´esima. La imagen extra´ıda con la m´ascara est´a en escala de grises por lo que se realza y binariza comparando con el umbral dado por el m´etodo de Otsu para distribuciones bimodales: serigraf´ıa realzadaij =rango −1 max(serigraf´ıa) −min(serigraf´ıa) ·serigraf´ıaij serigraf´ıa BWij = serigraf´ıa realzadaij ≤UOtsu UOtsu =Otsu(serigraf´ıa realzada) A continuaci´on las matrices se recortan de tal forma que en las primeras y ´ultimas filas y columnas debe haber al menos un elemento no nulo. Las resultantes se reescalan al tama˜no F ILred = 30 y COLred = 30 interpolando con splines c´ubicos para minimizar las p´erdidas de informaci´on, con lo que sus elementos vuelven a ser reales ∈[0,1]. serigraf´ıa normalizada = rescalado(serigraf´ıa BW, FILred, COLred) 80
Figura 83: Ejemplos de extracci´on de las serigraf´ıas de la imagen original en escala de grises, conversi´on a BW, centrado y normalizaci´on de las serigraf´ıas. Se muestran ejemplos con distintas se˜nales y grados de resoluci´on (dependiente principalmente de la distancia de la se˜nal a la c´amara). Anteriormente se ha mencionado la importancia de erosionar la m´ascara de extracci´on para asegurar que en el proceso de centrado solo estamos teniendo en cuenta aquellos puntos que pertenecen a la serigraf´ıa. Como prueba de ello se muestran a continuaci´on algunos ejemplos defectuosos para los que se ha eliminado este paso. Figura 84: Ejemplos defectuosos de extracci´on de serigraf´ıas sin haber erosionado la m´ascara de extracci´on. No sucede siempre pero es evitable con seguridad erosionando la m´ascara. 81
4.5. Clasificador de las serigraf´ıas de se˜nales En este apartado se expone el procedimiento seguido para la identificaci´on de las serigraf´ıas normalizadas dadas como ´ultimo paso del clasificador de formas. Existen muchas t´ecnicas para llevar a cabo la identificaci´on de los s´ımbolos. Por mencionar algunas: Basadas en m´etodos SVM apoyados en RBF [25], [23]. Empleando bases de datos para comparar caracter´ısticas SIFT o SURF [22]. Usando topolog´ıas m´as o menos complejas de redes neuronales: Empleando una CNN cl´asica [26]. Presentando una MCDNN, como versi´on especial de una DNN [27]. Este ´ultimo art´ıculo en particular describe el algoritmo ganador de la German traffic sign recognition benchmark con una tasa de acierto del 99.46 %, superando los rendimientos de reconocimiento humanos de 98.84 % sobre el mismo dataset. 4.5.1. Introducci´on a las redes neuronales de varias capas (MLP) Las redes neuronales de varias capas no son m´as que enormes funciones no lineales, invariantes en el tiempo, y sin estados de memoria22, que poseen una gran cantidad de par´ametros ajustables. El objetivo es ajustar estos par´ametros para obtener el mejor comportamiento ante un conjunto de entrenamiento, y esperando que estos resultados se generalicen en la aplicaci´on real. Puesto que el “mejor comportamiento” es una medida subjetiva, se debe crear alg´un tipo de m´etrica, generalmente denominada funci´on de coste, que eval´ua de forma cuantitativa cu´an mala es la actuaci´on de la red. Existen m´ultiples m´etodos para implementar el optimizador que ajusta los par´ametros, pero en configuraciones MLP es habitual emplear t´ecnicas basadas en el descenso de gradiente, pues es posible obtener una expresi´on anal´ıtica del mismo, simplificando enormemente la carga computacional. Se va a comenzar primero explicando, como a partir de un vector de entrada X, la red neuronal genera el vector de salida ˆ Y. Proceso conocido como forward propagation (Propagaci´on hacia delante). Figura 85: Izqda: Diagrama representativo de la interconexi´on de las neuronas en una red MLP de 3 capas. Dcha: Esquema de una neuronal con 3 entradas (esto se generalizar´a a cualquier n´umero de entradas). N´otese que hay una entrada al sumatorio que es un par´ametro llamado bias. 22Se entiende que una red posee memoria si la informaci´on previa introducida (no en la fase de entrenamiento naturalmente) afecta el comportamiento ante la informaci´on introducida en el presente. Para que esto sea posible se han de emplear topolog´ıas recursivas, que si bien son populares en reconocimiento de voz y s´ıntesis de texto, en reconocimiento visual no se emplean. 82
Tomemos una capa cualquiera ide una red neuronal y centr´emonos en computar la salida de una neurona j. Esta posee conexiones con todas las N(i−1) salidas de las neuronas de la anterior capa i−1. Estas salidas se combinan linealmente con unos factores de ponderaci´on dados por el vector wij (de longitud N(i−1) y se suma un par´ametro bi j. Finalmente el escalar resultante de la suma se introduce en un bloque no lineal, tambi´en conocido como funci´on de activaci´on oHidden Unit. Notes´e, que de no haberse a˜nadido este paso adicional, la red neuronal ser´ıa indistinguible de una funci´on polinomial multivariable. Ai−1= ai−1 1 ai−1 2 . . . ai−1 k . . . ai−1 N(i−1) wij = wij 1 wij 2 . . . wij k . . . wij N(i−1) zi j= N(i−1) X k=1 ai−1 k·wij k +bi j=Ai−1·wij +bi j ai j=factivacion zi j→repitiendo ∀j= 1,2...N(i)→Ai= ai 1 ai 2 . . . ai j . . . ai N(i) Haciendo uso de la notaci´on matricial podemos describir el paso por una capa de forma m´as sencilla. Para ello hemos de especificar que la factivacion(x) puede operar con entradas vectoriales, realizando operaciones elemento a elemento y por tanto, devolviendo un vector de id´enticas dimensiones. Zi=WiAi−1+Bi→Ai=factivacion Zi Donde las matrices y vectores empleados tienen las siguientes dimensiones y elementos: Wi= −−−(wi1)T−−− −−−(wi2)T−−− . . . −−−(wij)T−−− . . . −−−(wiN(i))T−−− N(i)×N(i−1) Ai−1= ai−1 1 ai−1 2 . . . ai−1 k . . . ai−1 N(i−1) N(i−1)×1 Bi= bi 1 bi 2 . . . bi j . . . bi N(i) N(i)×1 Zi= zi 1 zi 2 . . . zi j . . . zi N(i) N(i)×1 factivacion Zi= factivacion zi 1 factivacion zi 2 . . . factivacion zi j . . . factivacion zi N(i) N(i)×1 Ai= ai 1 ai 2 . . . ai j . . . ai N(i) N(i)×1 83
Existen numerosas funciones de activaci´on factivacion(x), pero en este TFG solo se ha experimentado con las 3 m´as comunes: Funci´on sigmoidal σ(x): Hist´oricamente fue la primera en aplicarse junto con la tangente hiperb´olica [29], probablemente dada su f´acil derivabilidad en su dominio. Tambi´en es conocida como funci´on log´ıstica. Su imagen tiene rango [0,1] σ(x) = 1 1 + e−x→σ′(x) = σ(x)·(1 −σ(x)) Tangente hiperb´olica tanh(x): Proviene de las identidades trigonom´etricas hom´ologas definidas en las secciones de ´area de una hip´erbola, de ah´ı su nombre. Al igual que la anterior funci´on es diferenciable f´acilmente en todo su dominio, pero su imagen tiene el rango ampliado de [−1,1] y es menos suave. tanh(x) = senh(x) cosh(x)=ex−e−x ex+e−x→tanh′(x) = (1 −tanh(x)2) Unidad Lineal Rectificada ReLU(x): Se trata de una funci´on muy sencilla que ha tenido ´exito solo recientemente en modelos muy complejos de redes. Por una parte ofrece rapidez, pero aporta nuevos problemas que las anteriores funciones no tienen: no derivabilidad en 0 y derivada nula para valores negativos en la entrada. Esto puede complicar el ajuste por descenso de gradiente puro en esos intervalos, pues podr´ıa producirse la muerte prematura de determinadas neuronas. ReLU(x) = 0 s´ı x < 0 xs´ı x≥0→ReLU′(x) = 0 s´ı x < 0 1 s´ı x > 0 Figura 86: Comparativa de las 3 funciones ReLU,Tangente hiperb´olica ySigmoidal . Existen, sin embargo, otras funciones de activaci´on muy populares como: Funciones de Base Radial (RBF), cuya salida se activa seg´un la entrada se aproxima a un prototipo, Softplus, una versi´on suavizada de la ReLU y diferenciable en todo el dominio, o Hard tanh, una versi´on mixta de la ReLU y la Tanh. 84
4.5.2. Implementaci´on de la red neuronal Para la tarea de reconocimiento que nos ocupa, se ha escogido una topolog´ıa de 4 capas: 1 Capa de entrada,2 Capas ocultas y1 Capa de salida. Un problema muy similar al planteado en este algoritmo de percepci´on, es el cl´asico experimento de identificaci´on de d´ıgitos manuscritos sobre el dataset NMIST, sobre el cual se suelen probar sistemas. [33] aplica exitosamente una MLP con 4 capas lo que respalda nuestra elecci´on. El primer paso es vectorizar las matrices de las serigraf´ıas normalizadas. En nuestro caso tienen las dimensiones FILRED =COLRED = 30. pserigraf´ıa normalizada = p11 p12 ··· p1m p21 p22 ··· p2m . . .. . ..... . . pn1pn2··· pnm N×M = −−P1−− −−P2−− . . . −−Pn−− N×M con →FILRED =n COLRED =m En el algoritmo se encadenan las filas de la matriz 23 para formar un vector columna de FILRED ×COLRED =Nentrada = 900 elementos, que ser´a la entrada. X=[−−P1−− −−P2−− ··· −−Pn−−]TNentrada×1 A continuaci´on se muestra el procedimiento feed forward para calcular la salida de la red propuesta: Capa de entrada A1=X Primera Capa oculta Z2=W2A1+B2→A2=factivacion Z2 Segunda Capa oculta Z3=W3A2+B3→A3=factivacion Z3 Capa de salida Z4=W4A3+B4→A4=factivacion Z4→ˆ Y=fnormalizacion A4 La etapa de normalizaci´on de la salida A4consiste en reescalar sus elementos de tal forma que cada entrada de ˆ Ysea la probabilidad por unidad de que la serigraf´ıa sea la correspondiente al ´ındice de la casilla. ˆ Y= [y1y2··· yi··· yn]T→yi=P(X∈Xi)∀i= 1,2..., n La funci´on de normalizaci´on que logra este prop´osito es soft-max: ˆ Y=fnormalizacion (A)→yi=eai Pn k=1 eak∀i= 1,2..., n Finalmente, aquel ´ındice cuyo elemento sea el m´as elevado (mayor probabilidad), ser´a nuestra predicci´on sobre el contenido de la se˜nal. Para este trabajo se han tenido en cuenta n−1 = 17 se˜nales diferentes y un grupo adicional de rechazo, con lo que el vector ˆ Ytiene dimensiones n×1 = 18 ×1. iidentificada =i / ˆyi≥ˆyj∀j= 1,2..., n 23Naturalmente se podr´ıa haber tomado la decisi´on de encadenar por columnas o usar una vectorizaci´on arbitraria, pero una vez tomado un criterio se ha de ser consistente con el resto de los pasos. Una red debe ser entrenada y empleada manteniendo el mismo convenio en la vectorizaci´on para que funcione correctamente. 85
Figura 87: Conjunto de se˜nales reconocibles por el algoritmo de percepci´on. Estas mismas im´agenes aparecer´an en el HUD cuando se detecte una de ellas. Como ya se ha visto, la entrada de la MLP es una serigraf´ıa normalizada, no las im´agenes de esta figura. Se˜nal de tr´afico Etiqueta Se˜nal de tr´afico Etiqueta Velocidad M´axima 10 1 Sucesi´on curvas peligrosas derecha 10 Velocidad M´axima 20 2 Sucesi´on curvas peligrosas izquierda 11 Velocidad M´axima 30 3 Curva peligrosa derecha 12 Velocidad M´axima 40 4 Curva peligrosa izquierda 13 Velocidad M´axima 50 5 Prohibici´on girar derecha 14 Velocidad M´axima 60 6 Prohibici´on girar izquierda 15 Velocidad M´axima 70 7 Peligro glorieta 16 Velocidad M´axima 80 8 Peligro resalte 17 Velocidad M´axima 90 9 No identificado 18 Cuadro 8: Convenio de etiquetas seguido para el conjunto de se˜nales de entrenamiento. Se va a dar un ejemplo del uso de estas etiquetas. Sup´ongase que se tiene una imagen de entrada con la serigraf´ıa de una se˜nal de Velocidad M´axima de 30 km/h. La etiqueta que corresponde a esta se˜nal es 3, luego hemos de esperar que el elemento 3 de ˆ Ysea 1 y los otros elementos nulos. XVel 30 Km/h →ˆ Y= [0 0 1 0 0 ··· 0 0]T El resultado anterior es el ideal, pero con total seguridad obtendremos valores peque˜nos pero no nulos en el resto de casillas, y un valor algo inferior a la unidad en el elemento 3. Como por ejemplo: ˆ Y= [0,02 0,05 0,83 0 0,01 ··· 0,004 0,025]T N´otese que al aplicar el paso de fnormalizacion () con la funci´on soft-max, se ha cubierto el espacio probabil´ıstico, es decir, la probabilidad de que la se˜nal pertenezca a alguno de los conjuntos es 1: 1 = n X k=1 yk= n X k=1 P(X∈Xk) 86
4.5.3. Implementaci´on del optimizador para la red neuronal El buen funcionamiento de una red reside principalmente en el valor de los factores de ponderaci´on Wy de los biases B. Si estos poseen valores arbitrarios la salida de la red ser´a completamente in´util. La idea consiste en ajustar los WyBde todas las capas, para que, sobre un conjunto de entradas de entrenamiento, se minimice una funci´on de coste que tenga en cuenta las discrepancias entre las salidas predichas ˆ Yy las verdaderas Yreal (que son conocidas). La funci´on de coste por muestra escogida es de tipo MSE por su f´acil derivabilidad: Ji(θ, Y real i) = 1 2 ˆ Yi(θ)−Yreal i 2 Donde θagrupa todos los par´ametros WyB. La funci´on de coste total, como promedio de la expresi´on anterior para un conjunto de muestras ser´a: J(θ, Y real) = 1 N N X i=1 Ji(θ, Y real i) = 1 2·N N X i=1 ˆ Yi(θ)−Yreal i 2 Con conjuntos de entrenamiento muy grandes, tomar N=Nconj entrenamiento para evaluar la funci´on de coste o para calcular su gradiente supone una enorme carga computacional, que hace inviable trabajar con ellos. Por ello, se suele aplicar el Descenso de Gradiente Estoc´astico (SGD), que emplea para cada iteraci´on un conjunto reducido aleatorio del conjunto de entrenamiento original. Este lote m´as manejable de datos se suele denominar batch, y es conveniente que cumpla: N=Nbatch ≪Nconj entrenamiento. Los primeros m´etodos de optimizaci´on por medio de t´ecnicas estoc´asticas fueron propuestos en 1951 por Herbert Robbins y Sutton Monro. Y la primera aplicaci´on en el campo de redes neuronales la realiz´o el propio Frank Rosenblatt en 1958 para entrenar su perceptr´on [35]. El a˜no 1986 fue especialmente fruct´ıfero en este campo, con 2 grandes avances: se describi´o por primera vez la retropropagaci´on como forma eficiente de calcular el gradiente de la funci´on de coste respecto a los par´ametros [36], y se aplicaron las t´ecnicas de descenso de gradiente con momento en la optimizaci´on con batches [37]. En este trabajo se va a trabajar con los hiperpar´ametros: Tasa de aprendizaje (α) y Momento (ρ) fijos. Pero cabe destacar que, m´etodos m´as complejos y potentes de optimizaci´on con hiperpar´ametros variables son los actualmente empleados por la mayor´ıa de programas. Uno de los m´as populares, Estimaci´on Adaptativa de Momento (AdAM, por su siglas inglesas) se propuso en 2014 [38], y ha dado lugar a una familia de optimizadores derivados de su idea original: Adadelta, Adagrad, AdamW, Adamax... A la fecha de redacci´on de este trabajo, TensorFlow y PyTorch, las librer´ıas m´as populares de Machine Learning, hacen uso extensivo de la famil´ıa AdAM de optimizadores [39]. Algorithm 1 Descenso de Gradiente Estoc´astico con α=cte Require: Tasa de aprendizaje fija α, Inicializaci´on aleatoria de θ0. Tama˜no de batch Nbatch. N´umero de iteraciones de descenso Nepoch Ensure: θoptimo tal que θoptimo = arg min θ J(θ) 1: for i= 1 hasta Nepoch do 2: for j= 1 hasta Nbatch do 3: Calcular el gradiente respecto a la funci´on de coste para cada muestra con el vector de par´ametros anterior: ∇Jij (θi−1) 4: end for 5: Promediar el gradiente para el batch :∇Ji(θi−1) = 1 Nbatch PNbatch i=1 ∇Jij(θi−1) 6: Actualizar los par´ametros: θi=θi−1−α·∇Ji(θi−1) 7: end for 8: return θNepoch ≈θoptimo 87
El principal problema del SGD puro, es que no se conoce nunca el verdadero valor del gradiente de la funci´on de coste completa, sino una estimaci´on estad´ıstica. Por tanto, si compar´asemos el camino seguido por el SGD, con el seguido por el GD ver´ıamos que el primero sigue una senda “zigzageante” y no necesariamente coincidente con el camino de m´aximo gradiente (aunque s´ı sea el camino de m´aximo gradiente del batch evaluado). La inclusi´on de Momento en el SGD da lugar a diferentes interpretaciones de su efecto: Atenuaci´on de las componentes de alta frecuencia que corresponden al ruido estad´ıstico de no estar teniendo en cuenta el conjunto de entrenamiento entero. En otras palabras, a˜nade un t´ermino de inercia que se opone a los cambios en m´odulo y direcci´on del vector gradiente. Es esta analog´ıa mec´anica la que da su nombre, y que se interpreta en la figura de la siguiente p´agina como un avance menos “zigzageante” sobre la superficie verdadera de la funci´on de coste. Puede interpretarse alternativamente, como el gradiente puro de una superficie en Rnque es una versi´on suavizada de la superficie original correspondiente a la funci´on de coste. El efecto del Momento aporta 2 ventajas fundamentales: Puede ayudar a superar las denominadas llanuras de la funci´on de coste, regiones en las que el gradiente es pr´oximo al valor nulo. Evita algunos m´ınimos locales d´ebiles, si existe una tendencia gen´erica hac´ıa un m´ınimo local fuerte. En el s´ımil de encontrar el punto m´as bajo de un valle, equivaldr´ıa a no “atascarse” en un peque˜no hoyo de una empinada ladera para poder llegar al r´ıo que discurre en el fondo. A continuaci´on se presenta una versi´on modificada del anterior algoritmo SGD incluyendo el t´ermino del momento. Algorithm 2 Descenso de Gradiente Estoc´astico con α=cte y Momento Fijo ρ=cte Require: Tasa de aprendizaje fija α. Coeficiente de Momento ρ. Valor inicial de θ0, Tama˜no de batch Nbatch, N´umero de iteraciones de descenso Nepoch Ensure: θoptimo tal que θoptimo = arg min θ J(θ) 1: for i= 1 hasta Nepoch do 2: for j= 1 hasta Nbatch do 3: Calcular el gradiente respecto a la funci´on de coste para cada muestra con el vector de par´ametros anterior: ∇Jij (θi−1) 4: end for 5: Promediar el gradiente para el batch:∇Ji(θi−1) = 1 Nbatch PNbatch j=1 ∇Jij(θi−1) 6: Filtro de paso bajo sobre el vector gradiente 7: if i≥2then 8: ∇Ji(θi−1)suavizado =ρ∇Ji−1(θi−1) + (1 −ρ)∇Ji(θi−1) 9: else 10: ∇Ji(θi−1)suavizado =∇Ji(θi−1) 11: end if 12: Actualizar los par´ametros: θi=θi−1−α·∇Ji(θi−1)suavizado 13: end for 14: return θNepoch ≈θoptimo 88
Figura 88: Representaci´on orientativa de la funci´on de coste en espacio R3donde se visualizan cualitativamente los beneficios de incluir momento en el SGD. Para poder llevar a cabo la implementaci´on final, nos falta saber como calcular el gradiente de la funci´on de coste ∇J(θ). La idea principal reside en emplear la regla de la cadena para hallar las expresiones anal´ıticas de: ∂J ∂Wi ∂J ∂Bi∀i= 1, ..., ncapas Por la forma algor´ıtmica de hallar estos valores, el procedimiento se conoce como back-propagation. δi= ˆ Y−Yreal⊙f′ activacion Zis´ı i=ncapas ←→ ´ Ultima capa Wi+1Tδi+1⊙f′ activacion Zi∀i= 1,2, ..., ncapas −2, ncapas −1.←→ Resto de capas ∂J ∂Wi=1 N N X j=1 δiAi−1T∀i= 1,2, ..., ncapas. ∂J ∂Bi=1 N N X j=1 δi∀i= 1,2, ..., ncapas. A continuaci´on se muestra el algoritmo implementado, incluyendo el c´alculo del gradiente dado por back-propagation y la inclusi´on de momento en el SGD. El n´umero de iteraciones podr´ıa haberse considerado variable, efectuando una parada del programa cuando se llegase a un m´ınimo local fuerte. Pero por los problemas de convergencia adicionales que pueden tener este tipo de implementaciones se ha preferido trabajar con un n´umero fijo de iteraciones oepochs. Este ´ultimo, es un t´ermino muy extendido en el campo de Machine Learning para aludir a pasos de GD. Observar que los super´ındices de las variables comienzan en 2. De esta forma, cuando la segunda dimensi´on de la primera matriz de pesos hace alusi´on a la capa anterior, esta tendr´ıa el valor 1. Como el 1 denota en lenguajes como Matlab el primer elemento de un array, se justifica este valor inicial en aras de ampliar de forma recursiva el programa mostrado a un n´umero arbitrario de capas sin tener que incluir casos especiales. De haberse usado un lenguaje como C en el que el primer elemento de un array tiene ´ındice 0, la nomenclatura ser´ıa probablemente m´as clara. 89
Figura 92: Dataset reducido clasificado manualmente. Por filas: se˜nales con las etiquetas del 10 al 8. Por columnas: 6se˜nales clasificadas manualmente por cada tipo de se˜nal.La primera columna es un prototipo sint´etico extraido de una serigraf´ıa ideal. 96
Figura 93: Ejemplos en la generaci´on del Dataset ampliado aplicado a serigraf´ıas con d´ıgitos. 97
Figura 94: Ejemplos en la generaci´on del Dataset ampliado aplicado a otras serigraf´ıas. Para cada una de las serigraf´ıas etiquetadas manualmente se producen 10 nuevos modelos para el Dataset ampliado (ordenados por filas en la visualizaci´on). 98
4.6. Ejemplos y resultados en im´agenes de la simulaci´on Figura 95: Se˜nal l´ımite de 10km/h, confianza 73.65 %. Se˜nal l´ımite de 40km/h, confianza 63.28 %. Se˜nal l´ımite de 30km/h, confianza 70.02 %. Se˜nal l´ımite de 20km/h, confianza 69.18 %. Ejemplo de robustez ante una imagen fuertemente degradada y con se˜nales rotadas. 99
A continuaci´on se muestran algunos ejemplos con la matriz de segmentaci´on directamente dada por el filtro de color. N´otese que a pesar de tratarse de un filtro m´as agresivo (menor variabilidad en la poblaci´on de entrenamiento), determinados elementos no son en absoluto separables por color de las se˜nales por ser indistinguibles. 100
Figura 96: Se˜nal sucesi´on curvas peligrosas la primera a la izquierda, confianza 79.904 %. Se˜nal curva peligrosa a la izquierda, confianza 67.451 %. Se˜nal curva peligrosa a la derecha, confianza 74.198 %. Se˜nal sucesi´on curvas peligrosas la primera a la derecha, confianza 63.297 %. 101
Figura 97: Se˜nal peligro glorieta, confianza 76.330558 %. Se˜nal prohibido girar a la izquierda, confianza 61.983208 %. Se˜nal peligro resalte, confianza 75.251764 %. Se˜nal prohibido girar a la derecha, confianza 53.210446 %. A continuaci´on se va a a˜nadir ruido, y se va a reducir la calidad de la imagen original para forzar al menos un fallo en la identificaci´on y comprobar la robustez del sistema. 102
Figura 98: Se˜nal grupo rechazo, confianza 37.663 %. Se˜nal l´ımite 50 km/h, confianza 62.868 %. Se˜nal l´ımite 90 km/h, confianza 78.135 %. Se˜nal l´ımite 50 km/h, confianza 27.168 % Incorrectamente identificada. Se˜nal l´ımite 80 km/h, confianza 60.429 %. Se˜nal l´ımite 70 km/h, confianza 74.991 %. A pesar de que este fallo ha sido instigado por el ruido y la degradaci´on previa, revela que los grupos [50,60] comparten muchas caracter´ısticas para la MLP y por tanto son los m´as sensibles a identificaciones correctas. A´un as´ı, el bajo nivel de confianza en la clasificaci´on nos advierte de un posible fallo. Sin embargo, si las im´agenes no se degradan y las se˜nales no est´an excesivamente alejadas, ni sobre fondos del mismo color, el algoritmo propuesto no ha fallado en ninguna de las identificaciones llevadas a cabo. Debe tenerse en cuenta, que en un sistema de TSR, al avanzar el veh´ıculo, se obtienen numerosas fotograf´ıas de las mismas se˜nales, con lo que se pueden contrastar diferentes resultados, descartando anomal´ıas. 103
Figura 99: Se˜nal l´ımite 50 km/h, confianza 70.871 %. Se˜nal l´ımite 90 km/h, confianza 64.956 %. Se˜nal curva peligrosa a la izquierda, confianza 83.76479 %. Figura 100: Se˜nal l´ımite 10 km/h, confianza 54.492 %. Se˜nal peligro resalte, confianza 73.265 %. Se˜nal prohibido girar a la derecha, confianza 82.791 %. Se˜nal curva peligrosa a la izquierda, confianza 85.443 %. Se˜nal l´ımite 20 km/h, confianza 57.076 %. Se˜nal l´ımite 30 km/h, confianza 76.203 %. Se˜nal peligro glorieta, confianza 69.105 %. Se˜nal l´ımite 50 km/h, confianza 75.623 %. Se˜nal l´ımite 70 km/h, confianza 73.728 %. Se˜nal curva peligrosa a la derecha, confianza 70.310 %. 104
4.7. Ejemplos y resultados en im´agenes reales Figura 101: Se˜nal prohibido girar a la derecha, confianza 51.567346 %. 105
Figura 112: Se˜nal l´ımite 80km/h, confianza 56.456898 %. Figura 113: Se˜nal curva peligrosa izquierda, confianza 79.364982 %. 112
Figura 114: Se˜nal l´ımite 30km/h, confianza 35.89568 %. Figura 115: Se˜nales l´ımite 90km/h, confianzas 42.602809 % y32.596863 %. 113
Figura 116: Se˜nal limite 50km/h, confianza 81.654982 %. Se˜nal sucesi´on curvas peligrosas la primera a la derecha, confianza 67.354985 %. Figura 117: Se˜nal curva peligrosa derecha, confianza 65.184358 %. 114
En esta p´agina se muestran tres casos encontrados de funcionamiento no satisfactorio del programa y se ofrecen posibles motivos y soluciones. Figura 118: Se˜nal de l´ımite 70km/h, confianza 20.224307 % eincorrectamente clasificada. Se˜nales de rechazo, con confianzas 74.570788 % y72.617657 %. En la figura 118, el sistema clasifica correctamente la morfolog´ıa de los blobs. Tambi´en clasifica correctamente dos serigraf´ıas como rechazo con confianzas altas, pero falla en la identificaci´on de la se˜nal de l´ımite 30km/h, sin embargo, el propio sistema advierte de posibles errores con una confianza inusualmente baja. Sucede lo mismo en la figura 119. Entre las posibles soluciones se barajan dos: Usar un dataset de entrenamiento con m´as casos reales. Esto implica principalmente tiempo, pues se ha de recolectar informaci´on y clasificarla manualmente. Se ha comprobado experimentalmente que las serigraf´ıas [70,30], [50,60], est´an pr´oximas en el espacio de caracter´ısticas interno de la MLP, por lo que habr´ıa que reincidir en estos casos particulares en el entrenamiento. Desechar las se˜nales clasificadas que no superen un umbral de confianza. Ello convierte un 115
fallo grave de incorrecta identificaci´on en uno m´as leve de no identificaci´on. Figura 119: Se˜nal limite 50km/h, confianza 23.582706 % eincorrectamente clasificada Figura 120: Se˜nales l´ımite 50km/h, confianzas 45.956638 % y72.275418 %.Omisi´on. En la figura 120 se aprecia un error leve de no identificaci´on. Este tipo de errores son principalmente resultado de im´agenes en las que las se˜nales tienen poca resoluci´on y/o est´an muy alejadas de la c´amara, por lo que las soluciones pasan por una mejora de hardware m´as que optimizaci´on del software. En el caso mostrado, la imagen ha sido difuminada en la parte central para no mostrar la matricula del veh´ıculo delantero, lo cual ha afectado a la se˜nal central. 116
5. Conclusiones y an´alisis de resultados En este trabajo se han alcanzado satisfactoriamente los ambiciosos objetivos de partida: crear y modelar los elementos de un mundo simulado, integrarlos con un modelo virtual de un robot y dise˜nar un algoritmo de reconocimiento de se˜nales valorando su eficacia en diferentes escenarios. Las dos aportaciones m´as importantes que realiza este trabajo son: La creaci´on de un repositorio de se˜nales de tr´afico espa˜nolas fidedignas para la plataforma de simulaci´on Gazebo. La biblioteca es de acceso libre y puede encontrarse en el siguiente enlace de github: https://github.com/juanfeijoo02/libreria_se-ales_trafico_Gazebo La presentaci´on de un nuevo m´etodo de segmentaci´on por color. Se ha mostrado su planteamiento como problema de optimizaci´on sujeto a restricciones, se ha resuelto el ajuste de par´ametros para diferentes conjuntos de im´agenes reales y simuladas, y finalmente, se ha aplicado exitosamente a nuestro algoritmo de identificaci´on de se˜nales. Estos resultados han sido enviados a las Jornadas de Autom´atica de 2024 de M´alaga (Espa˜na) en el art´ıculo [41], el cual a fecha de redacci´on de estas l´ıneas figura como aceptado. 5.1. Futuras mejoras del algoritmo de percepci´on El algoritmo de reconocimiento de se˜nales ha superado las expectativas en cuanto a buen funcionamiento. Esto ha permitido adaptarlo al reconocimiento en escenarios reales adem´as de los simulados (objetivo inicial del trabajo). No obstante, existe un gran campo para la mejora del mismo, tanto para incrementar su efectividad y rapidez, como para ampliar sus funcionalidades. Toda posible mejora aqu´ı expuesta debe ser considerada teniendo en cuenta dos aspectos: velocidad de ejecuci´on y efectividad. Como en los sistemas de visi´on de un ADAS no se procesa una sola imagen, sino un stream de ellas, puede resultar m´as importante la velocidad de procesamiento, dada la elevada tasa de actualizaci´on (fps) con la que trabajan; en otras palabras, una detecci´on fallida puede ser compensada con correctas identificaciones de la misma se˜nal seg´un el veh´ıculo avanza y toma m´as im´agenes. filtro de color El filtro de color es el primer bloque en la cadena del programa de visi´on propuesto. Si sus par´ametros lo vuelven muy restrictivo corremos el riesgo de omitir se˜nales, pero si se vuelve demasiado laxo, las etapas posteriores estar´an sometidas a una fuerte carga de trabajo. Teniendo presente este compromiso, se muestran a continuaci´on algunas ideas para futura investigaci´on: Experimentar con funciones con mayor n´umero de par´ametros en el filtro de color propues- to, en aras de segmentar varios colores simult´aneamente, o de otorgar m´as flexibilidad a la segmentaci´on. Alternativamente, podr´ıan combinarse varios segmentadores de color para separar regiones de colores muy similares que actualmente son indistinguibles, o para permitir al resto del programa la identificaci´on de otro tipo de se˜nales. Un problema que puede presentarse intentando segmentar por color las se˜nales que son azules, es que a diferencia del rojo, es un color muy habitual en el mundo real. En estos caso tal vez deber´ıan emplearse otras caracter´ısticas de las se˜nales en vez del color. Convendr´ıa estudiar la implementaci´on de un algoritmo de optimizaci´on m´as avanzado que el actualmente empleado: bisecci´on recursiva. El principal reto a superar es la no derivabilidad anal´ıtica del bloque de binarizaci´on de Otsu, lo que impide usar descenso de gradiente y otras t´ecnicas diferenciales expl´ıcitas que, sin duda, acelerar´ıan el proceso. Actualmente, puesto que las funciones de transformaci´on poseen pocos par´ametros, y se tiene una idea inicial aproximada de la ubicaci´on del m´aximo, las superficies de rendimiento son suaves y quasimon´otonas, lo que permite el uso de bisecci´on recursiva para encontrar el m´aximo global. Sin 117
embargo, si se pretendiese usar funciones de transformaci´on m´as atrevidas y con m´as GDL, la superficie probablemente presentar´ıa un gran n´umero de m´aximos locales d´ebiles yfuertes que penalizar´ıan fuertemente el uso del sistema de optimizaci´on presente. Experimentar con algoritmos de crecimiento de grano en las regiones segmentadas. Nuevamente el objetivo que se persigue es aprovechar al m´aximo la separaci´on por color. Distinguir entre diferentes condiciones de iluminaci´on, ajustando los par´ametros de los filtros de color de acuerdo a tablas, como en control por Gain Scheduling. En el sistema implementado el filtro de color se ha ajustado con unos par´ametros ´unicos, que deben servir para im´agenes tomadas en distintas horas y meteorolog´ıa diversa. Se proponen dos posibles entradas para las entradas de la tabla: hora del d´ıa y fecha para las condiciones de iluminaci´on, y sensores de radiaci´on o c´amaras para la detecci´on de las condiciones meteorol´ogicas y de iluminaci´on. Usar LUTs en la conversi´on del espacio RGB a HSV con baja granularidad, pues generalmente no se necesita mucha precisi´on en los canales H y S, ya que las funciones de transformaci´on suelen tener σ“altos”. Esto permitir´ıa reducir el tiempo de ejecuci´on evitando numerosos c´alculos trigonom´etricos. Un problema que surge con la segmentaci´on del color rojo es el mapeo por convenio de los tonos grises al Hue 0. Por esta regla, el color blanco es indistinguible en el espacio HSV del rojo puro. Para solventar este problema en im´agenes sint´eticas y reales se ha recurrido a sumar y restar respectivamente el valor 1 a los canales Green y Blue del espacio RGB. Se trata de una soluci´on basada en la abundancia estad´ıstica de tonos grises, y en la escasez de combinaciones que se transforman a grises tras la operaci´on. El resultado, si bien dista mucho de ser ´optimo26, es muy sencillo de implementar y r´apido en la ejecuci´on. A´un as´ı es un campo de futura depuraci´on que podr´ıa repercutir en un mejor comportamiento global del sistema. A pesar de que el color es uno de los rasgos m´as diferenciales de una se˜nal de tr´afico (en territorio europeo al menos), es tambi´en el que m´as variaci´on puede presentar. En especial en zonas como Andaluc´ıa, en la que existe una alta irradiancia en los meses estivales que ocasiona su deterioro. Figura 121: Casos extremos de degradaci´on del color. En caso de querer detectar este tipo de se˜nales degeneradas, ser´ıa preciso emplear un filtro de color tan laxo que se impedir´ıa el correcto funcionamiento del sistema. Tal vez, para estos casos, ser´ıa m´as acertado buscar rasgos distintivos en las serigraf´ıas. 26En las im´agenes reales se pueden ver siempre resquicios en la segmentaci´on de los nombre de las calles que Street Google ha ubicado sint´eticamente 118
clasificador morfol´ogico El clasificador morfol´ogico actual distingue entre las se˜nales triangulares, las circulares y el grupo de rechazo. A pesar de la robustez demostrada ante regiones no ideales, pueden realizarse m´ultiples modificaciones en aras de mejorar su comportamiento y ampliar sus funciones: Incorporar otro tipo de geometr´ıas: se˜nales octogonales (p.e. stop) o se˜nales cuadradas (p.e. paso de peatones). Se ha comprobado que es una pr´actica com´un agrupar determinadas se˜nales en “dobletes verticales” aprovechando el mismo poste. Por este motivo, ser´ıa relativamente f´acil para el actual programa de visi´on, establecer un criterio en la relaci´on altura-ancho de los bounding boxes de las regiones detectadas, que de cumplirse, partir´ıa la regi´on antes de enviarla al clasificador morfol´ogico. De esta forma se podr´ıa identificar un gran conjunto adicional de se˜nales sin tener que realizar grandes modificaciones en los pasos posteriores. Figura 122: Ejemplos habituales de agrupaciones dobles. El programa actual suele agruparlos como una misma regi´on impidiendo su identificaci´on. Emplear un conjunto de descriptores diferente que tambi´en sea f´acil de calcular y ofrezca robustez. En este aspecto, los escogidos son superiores a otras alternativas propuestas en el mundo acad´emico (p.e. DtB) por lo que parece un punto dif´ıcil de mejorar. Implementar otras t´ecnicas para la clasificaci´on morfol´ogica para intentar incrementar la efectividad. Una opci´on que se implant´o inicialmente sin ´exito fue usar la transformada de Hough para detectar esquinas y segmentos rectos en los tri´angulos, y centros y radios en los c´ırculos. Los principales problemas detectados fueron el largo tiempo de procesamiento y la poca robustez que presentaba ante regiones reales. Otra alternativa es usar plantillas de formas y efectuar comparaciones mediante procesos de correlaci´on. El reto m´as importante a superar es la velocidad de ejecuci´on. Usar redes neuronales entrenadas para clasificar el tipo de geometr´ıa. El problema que puede presentar es que, a cada reajuste del filtro de color, los bordes de las se˜nales poseen agrupaciones espurias muy diferentes, lo cual dificulta su entrenamiento. Usar m´etodos de SVM sobre el conjunto de descriptores de la regi´on. Implementar m´etodos predictivos para el tratamiento de perfiles incompletos. La oclusi´on es un problema muy com´un, especialmente en carreteras de zonas rurales donde la vegetaci´on puede tapar parcialmente la se˜nal. 119
extractor de serigraf´ıas En cuanto a la extracci´on de la serigraf´ıa y su normalizaci´on, podr´ıa aplicarse tambi´en la idea de Gain Scheduling para variar los par´ametros que gobiernan la binarizaci´on del s´ımbolo. El programa actual se basa en la separaci´on de dos gibas en el histograma de la serigraf´ıa en escala de grises. Cuando la iluminaci´on es buena, los picos se hallan bien separados, por lo que la umbralizaci´on es exitosa. Sin embargo, durante el atardecer y el anochecer, el contraste entre el fondo blanco y la tipograf´ıa negra disminuye, y a pesar de la normalizaci´on del contraste que se lleva a cabo, el bloque de binarizaci´on de Otsu no es tan efectivo. Otro problema que puede surgir es el mal estado del propio s´ımbolo interno, ya sea por deterioro o por vandalismo. Esto impide el centrado de la serigraf´ıa pura, por lo que el identificador posterior fallar´a con mayor probabilidad, a no ser que se entrene para este tipo de situaciones. Figura 123: Ejemplos de se˜nales con serigraf´ıas degradadas. identificador de serigraf´ıas Finalmente, respecto a la identificaci´on de serigraf´ıas pueden realizarse las siguientes mejoras: Ampliar el conjunto de se˜nales reconocibles. Ampliar el conjunto de entrenamiento para mejorar las tasas de acierto. Implementar un algoritmo de extracci´on de los caracteres por separado (p.e. 30 km/h →3 y 0), para inyectarlos a un sistema de clasificaci´on m´as sencillo. Es una t´ecnia aplicada en ANPR (Automatic Number Plate Recognition) con muy buenos resultados. Implementar topolog´ıas de redes m´as complejas y adaptadas a la tarea de identificaci´on de im´agenes, como CNN o DNN. Para los dos anteriores apartados no es necesario hacer pr´acticamente modificaciones al c´odigo, y ´unicamente se requiere tiempo de tedioso trabajo de clasificaci´on manual. Para las dos ´ultimas mejoras propuestas se debe modificar fuertemente el programa actual, en particular si se entiende que la implantaci´on de una CNN o una DNN conlleva que la entrada de la red sea directamente la imagen RGB completa. 120
6. Anejo de programas 6.1. Ejemplos representativos del repositorio de se˜nales En este apartado se muestran los contenidos reales de 3 diferentes tipos de se˜nales, que por sus diferentes formas, poseen un ´arbol de directorios diferente. El caso de los archivos .dae es especial ya que poseen arrays con un gran n´umero de elementos con los mapas de proyecci´on e informaci´on geom´etrica. Dada su exacerbada longitud, no se muestran m´as que las primeras y las ´ultimas componentes unidas con 4 puntos suspensivos. Adem´as como los 3 diferentes archivos que aparecen en el repositorio: anterior triangulo vertices suaves texturizado.dae posterior triangulo vertices suaves texturizado.dae circular mask proyection over thin cilinder.dae Solo difieren en dichos arrays y en el nombre, solo se muestra uno de ellos. 6.1.1. Ejemplo de se˜nal cuadrangular: paso peatones 1material Situacion_paso_peatones / Diffuse 2{ 3receive_shadows on 4technique 5{ 6pass 7{ 8texture_unit 9{ 10 texture ../../../../ pictogramas_senales_normalizados / Situacion_paso_peatones .png 11 } 12 } 13 } 14 } 15 16 material poste_metalico / Diffuse 17 { 18 receive_shadows on 19 technique 20 { 21 pass 22 { 23 texture_unit 24 { 25 texture ../../../../ texturas_genericas / poste_metalico . png 26 } 27 } 28 } 29 } 30 material chapa_metalica / Diffuse 31 { 32 receive_shadows on 33 technique 34 { 35 pass 36 { 37 texture_unit 38 { 39 texture ../../../ texturas_genericas / chapa_metalica . png 40 } 41 } 42 } 43 } Figura 124: senal vertical.material. 121
51 <shadow_r sid ="blender_shadow_r" type=" float " >0</ shadow_r > 52 <shadow_g sid ="blender_shadow_g" type=" float " >0</ shadow_g > 53 <shadow_b sid ="blender_shadow_b" type=" float " >0</ shadow_b > 54 <energy sid ="blender_energy" type=" float " >1000 </ energy > 55 <spotsize sid =" spotsize " type=" float " >75 </ spotsize > 56 <spotblend sid =" spotblend " type=" float " >0.15 </ spotblend > 57 <clipsta sid ="clipsta" type=" float " > 0.04999995 </ clipsta > 58 <clipend sid ="clipend" type=" float " >30.002 </ clipend > 59 <bias sid =" bias " type=" float " >1</ bias > 60 <radius sid ="radius" type=" float " >0.1 </ radius > 61 <area_shape sid =" area_shape " type=" int ">1 </ area_shape > 62 <area_size sid =" area_size " type=" float " >0.1 </ area_size > 63 <area_sizey sid =" area_sizey " type=" float " >0.1 </ area_sizey > 64 <area_sizez sid =" area_sizez " type=" float " >1 </ area_sizez > 65 </ technique> 66 </ extra > 67 </ light > 68 </ library_lights> 69 <library_effects > 70 <effect id=" Pictograma_senal_001 - effect " > 71 <profile_COMMON> 72 <newparam sid=" Pictograma_senal_png - surface " > 73 <surface type="2D"> 74 <init_from>Pictograma_senal_png</init_from > 75 </ surface> 76 </ newparam > 77 <newparam sid=" Pictograma_senal_png - sampler " > 78 <sampler2D> 79 <source> Pictograma_senal_png - surface </ source> 80 </ sampler2D> 81 </ newparam > 82 <technique sid ="common"> 83 <lambert> 84 <emission > 85 <color sid =" emission " >0 0 0 1</ color > 86 </ emission > 87 <diffuse> 88 <texture texture=" Pictograma_senal_png - sampler " texcoord =" UVMap "/> 89 </ diffuse> 90 <index_of_refraction> 91 <float sid ="ior">1.45 </ float > 92 </ index_of_refraction> 93 </ lambert> 94 </ technique> 95 </ profile_COMMON> 96 </ effect> 97 <effect id="Material_001 -effect"> 98 <profile_COMMON> 99 <newparam sid=" Pictograma_senal_png - surface " > 100 <surface type="2D"> 101 <init_from>Pictograma_senal_png</init_from > 102 </ surface> 103 </ newparam > 104 <newparam sid=" Pictograma_senal_png - sampler " > 105 <sampler2D> 106 <source> Pictograma_senal_png - surface </ source> 107 </ sampler2D> 108 </ newparam > 109 <technique sid ="common"> 110 <lambert> 111 <emission > 112 <color sid =" emission " >0 0 0 1</ color > 113 </ emission > 128
114 <diffuse> 115 <texture texture=" Pictograma_senal_png - sampler " texcoord =" UVMap "/> 116 </ diffuse> 117 <index_of_refraction> 118 <float sid ="ior">1.45 </ float > 119 </ index_of_refraction> 120 </ lambert> 121 </ technique> 122 </ profile_COMMON> 123 </ effect> 124 </ library_effects > 125 <library_images> 126 <image id="Pictograma_senal_png" name="Pictograma_senal_png"> 127 <init_from> ../../../ pictogramas_senales_normalizados / Velocidad_maxima_30 . png </ init_from > 128 <! --en la linea superior referenciar el path relativo del png del pictrograma de la se~nal teniendo en cuenta que el origen de relatividad es <>/Senal_<>/ por lo cual el primer paso llegar al path de biblioteca_senales y entrar en la carpeta con los png de los pictogramas --> 129 </ image > 130 </ library_images> 131 <library_materials> 132 <material id=" Pictograma_senal_001 - material " name="Pictograma_senal.001"> 133 <instance_effect url="# Pictograma_senal_001 - effect "/> 134 </ material > 135 <material id=" Material_001 - material " name=" Material .001 "> 136 <instance_effect url="#Material_001 -effect"/> 137 </ material > 138 </ library_materials> 139 <library_geometries > 140 <geometry id=" Pictograma_senal - mesh " name="Pictograma_senal"> 141 <mesh> 142 <source id=" Pictograma_senal -mesh - positions "> 143 <float_array id=" Pictograma_senal - mesh - positions - array " count ="12"> -0.5 -0.5 0 0.5 -0.5 0 -0.5 0.5 0 0.5 0.5 0</ float_array> 144 <technique_common> 145 <accessor source ="# Pictograma_senal - mesh - positions - array " count ="4" stride="3"> 146 <param name="X" type=" float "/> 147 <param name="Y" type=" float "/> 148 <param name="Z" type=" float "/> 149 </ accessor > 150 </ technique_common> 151 </ source> 152 <source id=" Pictograma_senal - mesh - normals "> 153 <float_array id=" Pictograma_senal - mesh - normals - array " count ="3">0 0 1</ float_array> 154 <technique_common> 155 <accessor source ="# Pictograma_senal - mesh - normals - array " count ="1" stride="3"> 156 <param name="X" type=" float "/> 157 <param name="Y" type=" float "/> 158 <param name="Z" type=" float "/> 159 </ accessor > 160 </ technique_common> 161 </ source> 162 <source id=" Pictograma_senal -mesh -map -0"> 163 <float_array id=" Pictograma_senal - mesh - map -0 - array " count ="12">100100101101</ float_array> 164 <technique_common> 165 <accessor source ="# Pictograma_senal - mesh - map -0 - array " count ="6" stride="2"> 166 <param name="S" type=" float "/> 167 <param name="T" type=" float "/> 168 </ accessor > 169 </ technique_common> 170 </ source> 129
171 <vertices id=" Pictograma_senal -mesh - vertices "> 172 <input semantic =" POSITION " source="# Pictograma_senal -mesh - positions "/> 173 </ vertices > 174 <triangles material =" Pictograma_senal_001 - material " count ="2"> 175 <input semantic ="VERTEX" source="# Pictograma_senal - mesh - vertices " offset="0"/> 176 <input semantic ="NORMAL" source="# Pictograma_senal - mesh - normals " offset="1"/> 177 <input semantic =" TEXCOORD " source="# Pictograma_senal - mesh -map -0" offset="2" set ="0"/> 178 <p>100201002103304205</p> 179 </ triangles> 180 </ mesh> 181 </ geometry > 182 <geometry id="Cylinder -mesh" name=" Cylinder " > 183 <mesh> 184 <source id=" Cylinder - mesh - positions "> 185 <float_array id=" Cylinder - mesh - positions - array " count =" 192">0 1 -1 0 1 1 0.1950903 ... resto de elementos 0.9807853 -1 -0.1950903 0.9807853 1 </ float_array> 186 <technique_common> 187 <accessor source ="# Cylinder - mesh - positions - array " count = "64" stride="3"> 188 <param name="X" type=" float "/> 189 <param name="Y" type=" float "/> 190 <param name="Z" type=" float "/> 191 </ accessor > 192 </ technique_common> 193 </ source> 194 <source id=" Cylinder - mesh - normals " > 195 <float_array id=" Cylinder - mesh - normals - array " count =" 165"> 0.09801727 0.9951847 0 0.2902846 ... resto de elementos -1 3.88857e-7 0 -1 -3.59258e -7 0 -1</ float_array> 196 <technique_common> 197 <accessor source ="# Cylinder - mesh - normals - array " count =" 55" stride="3"> 198 <param name="X" type=" float "/> 199 <param name="Y" type=" float "/> 200 <param name="Z" type=" float "/> 201 </ accessor > 202 </ technique_common> 203 </ source> 204 <source id=" Cylinder -mesh -map -0"> 205 <float_array id=" Cylinder - mesh - map -0 - array " count ="744">1 1 0.96875 0.5 1 0.5 ... resto de elementos ... 0.4853885 0.9853885 0.2968217 0.7968217 0.01461154 </ float_array> 206 <technique_common> 207 <accessor source ="# Cylinder - mesh - map -0 - array " count ="372 " stride="2"> 208 <param name="S" type=" float "/> 209 <param name="T" type=" float "/> 210 </ accessor > 211 </ technique_common> 212 </ source> 213 <vertices id=" Cylinder - mesh - vertices "> 214 <input semantic =" POSITION " source="# Cylinder - mesh - positions "/> 215 </ vertices > 216 <triangles material =" Material_001 - material " count ="124 "> 217 <input semantic ="VERTEX" source="# Cylinder -mesh - vertices " offset="0"/> 218 <input semantic ="NORMAL" source="# Cylinder -mesh - normals " offset="1"/> 219 <input semantic =" TEXCOORD " source="# Cylinder -mesh -map -0" offset="2" set="0"/ > 220 <p>1 0 0 2 0 1 0 0 2 3 ... resto de elementos ... 14 33 370 30 33 371 </p> 221 </ triangles> 222 </ mesh> 223 </ geometry > 224 </ library_geometries > 225 <library_visual_scenes> 226 <visual_scene id=" Scene " name=" Scene " > 227 <node id="Pictograma_senal" name="Pictograma_senal" type=" NODE "> 228 <matrix sid =" transform " > -6.74437 e -9 6.74437 e -9 0.1542932 0.002480021 0.1542932 2.94806 e -16 6.74437 e -9 0 0 0.1542932 -6.74437e-9 1.244442 0 0 0 1</ matrix > 130
229 <instance_geometry url="# Pictograma_senal - mesh " name="Pictograma_senal"> 230 <bind_material > 231 <technique_common> 232 <instance_material symbol=" Pictograma_senal_001 - material " target="# Pictograma_senal_001 - material"> 233 < bind_vertex_input semantic =" UVMap " input_semantic=" TEXCOORD " input_set ="0"/> 234 </instance_material> 235 </ technique_common> 236 </ bind_material > 237 </instance_geometry> 238 </ node > 239 <node id=" Cylinder " name=" Cylinder " type=" NODE "> 240 <matrix sid =" transform " > -1.98579 e -8 3.32518 e -8 0.005 -8.513 e -4 0.2630257 -0.141678 5.56505 e -10 0 0.141678 0.2630257 -3.32343e-10 1.195235 0 0 0 1</ matrix > 241 <instance_geometry url="#Cylinder-mesh" name=" Cylinder "> 242 <bind_material > 243 <technique_common> 244 <instance_material symbol=" Material_001 - material " target="# Material_001 - material " > 245 < bind_vertex_input semantic =" UVMap " input_semantic=" TEXCOORD " input_set ="0"/> 246 </instance_material> 247 </ technique_common> 248 </ bind_material > 249 </instance_geometry> 250 </ node > 251 <node id="Camera" name="Camera" type=" NODE "> 252 <matrix sid =" transform " >0.6859207 -0.3240135 0.6515582 7.358891 0.7276763 0.3054208 -0.6141704 -6.925791 0 0.8953956 0.4452714 4.958309 0 0 0 1 </ matrix > 253 <instance_camera url="# Camera - camera "/> 254 </ node > 255 <node id=" Light " name=" Light " type=" NODE "> 256 <matrix sid =" transform " > -0.2908646 -0.7711008 0.5663932 4.076245 0.9551712 -0.1998834 0.2183912 1.005454 -0.05518906 0.6045247 0.7946723 5.903862 0 0 0 1</ matrix > 257 <instance_light url="# Light - light "/> 258 </ node > 259 </visual_scene> 260 </ library_visual_scenes> 261 <scene > 262 <instance_visual_scene url="# Scene "/> 263 </ scene > 264 </ COLLADA> Figura 130: mesh.dae . 6.1.3. Ejemplo de se˜nal triangular: Peligro resalte 1material poste_metalico / Diffuse 2{ 3receive_shadows on 4technique 5{ 6pass 7{ 8texture_unit 9{ 10 texture ../../../../ texturas_genericas / poste_metalico . png 11 } 12 } 13 } 14 } 131
15 material chapa_metalica / Diffuse 16 { 17 receive_shadows on 18 technique 19 { 20 pass 21 { 22 texture_unit 23 { 24 texture ../../../../ texturas_genericas / chapa_metalica . png 25 } 26 } 27 } 28 } Figura 131: senal vertical.material. 1<?xml version =" 1.0"?> 2<model > 3<name> Senal_Resalte </ name> 4<version>1.0 </ version> 5<sdf version =" 1.6"> model . sdf </ sdf > 6<author> 7<name>Juan Feijoo </ name> 8</ author> 9<description> 10 Senal texturizada 11 Poste 12 Chapa trasera 13 Pictograma anterior con la identificacion de la senal 14 </ description> 15 </ model > Figura 132: model.config. 1<?xml version =’1.0 ’?> 2<sdf version =’ 1.7 ’> 3<model name=’ Senal_Resalte ’> 4<link name=’link_0’> 5<pose> -0.522 -0.047 1 0 0 -1.5715 </ pose> 6<visual name =’visual’> 7<pose>0 0 0 0 -0 0</ pose> 8<geometry > 9<mesh ><uri >file: //./ biblioteca_senales_v3 / senales / Senal_Resalte / meshes / posterior_triangulo_vertices_suaves_texturizado.dae</uri ></ mesh > 10 <! -- Tambien podr´ıa emplearse el path absoluto que puede especificarse a mano o mediante algun comando automatizando el proceso de busqueda , aunque realmente el metodo de los paths relativos es mucho m´as estable y por ello ha sido el escogido finalmente . ( find / -type d -name biblioteca_senales_x 2>/ dev / null )/ Senal_x /x. dae --> 11 </ geometry > 12 </ visual> 13 </ link > 14 <link name=’link_1’> 15 <pose> -0.522 -0.065 1 0 0 +1.5715 </ pose> 16 <visual name =’visual’> 17 <pose>0 0 0 0 -0 0</ pose> 18 <geometry > 132
19 <mesh ><uri >file: //./ biblioteca_senales_v3 / senales / Senal_Resalte / meshes / anterior_triangulo_vertices_suaves_texturizado.dae</uri ></ mesh > 20 <! -- Tambien podr´ıa emplearse el path absoluto que puede especificarse a mano o mediante algun comando automatizando el proceso de busqueda , aunque realmente el metodo de los paths relativos es mucho m´as estable y por ello ha sido el escogido finalmente . ( find / -type d -name biblioteca_senales_x 2>/ dev / null )/ Senal_x /x. dae --> 21 </ geometry > 22 </ visual> 23 </ link > 24 <link name=’link_2’> 25 <pose> -0.53054 -0.045524 0.684832 0 -0 0</ pose> 26 <visual name =’visual’> 27 <pose>0 0 0 0 -0 0</ pose> 28 <geometry > 29 <box > 30 <size>0.034496 0.010 1.21663 </ size> 31 </box > 32 </ geometry > 33 <material > 34 <lighting >1 </ lighting > 35 <script> 36 <! -- texturas del poste metalico de la se~nal --> 37 <uri > model: // Senal_Resalte / materials / scripts </ uri > 38 <! -- en caso de que se quisiese introducir una textura en el apartado 39 de texturas_particulares , deberia referenciarse este path con la inclusion 40 de la siguiente linea --> 41 <! -- 42 <uri >model: // Senal_situacion_paso_peatones / materials / texturas_particulares </ uri > 43 --> 44 <name>poste_metalico/Diffuse</name> 45 </ script> 46 <shader type=’pixel ’/> 47 <emissive >0 0 0 1 </ emissive > 48 </ material > 49 <transparency>0 </ transparency> 50 <cast_shadows>1 </ cast_shadows> 51 </ visual> 52 <collision name =’ collision ’> 53 <pose>0 0 0 0 -0 0</ pose> 54 <geometry > 55 <box > 56 <size>0.034496 0.015106 1.21663 </ size> 57 </box > 58 </ geometry > 59 </ collision> 60 </ link > 61 <joint name =’link_1_JOINT_1’ type=’fixed ’> 62 <parent>link_0</parent> 63 <child >link_1</child > 64 <pose>0 0 0 0 -0 0</ pose> 65 </ joint > 66 <joint name =’link_2_JOINT_0’ type=’fixed ’> 67 <parent>link_2</parent> 68 <child >link_0</child > 69 <pose>0 0 0 0 -0 0</ pose> 70 </ joint > 71 <static>1 </ static> 72 <allow_auto_disable >1</ allow_auto_disable > 73 </ model > 74 </sdf > Figura 133: model.sdf . 133
6.2. Programas de visi´on en MatLab En este apartado se presentan los programas m´as importantes que han sido empleados en las fases de ajuste de par´ametros e implementaci´on final del sistema de reconocimiento visual. 1function [LUT , flag_errores ]= LUT_pseudodistribucion_gaussiana ( rango ,sigma ,mu , notificacion_errores) 2%LUT PSEUDO DISTRIBUCION GAUSSIANA --> dg 3%------------------------------------------------------------------------% 4%Funcion para la creacion de una LUT definida por una campana tipo exp (-x ^2) , 5%Argumentos de entrada en formato double : 6%rango (m´a ximo n´u mero de niveles de gris discretos de la entrada y de la salida ) p.e 256. 7%. 8%sigma ( desviaci ´on en la curva , grado de achatamiento , anchura ) 9%. 10 %mu (punto m´a ximo de la curva , para mu =0) 11 %Argumentos de salida en formato double : 12 %LUT array columna en el que los indices de los elementos son los valores 13 %de grises de la entrada y los valores de los elementos accedidos los 14 %valores realzados . 15 16 %Comprobaci ´on coherencia variables introducidas 17 flag_errores=1; 18 %Se presupone ningun error de compatibilidad 19 if notificacion_errores==1 20 if rango >256 21 error (" Valores muy elevados reduzca el rango "); 22 end 23 if sigma <1 24 error (" Valor de sigma no valido , debe ser superior a 1"); 25 end 26 if mu <0 || mu > rango 27 error (" Valor de mu excede rango , debe estar en el intervalo [0, rango ]"); 28 end 29 else 30 if sigma <1 || mu <0 || mu >rango || rango >256 31 flag_errores = -1; LUT = -1; 32 %Algun error de incompatibilidad encontrado --> LUT no valida aborto 33 %de futuros calculos , LUT = -1. 34 end 35 end 36 if flag_errores ==1 || notificacion_errores ==1 37 LUT = zeros ( rango ,1) ; 38 for k =0: uint8 (( rango -1) /2) 39 LUT (k +1) =( rango -1) * exp ( -(( double (k)/ sigma ) ^2) /2) ; 40 LUT ( rango - double (k))= LUT (k +1) ; 41 %simetria respecto a k=0 42 end 134
43 %aplicacion de mu desplazamientos sucesivos del vector LUT 44 aux = LUT ( rango ); 45 for i =1: mu 46 for j=rango -1: -1:1 47 LUT (j+1) =LUT(j); 48 end 49 LUT (1)= aux; 50 aux = LUT ( rango ); 51 end 52 LUT = double ( LUT ); 53 end Figura 134: Programa de generaci´on de las LUT pseudo-gaussianas . 1function [LUT , flag_errores ]= LUT_segmentos_rectos ( rango , sigma ,mu ,slope , notificacion_errores) 2%LUT SEGMENTOS RECTOS -->sgr 3%------------------------------------------------------------------------% 4%Funcion para la creacion de una LUT definida a trozos por tramos rectos , 5%Argumentos de entrada en formato double : 6%rango (m´a ximo n´u mero de niveles de gris discretos de la entrada y de la salida ) p.e 256. 7%. 8%sigma ( anchura /2 de la meseta superior de la LUT , es decir , amplitud 9%segmento recto superior para el cual la salida en m´a xima ) 10 %. 11 %slope ( amplitud de las rectas de descenso a ambos lados de la meseta 12 %central) 13 %. 14 %mu ( punto central de la meseta , para mu =0 , valores maximos para 15 %[- sigma , sigma ]) 16 %Argumentos de salida en formato double : 17 %LUT array columna en el que los indices de los elementos son los valores 18 %de grises de la entrada y los valores de los elementos accedidos los 19 %valores realzados . 20 21 %Comprobaci ´on coherencia variables introducidas 22 flag_errores=1; 23 %Se presupone ningun error de compatibilidad 24 if notificacion_errores==1 25 if sigma <1 26 error (" Valor de sigma no valido , debe ser superior a 1"); 27 end 28 if slope <1 29 error (" Valor de slope no valido , debe ser superior a 1"); 30 end 31 if 2* slope +2* sigma > rango 32 error (" Longitud de tramos especificados excede el rango de valores , reduzca sigma o slope "); 33 end 34 if mu <0 || mu > rango 35 error (" Valor de mu excede rango , debe estar en el intervalo0 [0, rango ]"); 36 end 37 else 38 if sigma <1 || slope <1 || 2* slope +2* sigma >rango || mu <0 || mu > rango 39 flag_errores = -1; LUT = -1; 40 %Algun error de incompatibilidad encontrado --> LUT no valida aborto 41 %de futuros calculos , LUT = -1. 42 end 43 end 135
44 if flag_errores ==1 || notificacion_errores ==1 45 LUT = zeros ( rango ,1) ; 46 for k=0: rango -1 47 %Tramo recto superior 48 if (k <= sigma ) || (k >= rango -1 - sigma ) 49 LUT (k +1) = uint8 ( rango -1) ; 50 %Tramo bajada 51 elseif (k > sigma ) && (k <= sigma + slope ) 52 x=k - sigma ; 53 m =( rango -1) / slope ; 54 LUT (k +1) = uint8 ( rango -1 -m*x ); 55 %Tramo subida 56 elseif (k > rango -1-sigma - slope ) && (k < rango -1 - sigma ) 57 x=k -( rango -1 - sigma - slope ); 58 m =( rango -1) / slope ; 59 LUT (k +1) = uint8 ( 0 +m *x); 60 end 61 end 62 %aplicacion de mu desplazamientos sucesivos del vector LUT 63 aux = LUT ( rango ); 64 for i =1: mu 65 for j=rango -1: -1:1 66 LUT (j+1) =LUT(j); 67 end 68 LUT (1)= aux; 69 aux = LUT ( rango ); 70 end 71 LUT = double ( LUT ); 72 end Figura 135: Programa de generaci´on de las LUT segmentos rectos . 1clear ' all ' ;close ' all ' ;clc; 2 3%HIPERPAR´ A METROS OPTIMIZADOR DE LUT SEGMENTOS RECTOS 4N_imagenes_set_optimizacion=12; % 5degradacion = true ; %opcion de degradacion de la imagen 6gaussian_noise=0.01; % adici ´on ruido gaussiano si degradacion 7N=3; %filtrado si degradacion 8escalado =0.5; % disminucion de la resolucion si degradacion 9lambda =10; %Importancia relativa pixeles bien clasificados 10 rango =256; %Profundidad color por canal VGA - - >256 11 Carpeta_origen="Set_entrenamiento_color_real"; 12 13 %Cuadro interactivo con los intervalos de estudio y representacion 14 fprintf("¿ Desea estudiar desviaciones respecto al optimo en Canal_S \n" ); 15 opcion1 = input (" Y/N:" , ' s ' ); 16 fprintf("¿ Desea estudiar desviaciones respecto al optimo en Canal_H \n"); 17 opcion2 = input (" Y/N:" , ' s ' ); 18 fprintf("¿ Desea estudiar desviaciones respecto a sigma_mu (1) o slope (2) \n"); 19 opcion3 = input ("1 ,2:") ; 20 if opcion3 ==1 21 sigma_mu =1; 22 elseif opcion3 ==2 23 sigma_mu =0; 24 else 25 error (" Opcion debe ser 1 o 2" ); 26 end 136
27 if strcmp ( opcion1 ,"Y") && strcmp ( opcion2 ,"N") 28 Desviacion_optima_S=1; 29 Desviacion_optima_H=0; 30 elseif strcmp ( opcion1 ,"N") && strcmp ( opcion2 ,"Y") 31 Desviacion_optima_S=0; 32 Desviacion_optima_H=1; 33 else 34 error (" Opciones no compatibles , debe escoger solo una ."); 35 end 36 if Desviacion_optima_S==1 37 mu_canal_H =254; 38 sigma_canal_H =12; 39 slope_canal_H =10; 40 %desviaciones parametros LUT canal S 41 if sigma_mu ==1 42 mu_canal_S=[100:250]; 43 sigma_canal_S =[1:5:100]; 44 slope_canal_S =12; 45 else 46 mu_canal_S =187; 47 sigma_canal_S =60; 48 slope_canal_S =[1:2:40]; 49 end 50 elseif Desviacion_optima_H==1 51 mu_canal_S =188; 52 sigma_canal_S =56; 53 slope_canal_S =12; 54 %desviaciones parametros LUT canal H 55 if sigma_mu ==1 56 mu_canal_H =[235:2:255 ,0:2:15]; 57 sigma_canal_H =[1:20]; 58 slope_canal_H =10; 59 else 60 mu_canal_H =1; 61 sigma_canal_H =4; 62 slope_canal_H =[1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,12 ,15]; 63 end 64 end 65 66 rendimiento = zeros ( length ( sigma_canal_H ), length ( mu_canal_H ), length ( slope_canal_H ), length ( sigma_canal_S ), length ( mu_canal_S ), length ( slope_canal_S )); 67 rendimiento_maximo = rendimiento (1 ,1 ,1 ,1 ,1 ,1) ; 68 contador =0; 69 vueltas_totales = length ( sigma_canal_H )* length ( mu_canal_H )* length ( slope_canal_H )* ength ( sigma_canal_S )* length ( mu_canal_S )* length ( slope_canal_S )* N_imagenes_set_optimizacion; 70 filter_mask = ones (N ,N)/N ^2; 71 for k=1:N_imagenes_set_optimizacion 72 I_original = imresize ( load ( strcat ( "./",Carpeta_origen ,"/ Imagen_ " ,num2str (k) ,". mat ")). I_original , escalado ); 73 plantilla = imresize ( load ( strcat ( "./",Carpeta_origen ,"/ plantilla_ " ,num2str (k) ,". mat ")).BW , escalado ); 74 [FIL , COL , DEPTH ]= size ( I_original ); 75 if degradacion == true 76 I_ruidosa = zeros ( FIL ,COL , DEPTH ); 77 I_suavizada = zeros ( FIL ,COL , DEPTH ) ; 78 for j=1:3 79 I_ruidosa (: ,: ,j)= imnoise ( I_original (: ,: ,j) ," gaussian ",gaussian_noise); 80 I_suavizada (: ,: ,j)= filter2 ( filter_mask , I_ruidosa (: ,: ,j)); 81 end 82 %Conversion de la imagen degradada = suavizada que percibe el evaluador 83 %del rendimiento de la clasificaci ´on de las LUT 137