scieee AI-readable full text Open interactive document viewer

Detección, reconocimiento y seguimiento derostros aplicando Redes Neuronales Convolucionales

Bautista Gómez, Alejandro

Abstract

Las tecnologías de reconocimiento facial pertenecen a uno de los numerosos grandes hitosen la historia del desarrollo tecnológico. Mediante la aplicación de técnicas de detección,identificación y clasificación de rostros, se abre la posibilidad al desarrollo de numerosos tiposde aplicaciones. Algunas de estas, por ejemplo, irían desde sistemas de autenticación biométricosorientados al control de acceso, hasta la clasificación de rostros por grupos de edad para la emi-sión de anuncios personalizados o el análisis de las expresiones para el reconocimiento de emociones. Sin embargo, todo este desarrollo de aplicaciones jamás podría haber llegado hasta este punto dela década del siglo XXI, sin la aparición y avances de un revolucionario modelo de computación: elMachine Learning (ML). Para este proyecto, se presenta un sistema de detección, identificación y seguimiento de rostros enimágenes y video. Para ello en primer lugar se realizará un estudio de los distintos tipos de técnicasempleadas de forma clásica que se han podido emplear para la resolución de este tipo de problemas.Después se presentará una introducción a varios modelos de clasificación y algoritmos empleadosbasados en ML. Finalmente, se harán un conjunto de pruebas para poner a prueba dicho sistema.

Full text

28 Proyecto Fin de Carrera Ingeniería de Telecomunicación Formato de Publicación de la Escuela Técnica Superior de Ingeniería Autor: F. Javier Payán Somet Tutor: Juan José Murillo Fuentes Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2013 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Detección, reconocimiento y seguimiento de rostros aplicando Redes Neuronales Convolucionales Autor: Alejandro Bautista Gómez Tutor: Rubén Martín Clemente Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Detección, reconocimiento y seguimiento de rostros aplicando Redes Neuronales Convolucionales Autor: Alejandro Bautista Gómez Tutor: Rubén Martín Clemente Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020 Trabajo Fin de Grado: Detección, reconocimiento y seguimiento de rostros aplicando Redes Neuronales Convolucionales Autor: Alejandro Bautista Gómez Tutor: Rubén Martín Clemente El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores: Presidente: Vocal/es: Secretario: acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha: Agradecimientos El agradecimiento de este trabajo va dedicado a todos aquellos gigantes que, de forma amable y desinteresada, se prestaron a subirme sobre sus hombros. Gracias, pues me habéis regalado la capacidad de contemplar todo aquello más allá de lo que nunca podría haber observado en una vida. A mi familia, y en particular a mis padres: Francisco Manuel Bautista Cubero y M ª del Mar Gómez García; por su amor, por nunca haber dejado de creer en mi y por apoyarme con todo lo que tenían, incluso en los tiempos en los que no había. A aquellos profesores, que durante años han invertido su pasión, compasión y humildad a la docencia. Por dedicar largas y extensas sesiones de tutoría, de las que algunas incluso han llegado a ser impartidas fuera de horario lectivo. Mención especial para Rubén Martín Clemente, estimado tutor de este trabajo, por su guía y paciencia. También al profesor Marcos Calle Suárez, que en primero de carrera me enseño el valor más importante en esta y cualquier otra profesión: la humildad. A mis amigos de la carrera, por su confianza y camaradería; forjada a lo largo de años de entregas de prácticas, trabajos y noches de estudio. Gracias en especial a mi amigo Dunai Fuentes Hitos, gigante de corazón dorado cuyo consejo y guía han sido determinantes en la realización de este trabajo. Finalmente, a las personas que generan contenido basado en el conocimiento y lo divulgan de forma gratuita a través de la red. Muchas gracias, pues también habéis sido mis maestros. Alejandro Bautista Gómez Sevilla, 2020 I Resumen La s tecnologías de reconocimiento facial pertenecen a uno de los numerosos grandes hitos en la historia del desarrollo tecnológico. Mediante la aplicación de técnicas de detección, identificación y clasificación de rostros, se abre la posibilidad al desarrollo de numerosos tipos de aplicaciones. Algunas de estas, por ejemplo, irían desde sistemas de autenticación biométricos orientados al control de acceso, hasta la clasificación de rostros por grupos de edad para la emisión de anuncios personalizados o el análisis de las expresiones para el reconocimiento de emociones. Sin embargo, todo este desarrollo de aplicaciones jamás podría haber llegado hasta este punto de la década del siglo XXI, sin la aparición y avances de un revolucionario modelo de computación: el Machine Learning (ML). Para este proyecto, se presenta un sistema de detección, identificación y seguimiento de rostros en imágenes y video. Para ello en primer lugar se realizará un estudio de los distintos tipos de técnicas empleadas de forma clásica que se han podido emplear para la resolución de este tipo de problemas. Después se presentará una introducción a varios modelos de clasificación y algoritmos empleados basados en ML. Finalmente, se harán un conjunto de pruebas para poner a prueba dicho sistema. III Notación b c Función suelo ∇Operador gradiente ∑n j=1Sumatorio desde 1 a n √Raiz cuadrada enúmero e ELU Función Exponencial Lineal Unidad max(0,x)Función max tanh Función Tangente Hiperbólica ReLU Función Rectilinea Lineal Uniforme Sigmoid Función Sigmoide ∂y ∂xDerivada parcial de yrespecto a x ωL i Parámetro de un peso i-esimo a la entrada de una neurona de capa L bL Parámetro de sesgo a la entrada de una neurona de la capa L aL() Función de activación a la salida de una neurona de la capa L zL() Función suma ponderada de parámetros ω y b de una neurona de la capa L C() Función de error de costes a la salida de una red neuronal δValor de error imputado a una neurona XI XII Capítulo 0. Notación Acrónimos AI Artificial Intelligence ARN Artificial Neural Network CCTV Circuito Cerrado de Televisión CNN Convolutional Neural Network CPU Central Processing Unit CUDA Compute Unified Device Architecture DL Deep Learning DNN Deep Neural Network EKF Extended Kalman Filter FPS Frames per Second GOTURN Generic Object Tracking Using Regression Networks GPU Graphic Processing Unit HOG Histogram Oritented Gradients IA Inteligencia Artificial IoU Inserction over Union ILSVRC ImageNet Large Scale Visual Recognition Competition KF Kalman Filter KNN K-Nearest-Neighbours LBP Local Binary Patterns LFW Labeled Faces in the Wild MC Monte Carlo ML Machine Learning PCA Principal Component Analysis PF Particle Filter ResNet Residual Network RF Random Forest RGB Red Green Blue SGD Stochastic Gradient Descent SVM Support Vector Machines TPU Tensor Processing Unit UKF Unscent Kalman Filter USD United States Dollar YOLO You Only Look Once 1 Introduccion 1.1 Motivación del proyecto La s tecnologías de análisis biométrico 1 son una de las claves en el desarrollo para las próximas décadas del siglo XXI. Dentro de este campo tecnológico, las tecnologías relacionadas al análisis y procesado de rostros han experimentado un continuo crecimiento anual de su valor de mercado. Tanto es así que la consultora tecnológica Global Market Insights tasó el valor de estas tecnologías en más de tres mil millones USD en el año 2019, proyectando crecimientos de hasta cuatro veces su valor para el año 2024 y superando así la barrera de los de los doce mil millones USD [13]. El impacto de sus aplicaciones en la sociedad es amplio y profundo. Tenemos desde sistemas de seguridad que ofrecen autenticación de usuarios para el acceso a perímetros, dispositivos electrónicos y aplicaciones, así sistemas de detección y seguimiento. También existen sistemas que permiten extraer y clasificar características como puedan ser la edad o el sexo. Así, por ejemplo, compañías y organizaciones pueden estudiar el perfil demográfico de su audiencia a la hora de establecer estrategias de marketing y ventas. Otra clase de uso más alejado de los anteriormente citados residiría en la medicina, como es el caso del desarrollo de software de análisis facial para la detección temprana de enfermedades como el síndrome de DiGeorge [12]. Sin embargo, todo este avance tecnológico no está exento de dilemas éticos y sociales. La utilización de software basado en reconocimiento facial para la identificación de ciudadanos ya es una realidad en algunos países, como es el caso de China. El país asiático, emplea su infraestructura de cámaras de CCTV en sus ciudades junto a avanzados centros de procesado de datos para monitorizar a su población. Así como consecuencia, el estado dispone de una herramienta de represión sobre la ciudadanía disidente con el régimen. Otro, es el famoso caso de la empresa estadounidense Clearview AI, la cual recolecta sin permiso fotografías de perfiles de usuarios de redes sociales como Facebook e Instagram para entrenar modelos de reconocimiento de personas. El objetivo de esta empresa sería vender dichos modelos de reconocimiento a las fuerzas del orden de los diferentes países, facilitando así las tareas de reconocimiento de criminales, aunque no especifican para que clase de delitos según que país. Además esta clase de modelos no son infalibles. Ya aparecieron noticias sobre la aparición de falsos positivos, como fue el caso de la estudiante de Brown, Amara K. Majeed acusada erróneamente por las autoridades de Sri Lanka de perpetrar un atentado terrorista tras una errónea identificación por parte de un software de reconocimiento facial. 1 La biometría es el estudio de las características físicas unícas e intransferibles que permiten distinguir a un ser vivo de otro igual, como por ejemplo patrones faciales, huellas dactilares, voz, etc ... 1 2Capítulo 1. Introduccion Es por tanto a raíz de todas estas causas, que en mi ha crecido una profunda curiosidad por conocer como funcionan esta clase de sistemas, y el interés por desarrollar un sistema de detección y seguimiento que minimice la posibilidad de falsos positivos. 1.2 Objetivos El objetivo de este trabajo será el de añadir mejoras sobre un sistema de identificación de rostros previamente implementado en el trabajo final de Ildefonso Jiménez Silva [ 17 ]. Para ello se le dotará de un nuevo entorno de desarrollo gratuito en la nube, el cual facilitará la ejecución de los programas y dotará al usuario de una GPU virtual para realizar el procesado de las imágenes y videos. Además, se agregarán nuevos algoritmos de clasificación y la implementación de un algoritmo de tracking para dotar de mayor robustez al sistema a la hora de realizar identificaciones y no perder referencias 1.3 Organización de la memoria Esta memoria se dividirá en los siguientes capítulos: 1. Introducción: El capítulo actual, en el que se exponen la causas que han motivado a la realización de este proyecto, así como los objetivos a perseguir. 2. Tecnologías de reconocimiento facial : Este capítulo recoge los orígenes de las tecnologías de reconocimiento facial, así como las fases del proceso de reconocimiento y los distintos tipos de algoritmos que se suelen emplear. 3. Redes Neuronales: En este capítulo se explican las bases del modelo matemático y computacional en el que se basan las redes neuronales. 4. Técnicas de seguimiento: En este capítulo se recoge los diversos algoritmos empleados para las tareas de seguimiento, así como se discuten algunas de sus ventajas e inconvenientes a la hora de ser implementados. 5. Sistema propuesto: Aquí se detallarán los pasos que se han seguido para la implementación del sistema. De la misma forma se presentará al entorno de trabajo empleado para realizar dicha implementación. 6. Experimentos: Los experimentos que se llevan a cabo para evaluar el funcionamiento y rendimiento del sistema. Aquí se realizan experimentos basados en la identificación y experimentos basados en el seguimiento. 7. Conclusiones y líneas futuras: Capítulo final en donde se resume el trabajo realizado y en el que se extraen las conclusiones más importantes. A su vez, se proponen líneas de investigación futura para añadir funcionalidades al proyecto. 2 Tecnologías de reconocimiento facial 2.1 Historia del reconocimiento facial El ser humano al igual que el resto de animales, se vale de sus sentidos para reconocer y diferenciar a los miembros de su especie. Su sentido más desarrollado y por ende de mayor complejidad es la visión, que le permite percibir las formas, proporciones y tonos de aquellos elementos que hacen único al rostro de cada individuo. Las tecnologías de reconocimiento facial al igual que los seres humanos, se valen de esta información a la hora de identificar y clasificar rostros, acudiendo a mediciones de elementos como ojos, boca y nariz, a la relación entre sus proporciones o a su textura. La aparición de esta tecnología es relativamente nueva, ya que empezó a ser investigada en la década de los sesenta por W.W Bledsoe y su equipo [ 6 ]. Estos desarrollaron una técnica llamada “reconocimiento hombre-maquina”, que era un sistema semiautomático que requería de un administrador que debía indicar en fotografías la posición de los rasgos faciales de una persona e introducirlos en una base de datos. Luego estos rasgos pasarían a ser comparados a los de otras fotografías en busca de la mínima distancia euclídea. El siguiente paso fue en el año 1988, cuando L.Sirobich y M.Kirby [ 36 ] implementaron la técnica de álgebra lineal conocida como análisis de componentes principales (PCA) para el reconocimiento de rostros. El hito de este avance yace en la capacidad de cifrar en menos de 100 componentes, aquellos que eran necesarios para codificar una cara alineada y normalizada. Posteriormente en el año 1991, M. Turk y A. Pentland [ 38 ] presentan Eigenfaces, un sistema que permite detectar rostros en imágenes, logrando así automatizar la tarea del reconocimiento facial. Gracias a este avance se podría empezar a operar, en teoría, con sistemas en tiempo real. Sin embargo, estos sistemas son sensibles a las condiciones del entorno y dependen de elementos como la iluminación, la expresión de la cara o la ausencia de complementos sobre esta. Es por ello que durante las dos siguientes décadas se incidiría investigar en esta cuestión y aparecerían nuevos trabajos de investigación como la detección de rostros empleando filtros de Garbor [ 26 ], que conseguirían alrededor del 70% de aciertos en el dataset Labeled Faces in the Wild (LFW). Finalmente no fue hasta el año 2012 que AlexNet [ 3 ], una red neuronal profunda (DNN) , se declaró como la ganadora de la ImageNet Large Scale Visual Recognition Competition (ILSVRC) [ 40 ], donde puntuó con un 85.4% de aciertos. Este hito incentivó la investigación en nuevos modelos de aprendizaje profundo (DL), los cuales darían paso a la aparición en 2014 de DeepFace [ 21 ], una DNN que fue capaz de obtener un porcentaje de aciertos del 97.53% en el dataset LFW. 3 4Capítulo 2. Tecnologías de reconocimiento facial 2.2 Fases del sistema de reconocimiento Cualquier sistema de reconocimiento facial puede ser por lo general dividido en cuatro fases: detección, preprocesado, extracción de características y, comparación y clasificación. Figura 2.1 Diagrama de un sistema de reconocimiento. En la primera fase se detectan y localizan los rostros en la imagen. Después se pasa a la fase de preprocesado, en la que se normalizan los rostros mediante operaciones de alineación, escalado, recorte y ecualización. A continuación, se realiza la extracción de características, de la cual se obtiene un vector de información que permiten codificar a cada rostro. Finalmente, en la fase comparación y clasificación, el vector de características es comparado con los otros almacenados en la base de datos y se obtiene un valor de confianza, que permite clasificar o no al rostro como perteneciente al conjunto entrneado. A continuación se presentan las secciones donde se explica con mayor detalle los algoritmos y operaciones que se realizan en cada una de las fases anteriormente mencionadas mencionadas. 2.2.1 Detección La fase de detección es aquella en la que el sistema localiza áreas de una imagen o fotograma que contenga caras para después aislarlas. El escenario más simple al que se puede enfrentar este problema es aquel en el que tenemos control sobre el color del fondo y el cuerpo, como es el caso de las producción de efectos especiales en películas, donde solo necesitan filtrar dicho color para obtener el rostro del actor o actriz. Otra forma simple de resolver el problema sería si de forma anticipada, conociéramos el tono de la piel a detectar, aunque esto podría dar lugar a detectores con sesgo racial. (a) (b) Figura 2.2 Ejemplo de un escenario con aislamiento simple y un detector con sesgo racial. El escenario al que se enfrenta este trabajo no contempla ningún tipo control sobre las condiciones del entorno ni de la persona, por lo tanto, serán requeridos sistemas detección más robustos. Por ello se plantea a continuación los fundamentos de tres métodos, de los cuales se escogerá aquel basado en redes neuronales convolucionales, ya que ofrece la mayor robustez y precisión [5]. 2.2 Fases del sistema de reconocimiento 5 Algoritmo de Viola-Jones En el año 2001, Paul Viola Y Michael Jones [ 39 ] proponen un método de detección de rostros que ofrece la suficiente rapidez como para operar con imágenes de video a 15 fps 1 . Aunque no sea el más robusto de la lista, a día de hoy este algoritmo sigue siendo ampliamente utilizado por numerosas aplicaciones detección de rostros debido a su bajo requisito computacional. El algoritmo de Viola-Jones se basa en el uso de una serie de clasificadores débiles en cascada denominados Haar-like features. El calculo de estos clasificadores se obtiene realizando el producto escalar entre la imagen y patrones con forma rectangular que indican la diferencia de intensidad de luces entre regiones adyacentes tal y como se indica en la Figura 2.3 (a) (b) Figura 2.3 Haar-Cascade feautres aplicadas a una imagen. A partir de estos productos escalares, obtenemos imágenes positivas (imágenes que contienen caras) e imágenes negativas (imágenes que no contienen caras), las cuales son empleadas como datos de entrenamiento para AdaBoost, un algoritmo de Machine Learning que obtiene como resultado, clasificadores fuertes a partir de una serie clasificadores débiles. Método de los Histogramas de Gradientes Orientados Ya para el año 2005, Navneet Dalal y Bill Triggs [ 10 ] presentan un algoritmo de detección basado en la información obtenida a partir de la variación del gradiente de luminosidad de los píxeles de una imagen. Aunque su primer uso estuvo orientado a la detección de peatones, fue implementado con relativa rapidez a la detección de rostros, ya que con una menor fase de entrenamiento, el algoritmo obtenía mayor porcentaje de detecciones y menos falsos positivos respecto al algoritmo de Viola-Jones[30] El método de los Histogramas de Gradientes orientados (HOG) se compone de cinco pasos: •Transformación a escala de grises: el primer paso es transformar la imagen a una escala de grises, así el algoritmo operará sobre el valor de luminosidad de los píxeles. •Cálculo de gradientes: a continuación, se calcula el operador gradiente para cada uno de los píxeles en la imagen. Para ello, hay que aplicar la definición de operador gradiente a las direcciones horizontal y vertical. Esta operación refleja la variación en la luminosidad de los píxeles situados de izquierda a derecha, y de arriba a abajo. •División en bloques: una vez calculados los gradientes, se define un rango de orientaciones por subregiones que irán desde 180 grados (gradiente sin signo) hasta 360 grados (gradiente con signo). Se realizan divisiones por celdas sobre la imagen de tamaño 6 x 6, 8 x 8 o 16 x 16 pixeles. Por ejemplo, para un total de 9 subregiones de un gradiente sin signo [ 10 ], se 1 Los cuadros por segundo o frames per second (FPS) son la unidad de medida que indican la velocidad de refresco de imágenes en un vídeo 6Capítulo 2. Tecnologías de reconocimiento facial agrupan a los gradientes de cada celda en histogramas, para contar que cantidad de estos se haya en cada una de las subregiones que irán desde 0ºa 20º, 20ºa 40º,etc... •Normalización de histogramas: las imágenes contienen áreas donde luces y sombras resultan predominantes, dando como resultado variaciones indeseadas de los niveles de los histogramas. Para reducir este efecto se toman dichos histogramas de las celdas del paso anterior y se agrupan por bloques. Para cada bloque, se concatenan los histogramas de forma que se obtiene un vector y se calcula su norma. Figura 2.4 Representación gráfica de los pasos realizados para obtener una imagen HOG. Figura 2.5 Ejemplo de una imagén descrita a partir de sus HOG features. •Localización: finalmente para realizar la localización se aplica una plantilla de un rostro genérico previamente modelado de una imagen HOG sobre la imagen. Figura 2.6 Plantilla de un rostro genérico HOG. Redes Neuronales El método más preciso y robusto, dado que es capaz hasta de detectar rostros de perfil. A su vez es el de mayor coste computacional, ya que no pudo ser implementado de manera ágil hasta que en el año 2009 se presento el trabajo de investigación de Rajat, Madhavan y Andrew [ 31 ], en el, que se demostraba que el uso de tarjetas gráficas (GPU) aceleraba las fases de entrenamiento de modelos de aprendizaje basados en Machine Learning hasta 70 veces, en comparación con las clásicas CPU multinúcleos. Gracias a este avance, comenzó una revolución en el desarrollo de modelos de redes 2.2 Fases del sistema de reconocimiento 7 neuronales, ya que lo que anteriormente hubiese tomado semanas de entrenamiento e incluso meses, ahora requería solo de horas para poder entrenar a un modelo. Para este trabajo se ha empleado una red neuronal ya pre-entrenada del tipo convolucional con arquitectura ResNet [ 15 ]. Este tipo de arquitectura se caracteriza por sumar a la salida de sus capas de convolución el resultado de las anteriores. Esta característica ofrece como ventaja una disminución en los tiempos de entrenamiento y de la función de error, así como una solución al problema del desvanecimiento del gradiente [16]. Los conocimientos y conceptos relacionados a la teoría sobre este tipo de arquitecturas serán desarrollados en profundidad en los capítulos 3 y 5 de este trabajo. Figura 2.7 Arquitectura de una red neuronal tipo ResNet. 2.2.2 Preprocesado La fase preprocesado sirve para normalizar y alinear los rostros obtenidos durante la detección. Realizando transformaciones geométricas sobre la imagen, el objetivo de esta fase es el de preparar a los rostros detectados para una correcta extracción de características. El preprocesado consta de las siguientes operaciones: •Rotación: Normalmente los rostros contienen cierta inclinación en la imagen, por lo que es necesario rotarlos para alienarlos y facilitar la tarea del clasificador. Para realizar esta operación, se puede utilizar como método de alineación la referencia de la línea de los ojos. •Escalado: Los algoritmos de escalado permiten reducir o aumentar el tamaño de la imagen, así como realizar zoom a determinadas partes. Para conseguir que todos los rostros tengan las mismas proporciones, se vuelve a utilizar la distancia entre ojos para calcular la ratio de aumento o disminución del tamaño de la imagen. •Recorte: La operación de recorte sirve para tomar la imagen de la región en la que se haya un rostro. Dado que la imagen se trata de una matriz de píxeles, para seleccionar la región a recortar solo se deberá de seleccionar a la submatriz de píxeles que delimitan al rostro. •Ecualización del histograma: Las imágenes pueden presentar variaciones de luminosidad y contraste, lo que puede dar lugar a que imágenes similares presenten diferentes niveles de iluminación en sus píxeles. Aplicando ecualización a los histogramas, se consigue que, imágenes que concentren la mayor parte de sus píxeles en una región del histograma, pasen a extenderse por todo su rango. Como resultado, se obtienen imágenes con mayor contraste y mejor diferenciación de los rasgos 2.2.3 Extracción de características La extracción de características consiste en la obtención de información relevante de un rostro mediante la reducción de redundancias y características irrelevantes [ 37 ]. Existe una amplia variedad 14 Capítulo 3. Redes Neuronales 3.1.3 Deep Learning Los modelos de computación basados en aprendizaje profundo o Deep Learning son aquellos que se componen de múltiples capas de procesamiento que se dedican a aprender representaciones de datos a múltiples niveles de abstracción [22]. Utilizan arquitecturas basadas en Redes Neuronales, ya que estas permiten realizar el aprendizaje de forma jerarquizada a través de diferentes capas de neuronas. Por ejemplo para el caso de una cara, en las primeras capas una red puede aprender los elementos individuales que conforman la cara (ojos, boca, nariz ...), en las posteriores que estos poseen texturas, que se localizan en una determinada región del rostro, y que existen distancias y proporciones entre estos. Finalmente abstrae todos estos conocimientos, aprendiendo a identificar un rostro y a diferenciarlo de otros. Figura 3.1 Diagrama de jerarquías del aprendizaje maquina . 3.2 Arquitectura La arquitectura de una red neuronal se puede definir como un grafo cuyos nodos (neuronas) se organizan por niveles (capas). Las neuronas de cada capa se hayan conectadas por su entrada, a la salida de las neuronas de la capa anterior y estas a su vez, conectan su salida a las entradas de las neuronas de la capa posterior, tal y como se representa en el ejemplo de la figura 3.2. Figura 3.2 Arquitectura básica de una red neuronal. La capa de entrada (input layer) recibe los datos de entrada y la capa de salida (output layer) devuelve la predicción realizada por la red. Las capas intermedias se denominan capas ocultas 3.2 Arquitectura 15 (hidden layers), y aunque en el ejemplo de la figura 3.2 aparezcan solo tres, se pueden añadir a la red tantas capas con diferentes números de neuronas como se desee, dotándola así de mayor complejidad y profundidad (Deep Neural Network). 3.2.1 Neuronas La neurona es la unidad básica de procesamiento de una red neuronal. Esta representa el conjunto de soluciones de un problema de regresión lineal, el cual viene descrito por la suma de los valores de sus conexiones de entrada xj , ponderadas por una serie de pesos ωj y sumadas a un parámetro de sesgo b. Figura 3.3 Arquitectura de una neurona. Este es el modelo en el que se basa la idea más básica de neurona: el perceptrón [ 33 ]. La solución del perceptrón, presentada en 1957 por Frank Rosenblatt, define un hiperplano que establece una región de decisión para el problema de clasificación. Sin embargo, este modelo presenta serias limitaciones ya que solo puede resolver problemas lineales. Esto significa, que el modelo nos limita únicamente a problemas de clasificación que podamos resolver empleando únicamente una recta, tal y como se muestra en la figura 3.4. (a) (b) Figura 3.4 Soluciones a problemas de clasificación utilizando un perceptrón. En la figura 3.4a podemos resolver el problema de clasificación de las clases naranja y azul empleando un único perceptrón, sin embargo, en la figura 3.4b no. Para resolver este problema se podría plantear el uso de varios perceptrones para modelar la geometría de la región, sin embargo, resultaría inútil dado que el resultado de emplear grupos de perceptrones en serie y paralelo acaban por colapsar dando como resultado un único perceptrón. Para ello hace falta la introducción de un nuevo elemento matemático: la función de activación 16 Capítulo 3. Redes Neuronales La función de activación El objetivo de la función de activación es transformar el valor a la salida de una neurona a través de una función a(z) , para que esta pase de ser lineal a no lineal y desarrollar así sistemas de mayor complejidad geométrica. Para ello se propone el uso de un conjunto de funciones denominadas de activación que aportan esta serie de no linealidades a la salida de la suma ponderada de la neurona. Figura 3.5 Funciones de activación. En el libro Perceptrons [ 24 ] del año 1968, Marvin y Minsky explicaban la limitación del modelo del perceptrón proponiendo como ejemplo, la imposibilidad de modelar una puerta lógica XOR. Así para resolver el ejemplo de la figura 3.4b, se podrían asignar a las clases azul y naranja los 0sy 1sde la salida del problema de la puerta lógica. Utilizando así para resolver este problema una única capa oculta con tres neuronas y una función de activación ReLU, se puede obtener la siguiente solución al problema de clasificación tal y como se presenta en la figura 3.6. Figura 3.6 Solución al problema de clasificación de la puerta lógica XOR. 3.3 Redes Neuronales Convolucionales Hasta ahora, la arquitectura de las redes neuronales se ha presentado como un conjunto de capas de neuronas, en donde cada neurona de cada capa se haya conectada a cada una las neuronas de las capas anterior y posterior. Este modelo de capas interconectadas, que es denominado como denso (dense layers), no es eficiente a la hora de trabajar con imágenes. Esto es así porque al estar las imágenes compuestas de píxeles codificados a partir de canales de color, hace falta una neurona para cada píxel de la imagen, dando como resultado un elevado número neuronas y parámetros que incrementarían de forma seria los costes de computación de la red. 3.3 Redes Neuronales Convolucionales 17 Para exponer cuan costosa sería esta arquitectura, deberíamos de saber que solo para una neurona de la primera capa oculta se requeriría de un número de parámetros igual a Píxeles Altura x Píxeles Anchura x Canales de color + 1 , siendo el +1 el parámetro sesgo de la neurona. Es decir, que para una imagen de por ejemplo, 300 x 300 píxeles codificada con canales RGB (rojo, verde y azul), harían falta 270.001 parámetros para cada neurona de la primera capa. Las redes neuronales convolucionales (CNN) son una arquitectura particular de las redes neuronales artificiales, que funcionan de manera excelente en tareas de reconocimiento de patrones en imágenes. Para ello se valen de dos nuevos tipos de capas denominadas de convolución y de pooling , donde se realizan las operaciones para la extracción de características geométricas de la imagen. Así en las primeras capas ocultas la red detecta formas simples como curvas y aristas, que se propagan a lo largo de las siguientes capas de convolución, donde se jerarquiza el aprendizaje desde los elementos más simples a aquellos de mayor complejidad, hasta llegar finalmente a las capas densas donde se realizará la clasificación. Figura 3.7 Diagrama de una red neuronal convolucional. 3.3.1 Capa de convolución La capa de convolución extrae los patrones de la matriz de datos de entrada. Para ello se vale de los kernels, matrices de tamaño NxN que almacenan los valores de los pesos ω de las neuronas, y sirven para definir los filtros. El kernel opera desplazandose a lo largo de la matriz de datos de entrada, realizando series de productos y sumas de filas por columnas, cuyo resultado es almacenado a su salida en una nueva matriz denominada como mapa de caracteristicas omapa de activación. Figura 3.8 Ejemplo de la operación de convolución de un kernel de tamaño 3x3. A consecuencia de esta operación, se reduce el tamaño del mapa de características respecto a la matriz de datos de entrada. Para evitar esto se realiza el padding, una operación que consiste en agregar ceros alrededor de los bordes de la matriz de entrada. Además del padding, existe un parámetro adicional denominado stride, que indica el número de celdas sobre las que se desplaza el 18 Capítulo 3. Redes Neuronales kernel para cada paso de operación realizado sobre la matriz de entrada. Así el tamaño del mapa de características a la salida se puede calcular a partir de la siguiente formula: F=N+2P−F S+1(3.1) Donde: •F = Tamaño de la matriz de salida. •N = Tamaño de la matriz de la matriz de entrada. •P = Parámetro de padding, por defecto vale 0. •S = Parámetro de stride, por defecto vale 1. 3.3.2 Capa de pooling Las capa de pooling se emplea para simplificar aquellos valores que se hayan semánticamente próximos dentro del mapa de características, para así evitar el problemas durante la fase de entrenamiento como el overfitting [ 29 ]. La función más empleada es Max-pooling , que define una submatriz de tamaño MxM con stride M sobre el mapa de características, y que da a su salida una matriz que contiene los mayores valores del mapa de características. Figura 3.9 Ejemplo de una operación de Max-pooling con una matriz de tamaño 2x2. 3.4 Entrenamiento En el año 1968, Marvin y Minsky expusieron en su libro Perceptrons [ 24 ] el principal problema que limitaba el aprendizaje de las redes neuronales. Hasta ese momento para calcular los valores de los pesos de las neuronas, se empleaba un algoritmo de fuerza bruta que si bien resultaba útil para el cálculo de parámetros en el perceptrón, no era posible de escalar sobre arquitecturas de sistemas con mayor números de capas y neuronas. Este hecho dio lugar el llamado invierno de la Inteligencia Artificial (AI Winter), un periodo de más de quince años por el cual, la investigación de sistemas basados en aprendizaje automático se vio detenida. Sin embargo, en el año 1986 Rumelhart, Hinton y Williams [ 34 ] presentaron un trabajo de investigación que proponía un nuevo método para auto-ajustar los parámetros de la red neuronal a través del cálculo de las derivadas de sus errores y su propagación. Hablamos del algoritmo de backpropagation. 3.4 Entrenamiento 19 3.4.1 Algoritmo de backpropagation El algoritmo de backpropagation está basado en la teoría del conocido algoritmo del descenso del gradiente (SGD). La intuición que se esconde tras este algoritmo es la de calcular el valor del error a la salida de un modelo matemático en un punto de su función, calculando en el proceso sus derivadas parciales. Mediante estos cálculos obtenemos un vector gradiente ∇f que nos indica la dirección de la pendiente de la función error de nuestro modelo, es decir: en que dirección se incrementa el error de la predicción. Tomando de nuevo un punto en el sentido opuesto a la dirección de crecimiento, volvemos a operar ∇f sobre la función de error de forma iterativa, hasta llegar finalmente al óptimo global. Cuando inicializamos una red neuronal, los valores de los parámetros ω ybde las neuronas serán valores aleatorios, y en consecuencia darán como resultado predicciones erróneas a la salida de la red. Las funciones y parámetros que definen las relaciones matemáticas dentro una red neuronal son: •C(aL) como la función de coste que determina el error a la salida de la red y cuyo parámetro de entrada es la función aL(zL). •aL(zL) como el valor a la salida de la función de activación de una neurona en la última capa y cuyo parámetro de entrada es la función zL(wL ,bL). •zL(wL ,bL) como el valor a la salida de la suma ponderada de los pesos wL y el sesgo bL de una neurona en la última capa. Su ecuación es: zL=wL·xL+bL(3.2) Para actualizar los valores de los parámetros de una neurona, estudiamos la variación del error a la salida de la red como la derivada parcial de la función de coste C , respecto de los pesos y sesgo ωLybL: ∂C ∂ ωL=∂C ∂aL·∂aL ∂zL·∂zL ∂ ωL(3.3) ∂C ∂bL=∂C ∂aL·∂aL ∂zL·∂zL ∂bL(3.4) Esta expresión que es únicamente válida para una neurona de la última capa, es el resultado de aplicar la regla de la cadena sobre la derivada parcial de la función de coste C , donde cada derivada expresa cada uno de los siguientes significados: •∂C ∂ ωLcomo la variación del valor de la función de coste, respecto al peso ωL. •∂C ∂bLcomo la variación del valor de la función de coste, respecto al sesgo bL. •∂C ∂aLcomo la variación del valor de la función de coste, respecto a la función de activación. •∂aL ∂zL como la variación del valor a la salida de la función de activación, respecto al valor de la suma ponderada. •∂zL ∂ ωLcomo es la variación del valor a la salida de la suma ponderada, respecto al peso ωL. •∂zL ∂bLcomo la variación del valor de la suma ponderada, respecto al sesgo bL. De las expresiones 3.3 y 3.4, podemos simplificar el termino ∂C ∂aL·∂aL ∂zL por uno nuevo denominado δL . A este valor lo denominaremos como error imputado a la neurona, y nos indicará como cambia el valor del error a la salida de la red frente a un pequeño cambio en el valor de de la suma ponderada zL de una neurona de la última capa. La derivada parcial ∂zL ∂bL es 1, ya que es la derivada parcial 20 Capítulo 3. Redes Neuronales respecto al termino independiente y ∂zL ∂ ωL es igual a aL−1 i , que es el valor a la salida de la función de activación de una neurona de la capa previa. De esta forma las ecuaciones se simplifican y quedan como: δL=∂C ∂zL(3.5) ∂C ∂ ωL=δL·aL−1 i(3.6) ∂C ∂bL=δL(3.7) Sin embargo, estas ecuaciones solo determinan como se ve afectado el error a la salida, frente a variaciones de los parámetros ω ybde las neuronas en la última capa. Si aplicamos el mismo razonamiento que en 3.3 y 3.4, para las neuronas de la capa L-1 y aplicando la regla de la cadena se obtiene la siguiente expresión: ∂C ∂ ωL−1=∂C ∂aL·∂aL ∂zL·∂zL ∂aL−1·∂aL−1 ∂zL−1·∂zL−1 ∂ ωL−1(3.8) ∂C ∂bL−1=∂C ∂aL·∂aL ∂zL·∂zL ∂aL−1·∂aL−1 ∂zL−1·∂zL−1 ∂bL−1(3.9) Estas ecuaciones obtenidas se pueden simplificar de nuevo de manera fácil, ya que ∂aL−1 ∂zL−1 es igual a la derivada de la función de activación aL−1 , ∂zL−1 ∂ ωL−1 es igual a la función de activación aL−2 y ∂zL−1 ∂bL−1 es igual a 1. Nos queda la derivada ∂zL ∂aL−1 , que una vez calculada resulta la matriz de parámetros WL que conectan ambas capas, lo que nos hace propagar el error de la capa posterior a la anterior. Finalmente el algoritmo de backpropagation se presenta resumidamente como una iteración en tres pasos a realizar para cada una de las neuronas de nuestro sistema: 1. Calcular el error de computo de la última capa: δL=∂C ∂zL(3.10) 2. Retropropagar el error a la capa anterior: δl−1=Wlδl·∂al−1 ∂zl−1(3.11) 3. Calcular las derivadas de la capa usando el error anterior: ∂C ∂bl−1=δl−1(3.12) ∂C ∂ ωl−1=δl−1al−2(3.13) 3.4.2 Resultados y datos de entrenamiento El proceso de entrenamiento de una red neuronal es largo y complejo. Para empezar se parte de un conjunto de datos (dataset) que debe de contener un número elevado de muestras y al mismo tiempo, estas deben de ser lo suficientemente representativas y libres sesgos para que la red pueda 3.4 Entrenamiento 21 realizar predicciones de la manera esperada. Así, a la hora de entrenar una red se pueden esperar dos posibles resultados: •No convergencia : Tras aplicar SGD mediante backpropagation, no se llega a un punto donde el valor de la derivada de la función de error se mantenga estable alrededor de la región del cero. Es decir, no se haya solución estable al problema. •Convergencia : Tras aplicar aplicar SGD mediante backpropagation, la red alcanza un punto de equilibrio donde la derivada de la función de error y los pesos se mantienen próximos a cero. Aunque sin embargo, que el error se mantenga estable no es sinónimo de que la red haga predicciones de forma correcta, ya que esta se puede hallar en alguno de los siguientes tres escenarios. – Subajuste o Underfitting : Este caso ocurre cuando el conjunto de datos empleados para entrenar la red resulta insuficientemente representativo como para realizar una extracción generalizada de conocimiento. Como consecuencia, la red realiza predicciones erroneas. – Sobreajuste o Overfitting : Este caso ocurre cuando la complejidad de la red es tan elevada que se acaba por sobreespecializar en el conjunto de datos de entrenamiento. El resultado de esto es que realizan predicciones correctas con los datos de entrenamiento, pero sin embargo es incapaz de extraer el conocimiento para aplicarlo a nuevos datos de entrada. – Entrenamiento Correcto : el caso deseado, en donde la red ha sido capaz de extraer el conocimiento y realizar predicciones con un elevado porcentaje de aciertos. Para garantizar un correcto entrenamiento de nuestra red, es por tanto necesario disponer de una base de datos de entrenamiento amplia y variada. Para ello existen técnicas como el Data Augmentation [ 23 ], a través de la cual obtenemos nuevos datos de entrenamiento a partir de los datos originales ya etiquetados (aprendizaje supervisado). En el caso de las imagenes esta técnica se aplica agregando ruido, realizando rotaciones, traslaciones, aumentos, etc . . . Figura 3.10 Ejemplo de operaciones de Data Augmentation para imagen de la BBDD. Finalmente para validar nuestro modelo hace falta el uso de datos de validación, los cuales podemos obtener de nuestra base de datos de entrenamiento realizando previamente una división entre dichos datos, asignando un valor de entre el 70%-80% como datos para entrenar a la red y el 30%-20% para validar la red. 4 Técnicas de seguimiento 4.1 Introducción y desafíos al seguimiento de rostros La s técnicas de seguimiento de objetos (object tracking) consisten en el conjunto de operaciones para la detección y seguimiento de objetos (agentes) en secuencias de imágenes de vídeo, en las que se conserva la identidad y localización de dicho agente en todo momento. La aproximación clásica al problema de seguimiento se basa en la utilización de filtros para la predicción de trayectorias junto a la implementación de una función de error. Esta función permite comparar los resultados obtenidos por la predicción de dicho filtro frente al valor medido a partir del detector, los cuales pasan a ser procesados a través de un bucle de retroalimentación en el que se actualizará el próximo valor volcado por el filtro predictor. Esta solución, aunque correcta, no es sencilla de implementar en escenarios carentes de restricciones. En el caso de los rostros, la perdida de la referencia de la cara en una secuencia de vídeo provocará la desactualización de los valores predichos por el filtro y en consecuencia, actualizaciones abruptas de la función de error que harán que el sistema de seguimiento sea poco preciso. Algunas de las causas tras las que se esconden la razón para que se produzca dicha perdida de la referencia son, por ejemplo: •Que el rostro esté rotado en un cierto ángulo que impida su detección. •Condiciones de iluminación adversas. •Oclusiones parciales o totales del rostro debido a obstáculos. Es por ello que para este trabajo, se propone una aproximación diferente al seguimiento predictivo: el seguimiento por detecciones. Una nueva aproximación al problema de seguimiento que tomará en su lugar la información referente a los N agentes detectados en un frame L-1, que pasarán a ser compararados con los M agentes detectados en un frame L, mediante la utilización de una función de costes y un algoritmo de reasignación de identidades. En este nuevo paradigma, tres son los principales errores que podremos encontrar en nuestro sistema: •Falsos negativos: producidos por fallos en la detección de los agentes. •Falsos positivos: causados por la asociación de un objeto distinto al agente a detectar. •Intercambios en la identidad debido a una asociaciones equivocas entre agentes. Estos errores (especialmente los falsos positivos y negativos) se pueden ver incrementados drásticamente debido a la falta de precisión por parte del detector, razón que motiva a que se requieran sistemas de seguimiento robustos. 23 30 Capítulo 5. Sistema Propuesto GPU de este conjunto de tarjetas según su disponibilidad, por lo que no será posible seleccionar un modelo concreto con el que operar. Librerías El sistema hace uso de las siguientes librerias •Numpy [ 27 ]: (versión 1.18.5) es la librería de Python empleada para realizar operaciones con matrices y vectores. •OpenCV [ 7 ]: (versión 4.1.2) es la librería con funciones empleadas en aplicaciones de visión artificial. •Face_Recognition [ 14 ]: (versión 1.3.0) es la librería utilizada para la detección, preprocesado y extracción de características de rostros en imágenes. Por defecto utiliza el método HOG [ 10 ] para la detección, sin embargo para este trabajo se utilizará la CNN ya que es más eficiente [5]. •dlib [ 20 ]: (versión 19.18.0) esta librería escrita en C++ y adaptada para Python, incluye multitud de funcionalidades basadas en machine learning, entre las que se incluyen la CNN a emplear en este trabajo. •Scikit-Learn [ 8 ]: (versión 0.22.2.post1) es la librería a través de la que se implementarán los diversos algoritmos de clasificación estudiados en este trabajo. •Funciones decoradoras : los decoradores o "decorator functions", son una utilidad de metaprogramación disponible en Python. Gracias ellas podemos tomar funciones ya existentes y agregar nuevas funcionalidades. En este trabajo se han implentado decoradores de las librerías functools,time ytypying para crear funciones decoradoras que nos permitan comprobar los tiempos de ejecución de las diferentes procesos relacionados a la ejecución de los algoritmos y sus subprocesos. 5.2 Estructura del sistema En esta sección, se expondrán los diferentes métodos empleados para la implementación del sistema de detección, reconocimiento y seguimiento de rostros propuestos para este trabajo. 5.2.1 Detección, preprocesado y extracción de características El método empleado para este sistema será la CNN de arquitectura ResNet [ 15 ] ofrecida por la librería Face Recognition. El fin de esta arquitectura es el de implementar una serie de conexiones denominadas de salto o "skip" en las primeras capas de la CNN para mejorar su fase de entrenamiento y precisión en las predicciones. La razón de introducir estos saltos, se debe a la aparición del problema del desvanecimiento del gradiente o vanishing gradient [ 16 ], problema común en redes neuronales con elevados números de capas. Este problema se relaciona junto al ya presentado algoritmo de backpropagtion y se debe a que al aplicar dicho algoritmo, los valores de los gradientes resultados de ajustar los pesos de las neuronas de una capa L, se van viendo reducidos a medida que dicha capa está más alejada de la última capa de la red (primeras capas). Analíticamente este fenómeno ocurre ya que al aplicar la regla de cadena sobre las derivadas de las funciones de coste de cada capa, la acumulación de productos de las derivadas parciales acabarán convergiendo alrededor del cero (cambios aplicados sobre los pesos de las neuronas imperceptibles). Una vez la cara haya sido detectada por la red, esta pasará a ser preprocesada y se extraerá su vector de características, codificandolo como un vector de 128 dimensiones. Dichas componentes 5.2 Estructura del sistema 31 Figura 5.1 Diagrama de una conexión de salto (skip) sobre una capa de una red tipo ResNet. carecen de un significado físico como tal, por lo que únicamente caben a ser interpretadas por la red. Esta red está basada en el modelo de la librería dlib cnn_face_detection_model_v1, y ha sido entrenada a partir de más de tres millones de imágenes de rostros procedentes de los datasets face scrub[ 28 ] y VGG [ 42 ], siendo esta red validada mediante el dataset LFW con un 99.38% aciertos según su creador. 5.2.2 Clasificación y comparación En esta fase, el sistema de reconocimiento crea los modelos de clasificación a partir de los vectores de características de 128 dimensiones extraídos en la fase anterior. Para ello, se dará la posibilidad de emplear la librería de Python sklearn, para implementar los diferentes algoritmos de clasificación expuestos en este trabajo. Los parámetros que se recomiendan modificar para cada uno de los siguientes clasificadores a la hora de experimentar son: •Multilayer Perceptron : Este clasificador se basa en el modelo ya expuesto de la sección 3.2.1. Los valores de los parámetros que se recomiendan modificar son numero de capas (activation), número de neuronas y función de activación (hidden_layer_sizes). •K-Nearest-Neighbours : El parámetro recomendado a modificar para este clasificador será el número de vecinos (n_neighbours), que por defecto será 5. •Random Forest : El parámetro recomendado a modificar para este clasificador será el número de estimadores empleados (n_stimators), que por defecto será 100. •State Vector Machine : El parámetro recomendado a modificar para este clasificador será el tipo de kernel empleado, que por defecto será una función de base radial (kernel=’rbf’) 5.2.3 Algoritmo de seguimiento El algoritmo de seguimiento empleado en este trabajo será el método de seguimiento por detecciones ya expuesto en la sección 4.2.3 de este trabajo. Debido a que el enfoque de este sistema pretende ser lo más generalista, rápido y preciso posible, se ha optado por el uso de métricas de seguimiento basadas en la comparación de distancias euclídeas entre los rostros detectados y el uso del algoritmo de asignación greedy. El algoritmo comienza detectando un rostro en la secuencia de video, creando un objeto a través de la clase Object() y asignando a este una serie de características identificatorias (localización, encodings, tiempo desaparecido en la secuencia, etc...). Una vez creado el objeto este pasa a ser asignado a una lista de objetos activos en seguimiento a través de la clase FaceTracker(), la cual realizará el siguiente conjunto de acciones cada vez que se aplique el método de actualización update(): 32 Capítulo 5. Sistema Propuesto 1. Asignar el rostro a una lista de objetos activos en seguimiento. 2. Asignar las caras detectadas en el frame anterior a la caras detectadas en el frame actual, aplicando la distancia éuclidea como métrica de comparación y el algoritmo greedy como método de asignación. 3. En el caso de que un rostro que estuviera en activo no haya sido detectado, iniciar un contador. Dicho contador es reiniciado si el rostro se vuelve a detectar dentro de un periodo de tiempo determinado. 4. En caso de que un rostro no vuelva aparecer en el periodo de tiempo establecido, borrar el objeto asociado a dicho rostro. 5. Asignar el rostro nuevo detectado a un objeto de la clase FaceTracker(). 5.3 Interfaz del Sistema 5.3.1 Instalación y orden de los directorios La interfaz del sistema será el ya citado entorno Google Colaboratory. Para ello primero deberemos abrir un navegador web y acceder a nuestra cuenta de Google Drive. Desde ahí accedemos a la aplicación de Google Workspace Marketplace y vinculamos nuestra cuenta de Drive a la aplicación de Colaboratory. Una vez vinculada la aplicación, habrá que descargar el archivo comprimido del repositorio indicado al principio del capitulo, descomprimir dicho archivo y subir su contenido al directorio raíz del sistema de almacenamiento de Google Drive. El directorio /Programa se divide a su vez en los siguientes subdirectorios y ejecutables: •Principal.ipynb : Es el archivo principal del programa en formato ".ipynb". La primera vez que se abra será necesario configurarlo para que procese mediante GPU. Para ello hay que acceder a la pestaña Runtime −→Change runtime type −→hardware accelerator −→GPU. Figura 5.2 Menú del archivo Principal.ipynb. •Personas : aquí se almacenan las imágenes de entrenamiento para generar los archivos .pkl con los que entrenar a los clasificadores. Este directorio se divide a su vez en subdirectorios que contendrán el conjunto de imágenes de entrenamiento del modelo de cada persona. Se recomienda que en dichas imágenes se halle única y exclusivamente la persona que se desee reconocer, en la mayor variedad de estilos y poses. Además se recomienda que el número mínimo de imágenes por directorio sean 30. •Model : aquí se almacenan los archivos en formato .pkl de los rostros que han sido codificados para entrenar a los clasificadores del sistema. Existen dos clases de archivos, "name.pkl" que contiene los vectores codificados y etiquetas de cada rostro del directorio /Personas y "name_clasifier.pkl", que contiene el modelo generado por el tipo de clasificador. •Imágenes : en este directorio se almacenan las imágenes en formato .jpg o .png que se deseen testear mediante el sistema. •Vídeos : en este directorio se almacenan los vídeos en formato .mp4 o .avi que se deseen testear mediante el sistema. 5.3 Interfaz del Sistema 33 5.3.2 Inicialización y ejecución El archivo "Principal.ipynb" está dividido en diferentes grupos de celdas. Cada celda se puede ejecutar pulsado el botón "play" situado en la región superior izquierda. La primera celda siempre se debe ejecutar para iniciar el programa, pues sincroniza nuestro directorio Drive con la aplicación, a la vez que instala e importa las librerías a emplear. A la salida de su ejecución, nos pedirá que accedamos a un enlace a través del cual obtendremos una clave de sincronización de directorios. Accedemos a enlace, copiamos la clave facilitada en el portapapeles y la introducimos en la ventana. Figura 5.3 Ventana de sincronización de directorios. Una vez ejecutada exitosamente la primera celda, se podrán ejecutar las siguientes secciones del programa. Entrenamiento - Clasificación de modelos En esta sección se ejecutan las celdas mediante las que obtenemos los archivos .pkl: • La primera celda ejecuta las funciones para crear el fichero "Names.pkl" que contiene las etiquetas y vectores extraídos tras el análisis de las imágenes del directorio /Personas. Figura 5.4 Resultado en tiempo de ejecución de extracción de características de un individuo. • La segunda celda ejecuta las funciones que crean los ficheros en formato .pkl de los clasificadores a entrenar. Cada función estará inicializada con un determinado valor en sus parámetros, aunque se anima a experimentar a variar sus valores según las indicaciones de la sección 5.2.2. Figura 5.5 Resultado en tiempo de ejecución de los modelos de clasificación. 34 Capítulo 5. Sistema Propuesto • La tercera celda define clases orientadas al procesado de imágenes de entrada y umbral de similitud para ser considerado como correcto (se suele recomendar un valor de confianza mayor o igual al 80%). También se establece que clasificador se empleará por parte del sistema de reconocimiento. Finalmente se dispone de un apartado de experimentos, donde se podrán realizar diversas pruebas para determinar la robustez del sistema de reconocimiento de rostros en imágenes. Figura 5.6 Identificación de tres rostros entrenados en una imagen aplicando un clasificador SVM. Video-Tracking En esta sección se ejecutan las celdas para poner en marcha el sistema de procesado de vídeo: • La primera y segunda celda sirven tanto para inicializar las clases que realizan el procesado de los frames de los vídeos, como para generar objetos que identifiquen a los rostros seguidos. La clase FaceTracker() es la encargada de aplicar las métricas de seguimiento expuestas para este sistema. Además se incluye una variación del sistema de bounding boxes para asignar un color diferente a cada rostro y así hacer más sencillo el seguimiento visual. Una vez ejecutadas estas celdas se podrá proceder a las celdas de experimentación, donde se podrá poner a prueba el sistema de seguimiento mediante secuencias de vídeo. Figura 5.7 Ejemplo de un frame al que se le ha realizado video-tracking. 6 Experimentos y Resultados En este capitulo se recogen los diferentes experimentos que han sido considerados como de interés para determinar tanto la fiabilidad, como la robustez del sistema propuesto para este trabajo. Para ello se proponen tres experimentos: uno para la determinación de un clasificador óptimo, otro para determinar un umbral de confianza óptimo y un último relacionado a la robustez del sistema de seguimiento. 6.1 Experimento 1: Determinación de clasificadores óptimos Para este experimento se ha decidido comparar la eficiencia de los cuatro algoritmos de clasificación de rostros presentados en este trabajo con el fin de determinar un clasificador óptimo. Dichos clasificadores son el Multi Layer Perceptron,K-Nearest Neighbours,Random Forest yState Vector Machines. Cada clasificador opera de forma parecida: primero toma un vector de encodings de 128 dimensiones a la entrada, lo procesa y devuelve a la salida una etiqueta con la predicción de la persona identificada y un porcentaje de confianza con el que la realiza . La etiqueta puede contener o bien el nombre de una las personas con las que se ha entrenado el clasificador, o bien el valor "Unknown" en caso de que la confianza del sistema no haya superado el valor de umbral requerido para hacer una asignación. Partiendo de esta premisa, se propone un experimento en el que estos clasificadores en lugar de tomar como entrada los valores codificados del vector de características de una cara, toman en su lugar vectores construidos a partir de valores aleatorios. Es decir, que a través de un elevado número de muestras aleatorias, se puede determinar que clasificador ofrece la confianza media más baja y en consecuencia el menor número de falsos positivos. Para ello primero se ha construido una base de datos con imágenes de personas que serán empleadas para construir los clasificadores. Dichas personas de esta base de datos se tratan en total de diez personajes públicos y famosos, de los que se han tomado treinta imágenes de cada uno a través de internet. El criterio para seleccionar estas imágenes de entrenamiento es que la persona en cuestión se halle exclusivamente en la imagen y tenga la cara despejada, aunque también se admiten algunos complementos como gafas de ver, de sol o auriculares. También otro criterio que ha sido seguido para seleccionar a dichas personas ha sido la variedad de tonos de piel, raza y género, con el fin de así determinar si el sistema se comporta mejor o peor ante diferentes individuos. Una vez generada la base de datos, toca generar los diferentes clasificadores realizando modificaciones sobre sus parámetros de entrenamiento y a continuación, introducir una matriz de 1000 vectores aleatorios de 128 dimensiones. En los siguientes apartados se pueden comprobar los resultados obtenidos de dichos experimentos para cada clasificador. 35 36 Capítulo 6. Experimentos y Resultados Figura 6.1 Imágenes de la base de datos de entrenamiento. 6.1.1 Clasificador MLP Para este clasificador el parámetro sobre el que se ha operado ha sido el número de capas y el número de neuronas por cada capa, dejando como constante la función de activación tangente hiperbólica. Este clasificador se considera de los menos eficientes a la hora de realizar predicciones en imágenes, dado que su estructura de capas densas le hace sobre especializarse y producir overfitting. Es decir, que tenderá a ofrecer con mayor probabilidad una predicción basada en los datos de entrenamiento aunque el vector de entrada no se corresponda con ninguno de la base ya entrenada. Tabla 6.1 Resultados entrenamiento clasificador Multi Layer Perceptron. Nºde capas ocultas Neuronas en cada capa Nºde Falsos Positivos Confianza Media 1 150 755 88.49% 1 200 758 88.41% 2 150/50 622 81.47% 2 200/50 663 83.76% 3 200/100/50 411 72.01% De estos resultados se escoge el clasificador con menor número de falsos positivos y menor confianza media, que sería el de 3 capas ocultas con 200, 100 y 50 neuronas en cada capa respectivamente. 6.1 Experimento 1: Determinación de clasificadores óptimos 37 6.1.2 Clasificador KNN Para este clasificador los parámetros sobre los que se ha operado son tanto el número de vecinos a tener en cuenta para la predicción, como la representatividad del peso de estos en función a su distancia respecto de la muestra, siendo el parámetro weights="uniform" para la igualdad entre pesos y weights="distance" para que estos sean inversamente proporcionales. Tabla 6.2 Resultados entrenamiento clasificador K-Nearest Neighbours con pesos uniformes. Nºde vecinos Nºde Falsos Positivos Confianza Media 5 186 62.05% 7 188 60.25% 9 82 57.85% 11 120 55.95% 13 67 54.01% Tabla 6.3 Resultados entrenamiento clasificador K-Nearest Neighbours con pesos según el inverso de la distancia. Nºde vecinos Nºde Falsos Positivos Confianza Media 5 343 62.28% 7 157 59.58% 9 92 57.85% 11 124 56.03% 13 73 54.15% De estos resultados se escoge el clasificador con menor número de falsos positivos y menor confianza media, que sería el de pesos uniformes y 13 vecinos. 6.1.3 Clasificador RF Para este clasificador el parámetro sobre el que se ha operado ha sido el número de estimadores a considerar para cada predicción. Tabla 6.4 Resultados entrenamiento clasificador Random Forest. Nºde estimadores Nºde Falsos Positivos Confianza Media 25 0 24.15% 50 0 27.69% 100 0 24.03% 200 0 24.78% De estos resultados se escoge el clasificador con menor número de falsos positivos y menor confianza media, que sería el de 25 estimadores. 6.1.4 Clasificador SVM Para este clasificador el parámetro sobre el que se ha operado, ha sido el tipo de función empleada por el kernel. 38 Capítulo 6. Experimentos y Resultados Tabla 6.5 Resultados entrenamiento clasificador SVM. Función empleada por el kernel Nºde Falsos Positivos Confianza Media poly 2 27.55% linear 552 76.38% rbf 0 17.26% sigmoid 744 87.34% De estos resultados se escoge el clasificador que menor número de falsos positivos y menor confianza media, que sería de kernel con función de base radial. 6.1.5 Resultados y conclusión del experimento Escogiendo cada uno de los clasificadores óptimos de las tablas anteriores, se puede obtener la siguiente tabla comparativa: Tabla 6.6 Comparación de resultados entre clasificadores óptimos entrenados. Tipo de clasificador Nºde Falsos Positivos Confianza Media Multi Layer Perceptron 411 72.01% K-Nearest Neighbours 67 54.01% Random Forest 0 24.15% SVM 0 17.26% Por lo que se concluye a partir de este experimento que el clasificador óptimo es el clasificador SVM con función de kernel de base radial. 6.2 Experimento 2: Determinación de umbral de confianza óptimo Una vez hemos determinado el clasificador óptimo a emplear en el sistema de reconocimiento de rostros, el siguiente paso es determinar el umbral de confianza mínimo con el que realizar las predicciones. Para ello se han tomado diez imágenes en donde aparecen las personas entrenadas por el sistema de reconocimiento. Dichas imágenes de prueba se denominan datos de validación, y no pueden pertenecer a los datos de entrenamiento con los que se ha generado el modelo de clasificación. Además en dichas imágenes, las personas a identificar aparecen junto a otras personas que no han sido entrenadas por el sistema, a fin de determinar un umbral óptimo de sensibilidad a la confianza. Para comprobar la validez de estas detecciones suponemos tres casos: •Asignación correcta : el clasificador ha asignado correctamente su predicción, siendo o bien sobre persona con su nombre, o bien asignado el valor "Unknown" a un rostro desconocido. •Asignación incorrecta (identidad no reconocida) : este caso se produce cuando la predicción de la persona se haya por debajo del valor del umbral de confianza y da como resultado "Unknown". •Asignación incorrecta (identidad equivoca) : este caso se produce cuando el resultado de la predicción a una persona desconocida es una de las personas pertenecientes a la base de datos de entrenamiento. 6.3 Experimento 3: Fiabilidad del sistema de seguimiento 39 Figura 6.2 Imágenes de la base de datos de validación. Una vez determinados los supuestos de la detección queda registrar los datos de experimentación en la siguiente tabla comparativa. Tabla 6.7 Comparación de resultados ante sensibilidad de umbral de confianza. Valor umbral Asignaciones correctas Identidades no reconocidas Identidades equivocas 0.8 28 6 0 0.7 32 2 0 0.6 31 1 2 6.2.1 Resultados y conclusión del experimento A menor sea el umbral de confianza del experimento, mayor es el número de asignaciones realizadas. Sin embargo, esto es a costa de sacrificar certeza en la predicción, por lo que es preferible ante valores semejantes de asignaciones correctas, escoger aquel umbral con el menor número de identidades equivocas. Por lo tanto el valor óptimo de umbral de confianza para este clasificador queda determinado por el valor 0.7. 6.3 Experimento 3: Fiabilidad del sistema de seguimiento Para este último experimento se pretende poner a prueba el algoritmo de seguimiento de rostros propuesto para este trabajo. Para ello se han utilizado tres secuencias de vídeo con las siguientes 46 Appendix A. Códigos empleados from sklearn.neighbors import KNeighborsClassifier #Clasificador KNN from sklearn.ensemble import RandomForestClassifier #Clasificador RF from sklearn.svm import SVC #Clasificador SVM from sklearn.externals import joblib #Para guardar/cargar clases en archivos import pandas as pd from functools import wraps from time import time, sleep from typing import List import dlib def timing(f): @wraps(f) def wrapper(*args, **kwargs): start = time() result = f(*args, **kwargs) end = time() print(’Function: {}. Elapsed time: {}’.format(f, end-start)) return result return wrapper face_recognition.face_encodings = timing(face_recognition.face_encodings ) face_recognition.face_locations = timing(face_recognition.face_locations ) dlib.DLIB_USE_CUDA #Devuelve True en caso de que se estén utilizando GPU Código A.2 Carga de ruta y datos de entrenamiento.. """ En esta celda se definen: load_dir: función que carga la ruta del directorio donde se almacenan los datos de entrenamiento load_data: función que carga los datos de entrenamiento get_data: función que llama a load_data. Si no existen ficheros .pkl ejecuta load_data, si existen, introducir True o False para indicar si se desea entrenar de nuevo la red La ruta será /My Drive/programa/Personas En ella estarán los directorios con nombre e imagenes de la persona que se quiera identificar en formato .jpg o .png. 47 Se recomienda un mínimo de [30] imagenes de la persona que se quiera identificar para entrenar al clasificador. """ @timing def load_dir(directorio, encodings_final, index, tags): path= ’./Personas/’ + directorio +’/’ #Lista con los nombres de las imágenes de la carpeta de la persona file_list = os.listdir(path) for imagen in file_list: #Forma la ruta de la imagen complete_path= path + imagen #Carga la imagen y extrae su codificación (encodings) imagen = face_recognition.load_image_file(complete_path) encodings = face_recognition.face_encodings(imagen) #Si se ha obtenido, se añade a la lista final de encodings y de etiquetas if encodings: encodings_final.append(encodings[0]) tags.append(index) def load_data(): #Por defecto, se tomará la carpeta Source dirs=os.listdir(path=’./Personas’) #Inicializando parámetros encodings_final=[] tags=[] known_names=[] n_samples = 0 print("Analizando directorios:") for (directorio,index) in zip(dirs, range(len(dirs))): #Muestra el directorio analizado load_dir(directorio, encodings_final, index, tags) print(str(index+1) + ’) ’ + directorio + ’ - ’ + str(len(tags) - n_samples)) #Suponiendo que hay al menos un rostro correcto en cada directorio known_names.append(directorio) n_samples = len(tags) return encodings_final, known_names, tags def get_data(select): if ((not os.path.exists(’Model/Names.pkl’)) or (not os.path.exists(’ Model/Encodings_final.pkl’)) or (not os.path.exists(’Model/Tags. pkl’)) ): 48 Appendix A. Códigos empleados encodings_final, known_names, tags = load_data() joblib.dump(known_names, ’./Model/Names.pkl’) joblib.dump(encodings_final, ’./Model/Encodings_final.pkl’) joblib.dump(tags, ’./Model/Tags.pkl’) if not tags: raise "No images found! Need some images to train a classifier" else: if (select == True): encodings_final, known_names, tags = load_data() joblib.dump(known_names, ’./Model/Names.pkl’) joblib.dump(encodings_final, ’./Model/Encodings_final.pkl’) joblib.dump(tags, ’./Model/Tags.pkl’) else: known_names = joblib.load(’Model/Names.pkl’) encodings_final = joblib.load(’Model/Encodings_final.pkl’) tags = joblib.load(’Model/Tags.pkl’) """" Extrae caracteristicas en caso de no existir los ficheros: Names.pkl, Encodings_final.pkl o Tags.pkl True: sobreescribe los archivos actuales y carga los ficheros.pkl en los objetos False: carga los ficheros.pkl en los objetos """ [known_names, encodings_final, tags] = get_data(False) Código A.3 Entrenamiento de clasificadores. """ Función de entrenamiento de modelo Multi Layer Perceptron """ @timing def train_mlp(encodings_final, tags): #Si se han obtenido algunas etiquetas (y por tanto encodings) #Crea y entrena el clasificador clf = MLPClassifier(max_iter=1000, activation= ’tanh’, hidden_layer_sizes = (200,100,50)) model = clf.fit(encodings_final, tags) #Guarda el modelo de MLP entrenado y la lista de nombres joblib.dump(model, ’./Model/MLPClassifier.pkl’) print("Clasificador MLP creado.") """ Función de entrenamiento de modelo con K-Nearest Neighbours """ @timing def train_knn(encodings_final, tags): #Si se han obtenido algunas etiquetas (y por tanto encodings) #Crea y entrena el clasificador 49 clf = KNeighborsClassifier(n_neighbors=13, weights=’uniform’) model = clf.fit(encodings_final, tags) #Guarda el modelo de KNN entrenado y la lista de nombres joblib.dump(model, ’./Model/KNNClassifier.pkl’) print("Clasificador KNN creado.") """ Función de entrenamiento """ @timing def train_rf(encodings_final, tags): #Si se han obtenido algunas etiquetas (y por tanto encodings) #Crea y entrena el clasificador clf = RandomForestClassifier(n_estimators=25) model = clf.fit(encodings_final, tags) #Guarda el modelo de RF entrenado y la lista de nombres joblib.dump(model, ’./Model/RFClassifier.pkl’) print("Clasificador RF creado.") """ Función de entrenamiento SVM """ @timing def train_svm(encodings_final, tags): #Si se han obtenido algunas etiquetas (y por tanto encodings) #Crea y entrena el clasificador clf = SVC(probability=True, kernel=’rbf’) model = clf.fit(encodings_final, tags) #Guarda el modelo de SVM entrenado y la lista de nombres joblib.dump(model, ’./Model/SVMClassifier.pkl’) print("Clasificador SVM creado.") #encodings_final, known_names, tags = load_data() #if (encodings_final == ’None’): # encodings_final, known_names, tags = load_data() train_mlp(encodings_final, tags) train_knn(encodings_final, tags) train_rf(encodings_final, tags) train_svm(encodings_final, tags) Código A.4 Pipeline de clasificación. from google.colab.patches import cv2_imshow class SkleanClassifier(): def __init__(self, model_path, names_path): self.model = joblib.load(model_path) 50 Appendix A. Códigos empleados self.names = joblib.load(names_path) @timing def __call__(self, face_encodings, conf_thr=0.8): if len(face_encodings) == 0: return [] preds = self.model.predict_proba(face_encodings) # get the predictions predictions = [] for pred in preds: # map predictions to names and confidence conf = max(pred) if conf < conf_thr: name = "Unknown" else: tag = np.argmax(pred) name = self.names[tag] predictions.append((name, conf)) return predictions class Face(): def __init__(self, face_location, face_encoding, name, conf, frame_idx=None): self.frame_idx = frame_idx self.location = face_location self.y1, self.x2, self.y2, self.x1 = self.location self.encoding = face_encoding self.name = name self.conf = conf self.label = name + f" {self.conf:.2f}" self.color = (255, 0, 0) # blue by default def draw_on_img(self, img): c1, c2 = (self.x1, self.y1), (self.x2, self.y2) cv2.rectangle(img, c1, c2, (255, 0, 0), 2) tf = 1 # font thickness tl = 0.5 t_size = cv2.getTextSize(self.label, 0, fontScale=tl, thickness= tf)[0] c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3 cv2.rectangle(img, c1, c2, self.color, -1) # filled cv2.putText( img, self.label, (c1[0], c1[1] - 2), 0, tl, 51 [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA, ) def todict(self): return { "x1": self.x1, "y1": self.y1, "x2": self.x2, "y2": self.y2, "name": self.name, "conf": self.conf, "frame_idx": self.frame_idx, } class ProcessingPipeline(): def __init__(self, classifier): self.classifier = classifier @timing def __call__(self, img, frame_idx=None) -> List[Face]: rgb_frame = img[:, :, ::-1] # BGR to RGB face_locations = face_recognition.face_locations(rgb_frame, model="cnn") face_encodings = face_recognition.face_encodings(rgb_frame, face_locations) predictions = self.classifier(face_encodings) faces = [] for fl, fe, (name, conf) in zip(face_locations, face_encodings, predictions): faces.append(Face(fl, fe, name, conf, frame_idx)) return faces names_path = ’./Model/Names.pkl’ # Test MLP model_path = ’./Model/MLPClassifier.pkl’ mlp_classifier = SkleanClassifier(model_path, names_path) # Test KNN model_path = ’./Model/KNNClassifier.pkl’ knn_classifier = SkleanClassifier(model_path, names_path) # Test RF model_path = ’./Model/RFClassifier.pkl’ rf_classifier = SkleanClassifier(model_path, names_path) 52 Appendix A. Códigos empleados # Test SVM model_path = ’./Model/SVMClassifier.pkl’ svm_classifier = SkleanClassifier(model_path, names_path) """ IMPORTANTE: En la siguiente linea hay que introducir uno de los 3 clasificadores entrenados para ProccesingPipeline: mlp_classifier: clasificador Multi Layer Perceptron knn_classifier: clasificador K-Nearest Neighbours rf_classifier : clasificador Random Forest svm_classifier : clasificador State Vector Machine """ processing_pipe = ProcessingPipeline(svm_classifier) Código A.5 Experimento 1. """ Banco de pruebas 1: Valided de clasificador. El objetivo de este banco de pruebas es el de validar a los modelos de clasificación entrenados. Para ello, utilizamos dichos modelos comparados con vectores aleatorios de 128 dimensiones. La forma de comparar qun modelo es más eficiente será comparando el número de falsos positivos detectados por el sistema en forma de "personas identificadas" y el valor medio de confianza otorgado por este """ @timing def false_positves_on_classifier(predictions): false_positives=0 avg_conf = 0 for i in predictions: if (i[1] >=0.8): false_positives = false_positives + 1 avg_conf = avg_conf + i[1] avg_conf = avg_conf/len(predictions) print("Número de predicciones erroneas",false_positives,"\n"+" Confianza media", avg_conf) random_vectors = np.random.rand(1000, 128) print(’Clasificador MLP’) false_positves_on_classifier(mlp_classifier(random_vectors)) print(’Clasificador KNN’) false_positves_on_classifier(knn_classifier(random_vectors)) print(’Clasificador RF’) false_positves_on_classifier(rf_classifier(random_vectors)) print(’Clasificador SVM’) false_positves_on_classifier(svm_classifier(random_vectors)) 53 Código A.6 Experimento 2. """ Banco de pruebas 2: Valided de clasificador. El objetivo de este banco de pruebas es el de validar a los modelos de clasificación entrenados. Para ello, utilizamos los modelos ya entrenados con imágenes de personas alojadas en el directorio raiz y comprobamos si dichas personas son clasificadas de manera correcta. """ input_img = ’Imagenes/1.jpg’ img = cv2.imread(input_img) #Esta linea indica el nombre del archivo y el formato faces = processing_pipe(img) for face in faces: print(face.todict()) crop_img = img[face.y1:face.y2, face.x1:face.x2] cv2_imshow(crop_img) face.draw_on_img(img) cv2_imshow(img) Código A.7 Clases para procesado de video. class VideoLoader(): """ This class controls how frames are taken from the camera """ def __init__(self, video_path, downsampling_factor=1): self.downsampling_factor = downsampling_factor self.source = video_path self.cap = cv2.VideoCapture(self.source) self.shape = self.cap.read()[1].shape self.cap = cv2.VideoCapture(self.source) self.total_frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT)) self.fps = self.cap.get(cv2.CAP_PROP_FPS) self.latency = 1.0 / self.fps self.taken_fps = self.fps / self.downsampling_factor self.frame_counter = 0 def read(self): """ Read one Frame from video. Return None if none left. """ while self.frame_counter % self.downsampling_factor: # Throw away _, img = self.cap.read() self.frame_counter += 1 # read frame from video _, img = self.cap.read() 54 Appendix A. Códigos empleados # condition to finish iterating if img is None: print("[VideoLoader]: Reached end of video") return None return img def release(self): self.cap.release() def __iter__(self): return self def __next__(self): frame = self.read() if frame is None: raise StopIteration() else: return frame class VideoWriter(): """ This class, active in debug mode, offers an simple interface to writting visualizations over input frames. """ def __init__(self, save_path, shape, fps): self.fourcc = cv2.VideoWriter_fourcc(*"mp4v") self.fps = fps self.shape = shape self.writer = cv2.VideoWriter( save_path, self.fourcc, self.fps, self.shape[:2][::-1], ) def release(self): self.writer.release() def write(self, img): self.writer.write(img) Código A.8 Clases procesado de seguimiento. 55 from itertools import cycle class IDGenerator(): def __init__(self, max_id=10e9): max_id = int(max_id) self.iterator = cycle(range(max_id)) def __next__(self): return next(self.iterator) color_dict = { "purple": (255, 0, 255), "blue": (255, 0, 0), #"yellow": (0, 255, 255), "red": (0, 0, 255), "green": (0, 255, 0), # reserved for the detector "skyblue": (235, 206, 135), "navyblue": (128, 0, 0), "azure": (255, 255, 240), "slate": (255, 0, 127), "choco": (30, 105, 210), "olive": (112, 255, 202), "orange": (0, 140, 255), "orchid": (255, 102, 224), } colors = list(color_dict.values()) class Object(): ’’’ Tracked Object. ’’’ def __init__(self, face, given_id, fps): self.id = given_id self.fps = int(fps) self.n_observations = 1 self.unseen_ticks = 0 self.unseen_secs = 0 self.location = face.location self.encoding = face.encoding self.y1, self.x2, self.y2, self.x1 = self.location self.color = colors[given_id % len(color_dict)] self.name = face.name self.conf = face.conf self.lock_name = False if (self.name != ’Unknown’): self.label = self.name self.lock_name = True 62 Índice de Figuras 5.7 Ejemplo de un frame al que se le ha realizado video-tracking 34 6.1 Imágenes de la base de datos de entrenamiento 36 6.2 Imágenes de la base de datos de validación 39 6.3 Frames de resultado pertenecientes a la primera secuencia de vídeo 40 6.4 Frames de resultado pertenecientes a la segunda secuencia 40 6.5 Frames de resultado pertenecientes a la tercera secuencia 41 Índice de Tablas 6.1 Resultados entrenamiento clasificador Multi Layer Perceptron 36 6.2 Resultados entrenamiento clasificador K-Nearest Neighbours con pesos uniformes 37 6.3 Resultados entrenamiento clasificador K-Nearest Neighbours con pesos según el inverso de la distancia 37 6.4 Resultados entrenamiento clasificador Random Forest 37 6.5 Resultados entrenamiento clasificador SVM 38 6.6 Comparación de resultados entre clasificadores óptimos entrenados 38 6.7 Comparación de resultados ante sensibilidad de umbral de confianza 39 63 Índice de Códigos A.1 Montar entorno de Google Colab 45 A.2 Carga de ruta y datos de entrenamiento. 46 A.3 Entrenamiento de clasificadores 48 A.4 Pipeline de clasificación 49 A.5 Experimento 1 52 A.6 Experimento 2 53 A.7 Clases para procesado de video 53 A.8 Clases procesado de seguimiento 54 A.9 Experimento 3 58 65 Bibliografía [1] Google colaboratory,https:// colab.research.google.com/ . [2] Python,https:// www.python.org/ . [3] Zahangir Alom, Tarek M. Taha, Christopher Yakopcic, Stefan Westberg, Paheding Sidike, Mst Shamima Nasrin, Brian C Van Esesn, Abdul A S. Awwal, and Vijayan K. Asari, The history began from alexnet: A comprehensive survey on deep learning approaches, arXiv preprint arXiv:1803.01164 (2018). [4] N. S. Altman, An introduction to kernel and nearest-neighbor nonparametric regression, American Statistician 46 (1992), no. 3, 175–185 (English (US)). [5] Muhammet Fatih Aslan, Akif Durdu, Kadir Sabanci, and Meryem Afife Mutluer, Cnn and hog based comparison study for complete occlusion handling in human tracking, Measurement 158 (2020), 107704. [6] W. Bledsoe, The model method in facial recognition, (1964). [7] G Bradski, Opencv,https:// opencv.org/ . [8] David Copoernau, Scikit-learn,https:// sklearn.org/ . [9] Corinna Cortes and Vladimir Vapnik, Support-vector networks, Mach. Learn. 20 (1995), no. 3, 273–297. [10] N. Dalal and B. Triggs, Histograms of oriented gradients for human detection, 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR’05), vol. 1, 2005, pp. 886–893 vol. 1. [11] Erol Duymaz, Abdullah Ersan Oğuz, and Hakan Temeltaş, Eş zamanlı konum belirleme ve haritalama probleminde yeni bir durum tahmin yöntemi olarak parçacık akış filtresi, Gazi Üniversitesi Mühendislik Mimarlık Fakültesi Dergisi 32 (2017), 1255 – 1270. [12] Kruszka et al, 22q11.2 deletion syndrome in diverse populations, American Journal of Medical Genetics Part A 173 (2017), no. 4, 879–888. [13] Preeti Wadhwani & Saloni Gankar, Facial recognition market size by component (software [2d facial recognition, 3d facial recognition, facial analytics], service), by application (criminal investigation, homeland security, id management, attendance tracking monitoring, intelligent signage, photo indexing & sorting, physical security), by end-use (aerospace & defense, automotive, bfsi, education, retail & e-commerce, healthcare), industry analysis report, regional outlook, growth potential, competitive market share & forecast, 2020 – 2026, Jul 2020. 67 68 Bibliografía [14] A Geitgey, Face recognition,https:// face-recognition.readthedocs.io/ en/ latest/ . [15] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Deep residual learning for image recognition, 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016, pp. 770–778. [16] S. Hochreiter, Untersuchungen zu dynamischen neuronalen Netzen. Diploma thesis, Institut für Informatik, Lehrstuhl Prof. Brauer, Technische Universität München, 1991. [17] Ildefonso Jiménez Silva, Reconocimiento facial basado en redes neuronales convolucionales, (2018), 77. [18] María José and Gómez Silva, Appearance Similarity Learning for Multi-Person Tracking and Re-Identification, (2019), no. November. [19] R. E. Kalman, A New Approach to Linear Filtering and Prediction Problems, Journal of Basic Engineering 82 (1960), no. 1, 35–45. [20] Davis E. King, dlib,http:// dlib.net/ . [21] Alex Krizhevsky, Ilya Sutskever, and Geoffrey E. Hinton, Imagenet classification with deep convolutional neural networks, Communications of The ACM 60 (2017), no. 6, 84–90. [22] Yann Lecun, Yoshua Bengio, and Geoffrey Hinton, Deep learning, 521 (2015), no. 7553, 436–444. [23] A. Mikołajczyk and M. Grochowski, Data augmentation for improving deep learning in image classification problem, (2018), 117–122. [24] Marvin Minsky and Seymour A. Papert, Perceptrons: An introduction to computational geometry, The MIT Press, 1969. [25] Marvin L. Minsky, Nathaniel Rochester, Claude E. Shannon, and John McCarthy, A proposal for the dartmouth summer research project on artificial intelligence, august 31, 1955, 27 (2006), no. 4, 12. [26] Proceedings Of, T H E Romanian, A Series, and Tudor Barbu, Gabor filter-based face recognition technique,11 (2010), no. 3, 277–283. [27] Travis Oliphant, Numpy,https:// numpy.org/ . [28] Omkar M. Parkhi, Andrea Vedaldi, and Andrew Zisserman, Deep face recognition, Proceedings of the British Machine Vision Conference (BMVC) (Mark W. Jones Xianghua Xie and Gary K. L. Tam, eds.), BMVA Press, September 2015, pp. 41.1–41.12. [29] Josh Patterson and Adam Gibson, Deep learning: A practitioner’s approach, 1st ed., O’Reilly Media, Inc., 2017. [30] Cahya Rahmad, Rosa Andrie, D Putra, I Dharma, H Darmono, and I Muhiqqin, Comparison of viola-jones haar cascade classifier and histogram of oriented gradients (hog) for face detection, IOP Conference Series: Materials Science and Engineering 732 (2020), 012038. [31] Rajat Raina, Anand Madhavan, and Andrew Y. Ng, Large-scale deep unsupervised learning using graphics processors, ICML ’09, Association for Computing Machinery, 2009, p. 873–880. Bibliografía 69 [32] Matti Raitoharju, Robert Piché, and Henri Nurminen, A systematic approach for kalman-type filtering with non-gaussian noises, (2016). [33] F. Rosenblatt, The perceptron, a perceiving and recognizing automaton : pro ject para , cornell aeronautical laboratory report, 1957. [34] D.E. Rumelhart, G.E. Hintont, and R.J. Williams, Learning representations by backpropagating errors, Nature 323 (1986), no. 6088, 533–536. [35] Arthur L. Samuel, Some studies in machine learning using the game of checkers, IBM JOURNAL OF RESEARCH AND DEVELOPMENT (1959), 71–105. [36] L. Sirovich and M. Kirby, Low-dimensional procedure for the characterization of human faces, Journal of the Optical Society of America A 4(1987), no. 3, 519. [37] Zahraddeen Sufyanu, Fatma Mohamad, Abdulganiyu Yusuf, and Abdulbasit Nuhu, Feature extraction methods for face recognition, International journal of applied engineering research (IRAER) 5(2016), 5658–5668. [38] M. A. Turk and A. P. Pentland, Face recognition using eigenfaces, Proceedings. 1991 IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 1991. [39] P. Viola and M. Jones, Rapid object detection using a boosted cascade of simple features, Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision and Pattern Recognition. CVPR 2001, vol. 1, 2001, pp. I–I. [40] Mei Wang and Weihong Deng, Deep Face Recognition : A Survey, 1–31. [41] Qi Wei, Zhang Xiong, Chao Li, Yuanxin Ouyang, and Hao Sheng, A robust approach for multiple vehicles tracking using layered particle filter, AEU - International Journal of Electronics and Communications 65 (2011), no. 7, 609 – 618. [42] Hong wei Ng and Stefan Winkler, A data-driven approach to cleaning large face datasets.