Full text
1 jk Trabajo de Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Dpto. Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Autor: Lucía Reina López Tutor: María Teresa Ariza Gómez Sevilla, 2020 Trabajo de Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Autor: Lucía Reina López Tutor: María Teresa Ariza Gómez y Antonio Jesús Sierra Collado Dpto. Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020
2
Trabajo de Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Autor: Lucía Reina López Tutor: María Teresa Ariza Gómez Profesor titular Antonio Jesús Sierra Collado Profesor Sustituto Interino Dpto. de Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020
4
Trabajo de Fin de Grado: Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Autor: Lucía Reina López Tutor: María Teresa Ariza Gómez y Antonio Jesús Sierra Collado El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2020 El Secretario del Tribunal
6
A mi familia A mis amigos A mis maestros
8
Agradecimientos A mi gran familia, que me han enseñado más de lo que ninguna escuela podrá enseñarme, a mis amigos, por apoyarme, escucharme y compartir todas mis experiencias, a Abril, que tiene la capacidad de alegrarme cualquier día, y por último, a mis tutores, María Teresa Ariza Gómez y Antonio Jesús Sierra Collado, por su colaboración, paciencia, consejos y su empeño en ayudarme en la realización de este proyecto. Lucía Reina López Coripe, 2020
16
17 ÍNDICE DE TABLAS Tabla 1: API REST – Consulta usuarios 66 Tabla 2: API REST – Consultas señales 67 Tabla 3: Parámetros método blobFromImage 78 Tabla 4: Parámetros método forward 79 Tabla 5: Parámetros método NMSBoxes 80
18
19 ÍNDICE DE ILUSTRACIONES Ilustración 1: Esquema de la Arquitectura 28 Ilustración 2: Intel ® Core ™ i7 30 Ilustración 3: Teléfono Móvil Xiaomi Redmi S2 31 Ilustración 4: Navegador Opera 31 Ilustración 5: Spring Tool Suite 4 32 Ilustración 6: Eclipse 32 Ilustración 7: Android Studio 32 Ilustración 8: MySQL Workbench 33 Ilustración 9: LabelImg 33 Ilustración 10: Darknet framework 33 Ilustración 11: Spring 34 Ilustración 12: Java Persistence API 35 Ilustración 13: MySQL 35 Ilustración 14: SQLite 35 Ilustración 15: Android 36 Ilustración 16: JSON 36 Ilustración 17: Retrofit 36 Ilustración 18: OpenCV 37 Ilustración 19: YOLO 37 Ilustración 20: Google Colab 37 Ilustración 21: Google Cloud Platform 38 Ilustración 22: Amazon Web Services 38 Ilustración 23: Esquema Neurona Artificial 40 Ilustración 24: Esquema de una red neuronal 40 Ilustración 25: Esquema Red Neuronal Convolucional 41 Ilustración 26: Operación de Convolución 42 Ilustración 27: Pasos Operación de Convolución 42 Ilustración 28: Parámetro stride 42 Ilustración 29: Parámetro padding 42 Ilustración 30: Tipos de pooling 43 Ilustración 31: Capa de Conexión total o Clasificadora 44 Ilustración 32: Darknet-53 45 Ilustración 33: Cuadrícula SxS 45 Ilustración 34: Cuadros delimitadores y confianza 46
Ilustración 35: Predicción de clases en cada cuadro 46 Ilustración 36: Predicción final 47 Ilustración 37: Clases 49 Ilustración 38: Software LabelImg 50 Ilustración 39: Parámetros de configuración tiny-yoloV3 51 Ilustración 40: Parámetros capas tiny-yoloV3 52 Ilustración 41: Entorno Google Colab 53 Ilustración 42: Intersección sobre la Unión 53 Ilustración 43: Función Pérdida de Clasificación 54 Ilustración 44: Función de Pérdida de Localización 54 Ilustración 45: Función de Pérdida de Confianza 55 Ilustración 46: Función de Pérdida de Confianza (2) 55 Ilustración 47: Función de Pérdida 55 Ilustración 48: Salida Entrenamiento YOLO 56 Ilustración 49: Modelo Entidad-Relación de la Base de Datos 58 Ilustración 50: Clase Usuario – Servicio Web Spring 59 Ilustración 51: Clase TrafficSign – Servicio Web Spring 60 Ilustración 52: Clase GlobalTrafficSign – Servicio Web Spring 61 Ilustración 53: Interfaz UsuarioRepository – Servicio Web Spring 61 Ilustración 54: Interfaz SignRepository – Servicio Web Spring 62 Ilustración 55: Interfaz GlobalSignRepository – Servicio Web Spring 62 Ilustración 56: Clase Application – Servicio Web Spring 63 Ilustración 57: Clase UsuarioController – Servicio Web Spring 64 Ilustración 58: Clase SecurityConfig – Servicio Web Spring 65 Ilustración 59: Autenticación en Clase UsuarioService 65 Ilustración 60: Clase SignController – Servicio Web Spring 66 Ilustración 61: Interfaz AWS Elastic Beanstalk 68 Ilustración 62: Interfaz Amazon RDS 68 Ilustración 63: Patrón MVC 69 Ilustración 64: Diagrama de Secuencia – Registro 70 Ilustración 65: Diagrama de Secuencia – Inicio de Sesión 71 Ilustración 66: Diagrama de Secuencia – Cierre de Sesión 71 Ilustración 67: Diagrama de Secuencia – Registro Detección 72 Ilustración 68: Diagrama de Secuencia – Sincronización 73 Ilustración 69: Diagrama de Casos de Uso – Aplicación Android iCodriver 74 Ilustración 70: Clase Usuario – Aplicación Android 74 Ilustración 71: Clase TrafficSign – Aplicación Android 75 Ilustración 72: Clase Service – Aplicación Android 75 Ilustración 73: Instanciación Clase Retrofit 76 Ilustración 74: Clase SplashActivity – Aplicación Android 76
Ilustración 75: Clase RegisterActivity – Aplicación Android 76 Ilustración 76: Clase LoginActivity – Aplicación Android 77 Ilustración 77: Clase MainActivity – Aplicación Android 77 Ilustración 78: Clase DetectionActivity – Android Studio 77 Ilustración 79: Código DetectionActivity (1) 78 Ilustración 80: Código DetectionActivity (2) 78 Ilustración 81: Código DetectionActivity (3) 79 Ilustración 82: Código DetectionActivity (4) 80 Ilustración 83: Código DetectionActivity (5) 80 Ilustración 84: Clase MapsActivity – Android Studio 81 Ilustración 85: Código MapsActivity (1) 82 Ilustración 86: Código MapsActivity (2) 82 Ilustración 87: Clase SyncFragment – Android Studio 83 Ilustración 88: Clase ConexionSQLiteHelper – Android Studio 83 Ilustración 89: Clase SQLUtils – Android Studio 83 Ilustración 90: Clase NetworkMonitor – Android Studio 84 Ilustración 91: Registro NetworkMonitor 84 Ilustración 92: Archivo AndroidManifest.xml 85 Ilustración 93: Permisos declarados en AndroidManifest.xml 85 Ilustración 94: Fichero build.gradle (Project: iCodriver) 86 Ilustración 95: Fichero build.gradle (Module: App) 86 Ilustración 96: AndroidManifest.xml para OpenCV 87 Ilustración 97: Pantalla de Bienvenida 87 Ilustración 98: Pantalla de Inicio de Sesión 88 Ilustración 99: Pantalla de Registro 88 Ilustración 100: Pantalla Principal – Permisos 89 Ilustración 101: Pantalla Principal – Menú 89 Ilustración 102: Pantalla Principal – Detección 90 Ilustración 103: Pantalla Principal – Mapas y Navegación 90 Ilustración 104: Pantalla Principal – Sincronización 90 Ilustración 105: Pantalla Principal – Sincronización (2) 90 Ilustración 106: Pantalla Principal – Cerrar Sesión 91 Ilustración 107: Pantalla de Detección – Detección 92 Ilustración 108: Pantalla de Detección – Velocidad máxima sobrepasada 92 Ilustración 109: Pantalla Mapas – Visualización 93 Ilustración 110: Pantalla Mapas – Panel de información 93 Ilustración 111: Pantalla de Navegación – Panel 93 Ilustración 112: Pantalla de Navegación – Ruta 94 Ilustración 113: Pantalla Navegación – Aviso señal 94 Ilustración 114: Pantalla de Navegación – Aviso velocidad 94
Ilustración 115: Fichero ejecutable Android Studio 97 Ilustración 116: Instalador Android Studio 97 Ilustración 117: Instalación Android Studio – Elegir componentes 98 Ilustración 118: Instalación Android Studio – Localización 98 Ilustración 119: Instalación Android Studio – Elegir carpeta del Menú de Inicio 99 Ilustración 120: Instalación Android Studio completada 99 Ilustración 121: Configuración Android Studio – Selección tipo configuración 100 Ilustración 122: Configuración Android Studio – Selección tema 100 Ilustración 123: Página de Bienvenida de Android Studio 101 Ilustración 124: Actualización Android Studio – Buscar actualizaciones 101 Ilustración 125: Actualización Android Studio – Actualización 102 Ilustración 126: Pantalla de Bienvenida Android Studio v4.0 102 Ilustración 127: Selección Descarga OpenCV 103 Ilustración 128: Carpeta OpenCV descomprimida 103 Ilustración 129: Importar módulo OpenCV en Android Studio 104 Ilustración 130: Añadir dependencia OpenCV en Android Studio 104 Ilustración 131: Añadir dependencia OpenCV en Android Studio (2) 105 Ilustración 132: Ventana de herramientas de Android Studio 105 Ilustración 133: Crear nuevo JNI Folder 106 Ilustración 134: Archivos carpeta libs 106 Ilustración 135: Selección carpeta destino de la opción Paste 107 Ilustración 136: Comprobación Integración OpenCV con Android Studio 107 Ilustración 137: Ejecutable Eclipse 108 Ilustración 138: Instalador Eclipse 108 Ilustración 139: Instalación Eclipse – Localización 109 Ilustración 140: Instalación Eclipse – Eclipse IDE Launcher 109 Ilustración 141: Eclipse Marketplace 110 Ilustración 142: Ventana de creación Proyecto Spring 110 Ilustración 143: Archivo pom.xml 111 Ilustración 144: Dependencia módulo Spring Data JPA 111 Ilustración 145: Dependencia módulo Spring Security 112 Ilustración 146: Dependencia módulo Spring Session 112 Ilustración 147: Dependencia MySQL Connector 112 Ilustración 148: Fichero application.properties 112 Ilustración 149: Ejecutable MySQL Workbench 113 Ilustración 150: Instalador MySQL – Selección de un tipo de configuración 113 Ilustración 151: Instalador MySQL – Selección de productos y características 114 Ilustración 152: Instalador MySQL – Instalación 114 Ilustración 153: Pantalla de Bienvenida MySQL Workbench 115 Ilustración 154: Parámetros conexión local MySQL Workbench 115
Ilustración 155: Fichero creatablas.sql 116 Ilustración 156: Fichero creatablas.sql (Continuación) 116 Ilustración 157: MySQL Workbench – Interfaz gráfica 117 Ilustración 158: Consola AWS – Amazon RDS 118 Ilustración 159: Amazon RDS – Databases 118 Ilustración 160: Amazon RDS – Engine options 119 Ilustración 161: Amazon RDS – Templates 119 Ilustración 162: Amazon RDS – Configuración 119 Ilustración 163: Amazon RDS – Conectividad 120 Ilustración 164: Amazon RDS – Configuración adicional 120 Ilustración 165: Amazon RDS – Creando base de datos 121 Ilustración 166: Amazon RDS – Conectividad y Seguridad 121 Ilustración 167: Archivo application.properties 121 Ilustración 168: Amazon RDS – Editar reglas de entrada 122 Ilustración 169: MySQL Workbench – Añadir nueva conexión 122 Ilustración 170: MySQL Workbench – Creación manual tablas Spring Session 123 Ilustración 171: AWS – Elastic Beanstalk 123 Ilustración 172: Elastic Beanstalk – Seleccionar nombre aplicación 123 Ilustración 173: Elastic Beanstalk – Seleccionar plataforma 124 Ilustración 174: Elastic Beanstalk – Configurar más opciones 124 Ilustración 175: Elastic Beanstalk – Configuración de la base de datos 125 Ilustración 176: Elastic Beanstalk – Creando aplicación 125 Ilustración 177: Elastic Beanstalk – Aplicación creada 126 Ilustración 178: Creando el archivo .jar 126 Ilustración 179: Elastic Beanstalk – Aplicación subida y lista para usar 127 Ilustración 180: Página Principal Google Colaboratory 128 Ilustración 181: Google Colab – Configuración del Cuaderno 128 Ilustración 182: Google Colab – Celda de código para enlazar con Google Drive 129 Ilustración 183: Google Colab – Ventana Archivos 129 Ilustración 184: Google Colab – Celda de código para descomprimir Darknet 129 Ilustración 185: Google Colab – Celda de código para compilar Darknet 129 Ilustración 186: Google Colab – Celda de código para crear enlace simbólico a “Backup” 130 Ilustración 187: Google Colab – Celda de código para entrenamiento 130
24
25 1 INTRODUCCIÓN samos el Aprendizaje Automático decenas de veces al día sin darnos cuenta. Cada vez que realizamos una búsqueda en Google, funciona bien porque su software de Aprendizaje Automático ha aprendido a indexar las páginas. Cuando Facebook u otras aplicaciones reconocen a nuestros amigos en las fotos, usan aprendizaje automático. Cada vez que leemos el correo electrónico y un filtro de spam evita que tengamos que leer correo no deseado, es porque nuestro ordenador ha aprendido a distinguir entre correo deseado y no deseado. Todo esto es Machine Learning, la ciencia que posibilita que un ordenador aprenda sin ser explícitamente programado, que adquiere día a día más importancia gracias a la gran variedad de aplicaciones que tiene. En los diversos capítulos que conforman este Trabajo de Fin de Grado se explicará qué es el Aprendizaje Automático, las redes neuronales, y la solución final adoptada para aplicar estos conocimientos a la idea de un vehículo más seguro y autónomo. 1.1 Motivación y Objetivos Este Trabajo de Fin de Grado se ha realizado con el propósito de diseñar un sistema que proporcione al vehículo una ayuda en la conducción, con la finalidad de hacerlo más seguro y autónomo. El sistema desarrollado permitirá: • Detectar señales de tráfico de velocidad en carretera a tiempo real gracias al uso del Aprendizaje Automático y las redes neuronales artificiales. • Permitir al usuario recopilar estos datos y consultarlos. • Informar al conductor de la velocidad que deberá respetar en cada tramo de su recorrido. • Avisar al conductor si se supera la velocidad máxima permitida. • Hacer uso de los datos recopilados entre todos los usuarios para la señalización de velocidad en la navegación GPS. Para desarrollarlo, se han hecho uso de múltiples tecnologías, con el objetivo de indagar en el funcionamiento de las mismas y en las posibilidades que ofrecen. Entre ellas destacamos YOLO (You Only Look Once), que es una red neuronal capaz de detectar objetos a tiempo real, además de ser uno de los algoritmos más rápidos, precisos y completos. Spring, un framework basado en Eclipse para el desarrollo de aplicaciones Java, con el que se ha desarrollado el servicio web de este proyecto. Es el marco de trabajo más popular y extendido dentro U Nunca consideres el estudio como una obligación, sino como una oportunidad para penetrar en el bello y maravilloso mundo del saber. - Albert Einstein -
32 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV En nuestro caso, como ya teníamos Eclipse, instalamos STS como un complemento a través de Eclipse Marketplace, ya que es más rápido que descargar STS por separado. Mediante Spring Tool Suite 4 [7] se desarrolla el servicio web basado en el uso de Spring con JPA. Ilustración 5: Spring Tool Suite 4 2.2.3 Eclipse Eclipse es un entorno de desarrollo integrado, de código abierto y multiplataforma. Es una potente y completa plataforma de programación, desarrollo y compilación de elementos tan variados como sitios web, programas en C++ o aplicaciones Java [8]. El entorno de desarrollo integrado (IDE) de Eclipse emplea módulos (en inglés plug-in) para proporcionar toda su funcionalidad al frente de la plataforma de cliente enriquecido, a diferencia de otros entornos monolíticos donde las funcionalidades están todas incluidas, las necesite el usuario o no. Ilustración 6: Eclipse 2.2.4 Android Studio Android Studio es el entorno de desarrollo integrado (IDE) oficial para el desarrollo de aplicaciones para Android y está basado en IntelliJ IDEA de JetBrains [9]. A diferencia de Eclipse, Android studio utiliza un sistema de compilación flexible basado en Gradle. Se ha utilizado para el completo desarrollo de la aplicación Android iCodriver, encargada de la detección y clasificación de las señales captadas, además de la comunicación con el servicio web y la base de datos. Ilustración 7: Android Studio 2.2.5 MySQL Workbench MySQL Workbench es una herramienta visual de diseño de bases de datos que integra desarrollo de software,
33 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV administración de bases de datos, diseño de bases de datos, gestión y mantenimiento para el sistema de base de datos MySQL [10]. MySQL Workbench ha sido usada para la administración de la base de datos creada para el almacenamiento de las detecciones de señales realizadas por los usuarios desde la aplicación Android, así como los datos de cada usuario. Ilustración 8: MySQL Workbench 2.2.6 LabelImg LabelImg es una herramienta de anotación de imágenes gráficas escrita en Python y que usa Qt para su interfaz gráfica [11]. Las anotaciones se guardan como archivos XML en formato PASCAL VOC, el formato utilizado por ImageNet. Además, también es compatible con el formato YOLO, generando archivos txt que necesitamos para etiquetar las imágenes de entrada con las que alimentaremos nuestra red neuronal YOLO para su entrenamiento. Ilustración 9: LabelImg 2.2.7 Darknet Darknet es un marco de trabajo de red neuronal de código abierto escrito en C y CUDA [12]. Es rápido, fácil de instalar y admite cálculos de CPU y GPU. Se ha utilizado como marco de trabajo para entrenar nuestra red neuronal YOLO, estableciendo la arquitectura de la misma. Ilustración 10: Darknet framework
34 3 TECNOLOGÍAS UTILIZADAS n este capítulo se describen brevemente las tecnologías utilizadas en este proyecto, así como el uso que se les ha dado en este Trabajo de Fin de Grado. 3.1 Spring Spring es un framework y un contenedor de inversión de control e inyección de dependencias para la plataforma de Java. Posee estructura modular y gran flexibilidad para implementar diferentes tipos de arquitectura según la aplicación [13]. Se ha utilizado la tecnología Spring para realizar el desarrollo del servicio web. Para la ejecución se ha usado Spring Boot, conjunto de herramientas para construir y ejecutar las aplicaciones Spring. Tanto Spring como Spring boot están integradas dentro de Spring Tool Suite 4. Ilustración 11: Spring 3.2 Java Persistence API JPA (Java Persistence API) es la API de persistencia desarrollada por la plataforma Java EE definida en el paquete javax.persistence. Permite establecer una correlación entre una base de datos relacional y un sistema orientado a objetos estableciendo una interfaz común que es implementada por una base de datos de nuestra elección. Se encarga de automatizar dentro de lo posible la persistencia de nuestros objetos en una base de datos para no perder las ventajas de la orientación a objetos al interactuar con una base de datos [14]. Destacamos los siguientes conceptos sobre el uso de JPA: • Uso de anotaciones como @Entity, @Table o @Column entre otras para especificar propiedades. E La tecnología hizo posible las grandes poblaciones; ahora las grandes poblaciones hacen que la tecnología sea indispensable. - José Krutch -
35 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV • Entidades persistentes y relaciones entre entidades. • Mapeado Objeto-Relacional. • Lenguaje de consulta Java Persistence Query Language (JPQL). Ilustración 12: Java Persistence API 3.3 MySQL MySQL es un sistema de gestión de bases de datos relacional desarrollado bajo licencia dual: Licencia pública general/Licencia comercial por Oracle Corporation y está considerada como la base de datos de código abierto más popular del mundo [15]. Ilustración 13: MySQL 3.4 SQLite SQLite es una biblioteca en lenguaje C que implementa un motor de base de datos SQL pequeño, rápido, autónomo, de alta confiabilidad y con todas las funciones [16]. Es de dominio público y por lo tanto libre para el uso para cualquier propósito, comercial o privado. SQLite está integrado en todos los teléfonos móviles y en la mayoría de las computadoras y viene incluido dentro de innumerables otras aplicaciones que la gente usa todos los días. Se ha usado como base de datos provisional en la aplicación Android en el caso de que esta no pudiese comunicarse con el servidor web debido a la pérdida de conexión de red. Ilustración 14: SQLite 3.5 Android Android es un sistema operativo basado en Linux que está diseñado principalmente para dispositivos móviles con pantalla táctil, como teléfonos inteligentes y tabletas, admite una gran cantidad de aplicaciones en teléfonos inteligentes y es de código abierto, lo que significa que es gratuito y cualquiera puede usarlo.
36 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 15: Android 3.6 REST REST (Representational State Transfer, o Transferencia de Estado Representacional) es una interfaz para conectar varios sistemas basados en el protocolo HTTP y nos sirve para obtener y generar datos y operaciones, devolviendo esos datos en formatos muy específicos, como XML y JSON. Esta tecnología ha sido usada para desarrollar un servicio web Restful, es decir, basado en la arquitectura REST. 3.7 JSON JSON (acrónimo de JavaScript Object Notation) es un formato de texto sencillo para el intercambio de datos. Se trata de un subconjunto de la notación literal de objetos de JavaScript, aunque, debido a su amplia adopción como alternativa a XML, se considera un formato independiente del lenguaje. Nuestro servidor REST usa JSON para el intercambio de datos. Ilustración 16: JSON 3.8 Retrofit Retrofit es un cliente REST para Java y Android [17]. Hace que sea relativamente fácil recuperar y cargar JSON (u otros datos estructurados) a través de un servicio web basado en REST. En Retrofit, se configura qué convertidor se usa para la serialización de datos. Por lo general para JSON se usa GSon, pero se pueden agregar otros convertidores personalizados para procesar XML u otros protocolos. Retrofit usa la biblioteca OkHttp para solicitudes HTTP. Se ha usado Retrofit en la aplicación Android para poder enviar solicitudes de red con OkHttp y así poder comunicarnos con el servidor REST. Ilustración 17: Retrofit
37 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 3.9 OpenCV OpenCV (Open Source Computer Vision Library) es una biblioteca de software de visión artificial y aprendizaje automático de código abierto. OpenCV se creó para proporcionar una infraestructura común para aplicaciones de visión por computadora y para acelerar el uso de la percepción de la máquina en los productos comerciales. Al ser un producto libre, con licencia BSD, OpenCV facilita que las empresas utilicen y modifiquen el código [18]. OpenCV ofrece soporte para varios sistemas operativos, entre ellos Android. Se ha usado en nuestra aplicación Android, junto con la red neuronal YOLO para la detección y clasificación de objetos en las imágenes captadas por la cámara del dispositivo móvil. Ilustración 18: OpenCV 3.10 YOLO You only look once (YOLO) es un sistema de detección de objetos en tiempo real de última generación [19]. Es la red neuronal elegida para nuestro proyecto que será entrenada y usada para la detección de señales de tráfico de velocidad a tiempo real. YOLO se explicará en más detalle en el capítulo 4. Ilustración 19: YOLO 3.11 Google Colab Google Colab es un entorno gratuito de Jupyter Notebook que no requiere configuración y que se ejecuta completamente en la nube. Permite el uso gratuito de las GPUs y TPUs de Google, con librerías como: Scikitlearn, PyTorch, TensorFlow, Keras y OpenCV [20]. Se ha usado en este proyecto para entrenar nuestra red neuronal tiny-yolov3 ya que podemos usar la potente 12GB NVIDIA Tesla K80 GPU durante 12h seguidas. Ilustración 20: Google Colab
38 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 3.12 Google Cloud Platform Google Cloud Platform (GCP) es una plataforma que ofrece más de 90 servicios/productos a empresas, profesionales y desarrolladores. Te permite crear, implementar y escalar aplicaciones, sitios web y servicios en la misma infraestructura que Google. En concreto, haremos uso de los servicios de Maps SDK for Android [21] y Directions API [22] para la implementación de nuestra aplicación Android, los cuáles ofrecen imágenes de mapas desplazables, rutas y direcciones entre dos puntos del mapa. Ilustración 21: Google Cloud Platform 3.13 AWS Amazon Web Services (AWS) es la plataforma en la nube más adoptada y completa en el mundo, que ofrece más de 175 servicios integrales de centros de datos a nivel global [23] Contendrá el servicio web Spring desarrollado y la base de datos. Ilustración 22: Amazon Web Services
39 4 ESTADO DEL ARTE: YOLO, REAL-TIME OBJECT DETECTION n este capítulo se presenta la investigación realizada sobre el estado del arte en la detección de objetos usando redes neuronales, además de profundizar en el funcionamiento del sistema de detección de objetos a tiempo real YOLO (You Only Look Once) usado en este Trabajo de Fin de Grado. El campo de estudio que da a las máquinas la habilidad de aprender sin ser programadas de manera explícita (o Machine Learning) cuenta con diversas técnicas y algoritmos que podemos clasificar de dos formas: algoritmos supervisados y no supervisados, y algoritmos de regresión y clasificación. Los algoritmos supervisados son los más comunes, son aquellos que aprenden a partir de un conjunto de datos correctamente etiquetados, esto es, dada una determinada entrada, le indicamos cuál debería ser la salida correcta, o, dicho de otro modo, le enseñamos al algoritmo lo que está bien y lo que está mal para que aprenda. Por otro lado, los algoritmos no supervisados, recibirán entradas sin etiquetar y buscarán alguna estructura o configuración presente en los datos o detectarán similitudes entre las entradas proporcionadas para separarlas en grupos a su propia elección. En cuanto a los algoritmos de regresión y clasificación, los primeros tienen el objetivo de predecir valores continuos, como, por ejemplo, precios de viviendas en función del número de habitaciones, metros cuadrados, etc. Los algoritmos de clasificación en cambio predicen valores discretos. Proporcionan como salida la clase a la que pertenecen un conjunto de datos dados como entrada al algoritmo. En este proyecto, vamos a tratar con algoritmos supervisados y de clasificación, pues proporcionaremos como entrada imágenes de señales de tráfico de velocidad etiquetadas con su clase correspondiente, para que el algoritmo o red neuronal aprenda a detectarlas y clasificarlas correctamente. A continuación, se explicará el funcionamiento más básico de una red neuronal, después se procederá a comentar lo que son las Redes Neuronales Convolucionales (CNN, Convolutional Neural Network) para después hacer énfasis en las Redes Neuronales Convolucionales basadas en Regiones (R-CNN, Region-based Convolutional Neural Networks), asentando así las bases de la red neuronal utilizada en nuestro proyecto, YoloV3. E El cambio es siempre el resultado final de todo verdadero aprendizaje. Aprender no es prepararse para la vida. Aprender es la vida misma. - John Dewey -
40 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 4.1 Redes neuronales artificiales Las redes neuronales artificiales son modelos computacionales basados en el comportamiento de las redes neuronales biológicas que tienen la capacidad de aprender y formarse a si mismas de forma autónoma. Una neurona arficial es la unidad básica de procesamiento que se puede encontrar dentro de la red neuronal, representada en la Ilustración 23: Ilustración 23: Esquema Neurona Artificial Como se observa, estas reciben un conjunto de entradas, calcula la suma ponderada de las mismas y devuelve un valor de salida. La razón por la que es ponderada es debido a que cada entrada se multiplica por un peso asociado, que definirá la importancia relativa de la misma. Las redes neuronales consisten en un conjunto de estas neuronas artificiales organizadas en capas, como se observa en la Ilustración 24. Ilustración 24: Esquema de una red neuronal Tradicionalmente, a la primera capa se le conoce como capa de entrada, y la última como capa de salida. A todas las capas del medio se las conoce como capas ocultas totalmente conectadas (fully-connected). En esta estructura comentada, todas las neuronas se encuentran completamente conectadas, es decir, por cada dos capas de neuronas adyacentes, cada par de neuronas tiene una conexión por la que se transmite información. Por ejemplo, si una capa tiene m neuronas y la siguiente n, el número total de conexiones sería m*n. Esto significa que las salidas de una capa son las entradas de cada una de las neuronas de la capa adyacente, por lo que el cálculo de una neurona dependería de los valores de salida de su capa anterior, realizándose este una única vez.
41 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Las capas pueden tener distintos tamaños y cada neurona distintas funciones incluso dentro de la primera capa. Todo esto dependerá del problema. La capa de entrada poseerá tantas neuronas como componentes de entrada haya y la capa de salida tantas neuronas como valores se quiera generar. En el proceso, cada capa va tomando una serie de decisiones y cuanto más profunda sea la red, más inteligentes y complejas serán las decisiones ya que se irán basando en las tomadas por las anteriores capas. Esto se conoce como aprendizaje profundo (Deep Learning) y gracias a este se han logrado resolver problemas complejos como el de reconocimiento del habla, el procesado de lenguaje natural o la creación de sistemas de recomendación. 4.2 Redes neuronales convolucionales Las redes neuronales convolucionales (CNN) se distinguen del resto de redes neuronales por usar capas convolucionales, que realizan la operación llamada convolución que les da nombre. Las CNN son redes neuronales muy efectivas para la detección de objetos y clasificación y segmentación de imágenes. En la Ilustración 25, podemos ver que consta de diversas capas: capa de entrada, capa de convolución, capa de reducción y capa de conexión total. Ilustración 25: Esquema Red Neuronal Convolucional 4.2.1 Capa de entrada Contiene los valores brutos de la imagen, teniendo un volumen igual a las dimensiones de esta. 4.2.2 Capa de convolución En esta capa se realiza la operación de convolución que da nombre a estas redes neuronales. Esta capa posee un filtro de convolución, es decir, una matriz llena de pesos que, incialmente, poseen valores aleatorios, pero durante el entrenamiento, se irán ajustando para detectar patrones dentro de la imagen. Así, las primeras capas pueden detectar formas simples como líneas y curvas, y se van especializando hasta llegar a capas más profundas donde se reconocen formas complejas como la forma de una cara o un animal. La idea detrás de esto es que cada filtro aprende un atributo concreto y lo busca a través de toda la imagen:
48 5 ENTRENAMIENTO DE LA RED NEURONAL TINY-YOLOV3 n este capítulo detallaremos todos los pasos seguidos para el entrenamiento de la red neuronal escogida, tiny-yolov3, para hacerla capaz de detectar y clasificar las señales de tráfico de velocidad que se presenten en carretera. 5.1 Conceptos clave A continuación, se definen algunos de los conceptos claves para el entrenamiento de la red: • Entrenamiento: Entrenar es aplicar un número definido de imágenes etiquetadas a nuestro modelo para obtener y corregir los pesos para el propósito deseado. • Pesos o weights: Parámetros ajustables de la red neuronal de forma que, dada una determinada entrada, obtengamos la salida deseada. Estos parámetros se ajustan en el proceso de aprendizaje o entrenamiento de la red neuronal. • Dataset: Conjunto de pares de imágenes y etiquetas. • Etiquetas: Anotaciones preparadas que indicarán al modelo qué va a encontrar en cada imagen. • Conjunto de entrenamiento (Train data set): Conjunto de pares de imágenes y etiquetas que usaremos para entrenar la red neuronal. • Conjunto de validación (Test data set): Conjunto de pares de imágenes y etiquetas que usaremos para validar los pesos de la red neuronal y así obtener el error que se está produciendo con el ajuste de pesos en cada momento del entrenamiento. • Clases: Distintos objetos que queremos detectar en nuestro modelo. E Locura es hacer lo mismo una y otra vez esperando obtener resultados diferentes. - Albert Einstein -
49 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 5.2 Introducción El proceso de aprendizaje o entrenamiento es el proceso por el cual una red neuronal aprende como llevar a cabo una tarea, en nuestro caso, la tarea de detección y clasificación de objetos en una imagen. Como comentamos en el Capítulo 4, el entrenamiento puede ser supervisado o no supervisado. En nuestro caso, la red neuronal llevará a cabo el proceso de aprendizaje supervisado, de forma que le proporcionaremos imágenes de entrada y sus correspondientes salidas (posición de la detección y clasificación). La red neuronal aprenderá de sus errores entre la clase predicha y la real, y, tras el estudio de características propias de la imagen, ajustará sus pesos para reducir ese error al mínimo. Esta diferencia entre la clase predicha y la real es calculada haciendo uso de la Función de Pérdida (Function Error Loss) que veremos más adelante. 5.3 Clases Dado nuestro conjunto de imágenes de señales de velocidad, el primer paso es generar las etiquetas correspondientes. Darknet, el framework usado para entrenar tiny-yolov3, precisa un fichero .txt por cada imagen con una línea por cada uno de los objetos a detectar en la imagen. Cada línea tendrá el siguiente formato: <object-class> <x> <y> <width> <height> Donde x, y, width y height son las posiciones relativas a la imagen, mientras que object-class se refiere a la clase que representa el objeto señalado. En nuestro caso, hemos separado el número de objetos a detectar en 10 clases que se muestran en la Ilustración 37. Ilustración 37: Clases
50 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Se prodece a numerar las clases mostradas en la Ilustración 37 a continuación: 0. Velocidad máxima 20Km/h 1. Velocidad máxima 30Km/h 2. Velocidad máxima 40Km/h 3. Velocidad máxima 50Km/h 4. Velocidad máxima 60Km/h 5. Velocidad máxima 70Km/h 6. Velocidad máxima 80Km/h 7. Velocidad máxima 90Km/h 8. Velocidad máxima 100Km/h 9. Velocidad máxima 120Km/h Las etiquetas de las 4.560 imágenes proporcionadas al modelo se han generado manualmente usando el software LabelImg, cuya interfaz gráfica observamos en la Ilustración 38. Ilustración 38: Software LabelImg 5.4 Ficheros de configuración Una vez tengamos el conjunto de imágenes y etiquetas, descargamos el framework Darknet desde su página oficial [29] y modificamos sus ficheros de configuración para ajustar la red a nuestro caso particular. Partiendo del fichero situado en cfg/tiny-yolov3.cfg, hacemos una copia de este y la renombramos como trafficyolov3-tiny.cfg. Dentro de este fichero, establecemos las variables según la Ilustración 39.
51 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 39: Parámetros de configuración tiny-yoloV3 El parámetro batch, que se refiere al lote de imágenes o número de imágenes que se propagarán por la red neuronal en una iteración durante el entrenamiento, ha sido modificada de 1 a 64. Al elegir un número más pequeño que el número total de imágenes hacemos que el espacio de memoria usado durante el entrenamiento sea menor y que así sea más rápido ya que los pesos se van actualizando con más frecuencia. Por otro lado, cuanto más pequeño es el batch escogido, menor es la precisión de la estimación del gradiente. Por defecto está establecido a 1, pero hemos elegido cambiarlo a 64 porque ese tamaño se comporta mejor con la arquitectura de tiny-yolov3. A continuación modificamos el valor de la variable max_batches por el valor de 2000 multiplicado por el número de clases, que en nuestro caso son 10. Esto es así porque se considera que 2000 iteraciones por clase son necesarias para entrenar la red adecuadamente. Durante el entrenamiento, después que el 80% y el 90% de las iteraciones hayan sido completadas, la tasa de aprendizaje (learning rate) se ajustará, así que la variable steps se ha definido en ‘16000,18000’. La tasa de aprendizaje controla cuánto cambiar el modelo en respuesta al error estimado cada vez que se actualizan los pesos del modelo. Elegir la tasa de aprendizaje es un desafío, ya que un valor demasiado pequeño puede resultar en un proceso de entrenamiento largo que podría atascarse, mientras que un valor demasiado grande puede resultar en aprender un conjunto de pesos demasiado rápido o un proceso de entrenamiento inestable. Por todo esto hemos dejado su valor por defecto. Por otro lado, hemos aumentado la resolución de la red neuronal, en lugar de 416x416, a 608x608, así incrementamos la precisión y permitirá a la red neuronal ser capaz de detectar objetos más pequeños en las imágenes, y, además, se ha añadido el parámetro flip a 0. De esta forma, no se podrá dar la vuelta a las imágenes durante el entrenamiento. Esto se hace normalmente para obtener más variabilidad, pero en nuestro caso daba lugar a problemas, ya que las señales de 60Km/h y 90Km/h pueden ser confundidas. Una vez establecidos los parámetros generales, nos centramos en los parámetros de cada capa, establecidos según la Ilustración 40.
52 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 40: Parámetros capas tiny-yoloV3 En cada una de las tres capas YOLO (estas son las capas de salida), hemos cambiado el número de classes a 10, que es el número de objetos distintos que queremos que nuestra red sea capaz de detectar, como ya hemos mencionado anteriormente. También, en cada capa convolucional anterior a una capa Yolo, hemos modificado el número de filtros de esa capa atendiendo a la ecuación: filters=(classes+5) *3, y, por último, el valor random ha sido establecido a 1 para incrementar la precisión de yolo para entrenarlo en distintas resoluciones, tamaños de imagen. Finalmente, para terminar de configurar el marco Darknet completamente, hemos colocado nuestras imágenes con sus correspondientes etiquetas en la carpeta data/images y data/labels respectivamente. También se ha modificado el fichero Makefile para permitir el uso de GPU a la hora del entrenamiento, además de la creación de los ficheros: data/traffic.names, que contiene una línea por cada una de las clases a detectar, data/traffictrain.txt que contiene la ruta al conjunto de imágenes que se usarán como entrada para el entrenamiento de la red neuronal (conjunto de entrenamiento), data/traffic-test.txt, que contiene la ruta al conjunto de imágenes que usarán para validar el entrenamiento (conjunto de validación) y, por último, cfg/traffic.data, que especifica la localización de los archivos del conjunto de validación y entrenamiento y qué archivo contiene los nombres de las categorías (clases) que queremos detectar. Nuestro marco de trabajo ya estaría preparado para comenzar el entrenamiento de la red. Partiremos del fichero darknet53.conv.74, que es el extractor de características pre-entrenado para YoloV3, esto es, los pesos iniciales de YOLO usados para entrenar datos personalizados. 5.5 Google Colab Para entrenar tiny-yolov3, hemos usado la herramienta Google Colab, accessible a través de cualquier navegador, que nos permite ejecutar código y procesarlo en la nube, además de hacer uso de recursos más potentes. Este servicio gratuito nos da acceso a la Tesla K80 GPU con 12GB de RAM y más de 350GB de almacenamiento. Una vez comenzado el procedimiento, podemos usar estos recursos durante 12 horas seguidas, lo cuál ha sido suficiente para entrenar nuestra red neuronal. Para realizar el entrenamiento y validación, preparamos el entorno de Google Colab tal y como se indica en el Anexo D de este documento. Primero, establecemos el uso de GPU para acelerar el proceso. El entrenamiento de una red neuronal con el uso de CPU es extremandamente lento, por eso hemos usado esta opción. A continuación, se ejecuta el código de la Ilustración 41 para preparar y comenzar el entrenamiento.
53 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 41: Entorno Google Colab En nuestro caso, el entrenamiento se paró al alcanzar unos determinados valores estadísticos presentados en la salida del entrenamiento en Google Colab. 5.6 Estadísiticos Procedemos a definir los estadísticos más importantes con el fin de interpretar el comportamiento de la red durante su entrenamiento: • Verdadero positivo (TP, True Positive): Acierto que se da cuando la red detecta un objeto en la posición y la clase correcta. • Falso positivo (FP, False Positive): Error que se da cuando la red detecta un objeto que no existe en la imagen, o que, sí existe, pero de una clase distinta a la predicha. • Falso negativo (FN, False Negative): Error que se da cuando la red no detecta un objeto que aparece en la imagen. • Intersección sobre la Unión (IoU, Intersection over Union): Mide la precisión con la que nuestra red detectó un determinado objeto. En la Ilustración 42 podemos ver cómo calcular este porcentaje de superposición entre nuestro cuadro delimitador y el objeto real. Depende del umbral establecido, es decir, si se establece un umbral del 50% y el cuadro predicho por la red no cubre al menos el 50% del cuadro real, se considera como Falso Positivo. Ilustración 42: Intersección sobre la Unión
54 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV • Función de pérdida o Loss Function: Es el estadístico más importante para conocer el comportamiento de la red durante su entrenamiento. Como hemos dicho, YOLO predice hasta B cuadros delimitadores por cada celda, pero sólo queremos que uno de ellos sea responsable de predecir cierto objeto, y para ello seleccionamos el cuadro delimitador con el mayor IoU. A partir de aquí, YOLO usa el error de suma cuadrada entre las predicciones y el objeto de verdad para calcular la función de pérdida. Esta función tiene las siguientes partes: o Función de pérdida de clasificación (Classification Loss): Si se detecta un objeto, el error de clasificación de cada celda es el error al cuadrado de las probabilidades de clase condicionales por cada clase. Podemos ver mejor la función en la Ilustración 43: Ilustración 43: Función Pérdida de Clasificación o Función de pérdida de localización (Localization Loss): Mide el error entre la posición y el tamaño del cuadro delimitador y el objeto real: Ilustración 44: Función de Pérdida de Localización o Función de Pérdida de Confianza (Confidence Loss): Simplemente mide la confianza (confident score). Si se detecta un objeto en el cuadro delimitador, la pérdida de confianza sería:
55 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 45: Función de Pérdida de Confianza Si no se detecta ningún objeto sería: Ilustración 46: Función de Pérdida de Confianza (2) De este modo, la función de pérdida total sería la mostrada en la Ilustración 47: Ilustración 47: Función de Pérdida • Promedio de precisión media o Mean Average Precision (mAP): Mide la precisión media para cada clase y realiza un promedio. Recordemos que el entrenamiento de una red neuronal consiste en modificar los pesos de las neuronas de la red para que la función de pérdida sea mínima. Sin embargo,
56 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV debemos de tener en cuenta el sobreajuste de pesos u overfitting, que se produce cuando los pesos se ajustan demasiado al conjunto de entrenamiento, lo que implica tener un mAP muy elevado, pero, al estar sobreajustado y no generalizar correctamente, se tendría un mAP bajo para el conjunto de validación. En la Ilustración 48 se puede observar una parte de la salida del entrenamiento de YOLO. A continuación, detallaremos qué significa. Ilustración 48: Salida Entrenamiento YOLO Esta muestra presenta los siguientes datos de interés: • 19575 indica la iteración o lote de entrenamiento actual. • 0.064533 es la pérdida total. • 0.101819 avg, es la Función de Pérdida (Loss Function), que debe ser lo más bajo posible. Como regla general, una vez que llegue a menos de 0.060730 avg, podemos dejar de entrenar, que es lo que hemos hecho en este caso. • 0.001000 representa la tasa de aprendizaje definida en el fichero de configuración anteriormente visto. • 1.599550 seconds: representa el tiempo en procesar este lote. • Region Avg IOU: 0.927697 es la media de IoU de cada imagen en la región actual. El porcentaje es elevado, 90%, lo que nos indica que el entrenamiento está casi completado. • count: 3 es la cantidad de Verdaderos Positivos en la subdivisión de la imagen actual.
57 6 SERVICIO WEB SPRING Y BASE DE DATOS na vez tenemos tiny-yoloV3 entrenada para la detección y correcta clasificación de señales de tráfico de velocidad que se presentan en carretera, procedemos a explicar el tratamiento de estos datos obtenidos, así como los datos de los usuarios de nuestro sistema. Para ello, se ha desarrollado un servicio web RESTful con Spring Boot y una base de datos MySQL para la persistencia de los datos. En primer lugar, veremos la estructura de la base de datos MySQL creada para después proceder a explicar la estructura y el funcionamiento del servicio web Spring. 6.1 Servidor de base de datos La base de datos diseñada para este proyecto se compone de cinco tablas que se pueden ver en el modelo Entidad- Relación de la Ilustración 49, así como sus correspondientes campos y las relaciones entre ellas. A continuación, se procede a explicar con más detalle cada una de estas tablas: • Tabla “usuarios”: Almacena toda la información de los usuarios registrados a través de la aplicación Android. Está formada por cuatro columnas que son las siguientes: o username: Nombre de usuario de la persona que se registra en la aplicación. Es la clave primaria de la tabla y es de tipo VARCHAR. Es uno de los datos pedidos para iniciar sesión en la aplicación Android. o nombre: Nombre completo del usuario registrado. Es de tipo VARCHAR. o email: Correo electrónico del usuario registrado. Es de tipo VARCHAR. o contraseña: Contraseña introducida por el usuario al registrarse en la aplicación. Es de tipo VARCHAR y se guarda codificada en la base de datos. Se utiliza junto con el username para iniciar sesión en la aplicación. U La imaginación es más importante que el conocimiento. Mientras que el conocimiento es limitado, la imaginación abarca el mundo entero, estimulando el progreso, dando a luz a la evolución -Albert Einstein-
64 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 57: Clase UsuarioController – Servicio Web Spring • Clase SecurityConfig: Clase de configuración para implementar la autenticación y control de acceso de usuarios en nuestro sistema gracias al módulo Spring Security (todos los módulos usados en el desarrollo de este servicio web y cómo añadirlos, está detallado en el Anexo B de este documento). Configuramos nuestro sistema como muestra la Ilustración 58, de forma que no se pueda acceder a nuestros servicios si el usuario no está autenticado, excepto en el caso de registro de usuarios, al que puede acceder cualquiera. Se apoya en la clase “UsuarioService” de donde obtiene los datos de autenticación que deben ser introducidos por el usuario con el fin de poder usar los servicios. Esto lo podemos ver en la Ilustración 59. Se sobreescribe el método que obtiene la información de autenticación. En este caso si un usuario introduce un “username” y “contraseña” existente en la base de datos “usuarios”, podrá autenticarse y acceder al servicio.
65 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 58: Clase SecurityConfig – Servicio Web Spring Ilustración 59: Autenticación en Clase UsuarioService • Clase SignController: Controlador que se encarga de manejar las peticiones correspondientes a la ruta /signs. Se han creado dos controladores separados para diferenciar el manejo de los usuarios con el manejo de las señales de tráfico. o public String saveDetection: Método que se encarga de guardar tanto en la tabla “global_señales” como en la tabla “usuario_señales” las distintas señales de tráfico detectadas por el usuario en la aplicación Android. En “usuario_señales” se registra una señal si no hay una ya registrada en un radio de menos de un metro o si las señales que ya están registradas tienen las dimensiones más pequeñas, en cuyo caso se borran las que ya están registradas y se guarda la nueva. Todo esto se hace entre las señales detectadas por un mismo usuario. En la tabla “global_señales” se procede de la misma forma para el registro de una señal, pero se tienen en cuenta las señales de todos los usuarios. o public List<TrafficSign> getSeñales: Método que devuelve una lista con todas las señales registradas en la tabla “usuario_señales” cuya columna “username” coincida con el nombre
66 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV de usuario pasado como parámetro. o public List<GlobalTrafficSign> getGlobalSeñales: Método que devuelve una lista con todas las señales registradas en la tabla “global_señales”. Se puede observa la clase “SignController” en la Ilustración 60: Ilustración 60: Clase SignController – Servicio Web Spring 6.3 API REST En este apartado mostraremos la API REST, esto es, los distintos URI y métodos implementados para poder acceder a las distintas funciones que proporciona nuestro servicio web. En el marco del proyecto todas las peticiones realizadas al servicio web mediante su API son mediante peticiones HTTP con cuerpo con formato JSON. Dividiermos las peticiones en dos grupos, uno para las peticiones relativas a usuarios y otro para las peticiones relativas a las señales de tráfico. 6.3.1 Consultas de Usuarios Método URI Parámetros Descripción GET /usuarios/listar No aplica Devuelve una lista con todos los usuarios almacenados en la tabla “usuarios”. GET /usuarios/login?[parámetro]=[valor] “username”=Nombre de usuario. Autenticación de usuario. Las creedenciales se envían codificadas en la cabecera “Authorization” de la petición. POST /usuarios/registrar {“username”:”test”, “nombre”:”test”, “email”:” test”,”contraseña”:”test”} Registro de un nuevo usuario. Se insertan los datos del nuevo usuario en la tabla “usuarios”. POST /usuario/cerrarsesion No aplica Elimina la sesión abierta del usuario y las cookies de la tabla. Elimina la sesión de la tabla “spring_session” y “spring_session_attributes”. Tabla 1: API REST – Consulta usuarios
67 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 6.3.2 Consultas de Señales Método URI Parámetros Descripción GET /signs/listar/{username} “username” es el nombre de usuario del usuario actual. Devuelve una lista con todas las señales de la tabla “usuario_señales” cuya columna “username” coincide con el parámetro pasado en la petición. GET /signs/listarglobal No aplica. Devuelve una lista con todas las señales de tráfico almacenadas en la tabla “global_señales”. POST /signs/deteccion { “id”:”test” “longitud”:”test” “latitud”:”test” “ancho”:”test” “alto”:”test” “clase”:”test” “username”:”test” } Almacena la señal de tráfico detectada en “usuario_señales” y “global_señales” si no hay ninguna otra de mayores dimensiones en la misma posición. Tabla 2: API REST – Consultas señales 6.4 Despliegue en AWS Con el fin de proporcionar acceso a nuestro servicio web desde cualquier punto y momento, hemos optado por hacer uso de los servicios en la nube. Para ello hemos escogido la plataforma AWS (Amazon Web Services), que, gracias a su plan gratuito de 12 meses, se ha podido desplegar nuestro servidor en la nube sin coste alguno, lo cual lo convierte en la mejor opción para este Trabajo de Fin de Grado. Los pasos para el despliegue de este servicio Spring y la base de datos en la nube están detallados en el Anexo D de este documento. A continuación, se detallan los dos servicios proporcionados por AWS usados en este proyecto: AWS Elastic Beanstalk y Amazon RDS. 6.4.1 AWS Elastic Beanstalk AWS Elastic Beanstalk es un servicio fácil de utilizar para implementar y escalar servicios y aplicaciones web desarrollados con Java, .NET, PHP, Node.js, Python, Ruby, Go y Docker en servidores familiares como Apache, Nginx, Passenger e IIS. Para usar este servicio, sólo hemos necesitado cargar nuestro código y Elastic Beanstalk se encarga de administrar de manera automática la implementación, desde el aprovisionamiento de la capacidad, el equilibrio de carga y el escalado automático hasta la monitorización del estado de la aplicación. Al mismo tiempo, tendrá el control absoluto de los recursos de AWS que alimentan su aplicación y podrá acceder a los recursos subyacentes cuando quiera. En la Ilustración 61 podemos ver una imagen de la consola o interfaz gráfica de AWS Elastic Beanstalk:
68 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 61: Interfaz AWS Elastic Beanstalk 6.4.2 Amazon RDS Amazon Relational Database Service (Amazon RDS) es un servicio sencillo de configurar, utilizar y escalar una base de datos relacional en la nube. Amazon RDS está disponible para varios tipos de instancias de base de datos (optimizadas para memoria, rendimiento u operaciones de E/S) y le proporciona seis motores de bases de datos conocidos entre los que elegir, incluidos Amazon Aurora, PostgreSQL, MySQL, MariaDB, Oracle Database y SQL Server. En la Ilustración 62 podemos ver una imagen de la consola o interfaz gráfica de Amazon RDS: Ilustración 62: Interfaz Amazon RDS
69 7 APLICACIÓN ANDROID ICODRIVER n este capítulo se detallará el diseño y la implementación de la Aplicación Android iCodriver. A través de ella, el usuario podrá acceder a todas las funcionalidades que ofrece nuestro sistema. Para dar una idea de la solución final que se ha adoptado, primero se pasará a mencionar las distintas partes que componen nuestro sistema completo y la interacción entre las mismas. En total consta de 3 partes, las cuales son el servicio web RESTful desarrollado con Spring Boot y Eclipse, la base de datos MySQL administrada mediante MySQL Workbench, ambos mencionados anteriormente, y la aplicación móvil construida en Android. La arquitectura de este sistema sigue un patrón Modelo-Vista- Controlador (MVC). Este patrón es utilizado para separar los datos de una aplicación, la interfaz de usuario y la lógica de control, así separándolo en modelo, vista y controlador. En la Ilustración 63, se presenta mejor este tipo de arquitectura. Ilustración 63: Patrón MVC E La ciencia se compone de errores, que, a su vez, son los pasos hacia la verdad. - Julio Verne -
70 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV En el Modelo nos encontramos una representación de los datos que maneja el sistema, su lógica de negocio, y sus mecanismos de persistencia. La Vista, o también conocida como interfaz de usuario, contiene la información que es enviada al cliente y los mecanismos para interactuar con él, en nuestro caso, la vista se presenta en la aplicación Android desarrollada con Android Studio, que se tratará en este capítulo. Por último, el Controlador, actúa como un intermediario entre el Modelo y la Vista, gestionando así el flujo de información entre ellos y las transformaciones para adaptar los datos a las necesidades de cada uno. Spring Web MVC [31] proporciona una arquitectura Modelo-Vista-Controlador, por lo que nos facilita los distintos componentes y un acoplamiento sencillo y flexible entre ellos. A continuación, presentamos una serie de diagramas de secuencia para aclarar el funcionamiento y las interacciones que se darán entre las distintas partes de nuestro sistema. El primer diagrama de secuencia mostrado en la Ilustración 64, muestra el registro de nuevos usuarios al sistema. Ilustración 64: Diagrama de Secuencia – Registro A continuación, en la Ilustración 65, se puede observar el diagrama de secuencia de inicio de sesión de un usuario ya registrado en el sistema.
71 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 65: Diagrama de Secuencia – Inicio de Sesión En la Ilustración 66, se presenta el diagrama de secuencia de cierre de sesión de un usuario que previamente ha iniciado sesión. Ilustración 66: Diagrama de Secuencia – Cierre de Sesión
72 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV En el siguiente diagrama de secuencia de la Ilustración 67, se muestra el registro de señales de tráfico detectadas mediante el uso de la aplicación Android en la base de datos MySQL. Se observa la lógica y selección de las señales a registrar tras como se ha explicado en capítulos anteriores: Sólo puede haber una señal registrada en la misma posición, y esta será de todas la de mayores dimensiones. Ilustración 67: Diagrama de Secuencia – Registro Detección
73 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Por último, en la Ilustración 68, se presenta el diagrama de secuencia de la sincronización entre la base de datos SQLite y la de MySQL. El almacenamiento de las señales de tráfico en MySQL se hace con la misma lógica que en el diagrama anterior, como se puede observar. Ilustración 68: Diagrama de Secuencia – Sincronización Nos centraremos ahora en el funcionamiento de la aplicación Android. En la Ilustración 69, podemos ver un diagrama de casos de uso en el que se especifican todas las funcionalidades a las que el usuario puede acceder a través de iCodriver:
80 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV parámetros pasados se describen en Tabla 5. Ilustración 82: Código DetectionActivity (4) bboxes Conjunto de cuadros delimitadores a los que aplicar NMS. scores Conjunto de confianzas/puntuaciones correspondientes. score_threshold Umbral usado para filtrar los cuadros delimitadores por puntuación. nms_threshold Umbral usado en NMS. indices Los índices guardados de los cuadros delimitadores (bboxes) después de NMS. Tabla 5: Parámetros método NMSBoxes Por último, para completar el proceso de detección, dibujamos los cuadros resultantes en la imagen, así como la clase final detectada y la confianza final, tal como vemos en la Ilustración 83. Ilustración 83: Código DetectionActivity (5)
81 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV En esta clase, además de llevar a cabo la tarea de detección ya detallada, se registran estas detecciones en la base de datos, de modo que para cada detección, se comprueba la conexión de red, y si es posible contactar con el servidor web Spring visto en el Capítulo 6, se realiza la petición al mismo para insertar los datos de las señales de tráficos detectadas, su clase, dimensiones del cuadro delimitador (ancho y alto), el nombre de usuario y la localización (latitud y longitud) captada por los sensores, en este caso el GPS del dispositivo móvil. Si la conexión con el servicio web no es posible, se introducen estos mismos datos provisionalmente en la base de datos local SQLite. Gracias a la función de GPS también, se mide la velocidad en cada momento y se presenta por pantalla, dando avisos si esta supera la velocidad máxima de la señal detectada. • MapsActivity (Ilustración 84): Esta clase muestra un mapa con las mejores detecciones hechas por todos los usuarios en su posición correspondiente en el mapa y las mejores detecciones hechas por el mismo usuario a través de un botón que cambia entre estos dos estados. Además implementa una selección de búsqueda donde se muestran solo las señales detectadas en la zona/ciudad introducida. Para obtener estos mapas basados en datos de Google Maps a la aplicación, se ha usado Maps SDK for Android [21], servicio de Google Platform. Ilustración 84: Clase MapsActivity – Android Studio Además, esta clase da acceso también a la navegación GPS. A partir de un origen y destino introducido por el usuario, dibujará la ruta en el mapa e irá indicando en cada momento la velocidad y las señales de tráfico registradas previamente que el usuario va encontrando a lo largo del recorrido, así como avisos si se supera la velocidad máxima permitida. Para obtener estos mapas se ha usado también Maps SDK for Android, y para obtener las rutas entre dos puntos se ha usado la Directions API [22], un servicio de Google Platform también que calcula direcciones entre ubicaciones mediante una solicitud HTTP. Para almacenar las respuestas a esta solicitud, debemos instanciar un objeto de tipo “DirectionResults”, y otro de tipo “RouteDecode”, como se observa en Ilustración 85, que contendrá el método de decodificación para poder crear una polilínea (polyline) que representará el recorrido. Una polilínea en el context de Google Maps, es una lista de puntos, donde se dibujan segmentos de línea entre puntos consecutivos. La creación de esta polilínea se observa en la Ilustración 86.
82 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 85: Código MapsActivity (1) Ilustración 86: Código MapsActivity (2) Clases para la conexión con la base de datos SQLite SQLite es un sistema de bases de datos que se ajusta perfectamente a las aplicaciones móviles. Este sólo requiere un fichero para almacenar los datos, ya que la lógica de funcionamiento se debe implementar en la plataforma que quiera usar estos datos, en este caso Android, cuyo SDK posee soporte completo para SQLite. A continuación, veremos las distintas clases que usa Android para la comunicación con SQLite, así como para la sincronización entre esta base de datos y la base de datos de MySQL.
83 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV • SyncFragment (Ilustración 87): Carga una lista con todas las señales de tráfico almacenadas en la base de datos local SQLite con su fecha y hora de detección. Además cuenta con la funcionalidad de refrescar, con lo que se vuelve a cargar la lista por si se han producido cambios. Ilustración 87: Clase SyncFragment – Android Studio • SyncAdapter: Esta clase sirve como adaptador de la vista de la clase anterior. • ConexionSQLiteHelper (Ilustración 88): En esta clase se crea la tabla “usuario_señales” en la base de datos SQLite, donde se guardarán provisionalmente los datos de las señales de tráfico detectadas mediante el uso de la aplicación en el caso de que no haya conexión a la red o imposibilidad de conectar con el servicio web. Ilustración 88: Clase ConexionSQLiteHelper – Android Studio • SQLUtils (Ilustración 89): Contiene todas las cadenas relativas a la base de datos SQLite, esto es, nombre de la base de datos, nombre de las tablas, nombre de los campos y sentencias SQL usadas para insertar o consultar los datos de la misma. Ilustración 89: Clase SQLUtils – Android Studio
84 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV • NetworkMonitor (Ilustración 90): Clase que implementa la interfaz BroadcastReceiver, cuyo método onReceive, es llamado cada vez que se produce un cambio en el estado de conexión a la red, esto es, si se pierde la conexión, si vuelve la conexión, si pasamos de usar datos móviles a usar conexión Wi-fi y viceversa. De este modo, sabremos cuando el dispositivo móvil vuelve a tener conexión con el servidor web, para consultar si hay alguna señal en la base de datos local SQLite que debamos insertar en la base de datos MySQL. Una vez esta inserción se ha hecho correctamente, borramos los datos ya sincronizados de SQLite. Ilustración 90: Clase NetworkMonitor – Android Studio En nuestro caso, hemos registrado dinámicamente una instancia de esta clase en “MainActivity”, “DetectionActivity” y “SyncFragment” con el método registerReceiver, como vemos en la Ilustración 91. Ilustración 91: Registro NetworkMonitor 7.2 Ficheros de configuración Los ficheros de configuración que se usan en la Aplicación Android son: • AndroidManifest.xml Todos los proyectos Android deben tener un archivo “AndroidManifest.xml” situado en la raíz de la fuente del proyecto. Describe información esencial de la aplicación y, entre otras cosas, debe declarar: nombre del paquete de la aplicación, componentes de la aplicación, esto es, actividades, servicios, receptores de emisiones y proveedores de contenido, permisos que necesita la aplicación para acceder a las partes protegidas del sistema o a otras aplicaciones, funciones de hardware y software que requiere la aplicación. Este fichero, al usar Android Studio, se generó automáticamente, y la mayoría de los elementos se fueron agregando a medida que se compila la aplicación. En la Ilustración 92, podemos ver las subclases de Activity declaradas utilizando el componente de aplicación <activity>. Si una subclase no se declara en este fichero de configuración, el sistema no puede inciarlo. El nombre de la subclase se debe indicar con el atributo “name”. Además, para la primera actividad que se lanza al iniciar la aplicación, se han indicado dos tipos de intent, “Android.intent.action.MAIN”, que indica que esa actividad es el punto de entrada de la aplicación, al iniciarse la aplicación se crea esta actividad, y “android.intent.category.LAUNCHER”, que indica que la actividad marcada como punto de entrada debe aparecer en el lanzador de la aplicación.
85 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 92: Archivo AndroidManifest.xml En la Ilustración 93, podemos ver la declaración de los permisos que necesita la aplicación, entre ellos: permiso para el uso de la cámara del dispositivo, permiso para acceder a la ubicación del dispositivo, permiso para conectarse a la red y al estado de la misma, y permiso para leer y escribir en la memoria del dispositivo. Ilustración 93: Permisos declarados en AndroidManifest.xml Android usa Gradle como herramienta que permite la automatización de compilación, además de crear y empaquetar tu aplicación. Se utilizan dos archivos de compilación “build.gradle”, ambos ubicados en el directorio raíz del proyecto. Estos son: • build.gradle (Project: iCodriver): En este fichero se añaden opciones de configuración que serán comunes a todos los módulos del proyecto. Se puede ver en la Ilustración 94.
86 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 94: Fichero build.gradle (Project: iCodriver) • build.gradle (Module: App): En este fichero de configuración de nivel superior, se configuran los módulos específicos. En la Ilustración 95, se pueden ver los distintos módulos o dependencias. Ilustración 95: Fichero build.gradle (Module: App) • AndroidManifest.xml (OpenCV): Para añadir la librería de OpenCV, hemos importado su módulo para Android descargado desde la página official [32]. Este módulo, posee su propio manifiesto, el cuál podemos ver en la Ilustración 96, donde se declara entre otras cosas, el paquete y la versión utilizada de OpenCV.
87 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 96: AndroidManifest.xml para OpenCV 7.3 Interfaz de usuario En este apartado detallaremos la interfaz de usuario de la aplicación Android, esto es, cada una de las pantallas por las que el usuario navegará en su interacción con la aplicación y sus funcionalidades. Pantalla de Bienvenida: La pantalla de bienvenida o Splash Screen es la primera pantalla visible para el usuario cuando se inicia la aplicación. Dura dos segundos y cambia a la siguiente pantalla. Muestra el icono de la aplicación iCodriver como se puede ver en la Ilustración 97. La siguiente pantalla a la que se accede después de estos dos segundos será la pantalla principal o la pantalla de inicio de sesión, dependiendo de si el usuario de la aplicación ha iniciado sesión ya anteriormente o no, respectivamente. Ilustración 97: Pantalla de Bienvenida
88 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Pantalla de Inicio de Sesión: La pantalla de Inicio de Sesión se muestra en la Ilustración 98, en ella se introducen las credenciales del usuario para autenticarse y da acceso al resto de pantallas de la aplicación. Permite: • Rellenar los campos de usuario y contraseña y pulsar el botón INICIAR SESIÓN para iniciar sesión con un usuario ya registrado en el sistema. Si las creedenciales introducidas son correctas, se accederá a la pantalla principal. • Pulsar el texto “¿Aún no estás registrado? REGISTRATE” para acceder a la pantalla de Registro. Pantalla de Registro: La pantalla de registro se puede ver en la Ilustración 99, donde se permite introducir los datos para registrar un nuevo usuario en la aplicación. Se deben rellenar todos los campos: Nombre completo, username, email y contraseña. Además hay un campo “Repite contraseña” que debe coincidir con el campo “Contraseña” para que se produzca el nuevo registro. Una vez rellenados todos los campos se pulsa el botón “REGISTRAR” para insertar el nuevo usuario en la base de datos MySQL y volver a la pantalla de Inicio de Sesión donde se debe introducir las credenciales del usuario que se acaba de crear. Ilustración 98: Pantalla de Inicio de Sesión Ilustración 99: Pantalla de Registro Pantalla Principal:
89 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV En esta pantalla se podrá navegar a tres distintas ventanas que nos dan acceso a tres funcionalidades distintas de la aplicación. Si es la primera vez que accedemos a la aplicación, se solicitará permitir el acceso a la cámara y la ubicación del dispositivo, como se puede observar en la Ilustración 100. En la Ilustración 101, se puede ver que para su diseño hemos usado el elemento de interfaz Navigation Drawer, que consiste en un menú deslizante desde la izquierda que se despliega a través de un botón o con un gesto de desplazamiento. Ilustración 100: Pantalla Principal – Permisos Ilustración 101: Pantalla Principal – Menú En este menú se muestra el icono de la aplicación, el nombre completo y nombre de usuario del usuario autenticado y presentan tres opciones: • Detección: En esta ventana se presenta la primera funcionalidad de la aplicación, como se puede ver en la Ilustración 102. Pulsando en el botón que aparece se accede a dicha funcionalidad, esto es, a la pantalla de detección. • Mapas y Navegación: En esta ventana se presenta otra funcionalidad de la aplicación, como se observa en la Ilustración 103. Pulsando el botón que aparece se accede a dicha funcionalidad, esto es, a la pantalla de visualización en mapas y navegación. • Sincronización: En esta ventana que se puede observar en las Ilustraciones 104 y 105, se presenta una lista con los datos provisionalmente guardados en la base de datos SQLite de las señales de tráfico detectadas con la hora de su detección. Además, en la esquina inferior derecha se presenta un botón el cuál sirve para refrescar la lista y ver qué detecciones se han ido guardando en la base de datos MySQL y a la vez borrando de SQLite.
96 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV De cara al futuro también, además de ser capaz de recopilar toda esta información durante la conducción, esta podría ser integrada con otras tecnologías de forma que el vehículo fuese capaz de dar una respuesta autónoma, es decir, que sea capaz de reaccionar para frenar, acelerar, entre otras cosas. Por último, en cuanto a mejoras técnicas de la aplicación y el servicio web, un punto muy importante es dotar de seguridad al sistema. Aunque se han desarrollado mecanismos de autenticación mediante el módulo de Spring Security, las peticiones al servidor deberían estar cifradas para así proteger la confidencialidad de los datos. De esta forma se evitarían muchos problemas, desde accesos no permitidos a la aplicación hasta adulterar los datos para conseguir fines maliciosos.
97 ANEXO A: INSTALACIÓN Y CONFIGURACIÓN DE ANDROID STUDIO En este primer anexo se muestra cómo instalar y configurar Android Studio, cómo actualizarlo a versiones más recientes y cómo integrar la librería OpenCV dentro de este IDE. A.1 Instalación de Android Studio 1. Accedemos a la página oficial de descargas de Android Studio [35] y descargamos el fichero ejecutable de la versión. 2. Lanzamos el fichero ejecutable de la Ilustración 115 y aparece el instalador de Android Studio de la Ilustración 116. Ilustración 115: Fichero ejecutable Android Studio Ilustración 116: Instalador Android Studio 3. Para la instalación: a. Seleccionamos “Android Virtual Device” como componente a instalar y pulsamos el botón “Next” (Ilustración 117).
98 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 117: Instalación Android Studio – Elegir componentes b. Seleccionamos el directorio donde se instalará Android Studio (Ilustración 118). Ilustración 118: Instalación Android Studio – Localización
99 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV c. Seleccionamos la carpeta de menú de inicio y pulsamos “Install” (Ilustración 119). Ilustración 119: Instalación Android Studio – Elegir carpeta del Menú de Inicio d. Esperamos el tiempo que tarde la instalación y una vez completada, nos aparecerá una pantalla como la de la Ilustración 120, dándonos la opción de arrancar Android Studio. Ilustración 120: Instalación Android Studio completada
100 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV A.2 Configuración de Android Studio 1. Tras la correcta instalación, iniciamos Android Studio y se nos mostrará una pantalla como la de Ilustración 121 para elegir el tipo de configuración, en nuestro caso “Standard”. Ilustración 121: Configuración Android Studio – Selección tipo configuración 2. A continuación, seleccionamos el tema y pulsamos el botón “Next” de la Ilustración 122. Ilustración 122: Configuración Android Studio – Selección tema
101 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 3. Por último, se cargarán todos los componentes seleccionados en la configuración y finalmente aparecerá una pantalla como la de la Ilustración 123, donde podremos comenzar un nuevo proyecto. Ilustración 123: Página de Bienvenida de Android Studio A.3 Actualización de Android Studio En nuestro caso, ya teníamos Android Studio instalado y configurado de años anteriores, por lo que simplemente se ha procedido a actualizer este IDE a una versión más reciente. Para ello: 1. Una vez iniciado Android Studio seleccionamos Help → Check for Updates (Ilustración 124). Ilustración 124: Actualización Android Studio – Buscar actualizaciones
102 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 2. A continuación, Android Studio buscará la última versión y nos aparecerá una pantalla como la de la Ilustración 125, donde se puede observar la última actualización encontrada y las mejoras que presenta. Pulsaremos en “Update and Restart”. Ilustración 125: Actualización Android Studio – Actualización 3. Después de esperar el tiempo de la actualización, tendremos la última versión de Android Studio lista para usar (Ilustración 126). Ilustración 126: Pantalla de Bienvenida Android Studio v4.0
103 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV A.4 Integración de OpenCV en Android Studio 1. Accedemos a la página oficial de descargas de OpenCV [32] y seleccionamos la versión de OpenCV para Android que coincida con la versión de Android Studio que estamos usando, que en nuestro caso es 4.0. (Ilustración 127). Ilustración 127: Selección Descarga OpenCV 2. Una vez descargado el archivo, lo descomprimimos (Ilustración 128). Ilustración 128: Carpeta OpenCV descomprimida 3. A continuación, abrimos nuestro proyecto en Android Studio y seleccionamos File → New → Import Module y seleccionamos la carpeta “java”, que se encuentra dentro de la carpeta “sdk”, que a su vez se encuentra dentro de la carpeta “OpenCV-android-sdk”, que es la carpeta que hemos descargado y descomprimido (Ilustración 129).
104 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 129: Importar módulo OpenCV en Android Studio 4. Una vez que Android Studio ha añadido el módulo y ha construido y sincronizado el proyecto sin errores, seleccionamos File → Project Structure y navegamos hacia el apartado de “Dependencies”, donde debemos añadir OpenCV, tal como se indica en la Ilustración 130, seleccionando la opción “Module Dependency”. Ilustración 130: Añadir dependencia OpenCV en Android Studio
105 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 5. Una vez seleccionada esta opción, nos aparecerá una pantalla como la de la Ilustración 131, donde se debe seleccionar la librería de OpenCV. Pulsaremos entonces el botón “Apply” y a continuación el botón “Ok”. Nos aparecerá a partir de ahora, en la ventana de herramientas en la izquierda, la carpeta “java”, además de las otras dos que ya estaban (Ilustración 132). Ilustración 131: Añadir dependencia OpenCV en Android Studio (2) Ilustración 132: Ventana de herramientas de Android Studio 6. Una vez añadida la dependencia, en la ventana de herramientas, hacemos click derecho en la carpeta “app” y seleccionamos New → Folder → JNI Folder y cambiamos la localización de la nueva carpeta a crear por la que se ve en la Ilustración 133.
112 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 145: Dependencia módulo Spring Security Módulo Spring Session: Spring Session [39] proporciona una API e implementaciones para administrar la información de la sesión de un usuario. Spring Session nos ha proporcionado identificadores de sesión en las cabeceras de las llamadas REST, de esta forma, cada vez que debamos acceder a un recurso protegido del servidor, el usuario puede usar este identificador de forma transparente, en lugar de tener que autenticarse con su usuario y contraseña en cada paso. Debe ser añadido como dependencia como se observa en la Ilustración 146, dentro del archivo pom.xml. Ilustración 146: Dependencia módulo Spring Session MySQL Connector Para enlazar el servicio web con nuestro sistema de gestión de bases de datos elegido, MySQL [40]. Debe ser añadido como dependencia como se observa en la Ilustración 147, dentro del archivo pom.xml. Ilustración 147: Dependencia MySQL Connector Además, para establecer la conexión con la base de datos MySQL debemos añadir en el archivo application.properties de nuestro proyecto lo indicado en la Ilustración 148: Ilustración 148: Fichero application.properties
113 ANEXO C: INSTALACIÓN MYSQL WORKBECH Y CONFIGURACIÓN DE LA BASE DE DATOS C.1 Instalación MySQL Workbench 1. Accedemos a la página oficial de descargas de MySQL [41] y descargamos el fichero ejecutable de la versión. 2. Lanzamos el fichero ejecutable de la Ilustración 149 y aparecerá el instalador de MySQL Workbench. Ilustración 149: Ejecutable MySQL Workbench 3. Seleccionamos la opción “Custom” en el instalador de MySQL (Ilustración 150). Ilustración 150: Instalador MySQL – Selección de un tipo de configuración 4. A continuación, seleccionamos los productos y características que queremos instalar. En nuestro caso, seleccionaremos MySQL Workbench y el Servidor de MySQL (Ilustración 151).
114 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 151: Instalador MySQL – Selección de productos y características 5. Una vez repasados los productos a instalar, llegaremos a la pantalla mostrada en la Ilustración 152, donde debemos pulsar “Execute” para comenzar con la instalación. Ilustración 152: Instalador MySQL – Instalación
115 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV C.1 Configuración Base de Datos 1. Lanzamos MySQL Workbench. Cuando abrimos MySQL Workbench por primera vez después de ser instalado, se crea una instancia local (Ilustración 153). Ilustración 153: Pantalla de Bienvenida MySQL Workbench 2. Dejamos esta conexión local con sus valores por defecto (Ilustración 154). Ilustración 154: Parámetros conexión local MySQL Workbench 3. Abrimos la conexión local y creamos la base de datos a partir del fichero creatablas.sql, cuyo contenido se muestra en la Ilustración 155 y 156.
116 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 155: Fichero creatablas.sql Ilustración 156: Fichero creatablas.sql (Continuación)
117 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 4. A partir de aquí, podemos ver la base de datos creada, así como sus tablas y columnas, además podremos modificarla y gestionarla (Ilustración 157). Ilustración 157: MySQL Workbench – Interfaz gráfica
118 ANEXO D: DESPLIEGUE SERVICIO WEB Y BASE DE DATOS EN AWS En este Anexo detallamos el despliegue del servicio web Spring desarrollado y la base de datos MySQL en la nube de Amazon Web Services. D.1 Base de Datos MySQL en AWS. 1. Accedemos a la consola de AWS [42] y en el buscador de servicios introducimos “RDS” (Ilustración 158). Ilustración 158: Consola AWS – Amazon RDS 2. Una vez accedemos al servicio Amazon RDS (Servicio de bases de datos relacionales administrado), pulsamos la opción “Databases” en el panel de la izquierda de la Ilustración 159. Como vemos, no hay ninguna base de datos creada todavía, para ello pulsamos “Create database”. Ilustración 159: Amazon RDS – Databases 3. A continuación, seleccionamos las distintas opciones que nos aparecerán para la configuración de nuestra base de datos. En la Ilustración 160, se observa como seleccionamos MySQL, en la Ilustración 161, seleccionamos la opción “Free tier” para poder usar RDS de manera gratuita. Y por último, en la Ilustración 162, se elije un nombre para la base de datos, un usuario y una contraseña.
119 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV Ilustración 160: Amazon RDS – Engine options Ilustración 161: Amazon RDS – Templates Ilustración 162: Amazon RDS – Configuración
120 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 4. En el apartado “Connectivity” desplegamos la opción “Additional connectivity configuration” y seleccionamos “Yes” en el apartado “Public Access”. El resto se deja como está (Ilustración 163). Ilustración 163: Amazon RDS – Conectividad 5. Para terminar con la creación, seleccionamos el desplegable “Additional configuration” y volvemos a escribir el nombre de la base de datos en “Initial database name” (Ilustración 164). Este nombre se debe recordar posteriormente. El resto de campos los dejamos como están y pulsamos finalmente el botón “Create database” al final de la página. Ilustración 164: Amazon RDS – Configuración adicional
121 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 6. La creación de la base de datos tardará unos minutos (Ilustración 165). Una vez este creada, el campo “Status” aparecerá como “Available” en verde. Ilustración 165: Amazon RDS – Creando base de datos 7. Una vez creada, seleccionamos el “DB identifier” para ver los detalles y en el apartado “Connectivity & port” copiamos el “Endpoint” y el “Port” (Ilustración 166). Ilustración 166: Amazon RDS – Conectividad y Seguridad 8. Modificamos el archive application.properties de nuestro servicio web en Eclipse, añadiendo el “Endpoint”, el “Port” y el nombre de la base de datos que introdujimos en el campo “Initial database name” como se muestra en la Ilustración 167, así como el usuario y contraseña que introdujimos también anteriormente. También establecemos como puerto del servidor el 5000, para que no haya problemas con la pasarela. Ilustración 167: Archivo application.properties
128 ANEXO E: PREPARACIÓN DEL ENTORNO DE GOOGLE COLAB En este anexo se detalla cómo preparar el entorno de Google Colab antes de comenzar con el entrenamiento de la red neuronal YOLO. 1. Accedemos a la página oficial de Google Colab [20] a través de nuestro navegador y seleccionamos Archivo → Nuevo Cuaderno (Ilustración 180). Ilustración 180: Página Principal Google Colaboratory 2. A continuación, en el nuevo entorno de ejecución creado o cuaderno, seleccionamos ->Configuración del Cuaderno y elegimos como acelerador por hardware “GPU” y seleccionamos “Guardar” (Ilustración 181). Ilustración 181: Google Colab – Configuración del Cuaderno
129 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 3. Enlazamos el cuaderno con una cuenta de Google Drive para poder guardar los pesos que vamos obteniendo del entrenamiento de Yolo, ya que el entorno de Google Colab se reiniciará en 12h y perderemos todo el trabajo hecho. Para esto, escribimos en una celda de código la Ilustración 182 y ejecutamos dicha celda a través del botón de reproducir situado a la izquierda del código o usando la combinación de teclas “Comando/Ctrl + Intro”. Ilustración 182: Google Colab – Celda de código para enlazar con Google Drive 4. Una vez enlazada nuestra cuenta de Google Drive, podemos acceder a todos los archivos dentro de esta, que estarán ubicados en el directorio /content/drive dentro del entorno de ejecución. En la ventana de la izquierda podemos ver estos directorios en el apartado “Archivos” (Ilustración 183). Ilustración 183: Google Colab – Ventana Archivos 5. A continuación, subimos la carpeta darknet.zip a nuestra cuenta de Google Drive enlazada y la descomprimos ejecutando la celda de código de la Ilustración 184. Ilustración 184: Google Colab – Celda de código para descomprimir Darknet 6. Compilamos Darknet a través del comando make y le damos permisos de ejecución. Para ello ejecutamos la celda de código de la Ilustración 185. Ilustración 185: Google Colab – Celda de código para compilar Darknet
130 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV 7. Creamos un enlace simbólico a la carpeta “Backup” que se encuentra dentro de nuestro Google Drive para guardar ahí los pesos que se vayan generando del entrenamiento de Yolo. Para ello ejecutamos la celda de código de la Ilustración 186. Ilustración 186: Google Colab – Celda de código para crear enlace simbólico a “Backup” 8. Ya estaría preparado el entorno de Google Colab y podríamos comenzar a entrenar la red neuronal tinyyolov3 ejecutando la celda de código de la Ilustración . Ilustración 187: Google Colab – Celda de código para entrenamiento
131 REFERENCIAS [1] Dirección General de Tráfico, «Anuario Estadístico de Accidentes 2018», [En línea] Disponible: http://www.dgt.es/es/seguridad-vial/estadisticas-e-indicadores/publicaciones/anuario-estadistico- accidentes/ [2] Dirección General de Tráfico, «La velocidad excesiva o inadecuada sigue siendo una de las principales causas de los accidentes de tráfico» Notas de prensa (01/04/2019), [En línea] Disponible: http://www.dgt.es/es/prensa/notas-de-prensa/2019/La-velocidad-excesiva-o-inadecuada-sigue-siendo- una-de-las-principales-causas-de-los-accidentes-de-trafico.shtml [3] S. Mellado Contigioso, Aplicación Android y Servicio Web Spring para la monitorización de datos obtenidos en un vehículo haciendo uso de la plataforma FIWARE, Sevilla: Universidad de Sevilla, 2020 [4] A. Carmona Palomares, Securización mediante Keyrock y Wilma de Aplicación y servicios Web para Vehículo Inteligente, Sevilla: Universidad de Sevilla, 2020 [5] L. Martínez Ruíz, Aplicación web con Freeboard para la recolección de datos de sensores de acelerómetro y gps mediante Orion Context Broker de Fiware, Sevilla: Universidad de Sevilla, 2018 [6] P. Bermejo Pérez, Aplicación y Servicio web para la gestión de información de sensores usando Fiware y Spring, Sevilla: Universidad de Sevilla, 2019 [7] Spring Tool Suite 4, «Spring Tool Suite 4» [En línea] Disponible: https://spring.io/tools [8] Eclipse, «Desktop IDEs», [En línea] Disponible: https://www.eclipse.org/ide/ [9] Android Studio, «Introducción a Android Studio», [En línea] Disponible: https://developer.android.com/studio/intro [10] MySQL Workbench, «MySQL Workbench», [En línea] Disponible: https://www.mysql.com/products/workbench/ [11] LabelImg, «LabelImg», [En línea] Disponible: https://github.com/tzutalin/labelImg [12] Darknet, «Darknet: Open Source Neural Networks in C», [En línea] Disponible: https://pjreddie.com/darknet/ [13] Spring, «Why Spring?», [En línea] Disponible: https://spring.io/why-spring [14] JPA, «Java Persistence API», [En línea] Disponible: https://www.oracle.com/java/technologies/persistence-jsp.html [15] MySQL, «MySQL 8.0 Reference Manual», [En línea] Disponible: https://dev.mysql.com/doc/refman/8.0/en/
132 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV [16] SQLite, «What Is SQLite?», [En línea] Disponible: https://www.sqlite.org/index.html [17] Retrofit, «Retrofit», [En línea] Disponible: https://square.github.io/retrofit/ [18] OpenCV, «About», [En línea] Disponible: https://opencv.org/about/ [19] YOLO, «YOLO: Real-Time Object Detection» [En línea] Disponible: https://pjreddie.com/darknet/yolo/ [20] Google Colab, «¿Qué es Colaboratory?», [En línea] Disponible: https://colab.research.google.com/notebooks/intro.ipynb [21] Maps SDK for Android, «Descripción general», [En línea] Disponible: https://developers.google.com/maps/documentation/android-sdk/overview [22] Directions API, «Overview», [En línea] Disponible: https://developers.google.com/maps/documentation/directions/overview [23] AWS, «Overview of Amazon Web Services», [En línea] Disponible: https://docs.aws.amazon.com/whitepapers/latest/aws-overview/introduction.html [24] Simon Haykin, Neural Networks, Prentice-Hall, New Yersey, USA, 1999 [25] Keiron O'Shea y Ryan Nash, An Introduction to Convolutional Neural Networks, 2015 [26] Sumit Saha, A Comprehensive Guide to Convolutional Neural Networks, 2015 [En línea] Disponible: https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way- 3bd2b1164a53 [27] Redmon, Joseph y Farhadi, Ali, YOLOv3: An Incremental Improvement, arXiv, 2018 [28] Redmon, Joseph y Farhadi, Ali, You Only Look Once: Unified, Real-Time Object Detection, arXiv, 2016 [29] Darknet, «Installing Darknet» [En línea] Disponible: https://pjreddie.com/darknet/install/ [30] Jonathan Hui, Real-Time Object Detection with YOLO, YOLOv2 and now YOLOv3, 2018 [En línea] Disponible:https://medium.com/@jonathan_hui/real-time-object-detection-with-yolo-yolov2- 28b1b93e2088 [31] Spring Web MVC, «Web MVC Framework», [En línea] Disponible: https://docs.spring.io/springframework/docs/3.2.x/spring-framework-reference/html/mvc.html [32] OpenCV, «Releases» [En línea] Disponible: https://opencv.org/releases/ [33] Tesla, «Piloto Automático», [En línea] Disponible: https://www.tesla.com/es_ES/autopilotAI [34] Mercedes Benz, «Autonomous», [En línea] Disponible: https://www.mercedesbenz.com/en/innovation/autonomous/ [35] Android Studio, «Android Studio» [En línea] Disponible: https://developer.android.com/studio?hl=es [36] Eclipse, «Download Eclipse Technology that is right for you» [En línea] Disponible:
133 Aplicación Android y Servicio Web Spring para la detección y registro de señales de tráfico de velocidad usando Deep Learning con tiny-yolov3 y OpenCV https://www.eclipse.org/downloads/ [37] Spring Data JPA, «Accessing Data with JPA» [En línea] Disponible: https://spring.io/guides/gs/accessingdata-jpa/ [38] Spring Security, «Spring Security» [En línea] Disponible: https://spring.io/projects/spring-security [39] Spring Session, «Spring Session» [En línea] Disponible: https://spring.io/projects/spring-session [40] MySQL Connector, «Accessing Data with MySQL» [En línea] Disponible: https://spring.io/guides/gs/accessing-data-mysql/ [41] MySQL, «MySQL Community Downloads» [En línea] Disponible: https://dev.mysql.com/downloads/ [42] AWS, «Consola de administración de AWS» [En línea] Disponible: https://aws.amazon.com/es/console/