Full text
Treball de Fí de Grau Enginyeria en Tecnologies Industrials Diseño y construcción de un prototipo para el control de presencia con Raspberry Pi MEMORIA Autor: David Agelet Aumedes Director: Luis Solano Albajes Convocatòria: Gener 2018 Escola Tècnica Superior d’Enginyeria Industrial de Barcelona
Pàg. 2 Memòria
Aquí pot anar el títol del vostre TFG/TFM Pàg. 3 Resumen Las oficinas o espacios de trabajo suelen ser frecuentadas por las mismas personas durante cada jornada. Hay casos en los que no existe un sistema de fichaje para los trabajadores. Por otra banda, en ocasiones existen empleados que no trabajan dentro de las oficinas durante la totalidad de su horario. Por estos motivos muchas veces resulta extremadamente difícil saber en cada momento quién está dentro y quién fuera. El problema que está sobre la mesa, en la empresa en la que trabajo actualmente y, análogamente, en otras empresas, es que resulta difícil hacer un recuento en caso de incendio o simulacro en la casuística planteada. Por este motivo, se ha pensado en diseñar un prototipo que identifique a los usuarios que entran y salen por los diferentes puntos de acceso a una oficina (o recinto) para poder ofrecer valiosa información a los responsables de estos trabajadores en caso de incendio o cualquier otra emergencia. De la misma forma, la información ofrecida por el prototipo puede ser útil para buscar compañeros dentro de la oficina. Este proyecto plantea una solución para el problema planteado, diseñando un sistema para el control de presencia de los trabajadores usuarios. La identificación de los usuarios se ha basado en la tecnología de reconocimiento facial a partir de una cámara instalada en el mini-ordenador Raspberry Pi. Para tener la información del estado de los usuarios (dentro o fuera de la oficina), se ha optado por diseñar e implementar una aplicación en un servidor web que permite el acceso y ofrece la información a tiempo real desde cualquier dispositivo con conexión a internet. El proyecto implementa el prototipo, consiguiendo encontrar una solución factible para el problema planteado, aunque es posible mejorar notablemente el prototipo partir de la optimización del reconocimiento de los usuarios.
Pàg. 4 Memòria Índice ÍNDICE ______________________________________________________ 4 GLOSARIO DE TÉRMINOS ______________________________________ 7 PREFACIO ___________________________________________________ 9 1. INTRODUCCIÓN _________________________________________ 11 1.1. Planteamiento del problema ........................................................................ 11 1.2. Objetivos del proyecto ................................................................................. 11 1.3. Alcance del proyecto ................................................................................... 13 2. ARQUITECTURA DEL DISPOSITIVO PROTOTIPO ______________ 15 2.1. Hardware ..................................................................................................... 15 2.1.1. Qué es Raspberry Pi? .....................................................................................15 2.1.2. Periféricos y complementos .............................................................................17 2.1.3. Sistema de verificación ....................................................................................18 2.1.3.1. Sistema elegido ................................................................................... 18 2.1.3.2. Montaje de los elementos .................................................................... 19 2.2. Software ....................................................................................................... 21 2.2.1. Instalación del Sistema Operativo en la Raspberry Pi .....................................21 2.2.2. Instalación de OpenCV ....................................................................................22 2.2.3. Instalación de la cámara ..................................................................................25 3. PROGRAMA DE RECONOCIMIENTO FACIAL __________________ 26 3.1. Módulo 1: recopilación de datos de los usuarios ........................................ 28 3.2. Módulo 2: entrenamiento de los usuarios ................................................... 29 3.3. Módulo 3: reconocimiento facial .................................................................. 30 3.4. Sistema de verificación para los usuarios identificados .............................. 31 3.4.1. Programa de verificación: verificacion.py ........................................................31 3.4.1.1. Verificacion.detect(usuario).................................................................. 32 3.4.1.2. Verificacion.borrar(cara) ...................................................................... 32 4. SERVIDOR WEB _________________________________________ 33 4.1. Contenido: tabla del control de presencia de los usuarios.......................... 34 4.2. Comunicación con el dispositivo Raspberry Pi: Adaptación del programa de detección facial ............................................................................................ 35 4.3. Desarrollo de la Web App ........................................................................... 37
Aquí pot anar el títol del vostre TFG/TFM Pàg. 5 4.3.1. Views.py.......................................................................................................... 37 4.3.1.1. @app.route(‘/’) ..................................................................................... 38 4.3.1.2. @app.route(‘/actualizar’) ...................................................................... 39 4.3.2. Alojamiento online........................................................................................... 39 5. PRUEBAS, RESULTADOS Y AVALUACIONES _________________ 42 5.1. Retardo en la visualización del video ........................................................... 42 5.2. FPS .............................................................................................................. 43 5.3. Distancia a la cámara ................................................................................... 43 6. PRESUPUESTO DEL PROYECTO ___________________________ 44 7. PLANIFICACIÓN _________________________________________ 46 7.1. Fase previa ................................................................................................... 46 7.2. Fase de diseño ............................................................................................. 46 7.3. Fase final ...................................................................................................... 46 CONCLUSIONES _____________________________________________ 48 MEJORAS FUTURAS PARA EL PROTOTIPO ______________________ 49 AGRADECIMIENTOS __________________________________________ 51 BIBLIOGRAFÍA _______________________________________________ 52 Referencias bibliográficas ..................................................................................... 52 Bibliografía complementaria .................................................................................. 53
Aquí pot anar el títol del vostre TFG/TFM Pàg. 7 Glosario de términos En este apartado se encuentran recogidas todas las abreviaciones y términos anglosajones empleados en este proyecto y su significado. RasPi: Raspberry Pi. Hardware: Partes físicas de un sistema informático. Software: Soporte lógico de un sistema informático. SBC: Single-Board Computer (Ordenador de una sola placa). GPIO: General Purpose Input/Output (Entrada/Salida para un uso general). LCD: Liquid Cristal Display (Monitor de cristal líquido). OS: Operation System (Sistema Operativo). CV2: OpenCV (Open Source Computer Vision), en su versión para Python. Web App: Aplicación Web. PC: Personal Computer (Ordenador personal). URL: Dirección Web. HTTP: HyperText Transfer Protocol (Protocolo de transferencia de hipertexto). Framework: Entorno de trabajo.. Render: Interpretación. HTML: Hyper Text Markup Language (Lenguaje informático). CSS: Cascading Style Sheets (Lenguaje informático de hojas de estilo).
Diseño y construcción de un prototipo para el control de presencia Pàg. 9 Prefacio La sociedad en la que nos ha tocado tomar parte, así como su ciencia y tecnologías, avanzan a pasos agigantados. Mi madre aun no acaba de entender cómo usar el Whatsapp mientras que tenemos gente trabajando en el Deep Learning, lanzando predicciones extraordinariamente precisas y ganándote al ajedrez. Así pues, creí pertinente cursar un grado que permitiese explorar los diversos campos de la ingeniería en ámbito industrial, ya que a partir de ahora todo apunta a que tendremos que entrar en un constante aprendizaje para no sentirnos obsoletos frente a las generaciones venideras. Por mi parte, me gustaría reconocer aquí y ahora lo siguiente: dudo que mi vocación se sirva de ninguno de los campos introducidos en esta ingeniería. De hecho, llegados a este punto, solamente me alcanza para una vaga conclusión: me gustan la informática y la electrónica. Pensé en un tema de TFG que me permitiera aprender nuevos conceptos de electrónica y de informática y, en la búsqueda de una propuesta de proyecto en la página de la facultad, descubrí la Raspberry Pi, un ordenador de placa reducida originariamente ideado para estimular la enseñanza de la informática en escuelas. Es más potente de lo que puede parecer viendo su propósito original. Combinando la polivalencia del aparato con los sensores adecuados se descubre ante nosotros una amplia variedad de proyectos posibles basados en este dispositivo. De hecho, si entramos en los primeros enlaces que nos ofrece Google, nos encontramos con proyectos muy diversos: desde un aparato con una cámara instalada para el reconocimiento facial hasta la RasPi convertida en router para enviar el tráfico a través de un navegador anónimo, pasando por prototipos de máquinas de juego arcade. La aplicación, pues, parece ser super extensa, pero está limitada a la variedad de sensores existentes y a la potencia del hardware para procesar y ejecutar programas. Quise trabajar en el diseño de un prototipo innovador con RasPi, planteando una solución a un problema real. Así pues, el primer punto a afrontar era pensar en un problema adecuado. Sucedió que, estando en la empresa donde realizo prácticas, me di cuenta de que frecuentemente pasan algunos trabajadores de otra zona de la oficina preguntando por algún compañero. Muchas veces no se sabe si esta persona buscada está en la oficina, en el bar del otro edificio o bien está fuera visitando algún cliente. Pensé que sería una buena idea diseñar un sistema de control que indicase la gente que se encuentra en la oficina a tiempo real para localizar más fácilmente a los compañeros de trabajo.
Pág. 16 Memoria Figura 2.2 - Raspberry Pi En la siguiente tabla se muestran las principales características del modelo B+ de Raspberry Pi. Raspberry Pi B+ Procesador ARM Broadcom BCM2835 @ 700 MHz Memoria RAM 512 MB LPDDR SDRAM 400Mhz Ethernet 10/100 Mbps Tamaño [mm] 85 x 56 x 17 Peso [gr] 45 Potencia requerida 5V, 370 mA
Diseño y construcción de un prototipo para el control de presencia Pàg. 17 OS soportados Debian GNU/Linux, Fedora, Arch Linux Coste aproximado a España [€] 35 – 40 (Tabla 2.1) Características Raspberry Pi modelo B+ 2.1.2. Periféricos y complementos El prototipo debe disponer de ciertos elementos complementarios a la RasPi que le permitan desempeñar su función: • Placa protoboard para prototipos sin soldadura de 850 contactos. • Una pantalla LCD 1602 (16 caracteres x 2 filas) retroiluminada. • 10 cables de puente macho a hembra. • Sensor cámara de visión nocturna, gran angular (lente de ojo de pez de 5Megapíxeles), con dos sensores de luz infrarroja. Soporta resolución 1080 p. • Un diodo LED verde. • Resistencias de 2.200, 1.000 y 220 Ω. Figura 2.3 - De izquierda a derecha; pantalla LCD, cámara de visión nocturna con una luz infrarroja, diodo LED y resistencia eléctrica Complementariamente, para poder trabajar con la Raspberry Pi es necesario disponer de: • Alimentador de 5V y 3,4A.
Pág. 18 Memoria • Tarjeta de memoria microSD. • Teclado y ratón con entradas USB. • Un monitor con entrada VGA, que se deberá complementar con cable VGA (de macho a hembra) y un adaptador de VGA hembra a HDMI macho. 2.1.3. Sistema de verificación 2.1.3.1. Sistema elegido Debido a que una implementación del prototipo no permetria un monitor para cada dispositivo instalado, se tiene que pensar en una solución más economica y que verifique la correcta identificación del usuario de forma clara. El dispositivo RasPi B+ soporta gran cantidad de sensores que, con un bajo precio, permiten una verificación visual. Un diodo LED que se encienda cada vez que se identifique a alguen puede funcionar, pero no es suficiente para determinar el nombre del usuario reconocido. Por este motivo, se ha pensado en montar una pantalla adicional de bajo coste que muestre el nombre y apellido de la persona recién identificada por el dispositivo. Una pantalla LCD de 32 carácteres (16 x 2 filas) parece suficiente para este propósito. Figura 2.4 – Alimentador Figura 2.5 - Monitor, cable VGA (negro) y adaptador VGA-HDMI
Diseño y construcción de un prototipo para el control de presencia Pàg. 19 2.1.3.2. Montaje de los elementos Para montar el diodo LED y la pantalla LCD se hace uso de los puertos GPIO que incorpora la RasPi modelo B+. Figura 2.6 - Puertos GPIO de la RasPi B+ [2]. Para conectar los pins de la pantalla a la RasPi se utiliza una Placa protoboard. Para que la conexión de los pins de la pantalla LCD sea sólida y el montaje de la placa a la protoboard rígido, éstos pins se sueldan con estaño a unas patillas metálicas. Figura 2.7 - Pins de la pantalla LCD (1 a 16)
Pág. 20 Memoria Posteriormente, se procede a colocar los cables de puente macho-hembra necesarios para conectar cada pin de la pantalla con su puerto GPIO correspondiente [3]. Los dos primeros pins de la placa de la pantalla se conectan a los puertos de tierra (Ground) y alimentación de 5V, respectivamente. El tercer pin se utiliza para el contraste de la pantalla LCD. Por defecto, el contraste está al máximo, por lo que se puentea a masa utilizando una resistencia de 2,2kΩ. Los demás pins se colocan del mismo modo, tal y como muestra la siguiente figura, referente al tutorial utilizado. Figura 2.8 - Relación de conexiones para la configuración de la pantalla LCD a la RasPi. El pin 4 y el pin 5 son los RS (Register Select) , R/W (Read/Write state), se encargan de dirigir los datos en la pantalla en la posición requerida. R/W está puenteado a masa para poner al display en modo escritura. El pin 6 (Enable), permite decidir si se procesa la información de los dos pins anteriores y los siguientes pins de bus de datos. Los 8 pins siguientes (7-15, de D0 a D7) son pins para el bus de datos. En este caso se utiliza una configuración de 4 bits, por lo que se usan los pins referentes a las posiciones D4 a D7. Las dos últimas conexiones (15, 16), cátodo y ánodo del LED de iluminación de la pantalla LCD, respectivamente, se conectan a los GPIO correspondientes de 5V y tierra (Ground). En este caso, se utiliza una resistencia de 1 kΩ en el pin de alimentación para limitar el
Diseño y construcción de un prototipo para el control de presencia Pàg. 21 voltaje de entrada y reducir la iluminación de la pantalla. La misma protoboard se aprovecha para colocar el diodo LED, complementado por una resistencia de 220 Ω, que se conecta a uno de los puertos GPIO libres. En este caso, se ha utilizado GPIO18. La configuración del software de este sistema se plantea posteriormente. [3.4]. 2.2. Software El software del prototipo es todo aquel soporte lógico que permite el funcionamiento del hardware, y que comprende todos los programas desarrollados para alcanzar la finalidad de este dispositivo. La función principal del prototipo incluye reconocer a los usuarios registrados, para ello lo más importante es desarrollar un programa de reconocimiento facial, y que se encuentra recogido en el Anexo I de este proyecto. Aparte, el prototipo comprende el software que permite visualizar en un servidor web la información requerida, recogido en el Anexo II del proyecto. La RasPi necesita un sistema operativo (OS) que gestione los recursos del hardware y provenga de servicios a los programas de aplicación necesarios para el objetivo del prototipo, por lo que se dispone a explicar su instalación, así como la posterior instalación de los paquetes asociados al desarrollo de los programas de reconocimiento facial y al servidor web. 2.2.1. Instalación del Sistema Operativo en la Raspberry Pi Lo primero que se debe hacer al disponer del dispositivo es instalar un sistema operativo que lo gobierne. Se ha optado por el OS oficial de la Raspberry Pi, Raspbian Strech [4], en su versión extendida más actual, que dispone de un directorio para poder trabajar de forma más cómoda. Para proceder con la instalación, se debe descargar el OS en formato .iso y quemar esa imagen en una tarjeta micro SD. Para quemar la imagen .iso del OS se ha utilizado Etcher, un programa externo [5]. A continuación, se procede introduciendo la tarjeta microSD en el puerto habilitado de la RasPi, se enciende conectando el alimentador y se espera unos minutos a que se instale Raspbian Strech. Puede ocurrir, como en este caso en concreto, que no se detecte el monitor de salida VGA, conectado a la RasPi por via HDMI. En esa tesitura, se deberían configurar los parámetros de resolución ubicados en el archivo de la root del OS boot/config.txt. [6].
Pág. 22 Memoria Figura 2.9 - Archivo de configuración del monitor de la RasPi. Quitando la almohadilla (#) en cada línea de código, se permite leer los comandos del fichero config.txt. En este caso, se activa hdmi_force_unplug=1, forzando la salida a través del puerto HDMI. Esto es necesario, pero no suficiente. Se configura de igual forma un parámetro de resolución. Este debe coincidir con la resolución del monitor usado en este proyecto, LG FLATRON L1510S. Después de los ajustes pertinentes y reiniciando la RasPi, se puede visualizar el escritorio del SO y así se procede a terminar de configurar el teclado y ratón si fuese oportuno, así como la conexión Wifi. 2.2.2. Instalación de OpenCV Una vez ajustados los parámetros para el correcto funcionamiento de la RasPi se procede a la instalación de la librería de Python OpenCV. Se ha decidido utilizar OpenCV por ser la librería más extensa y popular en Python para el reconocimiento facial. OpenCV está basada en Machine Learning, una rama de la inteligencia artificial cuyo objetivo es desarrollar técnicas que permitan que las computadoras aprendan. De forma más concreta, se trata de crear programas capaces de generalizar comportamientos a partir de una información suministrada en forma de ejemplos. En CV2 existen funciones para el reconocimiento de objetos, que son los que nos servirán para el reconocimiento facial. La librería está entrenada para detectar rostros humanos con el previo aprendizaje de las facciones de un rostro humano en miles de imágenes suministradas. Para tener una mínima idea de cómo funciona el proceso de aprendizaje, se debe observar que, en el método para el reconocimiento de objetos en imágenes, éstas se tienen que analizar en un
Diseño y construcción de un prototipo para el control de presencia Pàg. 23 formato de matriz numérica, que se genera a partir del valor RGB de agrupaciones de píxeles para ejercer posteriormente complejos procesos matemáticos. Figura 2.10 - Esquema del funcionamiento del Machine Learning. El Machine Learning es, en efecto, un campo contemporáneo objetivamente complejo de las ciencias de la computación. En este proyecto no se considera entrar más en profundidad con la explicación de su funcionamiento, más allá de entender la dinámica de la librería utilizada para el reconocimiento facial. La instalación de OpenCV en la Raspberry Pi requiere de un seguido de pasos: 1. Primero de todo, se tiene que expandir el sistema de archivos del OS para abarcar todo el espacio disponible en la tarjeta de memoria microSD.
Pág. 24 Memoria Figura 2.11 - Herramienta de configuración del OS de RasPi 2. Instalar las dependencias necesarias requeridas y actualizar los paquetes necesarios. En este paso se incluye la instalación de CMake [7], una herramienta de desarrollo que sirve para configurar el proceso de instalación de CV2, paquetes de trato de imágenes, de video, un submódulo de monitoreo de las imágenes en la pantalla, y dependencias referentes a la optimización de operaciones con matrices del CV2. Figura 2.12 - Comando para instalación de dependencias del CV2 3. Descargar el código fuente de la librería CV2. A demás, va a ser necesaria tener instalada la expansión Contrib de CV2 para el programa de detección facial. En este proyecto se usará la versión más reciente de Python, la versión 3.7. A continuación se instala pip, el manager de paquetes de Python, para instalaciones posteriores. 4. Ya que los diferentes proyectos que se creen en la RasPi pueden depender de versiones diferentes de los paquetes instalados, es altamente recomendable crear entornos aislados para cada uno de los proyectos. Por ello, el próximo paso es crear un entorno virtual de Python. $ sudo pip install virtualenv virtualenvwrapper $ sudo rm -rf ~/.cache/pip
Diseño y construcción de un prototipo para el control de presencia Pàg. 25 5. Una vez dentro del entorno virtual de CV2 creado en el terminal, se procede a instalar la única dependencia de Python necesaria para este proyecto, NumPy, usado para el procesamiento matemático. 6. Finalmente, se crea un enlace simbólico de los enlaces de CV2 dentro del entorno virtual creado. Con los pasos anteriores ya se tiene el entorno preparado para trabajar con CV2. Se puede comprobar de la siguiente forma: Figura 2.13 - Terminal de Raspbian Stretch (OS) Cada vez que se pretenda ejecutar un programa que use CV2, como en el presente caso un programa de reconocimiento facial, será necesario introducir los comandos anteriores en un terminal del OS para trabajar dentro del entorno virtual de OpenCV. 2.2.3. Instalación de la cámara Para tener configurado correctamente el periférico de cámara conectado en el puerto Camera de la RasPi se tiene que introducir el siguiente comando en el entorno virtual cada vez que se vaya a utilizar: $ sudo modprobe bcm2835-v4l2
Pág. 32 Memoria Figura 3.12 – Código Python; importar e inicializar lcd.py y configurar el puerto del diodo LED El módulo verificación.py contiene dos funciones diferentes. 3.4.1.1. Verificacion.detect(usuario) Esta primera función detect(usuario) printea ‘Bienvenido,’ en la primera fila de la pantalla LCD. La variable ‘usuario’, entrada desde el módulo de reconocimiento facial, contiene el Nombre y Apellido del usuario identificado y se printea en la segunda fila. También se enciende el diodo, escribiendo GPIO.output(18, True). 3.4.1.2. Verificacion.borrar(cara) Esta segunda función, borrar(cara), apaga el diodo LED. Si la lista cara está vacía, se borra el último nombre que haya estado printeado en la pantalla. La variable cara es una lista creada en el módulo de reconocimiento facial (03_reconocimiento.py) para mantener los nombres de los últimos usuarios introducidos en el caso de que sean identificados por el prototipo en un lapso de tiempo muy corto. De esta forma, cada unos cuantos frames del registro de vídeo (lo que aproximadamente corresponden a 2 - 3 segundos), se printearía cada uno de los usuarios en el orden en el que han sido identificados.
Diseño y construcción de un prototipo para el control de presencia Pàg. 33 4. Servidor web Para satisfacer la función del prototipo del presente proyecto es necesario desarrollar un espacio que permita la visualización a tiempo real del estado de los usuarios registrados. Los usuarios con autorización de acceso a este espacio deberán poder entrar de forma online. Un servidor web es preferible a un servidor local si la información que contiene es importante en momentos críticos como lo puede ser un incendio. Un servidor web también permite acceder a los datos requeridos de forma rápida y desde cualquier dispositivo con conexión a internet. Por estos motivos, para el presente proyecto se ha decidido diseñar una Web App e implementarla en un servidor online. Figura 4.1 - Esquema de un servidor web [11] Para desarrollar la Web App, se ha pensado en diseñar una aplicación que se pueda exportar de forma cómoda y gratuita a un servidor de internet, y utilizando Python como lenguaje informático principal. Primeramente, se diseña y se desarrolla la Web App en un PC usando un servidor local. Se emplea la librería Flask [12], un entorno de trabajo – o micro framework - para aplicaciones web en Python. Finalmente, se utilizará Pythonanywhere [13], un servicio Web que permita almacenar los archivos de la Web App, desplegarlos y mostrarlos en un espacio web accesible con una URL.
Pág. 34 Memoria Figura 4.2 - Logos de Flask y de Pythonanywhere, respectivamente Existen dos opciones principales de librerías para desarrollar una Web App en Python. Una es Flask y la otra Django. Se ha elegido usar Flask debido a que ya se tenia una cierta experiencia de trabajo con este micro framework. Seguidamente se procede a explicar y argumentar el diseño y los métodos utilizados para desarrollar la Web App. El código de la Web App implementado se encuentra en el Anexo I del proyecto. 4.1. Contenido: tabla del control de presencia de los usuarios En la Web App se debe poder consultar una tabla con la información necesaria para saber el estado de los usuarios. Esta tabla contiene, pues, los mismos usuarios que los que se encuentran registrados en el programa de detección facial del dispositivo prototipo, con las variables: • Nombre • Apellido • Numero identificativo, ID. Adicionalmente, se presenta otra variable: • el Estado del usuario, dentro o fuera del recinto, representado en otra columna de la tabla con valores IN y OUT, respectivamente. Adicionalmente, se ha creído interesante y conveniente agregar un espacio en la tabla que
Diseño y construcción de un prototipo para el control de presencia Pàg. 35 muestre el último momento de tiempo – en horas y minutos – en que se ha detectado la entrada de cada usuario. Análogamente, es posible agregar otro espacio para la hora de salida si se agrega otra cámara al prototipo: • Última hora de Entrada (y Última hora de Salida del recinto) de cada usuario. De este modo se consigue un control más preciso. Figura 4.3 - Variables en la tabla del servidor web 4.2. Comunicación con el dispositivo Raspberry Pi: Adaptación del programa de detección facial La Web App recibe un seguido de datos por parte del entorno del dispositivo de detección facial, tal y como se muestra en el siguiente esquema: Figura 4.4 – Esquema de la relación entre la RasPi y el servidor web Para enviar la información desde el dispositivo RasPi al servidor web, se va a importar
Pág. 36 Memoria Requests [14], una librería HTTP para Python. El HTTP establece el protocolo para el intercambio de documentos de hipertexto y multimedia a la red. [1]. 1. Por parte del módulo de registro de usuarios, se envían al servidor los datos Nombre, Apellido e ID del usuario que se esté registrando en ese momento en el dispositivo. La información se enviará desde el módulo 01_dataset.py a la dirección de la variable url, del siguiente modo: Figura 4.5 – Código Python; enviar nuevo usuario al servidor 2. Primero de todo, por parte del módulo de reconocimiento del dispositivo (03_reconocimiento.py), se diseña una variable encender, que envia el Estado ‘IN’ de un usuario ‘ID’: 0. El usuario 0 se usa en la tabla de la Web App para para mostrar que el programa de reconocimiento está en funcionamiento. Figura 4.6 – Código Python; enviar ‘encender’ 3. Seguidamente, tras el reconocimiento de un usuario, se transmite la información del mismo: ID, Estado (‘IN’ en el presente diseño) y la Hora de entrada (importada en el mismo módulo con la librería time). 4. Finalmente, se envía otra función .requests desde el módulo de reconocimiento facial para indicar que se apaga el programa. Figura 4.7 – Código Python; enviar ‘apagar’ La información enviada desde el dispositivo RasPi a través de Wifi será recibida en el servidor Web por la Web App, donde se tratará debidamente.
Diseño y construcción de un prototipo para el control de presencia Pàg. 37 4.3. Desarrollo de la Web App La Web App basada en Flask (Python) ha sido desarrollada de forma local y posteriormente se han adaptado algunas de las rutas de los archivos y de las funciones en el servidor web para el correcto funcionamiento. Principalmente, para ejecutar un servidor web local con Flask se debe indicar una dirección y un puerto. Por defecto, en el PC que se ha utilizado, se trabaja en la dirección 127.0.0.1 y el puerto 5000. Copiando la ruta 127.0.0.1:5000 en el navegador web del dispositivo desde donde se está ejecutando la Web App se pueden hacer pruebas. Además, se ha activado la depuración (debug= True) durante el periodo de desarrollo, que permite que el servidor esté a la escucha de cualquier cambio efectuado en el código. El programa se inicializa leyendo el archivo init.py (en el directorio raíz del Anexo II de este proyecto) que, por una parte lo ejecuta -app.run()- y por otra, importa el archivo que contiene todo el código que comprende la aplicación. Este código también se encuentra en el directorio raíz, con el nombre de views.py. 4.3.1. Views.py En la arquitectura cliente-servidor, un cliente (por ejemplo, un navegador de un dispositivo móvil), realiza una petición a un servidor. El servidor tiene la obligación de manejar la petición y responder en cualquier formato (por ejemplo, html, json, xml, etc.). Se necesita indicar a qué ruta puede acceder el cliente. Para ello se necesita utilizar un decorador (wrap). En Flask, el decorador se invoca de la siguiente forma: Figura 4.8 – Código Python; indicador de ruta @app.route() recibe como parámetros, por una parte, un string que indica dónde va a ser la ruta (en este caso recibe un ‘/’, indicando que no se quiere una ruta específica dentro del servidor), y, por otra parte, los métodos HTTP que permiten intercambiar información con un cliente u otro servidor. Para utilizar estos métodos se importa la función request de Flask, [12], la cual funciona de forma análoga a la función de la librería requests utilizada en el programa de reconocimiento facial para enviar los datos [4.2.]. Cada ruta debe tener un método asociado. En el presente caso se tienen dos rutas.
Pág. 38 Memoria 4.3.1.1. @app.route(‘/’) La ruta principal (‘/’), que está destinada a mostrar la tabla con el control de presencia de usuarios. Figura 4.9 – Código Python; ruta ‘/’ En el método asociado a esta ruta se renderiza un archivo HTML. Este archivo, LVEWgV.html [15], importa un fichero de lenguaje JavaScript, ‘LVEWgV.js’ que genera una tabla a partir del fichero de base de datos users_dataset.csv. Por lo tanto, los datos enviados por parte del cliente (el dispositivo RasPi) modifica el contenido del fichero users.csv, ubicado el subdirectorio ‘static/’ del Anexo II de este proyecto. La tabla de control de usuarios de LVEWgV.html percibe los cambios tras su próxima actualización después de haber sido modificado el fichero con el contenido de los usuarios. Se ha diseñado el fichero HTML para que actualice periódicamente (cada 20 segundos) y de forma automática la tabla, tal y como se aprecia en la primera línea de código de la figura siguiente. Figura 4.10 - Código HTML; actualización automática e importación de las hojas de estilo y scripts El fichero JavaScript, así como las hojas de estilo (.css) se encuentran en el subdirectorio ‘static/’.
Diseño y construcción de un prototipo para el control de presencia Pàg. 39 4.3.1.2. @app.route(‘/actualizar’) La ruta secundaria ‘/actualizar’ no renderiza ningún fichero y, si se accede a ella, se redirige automáticamente a la ruta principal (‘/’). Esta ruta está diseñada para recibir los datos enviados por el cliente (RasPi). Por este motivo, en el método asociado, actualizar(), utiliza las funciones que trabajan sobre los datos recibidos para modificar el fichero users.csv, y por ende la tabla de control de presencia de usuarios. Figura 4.11 - Código Python; método de la ruta ‘/actualizar’ Las funciones utilizadas son llamadas desde el mismo archivo views.py. • Si llega un request del primer módulo del programa de reconocimiento con los datos de un nuevo usuario agregado al sistema, se ejecuta la función get_data_user([data obtenida]), que añade la información del nuevo usuario al fichero users.py. • Si llegan datos referentes al módulo de reconocimiento facial con la palabra clave ‘Hora de entrada’, se ejecuta la función get_data_inout([data obtenida]), que actualiza la variable Estado de un usuario en el fichero users.py. • Si llega un request del módulo de reconocimiento facial con la palabra clave ‘apagar’, se ejecuta la función reinicio(). Esta función modifica el estado de todos los usuarios registrados en users.py a ‘OUT’. Igualmente ocurre que los valores de la columna ‘Hora de entrada’ son borrados. Si existiese otra columna para la variable ‘Hora de salida’, se tendría que diseñar de igual forma la función reinicio() para que resetease también esos valores. 4.3.2. Alojamiento online El objetivo es disponer de la Web App en un sitio web, accesible con una URL desde cualquier dispositivo. Para ello, se utilizará un servicio que despliegue la Web App diseñada. El servicio se llama Pythonanywhere, un conocido sitio web que permite
Pág. 40 Memoria hospedar y ejecutar código de Python y el micro framework Flask desde la nube. El primer paso es registrarse al sitio www.pythonanywhere.com. Los servicios básicos son gratuitos. Esta página web proporciona acceso en el navegador a las interfaces de consolas de Python y Bash (basadas en el servidor), junto con un editor de código. Por otra parte, permite transferir archivos de programa (como en este caso, los archivos que componen la Web App) utilizando el navegador del usuario y finalmente desplegar una Web App con una URL personalizada, utilizando cualquier framework de aplicación basado en WSGI (Web Server Gateway Interface [1]). Figura 4.12 – Pythonanywhere.com, página principal [13] Para desplegar la Web App desarrollada se crea un entorno virtual de trabajo. Para ello se utiliza una consola Bash para ejecutar un entorno virtual ($ mkvirtualenv) y dentro instalar Flask. Posteriormente se crea un nuevo directorio, ‘deploy/’, se importan los archivos que componen la Web App de este proyecto y se dispone a configurar la aplicación dentro del sitio web, seleccionando Flask como micro framework y la versión 3.7.0 de Python. Finalmente, se indica que se va a utilizar el entorno virtual creado previamente, introduciendo la ruta dentro de la página web, y se modifica con la misma ruta el archivo de configuración de WSGI generado en pythonanywhere, davidagelet_pythonanywhere_com_wsgi.py.
Diseño y construcción de un prototipo para el control de presencia Pàg. 41 Figura 4.13 - Configuración para davidagelet.python.com
Pág. 48 Memoria Conclusiones Una vez diseñado y montado el prototipo de reconocimiento facial y el servidor se concluye que los objetivos detallados en el primer apartado del proyecto se han cumplido. Se ha conseguido diseñar un programa de detección facial que, a partir de una cámara, llega a reconocer a un usuario registrado, enciende un diodo LED y muestra su nombre en una pantalla el tiempo necesario para que el usuario pueda leerlo. En este punto, el objetivo se cumple bajo mínimos, ya que el porcentaje de reconocimiento no es suficientemente alto. Empleando óptimas condiciones de luz y una distancia corta de enfoque con la cámara, el porcentaje de coincidencia no supera el 65% y en ocasiones el programa confunde a la persona detectada por otro usuario registrado. Esto se podría mejorar utilizando un procesador más potente, con otra librería más compleja y avanzada que trabaje con una arquitectura que optimice el proceso de ejecución. Con el programa desarrollado en 3 módulos para el reconocimiento facial se hace uso del potencial que ofrece la librería OpenCV, pero se cree que se podría mejorar el porcentaje de reconocimiento aumentando la potencia de procesador, que aumentaría la cantidad de imágenes tomadas (frames) por segundo de captura de la cámara (actualmente entre 0,5 y 3 frames por segundo en la RasPi). Por otro lado, la cámara de 5MP no ofrece suficiente resolución para un óptimo reconocimiento por parte del software. Esto puede ser debido a dos factores causados por la cámara utilizada en este proyecto. El primero, que es de visión nocturna, y en condiciones óptimas de luz es posible que no ofrezca la calidad de imagen que se cabría esperar. El segundo, es que la lente es de gran angular. Eso implica que el sujeto debe acercarse más a la cámara para que su rostro se vea en una mayor proporción del encuadre, y así obtener mayor resolución de su rostro. Al hacer esto, la imagen de la cara es distorsionada por la lente de la cámara y es posible que este efecto afecte a la cualidad del reconocimiento del programa. Se ha conseguido montar un servidor web sencillo pero que permite mostrar toda la información necesaria y a tiempo real. Se concluye en que los objetivos para la muestra de información del control de presencia de usuarios se han cumplido satisfactoriamente. De todos modos, se pueden añadir diversas mejoras, que se van a redactar en un siguiente apartado del proyecto. Finalmente, sobre el proyecto y en estilo personal, quiero destacar en que al inicio solamente se tenia un backgroud básico sobre programación en Python. Por lo tanto, durante la elaboración del proyecto se han ido aprendiendo conceptos en la teoría de funcionamiento de los servidores y Machine Learning, lenguaje HTML, CSS y JavaScript. Gracias a este trabajo he adquirido conocimientos sobre estas tecnologías, que en un futuro podrán ser útiles para mi carrera profesional.
Diseño y construcción de un prototipo para el control de presencia Pàg. 49 Mejoras futuras para el prototipo Tal y como se pretende explicar en el prefacio, este trabajo es un punto de partida para la implementación en las empresas de un producto que satisfaga una problemática real. La intención de este apartado del trabajo es proponer mejoras inmediatas del prototipo, así como esbozar una hoja de ruta para optimizar el dispositivo y para que, en un futuro, fuese factible llevar al mercado un producto basado en el planteamiento de este proyecto. En cuanto a las mejoras inmediatas que se pueden implementar en el presente prototipo, se propone: • Desarrollar un programa de automatización que permita controlar desde la pantalla LCD y una serie de botones el uso de los módulos del programa de reconocimiento facial. De este modo, solo hace falta encender el dispositivo y seleccionar una de las opciones utilizando cuatro botones: subir, bajar, seleccionar y volver atrás. Los botones se podrían instalar en la placa protoboard y configurar de forma sencilla utilizando los pins GPIO. • Mejorar el primer módulo del programa de detección facial, añadiendo la opción de borrar usuarios. De el mismo modo, se debería añadir una función nueva en la Web App adoptando esta opción. • Configurar la tabla JavaScript de la Web App de forma que las celdas de la variable Estado con valor ‘IN’ se vea de color verde, y ‘OUT’ de color rojo. De esta forma, la consulta resulta visualmente más inmediata. • Configurar el módulo de verificación para que si dos usuarios son identificados en lapsos de tiempo muy pequeños aparezcan los dos nombres, uno en cada fila de la pantalla. • En cuanto a desarrollar la solución completa del prototipo, se tiene que investigar la forma de agregar otro módulo de cámara a la RasPi que funcione de forma simultánea con el primero, utilizando el mismo programa, y configurando esta segunda cámara para que funcione como detector de salida. Paralelamente, se tendría que añadir los cambios pertinentes en el código de la Web App y en su fichero users.py. • Diseñar una página de acceso con requerimiento de usuario y contraseña para restringir el uso de la página a los clientes autorizados.
Pág. 50 Memoria Tal y como se ha concluido al proyecto, el programa de detección facial diseñado para el prototipo no funciona tan bien como se desea. La optimización del código es una opción de mejora, pero se cree que no soluciona suficientemente bien el problema. Tanto La librería OpenCV como el hardware de la Raspberry Pi no son suficientemente potentes para el propósito del prototipo. Así pues, la hoja de ruta pasa principalmente por mejorar el programa, utilizando un dispositivo más potente y optimizado. Para mejorar la arquitectura del prototipo probablemente se tiene que sustituir el dispositivo Raspberry Pi por un mejor hardware. Se investigaría la forma de obtener un hardware con características más acotadas al objetivo del dispositivo y optimizadas para un programa de detección facial más avanzado tecnológicamente. Diseñando un hardware optimizado para su objetivo que pudiese ser construido en serie por una empresa ajena, se puede conseguir reducir mucho el coste de producción del producto. También se tendría que tener en cuenta un diseño pensado para una fácil instalación del producto. Una opción que parece correcta es separar la cámara, instalada discretamente encima del punto de acceso al recinto de la instalación, de el resto del dispositivo, que tendría que encontrarse a la vista del usuario para poder verificar su correcta identificación. O inclusive, otra opción estudiable seria aprovechar el registro de vídeo de seguridad ya instalado, y conectarlo directamente al software del dispositivo. Figura 9.1 – Instalación del prototipo-producto en la entrada de una oficina
Diseño y construcción de un prototipo para el control de presencia Pàg. 51 Agradecimientos A mi tutor del trabajo, Lluis Solano Albajes, por su guía y tutelaje durante todo el proyecto. A mis amigos y a mis compañeros de piso, por su interés en el proyecto, la incesante aportación de motivación y apoyo. A mi família, por sus consejos y apoyo incondicional.
Pàg. 52 Memòria Bibliografía Referencias bibliográficas [1] WIKIPEDIA, Debian [https://es.wikipedia.org/wiki/Debian, 7 de octubre de 2018], HTTP [https://ca.wikipedia.org/wiki/Protocol_de_transfer%C3%A8ncia_d%27hipertext, 7 de noviembre de 2018], WSGI [https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface, 18 de noviembre de 2018] [2] WORDPRESS.COM, PrototipoPi – Puertos GPIO [https://prototipopi.wordpress.com/2016/05/02/puertos-gpio/, 30 de diciembre de 2018] [3] ROTOTRON.INFO, LCD display tutorial for raspberry PI [https://www.rototron.info/lcddisplay-tutorial-for-raspberry-pi/ , 29 de diciembre de 2018] [4] RASPBERRY PI, Raspbian – Página de descarga [https://www.raspberrypi.org/downloads/raspbian/, 7 de octubre de 2018] [5] ETCHER, link de descarga [https://www.techspot.com/downloads/6931-etcher.html, 7 de octubre de 2018] [6] THEPIHUT.COM, Raspberry Pi tutorials – Troubleshooting a Raspberry Pi HDMI/VGA Adapter [https://thepihut.com/blogs/raspberry-pi-tutorials/34512708-troubleshooting-araspberry-pi-hdmi-vga-adapter, 8 de octubre de 2018] [7] PYPI.ORG, Cmake [https://pypi.org/project/cmake/, 12 de octubre de 2018] [8] HACKSTER.IO/MJROBOT, Real-Time Face Recognition: And End-to-End Project [https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-projecta10826, 14 de octubre de 2018] [9] OPENCV, Documentos – Cascade_clasification [https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html, 15 de octubre de 2018] [10] PILLOW, Documentos – Información [https://pillow.readthedocs.io/en/5.3.x/, 17 de octubre de 2018] [11] PEREZMARTIN.ES, Introducción a la programación web [https://perezmartin.es/tema-
Aquí pot anar el títol del vostre TFG/TFM Pág. 53 1-introduccion-a-la-programacion-web/, 5 de noviembre de 2018] [12] FLASK, Portal web [http://flask.pocoo.org, 5 de noviembre de 2018], documentos - método request [http://flask.pocoo.org/docs/1.0/quickstart/, 7 de noviembre de 2018] [13] PYTHONANYWHERE, Portal web [https://www.pythonanywhere.com/, 26 de noviembre de 2018] [14] PYTHON REQUESTS, Documentos [http://docs.pythonrequests.org/en/master/user/quickstart/, 7 de noviembre de 2018] [15] CODEPEN.IO, CSV to HTML Sercheable and Sortable Table [https://codepen.io/RYJASM/pen/LVEWgV, 8 de noviembre de 2018] Bibliografía complementaria [16] WIKIPEDIA, Raspberry Pi [https://ca.wikipedia.org/wiki/Raspberry_Pi, 20 de setiembre de 2018], Aprendizaje automático [https://es.wikipedia.org/wiki/Aprendizaje_autom%C3%A1tico, 28 de setiembre de 2018], OpenCV [https://es.wikipedia.org/wiki/OpenCV, 1 de octube de 2018] [17] YOUTUBE, Codigofacilito – Curso Flask [https://www.youtube.com/user/codigofacilito/videos, 10 de noviembre de 2018], Oliver Nabani – Machine Learning para todos [https://www.youtube.com/watch?v=n7WRqjnefr4&t=646s, agosto del 2017] [18] SUPERDATASCIENCE.COM, OpenCV fase recognition – información [https://www.superdatascience.com/opencv-face-recognition/, 5 de octubre de 2018] [19] W3SCHOOLS.COM, CSS White-space Property [https://www.w3schools.com/csSref/pr_text_white-space.asp, 25 de noviembre de 2018] [20] PYTHON, Documentos – time library [https://docs.python.org/2/library/time.html, 18 de noviembre de 2018]