Full text
42 Equation Chapter 1 Section 1 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Etiquetado automático de vídeo utilizando aprendizaje máquina Autor: Fernando Vega Zájara Tutor: Francisco José Simois Tirado Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
iii Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Etiquetado automático de vídeo utilizando aprendizaje máquina Autor: Fernando Vega Zájara Tutor: Francisco José Simois Tirado Profesor Contratado Doctor Dpto. de Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
v Trabajo Fin de Grado: Etiquetado automático de vídeo utilizando aprendizaje máquina Autor: Fernando Vega Zájara Tutor: Francisco José Simois Tirado El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2021 El Secretario del Tribunal
vii A mi familia A mis amigos
ix Agradecimientos Finalizar el grado universitario presenta una oportunidad para echar una vista atrás en el tiempo y es una gran satisfacción personal haber llegado hasta este punto. Me gustaría primero agradecer a mi tutor, Francisco José Simois, por abrirme las puertas a un mundo tan apasionante y novedoso para mí como es el Deep Learning. Junto a él me gustaría agradecer a los profesores de la escuela, especialmente a aquellos que consiguen hacer que los estudiantes nos apasionemos por sus asignaturas gracias a su cariño y ganas. Me gustaría agradecer al Colegio Mayor Guadaira y a todas las personas que conocí en él, ya que me apoyaron mucho durante los primero años de carrera y por todas las experiencias vividas junto a ellos, de dónde más que colegiales me llevo a amigos y donde sé que siempre tendré una casa. A todos mis compañeros de facultad. Sin vosotros, vuestro apoyo con apuntes, quedadas en las salas de estudio y fuera de ellas y ayudas con las prácticas y exámenes jamás habría podido acabar. Me habéis inculcado valores de compañerismo que espero llevar siempre conmigo. A mis amigos de San Fernando, gracias por haberme aguantado, en las buenas y en las malas. Por haber escuchado mis quejas, por haberme apoyado y por estar siempre ahí. Me habéis visto crecer desde antes de entrar en la carrera y salir de ella, y espero estar siempre con vosotros. Por último y por encima de todo me gustaría agradecer a mi familia. Especialmente a mis padres, que son las personas que siempre me han apoyado durante toda mi vida. Me habéis inculcado unos valores de responsabilidad y cariño por los que nunca podré agradeceros lo suficiente. Habéis creído en mí cuando ni yo mismo lo hacía. Gracias Papá, gracias Mamá. Muchas gracias por todo. Fernando Vega Zájara Sevilla, 2021
3.3.1 Capa Input 20 3.3.2 Capa Dense 20 3.3.3 Capa Dropout 20 3.3.4 Capa concatenate 20 3.4 Medidas del resultado 20 3.4.1 Categorical-crossentropy 21 3.4.2 Accuracy 21 3.4.3 Matriz de confusión 22 3.5 Optimizador 23 3.6 Arquitectura de red 23 4 Entrenamiento de la red y Resultados 25 4.1 Procesamiento de datos 25 4.2 Creación de las redes 27 4.3 Visualización de resultados 28 4.4 Evolución de las arquitecturas 29 4.5 Matrices de confusión 35 4.6 Resumen de los modelos 38 4.7 Aumento del número de etiquetas 39 5 Conclusiones y Líneas Futuras 43 5.1 Conclusiones 43 5.2 Líneas futuras de la clasificación de vídeo 44 Anexo A: Descarga Base de Datos 47 Anexo B: Código Clasificador 49 Referencias 55
xvii ÍNDICE DE FIGURAS Figura 2-1. Mapa conceptual de ramas de la IA [3] 3 Figura 2-2. Esquema del perceptrón [5] 4 Figura 2-3. Funciones de activación no lineales [7] 6 Figura 2-4. Ejemplo de una red densamente conectada [9] 6 Figura 2-5. Funcionamiento de algoritmo de retropropagación [8] 7 Figura 2-6. Descenso del gradiente [5] 8 Figura 2-7. Efecto de distintos valores del factor de aprendizaje [10] 8 Figura 2-8. Posibles resultados en una red [11] 9 Figura 2-9. Sobreajuste y subajuste en el error [12] 10 Figura 2-10. Red propuesta para clasificación de caracteres manuscritos usando CNN [14] 10 Figura 2-11. Operación de la convolución [15] 11 Figura 2.12. Aplicación de filtro Max-pooling 2x2 [16] 12 Figura 3-1. Bases de datos para imagen y vídeo [18] 13 Figura 3-2. Red convolucional Inception [19] 14 Figura 3-3. Módulo Inception sin y con reducción de dimensiones [19] 15 Figura 3-4. Distribución de las etiquetas para el entrenamiento (%) 16 Figura 3-5. Ejemplo de estructura de cada vídeo en YouTube-8M [17] 16 Figura 3-6. Posibles librerías de Deep Learning en el mercado [29] 19 Figura 3-7. Software utilizado por los ganadores de competiciones de kaggle [28] 19 Figura 3-8. Matriz de confusión para un clasificador binario [34] 22 Figura 3-9. Problema de mínimos locales en funciones no convexas [8] 23 Figura 4-1. Pérdida en el Modelo 1 con una sola capa oculta con ReLu y con tanh 30 Figura 4-2. Pérdida en Modelo 2 de una sola capa con la introducción de Dropout 30 Figura 4-3. Modelo 3 con una capa oculta para cada tipo de entrada 31 Figura 4-4. Pérdida en el Modelo 3 31 Figura 4-5. Modelos 4 y 5 al añadir una segunda capa oculta 32 Figura 4-6. Resultados de los Modelos 4 y 5 con dos capas ocultas 32 Figura 4-7. Acierto en el modelo con una segunda capa oculta tras concatenar las primeras 33 Figura 4-8. Pérdida en el Modelo 6 con tres capas ocultas 33 Figura 4-9. Pérdida y validación del mejor Modelo 7 con mismo número de vídeos por etiqueta 34 Figura 4-10. Matriz de confusión del Modelo 5 con igual número de vídeos por etiqueta 36 Figura 4-11. Matriz de confusión del Modelo 5 con distinto número de vídeos por etiqueta 36 Figura 4-12. Matriz de confusión del Modelo 7 con igual número de vídeos por etiqueta 37 Figura 4-13. Matriz de confusión del Modelo 5 con distinto número de vídeos por etiqueta 37
Figura 4-14. Resultados para clasificación de 20 clases 39 Figura 4-15. Resultados para clasificación de 50 clases 40 Figura 4-16. Estructura completa del clasificador 41
xix ÍNDICE DE TABLAS Tabla 3-1. Número de vídeos por etiqueta 17 Tabla 3-2. Especificaciones del ordenador personal utilizado para el entrenamiento 18 Tabla 4-1. Resultado al igualar el número de vídeos por etiqueta 34 Tabla 4-2. Resultado sobre el conjunto de test en modelos 5 y 7 35 Tabla 4-3. Resumen final de los modelos 38
xxi ÍNDICE DE CÓDIGOS Código 4-1. Importación de librerías 26 Código 4-2. Extracción de datos de archivos .tfrecord 26 Código 4-3. Procesado de entradas 27 Código 4-4. Creación de arquitectura de red neuronal densamente conectada 28 Código 4-5. Visualización del rendimiento de la red 29 Código 4-6. Matriz de confusión y evaluación sobre conjunto de test 35
xxiii ÍNDICE DE ECUACIONES Ecuación 2-1. Entrada a una neurona 5 Ecuación 2-2. Función de activación del perceptrón 5 Ecuación 2-3. Regla del perceptrón para la actualización de los pesos 5 Ecuación 2-4. Función representativa de una red neuronal 7 Ecuación 3-1. Función softmax 21 Ecuación 3-2. Función categorical-crossentropy 21 Ecuación 3-2. Función Accuracy para el caso binario 22
1 1 INTRODUCCIÓN 1.1 Motivación y objetivos del trabajo n las últimas décadas hemos sido espectadores del increíble crecimiento e importancia que ha ido obteniendo la Inteligencia Artificial. Gracias a los avances tecnológicos en tarjetas gráficas de mano de empresas como NVIDIA o AMD, la creación de enormes bases de datos debido al desarrollo de Internet y la introducción en este campo de gigantescas empresas como Google o Facebook, es una rama que se ha ido desarrollando transversalmente en prácticamente todas las áreas del conocimiento. Se han conseguido auténticas proezas utilizando algoritmos de Aprendizaje Profundo, tales como conducción autónoma, habilidades sobrehumanas para distintos juegos, traducción automática o publicidad dirigida, entre muchas otras. Pero, de entre las tareas que dieron comienzo a la base de lo que hoy conocemos como Inteligencia Artificial, cabe destacar la clasificación, es decir, entrenar un sistema para que a partir de unos datos de entrada pueda determinar ciertas etiquetas correspondientes. Los paquetes especializados en Aprendizaje Máquina y Aprendizaje Profundo tales como Keras, TensorFlow, Pytorch, Pandas o Numpy, todos accesibles mediante el potente pero sencillo lenguaje de programación Python, han permitido que personas de todo el mundo puedan acceder de manera gratuita a recursos del campo de la Inteligencia Artificial que permiten que, sin tener estudios específicos en matemáticas o ingeniería, se puedan desarrollar proyectos en este campo. Es además la visión por ordenador una de las especializaciones de la Inteligencia Artificial gracias a la cual ha cobrado la importancia que tiene a día de hoy, con avances como las redes convolucionales o las redes recurrentes. Si bien se han conseguido increíbles resultados para clasificar imágenes o texto manuscrito, esto ha sido posible solamente gracias a la existencia de enormes bases de datos, algo con lo que por desgracia hasta hace unos años no se contaba para vídeo. Varias bases de datos famosas de vídeo como UCF101 o Sports-1M, estaban restringidas por el bajo número de ejemplos y etiquetas, pero en 2016 Google presentó Youtube-8M, una enorme base de datos comparable a ImageNet, la más famosa de imágenes, para vídeo. Con ello se buscaba conseguir una mejora en el campo de la visión por ordenador, ya que todos los avances en dicho ámbito se han relacionado con la existencia de grandes bases de datos, durante muchos años solamente de imágenes. El presente trabajo se ha basado en la famosa página de competiciones de Aprendizaje Máquina, kaggle, en la cual Google durante varios años ha propuesto competiciones sobre la clasificación de vídeo utilizando su base de datos, Youtube-8M [1]. Para ello, ya que en el grado de Telecomunicaciones no hay ninguna asignatura específica sobre esta tecnología, primero se busca crear una base teórica necesaria, y después aprender mediante un lenguaje de programación, en este caso Python, a utilizar las funciones que ofrecen las distintas librerías para crear redes neuronales, y más específicamente clasificadores. El objetivo es, a partir de las características de RGB (rojo, verde y azul) y audio de vídeos sacados de YouTube, conseguir que una red neuronal las relacione con una de entre una serie de etiquetas posibles. Para ello se ha considerado que las etiquetas posibles sean visualmente reconocibles por el ser humano, como por ejemplo “Videojuego” o “Guitarra”. El etiquetado de vídeos es importante en plataformas como la misma YouTube, ya que permite poder adaptar las recomendaciones a los usuarios que estén viendo una clase de vídeo determinada. Para resolver el problema se ha hecho uso de un ordenador personal y de las herramientas ya mencionadas como Keras o TensorFlow. E
8 Redes neuronales 8 justo anterior y así hasta la primera. Esta es una manera eficiente de cálculo de derivadas ya que previamente a este algoritmo había que calcular cada uno de los posibles caminos desde la capa de entrada a la de salida, con una enorme carga computacional. 2.4.2 El descenso del gradiente Este algoritmo de retropropagación necesita de una función de coste para cuantificar el error y poder minimizarlo. Después se hace uso de un algoritmo de optimización, de entre los cuales el descenso del gradiente es el más conocido. El descenso del gradiente es un algoritmo que busca mínimos de una función de manera iterativa, analizando el gradiente de la función de error en cierto punto. El objetivo de este algoritmo es ir variando los pesos de las neuronas para minimizar el error. Figura 2-6. Descenso del gradiente [5] En la Figura 2-6, 𝐽(𝑤) corresponde con el coste, que mide el error a minimizar y que depende de los pesos de todas las neuronas. El proceso de aprendizaje en este caso es iterativo. Normalmente se dividen los datos en tres grupos, diferenciado entre entrenamiento, validación y test. El set de entrenamiento es el que se usa para, durante varias épocas, ir pasando sus datos por la red e ir calculando el error. Ese error es el que usa el descenso del gradiente para ir variando a su vez los pesos de la red en cada iteración hasta llegar al mínimo. El algoritmo depende del factor de aprendizaje 𝛼 que, al igual que en el perceptrón, se utiliza para que la variación de pesos no sea demasiado grande y es un parámetro a ajustar en la red. Si es demasiado pequeño el algoritmo tardará muchas épocas en llegar al óptimo, y si es demasiado grande se pueden dar oscilaciones hasta incluso aumentar el coste. Figura 2-7. Efecto de distintos valores del factor de aprendizaje [10]
Etiquetado automático de vídeo utilizando aprendizaje máquina 9 9 2.5 Sobreajuste y subajuste El objetivo de una red neuronal es generalizar el aprendizaje conseguido durante el entrenamiento, es decir, una vez aprendido un problema poder obtener una salida correcta ante nuevos datos desconocidos. Para poder medir como de buena es una red ya se ha mencionado la división en tres grupos de los datos. El set de entrenamiento y el de validación son los que se usan durante el entrenamiento de la red. El set de test se usa una vez es entrenada la red para medir en realidad cómo de bien funciona la red. Normalmente de los datos usados para el entrenamiento, para el set de entrenamiento se usa un 80% y para validación un 20%, aunque estas cantidades pueden variar. La red tras el entrenamiento puede dar tres tipos de resultados dependiendo de cómo de generalizado es el aprendizaje. Para poder medir dicho resultado se hace uso de la función de pérdida, que es la que se va minimizando durante el entrenamiento. En este trabajo se hará uso de la función categorical-crossentropy, que se explicará más adelante, como función de pérdida a minimizar. Figura 2-8. Posibles resultados en una red [11] Si la red no es capaz de adaptarse a los datos de entrenamiento se produce un subajuste, que normalmente suele suceder porque la red es demasiado simple para la complejidad de los datos del problema. Normalmente si se van añadiendo capas o neuronas se soluciona este problema, y al ir realizando más iteraciones en el entrenamiento. Si la red se adapta demasiado a los datos de entrenamiento pierde la generalización y se produce un sobreajuste, donde la red memoriza para los datos de entrenamiento sus correspondientes salidas. Suele darse cuando se entrena demasiadas épocas a la red y es uno de los problemas más típicos dentro del Aprendizaje Máquina. El punto medio entre el subajuste y el sobreajuste es el que se busca en una red de este tipo, donde se consigue generalizar el conocimiento adquirido. Estos tres casos posibles pueden verse durante el entrenamiento si se observa la función de error, que es el objetivo a minimizar. Cuando se produce subajuste tanto el error de entrenamiento como el de validación es elevado. Normalmente si la red es lo suficientemente compleja y se sigue iterando, se va minimizando ambos errores. Pero llega un punto normalmente en que el error de entrenamiento continúa disminuyendo pero el de validación empieza a crecer. Se está produciendo un sobreajuste, ya que se está perdiendo la generalización y la red se está adaptando demasiado a los datos de entrenamiento. Una posible solución al problema sería ir graficando el error de entrenamiento y validación. Al principio empezará bajando superando la fase de subajuste si la red es lo suficientemente compleja. Si llega el punto en que el error de entrenamiento sigue disminuyendo pero el de validación ha llegado a un mínimo y empieza a crecer, se puede parar de entrenar en dicha época, ya que significa que es el punto óptimo para la red.
10 Redes neuronales 10 Figura 2-9. Sobreajuste y subajuste en el error [12] 2.5.1 Dropout Otra posible solución al problema del sobreajuste es el Dropout [13], una técnica desarrollada en la universidad de Toronto, que se basa en, al aplicarla en una capa, desactivar de manera aleatoria un cierto número de neuronas, lo que implica poner sus entradas a cero durante el entrenamiento. El número de neuronas desactivadas es dependiente de la tasa de Dropout que se use. Normalmente se usa 0.5, que indica que de manera aleatoria la mitad de las neuronas de esa capa se desactiva. Esta técnica reduce el sobreajuste en la red ya que se demuestra que limita la memorización de los datos de entrenamiento. En este trabajo se empleará esta técnica. 2.6 Redes convolucionales Las redes convolucionales (CNN en inglés) son una familia de modelos que se inspiran en el funcionamiento de la corteza visual del cerebro humano para el reconocimiento de objetos. Surgen en los años noventa cuando Lecun [14] y varios colegas propusieron un nuevo tipo de arquitectura de red neuronal para la clasificación de dígitos manuscritos a partir de imágenes, basada en buscar ciertos patrones. Por ejemplo en la imagen de un coche se buscan patrones simples, como líneas o curvas, para construir un patrón más complejo como una rueda o una puerta. Figura 2-10. Red propuesta para clasificación de caracteres manuscritos usando CNN [14] Este tipo de redes obtiene un rendimiento excepcional para clasificación de imágenes, lo que ha hecho que adquieran mucha importancia en el campo del Aprendizaje Profundo en las últimas dos décadas. Las CNN en imágenes se basan en calcular un mapa de características a partir de la imagen de entrada. Normalmente estas redes se componen de varias capas convolucionales y submuestreo seguidas, y al final se hace uso de una red densamente conectada para la tarea de clasificación. Además de las dos principales capas de convolución y submuestreo, se realiza un aplanado de características para poder usar como entrada un vector en la red densamente conectada.
Etiquetado automático de vídeo utilizando aprendizaje máquina 11 11 Las CNN se aprovechan de una propiedad que tienen las imágenes, su estructura espacial. Antes de estas redes para poder introducir una imagen en una red neuronal, cada pixel de esta imagen era pasada a la red como una variable independiente, recibiendo la imagen como un único vector plano. Pero de esta forma se perdía la importancia que tiene la posición de ese pixel dentro de la imagen, donde sabemos que normalmente el valor de un pixel está muy relacionado con los píxeles que tiene alrededor, permitiendo la construcción de patrones. 2.6.1 Capa convolucional Este tipo de capa se caracteriza por aplicar sobre la entrada, que normalmente es una imagen por lo que tiene dos dimensiones, la operación matemática de la convolución. Esta operación puede verse como la aplicación de un filtro sobre estos datos de entrada. Estos filtros son una matriz de números, de dimensiones normalmente mucho más pequeñas que la entrada, que se pone sobre la imagen original, y después se multiplican sus valores por los valores de los píxeles de la imagen de entrada. De esta manera se consiguen unos nuevos valores haciendo un sumatorio de la multiplicación. Tras hacer esta multiplicación, el filtro se va desplazando por toda la imagen, hasta conseguir una nueva imagen. Figura 2-11. Operación de la convolución [15] Esta imagen resultado dependerá de los valores que tenga el filtro, existiendo diferentes filtros como algunos especializados en buscar diferencias de contraste, mientras que otros pueden ser usados para desenfocar. Son estos valores del filtro los que durante el entrenamiento la propia red aprenderá para detectar los patrones. El resultado de aplicar el filtro es lo que, como ya se ha mencionado, se denomina mapa de características. La potencia de las CNN radica en que realmente lo que se produce es un conjunto de convoluciones, donde la entrada de cada una es la salida de la anterior. De esta manera cada vez será más profunda la red y más potente, ya que podrá detectar más información útil. Cuando ya se tiene un enorme conjunto de mapas de características con los patrones necesarios para poder detectar dicha información es cuando se pasa por una red densamente conectada. Las imágenes realmente pueden verse con sus dos dimensiones espaciales, pero dependiendo de si es a color tiene tres canales (RGB) o en blanco y negro, un canal. Para cada uno de los canales se crea un mapa de características diferente al aplicar la convolución.
12 Redes neuronales 12 2.6.2 Capa de pooling En las CNN, al realizar las convoluciones, se aplica también una capa denominada pooling, ya que en cada capa convolucional no se aplica un solo filtro, sino un conjunto de filtros, lo que da como resultado que cada vez haya más capas de características al ir profundizando en la red, por lo que computacionalmente tendría un coste enorme. Para ello se hace una reducción del tamaño de las imágenes filtradas o mapas de características. Hay diversos tipos de capas de pooling, entre los cuales el más usado es el de Max-pooling. Se resume en aplicar también un filtro, por ejemplo un 2x2, donde en este caso se toma el máximo valor de la entrada por cada aplicación del filtro en la imagen. De esta manera se reduce a la mitad sus dimensiones. Figura 2-12. Aplicación de filtro Max-pooling 2x2 [16] Otra capa de pooling importante es el Avarage-pooling, que toma el valor medio, pero la de Max-pooling es la más utilizada. 2.6.3 Capa Flatten Las CNN terminan haciendo uso de una red densamente conectada, pero este tipo de redes funciona recibiendo como entrada un solo vector. Es necesario pues una capa previa a esta red, una vez finalizadas todas las capas convolucionales y de pooling, que se denomina Flatten o aplanado. La tarea de esta capa es convertir los últimos mapas de características de la CNN es un vector e introducírselo a la red neuronal multicapa densamente conectada. Es necesaria para poder combinar estos dos tipos de redes distintas.
13 3 METODOLOGÍA PROPUESTA n este capítulo se va a hacer una presentación de la base de datos y los materiales utilizados, tanto desde el punto de vista software como hardware. Primero se explicará la potencia y utilidad que tiene la base de datos YouTube-8M y cómo extrae las características de los vídeos. De la misma forma se comentarán las librerías de software que se usarán, junto a algunas de sus funciones más importantes. Tras ver los materiales se explicarán las herramientas de medida que se usarán durante el entrenamiento y los objetivos que se buscan a la hora de ir eligiendo los parámetros de la red neuronal. 3.1 Base de datos utilizada: Youtube-8M Para el presente trabajo se ha decidido hacer uso de entre todas las bases de datos de vídeo disponibles la de YouTube-8M, proporcionada por Google. Su gran tamaño y sus diferentes etiquetas hacen de esta una base de datos interesante de analizar. A diferencia de otras bases de datos anteriores a ella como ActivityNet o Sports-1M, YouTube-8M no se restringe solo a vídeos de acciones o deportes. De hecho en su página oficial [17] se ofrece un buscador para todo su vocabulario, agrupando los vídeos en 24 grupos principales denominados “verticales”. Figura 3-1. Bases de datos para imagen y vídeo [18] La base de datos fue construida a partir de vídeos de la plataforma YouTube, ya que esta era una buena fuente de vídeos de muy distintas categorías. Se eligieron para cada vídeo una serie de etiquetas que fueran visualmente reconocibles, de las cuales muchas las ponía el propio algoritmo de la plataforma. Pero la base de datos original tenía millones de vídeos que se traducían en cientos de Terabytes de información, lo que la hacía ineficaz para su uso en entrenamiento de redes neuronales. 3.1.1 Red Inception Es por la gran cantidad de espacio necesario que los creadores de YouTube-8M decidieron hacer uso de una red ampliamente conocida y públicamente accesible, Inception [19], que ha sido entrenada haciendo uso de la base de datos de imágenes ImageNet. Se procesaron los vídeos de YouTube, decodificándolos a 1 frame/segundo, y se introdujeron estos frames en la red Inception, utilizando una función de activación ReLu en su última capa oculta, antes de la capa de clasificación final. El resultado fue un vector de dimensión 2048 E
14 Metodología propuesta 14 por segundo de vídeo [18]. Después se hizo una serie de reducciones hasta conseguir un vector de características de dimensión 1024 por segundo de vídeo. Además de las características de vídeo, de igual manera Youtube-8M ofrece las de audio por cada vídeo. Cabe destacar que la red Inception es una compleja red convolucional, por lo que como solución al problema de clasificación de vídeos, ya que YouTube-8M previamente ha procesado estos vídeos mediante dicha red, lo que se va a realizar en este trabajo es una red densamente conectada, que tomará estas características y aprenderá de los patrones. ImageNet es una base de datos que surge en el 2009 [20], y en sus inicios recogía más de 3 millones de imágenes. Fue propuesta en el campo del Aprendizaje Máquina, específicamente de la visión por ordenador, con el principal objetivo de ser un recurso en el entrenamiento de redes y para los investigadores. Previamente a esta base de datos, la mayoría de redes de visión por ordenador se centraban en un pequeño número de objetos comunes, como coches, peatones y caras, debido a que las bases de datos disponibles eran de pequeña escala y únicamente disponías de estas pocas clases. ImageNet en cambio, además del gran número de imágenes por clase, permite acceder a objetos menos comunes. Aporta una gran calidad, diversidad y escala, propiedades que hicieron que, más allá de convertirse en una de las bases de datos más famosas de la última década, se hayan creado potentes redes para analizar relaciones complejas y jerarquías entre ellas, y se haya avanzado más en el entendimiento del sistema visual humano. Además de la clasificación, en la que se centra este trabajo, hay muchas otras aplicaciones de conjuntos de imágenes y vídeos, como detección de objetos, redes generativas adversarias, conducción autónoma, reconocimiento facial y muchas otras. Inception surge justo como solución vencedora, seguido por VGGNet, en la competición de Reconocimiento Visual a Gran Escala de ImageNet 2014 (ILSVRC14). Se trataba en su primera versión, también conocida como GoogLeNet, de una red convolucional profunda, formada por 22 capas cuyo principal uso era la clasificación y la detección de imágenes. La principal característica de esta arquitectura es la utilización mejorada de los recursos informáticos dentro de la red, mediante un diseño cuidadosamente elaborado de los mismos, aumentamos la profundidad y la anchura de la red, manteniendo a su vez constante el coste computacional. Figura 3-2. Red convolucional Inception [19] La red Inception, como otras que surgieron estos años en estas competiciones, fue un gran avance para el campo del Aprendizaje Profundo porque demostró que con una mejora mínima del hardware, y usando las mismas bases de datos, se conseguían grandes mejoras en el rendimiento de clasificación. Lo importante es que estas mejores se conseguían únicamente mediante mejores algoritmos y arquitectura, logrando por ejemplo en 2014 utilizar 12 veces menos parámetros que la versión ganadora de dos años antes, aun aumentando el rendimiento.
Etiquetado automático de vídeo utilizando aprendizaje máquina 15 15 Las redes convoluciones en los años anteriores seguían la regla de ir haciéndose cada vez más profundas para lograr representaciones mejores, de manera secuencial, reduciendo las dimensiones entre capas usando antes de la siguiente capa convolucional una de pooling. Pero la estructura básica de la red GoogLeNet es el bloque o módulo Inception que se basa en usar varias capas en paralelo [21]. Para ello una capa toma la salida de la capa anterior, aplica diferente capas de convoluciones y concatena los resultados para la capa posterior. El módulo básico consta de una capa convolucional con filtros de tamaño 1x1, una con 3x3, una con 5x5 y una de Max-Pooling con 3x3. Además ofrece otra versión posible de esta red utilizando capa convolucionales 1x1 extras para aplicar una reducción de características. La utilización de diferentes filtros en paralelo permite extraer diferentes tipos de características de una misma entrada. Si se opta por la opción de aplicar los filtros 1x1 antes de las capas convoluciones con filtros 3x3 y 5x5, permite que el número de parámetros se reduzca y sea más eficiente computacionalmente, consiguiendo además la mejora del rendimiento. Figura 3-3. Módulo Inception sin y con reducción de dimensiones [19] 3.1.2 Uso de YouTube-8M YouTube-8M ofrece para cada uno de los vídeos una media de 3 etiquetas/vídeo. En este trabajo se ha decidido utilizar una sola etiqueta por vídeo para que sea más asequible desde un punto de vista computacional. Para ello se ha escogido de manera aleatoria 725 archivos que contienen las características procesadas de más de 300.000 vídeos, que se han dividido en 70% para el set de entrenamiento y 30% para validación, además de casi 50.000 vídeos para el set de test. En estos vídeos se han decidido escoger 10 etiquetas de entre todas las que ofrece la base de datos, ya que permitirá que la red se entrene en menos de una hora por entrenamiento, además de hacer más visibles los resultados mediante la matriz de confusión, que se explicará más adelante. Es importante señalar que en esta base de datos el número de veces que aparecen las etiquetas va descendiendo según aumenta su identificador, por lo que se han escogido etiquetas que tienen identificadores bajos. Más adelante se trabajará alimentando redes cumpliendo con esta proporción como viene en la base de datos, o con
16 Metodología propuesta 16 el mismo número de vídeos por cada etiqueta, para evitar cualquier tipo de memorización de la red con las etiquetas que tienen mayor probabilidad de aparecer, viendo las ventajas o desventajas de cada caso. Figura 3-4. Distribución de las etiquetas para el entrenamiento (%) Las características de los vídeos, junto a sus identificadores, vienen dados por YouTube-8M en un formato denominado tensorflow.Example, un protocolo que se guarda en archivos con extensión .tfrecord, haciendo uso de la librería TensorFlow, que se explicará más adelante. En la siguiente imagen se muestra un ejemplo de cómo es la estructura interna de estos archivos. Figura 3-5. Ejemplo de estructura de cada vídeo en YouTube-8M [17]
Etiquetado automático de vídeo utilizando aprendizaje máquina 17 17 De esta forma, se dan las etiquetas asignadas a cada vídeo como una lista de enteros de tamaño variable, y las características de vídeo y audio como una lista de flotantes, de tamaños fijos 1024 y 128 respectivamente. Haciendo uso del vocabulario ofrecido en la página oficial de la base de datos, en la siguiente tabla se muestra por cada una de las etiqueta el número de vídeos que se ha usado en el entrenamiento. Etiqueta Número de vídeos Etiqueta Número de vídeos Game 102.216 Performance Art 11.202 Vehicle 54.225 Dance 13.978 Concert 49.153 Food 17.514 Musician 15.551 Music Video 12.401 Cartoon 22.328 Animal 13.596 Tabla 3-1. Número de vídeos por etiqueta 3.2 Material 3.2.1 Hardware Todo el campo de la IA, especialmente el Aprendizaje Máquina y el Aprendizaje Profundo, ha conseguido grandes resultados gracias al enorme avance de la tecnología en las últimas décadas. Un modelo es una estructura que consta de hasta miles o millones de variables, y su funcionamiento se basa principalmente en multiplicación de matrices, por lo que hacen falta materiales específicos para ello. Durante muchos años las mejoras fueron principalmente de la mano de la unidad central de procesamiento, CPU, que permite hacer operaciones aritméticas y lógicas lo suficientemente potentes a día de hoy para que cualquiera en su portátil pueda entrenar pequeños modelos. Pero a la vez, empresas como NVIDIA o AMD han invertido millones de euros en el desarrollo de las unidades de procesamiento gráfico, GPU, destinados a mejorar la calidad de los videojuegos, siendo este un mercado en alza. Las GPUs se diferencian de las CPUs en que las segundas son de propósito general, mientras que las GPUs cumplen tareas más específicas como reproducir escenas 3D en las pantallas de los ordenadores. NVIDIA lanzó además en 2007 CUDA [22], una interfaz de programación para sus GPUs, de esta manera pudo ser utilizada por la comunidad científica. Muchos investigadores comenzaron entonces a escribir implementaciones de CUDA para redes neuronales. Desde los últimos años, NVIDIA ha invertido mucho dinero en el campo de la Inteligencia Artificial, incluso desarrollando GPUs específicas para estas tareas, usadas principalmente para problemas más complejos como visión por ordenador o reconocimiento de texto. Otra empresa que ha invertido mucho en este campo es Google, que en 2016 presentó la unidad de procesamiento de tensores, TPU [23], un proyecto diseñado específicamente para ejecutar redes neuronales profundas, y que puede llegar a ser mucho más eficiente y consumir menos que las mejores GPU. Además Google ofrece Google Cloud, una plataforma que permite el acceso a las GPUs y TPUs de la compañía de manera virtual. Ofrece una versión gratuita mediante la cual se puede hacer uso de la tecnología que ofrece la compañía pero dentro de ciertos límites, además de que en cualquier momento si la compañía requiere de estos recursos puede reducirlos o dejar de darlos. En este trabajo se ha decidido optar por la opción de trabajar con el portátil personal, ya que si bien no tiene una GPU especializada en Aprendizaje Máquina, al ser personal se puede hacer uso de él en cualquier momento e incluso dejarlo entrenando todo el tiempo necesario, sin costes adicionales ni cortes. Se trata de un portátil ASUS cuyas características se presentan en la siguiente tabla.
24 Metodología propuesta 24 menos tiempo, pero consiguiendo aun así un buen porcentaje de acierto. Se ha encontrado que el mejor enfoque pasa primero por ir creando una red simple, que de buenos resultados y a partir de ahí ir añadiendo más capas y neuronas, haciendo la red más compleja buscando si hay una mejora del resultado. Como también se ha mencionado al explicar la base de datos utilizada, hay etiquetas que tienen un porcentaje de vídeos muy alto del total utilizado, en comparación con otras. Por ello se han hecho pruebas tanto usando esta proporción de vídeos como utilizando el mismo número de vídeos por clase, usando para ellos el número de vídeos de la etiqueta que menos tiene. De esta manera se consiguen dos cosas, primero al usar menos vídeos la red se entrena más rápido y requiere menor carga computacional, y además se comprueba si en el caso de dejar la proporción inicial la red no “memoriza” y asigna mayor proporción de salidas correctas a las clases con mayores probabilidades sin realmente aprender de sus características.
25 4 ENTRENAMIENTO DE LA RED Y RESULTADOS n este capítulo se irán explicando los distintos pasos dados y los resultados obtenidos. Se irán viendo las redes creadas hasta llegar a la que mejores resultados han obtenido, buscando los objetivos fijados de minimizar la carga computacional y tiempo de entrenamiento, pero maximizando el porcentaje de acierto del clasificador. Para el entendimiento del trabajo se van a ir explicando mediante fragmentos de código los pasos tomados y los cambios. Se ha decidido minimizar el uso de código en la memoria a solo unos fragmentos para el entendimiento de las librerías usadas y el procedimiento a seguir, en general, para la construcción de cualquier algoritmo de red neuronal. Se dejará en un anexo el código completo de la arquitectura final. Este procedimiento puede resumirse en los siguientes tres pasos: Primero se hace un procesamiento de los datos, preparándolos como vectores que puedan ser utilizados como entradas a la red. Segundo se crea la estructura de la red, haciendo uso de librerías como Keras o TensorFlow, que facilitan el procedimiento, indicando el número de capas, dimensiones de los vectores de entrada, funciones de activación y procedimientos para mitigar el sobreajuste. Tras esto se produce el entrenamiento, indicando el optimizador y funciones de pérdida. Durante el entrenamiento de la red se visualizarán las pérdidas y el acierto y, si la red brinda un resultado interesante, se podrá probar sobre datos no usados en el entrenamiento. Al no tener experiencia previa en el campo del Aprendizaje Máquina, antes de abordar el problema del trabajo, se utilizaron las librerías Pandas, Numpy y Matplotlib para probar distintas redes con problemas más sencillos, como primero problemas de regresión lineal, quizás los más sencillos. Tras ello se avanzó tratando el conocido problema de clasificación de caracteres de la base de datos MNIST, lo que permitió sentar un punto de partida para poder entender el problema de clasificación de vídeo. Como herramientas para iniciarse en el mundo del Aprendizaje Máquina y Aprendizaje Profundo, cabe destacar por su sencillez y su atractivo didáctico, el libro escrito por el creador de la librería Keras, François Chollet [3], famoso ingeniero de Google dentro del campo del Aprendizaje Máquina. Siguiendo su libro, haciendo uso de la librería creada por él, permite a cualquier persona sin formación previa en matemáticas, ingeniería ni programación, un primer acercamiento a este campo. Además también dentro de la comunidad hispanohablante, existe un canal de YouTube, que ha servido para asentar una base tanto teórica como práctica de este campo, además de hacerlo aún más atractivo, denominado DotCSV [36]. Fue creado por el ingeniero informático Carlos Santana, divulgador de Inteligencia Artificial, y tiene varios vídeos dedicados a explicar conceptos como el de la neurona, redes neuronales, redes convolucionales y muchos otros que se relacionan con este trabajo. Además acompaña los vídeos teóricos de otros explicando cómo llevar la teoría al código, siempre de una manera sencilla pero potente. 4.1 Procesamiento de datos Los primeros pasos para la realización de cualquier proyecto de Aprendizaje Máquina tras determinar el problema y herramientas de programación a utilizar es escoger la plataforma para escribir y probar el código. En este caso al utilizar un sistema Linux, se ha optado por programar en Python utilizando el editor de textos Sublime Text, por la comodidad que aporta. Para la ejecución del código, una vez instalado Python y todas las librerías a usar, se ha hecho uso de la terminal Linux de manera que se ha desestimado instalar otras aplicaciones adicionales como entorno de desarrollo. Todas las pruebas requieren de la importación de las distintas librerías de Python (Código 4-1), y el uso de funciones de TensorFlow y Keras. E
26 Entrenamiento de la red y resultados 26 import os import numpy as np import tensorflow as tf from keras import models from keras import layers import keras from keras import Input from keras.models import Model import matplotlib.pyplot as plt Código 4-1. Importación de librerías YouTube-8M es una enorme y compleja base de datos, y para las distintas competiciones que Google ha propuesto haciendo uso de dicha base de datos, la compañía ha aportado los distintos vídeos almacenados en formato .tfrecord, haciendo uso para ello de funciones de la librería TensorFlow (Código 4-2) para la extracción de los datos. Este tipo de archivo almacena en un formato simple una secuencia de registros binarios. Se trata de un búfer de protocolos para la serialización eficiente de datos estructurados. Cada mensaje representa una asignación de valores a unos identificadores. Se han descargado los vídeos y se han almacenado en el directorio de trabajo según la siguiente estructura: -/TFG/data/train: Archivos para entrenamiento -/TFG/data/validate: Archivos para validación -/TFG/data/test: Archivos para test -/TFG/tfg.py: Cada modelo ha sido guardado en un fichero Python para su ejecución for i in ficheros: record = './data/train/'+i labels = [] mean_rgb = [] mean_audio = [] for example in tf.compat.v1.python_io.tf_record_iterator(record): result = tf.train.Example.FromString(example) labels.append(result.features.feature['labels'].int64_list.value) mean_rgb.append(result.features.feature['mean_rgb'].float_list.value) mean_audio.append(result.features.feature['mean_audio'].float_list.value) Código 4-2. Extracción de datos de archivos .tfrecord
Etiquetado automático de vídeo utilizando aprendizaje máquina 27 27 De esta manera se extraen y se guardan en listas para todos los ficheros utilizados los tres tipos de datos distintos: etiquetas, características de vídeo y audio, respectivamente almacenados como enteros y flotantes. La dimensión del vector de etiquetas por cada vídeo dentro de cada fichero es variable, mientras que los vectores de vídeo y audio se corresponden siempre con dimensiones 1024 y 128. Lo que se consigue mediante el Código 4-2 es extraer de los archivos los datos, pero estos deben ser procesados antes de poder ser introducidos a la red neuronal. Las etiquetas deben estar en formato one-hot, ya que es la manera en que las redes puedan procesarlas. De esta forma en el Código 4-3 se muestra como por ejemplo para el vídeo que tenga asignado la etiqueta con valor 0, hay que asignarle un vector de ceros de dimensión 10 pero con un 1 en la primera posición. De la misma manera se procede para cada etiqueta en cada vídeo, donde se van guardando en la lista etiquetas los vectores de etiqueta correspondientes a cada vídeo. Además en el mismo orden se guarda en otras listas las características de vídeo y audio como listas Se asigna además un variable por cada tipo de etiqueta, en el ejemplo num_0, para contabilizar el número total de vídeos que se utiliza por clase. etiquetas = [] audio = [] video = [] for i in range(len(labels)): if(labels[i][0] == 0): num_0 +=1 etiquetas.append([1, 0, 0, 0, 0, 0, 0, 0, 0, 0]) audio.append(list(mean_audio[i]) video.append(list(mean_rgb[i])) Código 4-3. Procesado de entradas Todo este procedimiento se hace por cada fichero, y al final se guardan los conjuntos de datos conseguidos en unas listas para entrenamiento (X_train_video, X_train_audio, Y_train) y validación (X_validate_video, X_validate_audio, Y_validate), donde las X corresponden con las entradas a la red y las Y con las etiquetas de salida. 4.2 Creación de las redes Una vez se tienen almacenados en memoria las entradas y salidas esperadas de una manera que puedan ser utilizadas por una red neuronal, se procede a la creación de la misma. Para ello se usa la librería Keras, donde el proceso para todas las redes creadas se repite. Primero en todas las redes se definen las capas de entradas que son de tipo Input, donde se puede tomar la opción de una entrada para cada tipo de característica o una sola entrada que sea la unión de ambas. Después se utilizan las funciones Dense para ir apilando capas ocultas, donde el número de capas y neuronas son los principales parámetros a definir y lo que diferencia las arquitecturas propuestas. Además se pueden usar diferentes funciones de activación que aporta Keras directamente, aunque la capa de salida debe ser siempre una de tipo softmax para realizar la labor de clasificación. Keras permite guardar una imagen de la arquitectura creada, que será de gran utilidad para ver la diferencia entre ellas sin tener que enseñar el código de cada una, ya que es bastante repetitivo.
28 Entrenamiento de la red y resultados 28 Tras la arquitectura se define el optimizador junto a la medida que se usará, el acierto, y se procede al uso de la función fit, que es la que realiza el entrenamiento de la red, a la vez que va mostrando el progreso y los valores de los parámetros al terminar cada época. En principio se van a usar 20 épocas en cada entrenamiento, para una mejor visualización de los resultados. video_input = Input(shape=(1152,)) hidden_1_video = layers.Dense(108, activation='relu')(video_input) salida = layers.Dense(10,activation='softmax')(hidden_2_video) model = Model(video_input,salida, name="tfg_v1") print(model.summary()) keras.utils.plot_model(model, 'tfg_v1.png', show_shapes=True) model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=["acc"]) historia = model.fit(X_train, Y_train, epochs=20, batch_size=256, validation_data=(X_validate,Y_validate)) model.save('tfg_v1.h5') Código 4-4. Creación de arquitectura de red neuronal densamente conectada El ejemplo del Código 4-4 fue el primer modelo de arquitectura que se probó. Se empezó con uno sencillo de solo una capa oculta Dense de 108 neuronas, con función de activación ReLu, ya que es de las más utilizadas. Para cada tipo de arquitectura se han ido probando los distintos hiperparámetros para buscar el mejor resultado. Estos son el número de neuronas en cada capa, el factor de aprendizaje, el número de capas ocultas, la función de activación de cada capa o el uso de Dropout. El número de pruebas hechas ha sido enorme, ya que hay una gran cantidad de distintas combinaciones entre estos hiperparámetros, pero en la memoria del trabajo se van a reflejar por simplicidad la evolución que se ha seguido, y la mejor arquitectura conseguida para cada tipo. 4.3 Visualización de resultados Para visualizar los resultados en cada arquitectura, se hace uso de la librería Matplotlib, que permite realizar gráficas. Se visualizará el progreso tanto de la pérdida como del acierto en cada arquitectura durante el entrenamiento. En principio se visualizará solo la pérdida, ya que nos permitirá ver si se produce subajuste o sobreajuste, y si los resultados son lo suficientemente buenos se visualizará también el acierto y se utilizará el modelo entrenado, cuyos parámetros se guardan en un fichero .h5, para utilizarlo en el set de datos de test, es decir, valores de vídeos que la red no ha visto durante el entrenamiento, para visualizar su matriz de confusión.
Etiquetado automático de vídeo utilizando aprendizaje máquina 29 29 historia_dict = historia.history acc = historia_dict['acc'] val_acc = historia_dict['val_acc'] val_loss = historia_dict['val_loss'] loss = historia_dict['loss'] epochs = range(1,len(acc)+1) plt.plot(epochs, acc, 'g', label='Acierto en entrenamiento') plt.plot(epochs, val_acc, 'b', label='Acierto en validación') plt.title('Exactitud en entrenamiento') plt.xlabel('Epocas') plt.ylabel('Exactitud') plt.legend() plt.show() plt.plot(epochs, loss, 'g', label='Perdida en entrenamiento') plt.plot(epochs, val_loss, 'b', label='Perdida en validación') plt.title('Perdida en entrenamiento') plt.xlabel('Epocas') plt.ylabel('Perdida') plt.legend() plt.show() Código 4-5. Visualización del rendimiento de la red En cada gráfica diferenciará por el color verde a los resultados correspondientes con el entrenamiento y en azul al correspondiente con la validación. 4.4 Evolución de las arquitecturas La primera arquitectura que se crea es de una sola capa oculta, y con pocas neuronas. Toma como entrada directamente por cada ejemplo todas sus características, tanto de vídeo como audio, y las introduce en la red. Se ha tenido en cuenta que en este tipo de arquitectura el número de neuronas en una capa debe ser mayor que el número de neuronas de la salida, ya que de no ser así, se produciría una pérdida de información. Además, es una buena práctica intentar que la arquitectura sea lo más simple posible, ya que conforme más parámetros tiene, mayor carga computacional será necesaria. Además, cuantas menos neuronas se utilicen, estas, para conseguir clasificar correctamente los distintos vídeos, tienen que generalizar más diferentes conceptos. Si a una arquitectura se van añadiendo más neuronas, cada una de ella va especializándose en conceptos más específicos, por lo que se pierde cierta generalidad, y quizás funcione mejor con el conjunto de datos de entrenamiento, cuya salidas la red va conociendo y se va adaptando a ella, que con un conjunto de muestras cuyas salidas no conozca. El tiempo que necesita el ordenador para procesar los datos de los archivos y guardarlos para poder ser introducido en la red es de unos 20 minutos, y ya conlleva una gran carga computacional, por lo que es aún más importante trabajando con unos datos de esta naturaleza buscar la simplicidad de la red para el entrenamiento. Se utilizan unos 312.000 vídeos para entrenamiento y unos 140.000 para validación.
30 Entrenamiento de la red y resultados 30 Los resultados en la pérdida de esta primera arquitectura (Modelo 1) demuestran que se produce rápidamente un sobreajuste enorme, ya a partir de prácticamente la tercera época la pérdida de la validación crece a un elevado ritmo. Por ello se procede al cambio de otros de los hiperparámetros, la función de activación, probando con otra función no lineal muy importante en el campo del Aprendizaje Máquina, la tangente hiperbólica (tanh). Se puede ver bastante mejora en los valores de la pérdida, por lo que se seguirá usando esta función en vez de la ReLu, pero se sigue cumpliendo el mismo comportamiento. Figura 4-1. Pérdida en el Modelo 1 con una sola capa oculta con ReLu y con tanh Por ello se introduce la técnica de Dropout con una tasa de 0.5, de manera que con la misma única capa oculta y el mismo número de neuronas se consigue una gran mejora, ya que se suaviza la curva de la pérdida de validación. Figura 4-2. Pérdida en Modelo 2 de una sola capa con la introducción de Dropout Este modelo (Modelo 2), aun siendo muy simple, consigue en la clasificación un 92% de acierto en validación, porcentaje bastante bueno para la poca carga computacional consumida. Acaba prácticamente con el sobreajuste, y tarda únicamente 6 épocas en estabilizarse del todo.
Etiquetado automático de vídeo utilizando aprendizaje máquina 31 31 Tras el primer modelo y su mejora, se decide tener en cuenta la naturaleza de las entradas, ya que son de diferente tipo. Se sigue teniendo una arquitectura con una sola capa oculta, pero esta vez una para los datos de vídeo y otra distinta para los datos de audio (Modelo 3). Después de capa Dense desde el primer modelo siempre se utiliza la técnica Dropout para evitar el sobreajuste. Figura 4-3. Modelo 3 con una capa oculta para cada tipo de entrada La idea es que quizás cada una de las capas podría especializarse en características diferentes según la naturaleza de la entrada, y de esa forma lograr mejores representaciones y aumentar el porcentaje de acierto en la clasificación. El resultado es que si bien la pérdida no sufre de sobreajuste, aumenta mínimamente su valor. Figura 4-4. Pérdida en el Modelo 3
32 Entrenamiento de la red y resultados 32 Si bien no se logra el objetivo que se busca, sigue siendo una buena posibilidad, por lo que se hace uso de otro hiperparámetro, el número de capas ocultas de la red. El siguiente paso es pues tomar dos capas ocultas para la red. De nuevo se han probado numerosas combinaciones de número de neuronas por capa hasta llegar al mejor resultado posible. Hay dos posibilidades a la hora de usar una segunda capa oculta. La primera sería una segunda capa oculta por cada una de las entradas (Modelo 4), mientras que la otra posibilidad es usar una capa oculta después de concatenar las primeras capas ocultas de cada entrada (Modelo 5). Figura 4-5. Modelos 4 y 5 al añadir una segunda capa oculta Los resultados se muestran en la Figura 4-6 en el mismo orden que los modelos de la anterior. Figura 4-6. Resultados de los Modelos 4 y 5 con dos capas ocultas Ambos resultados son muy similares y demuestran que aun añadiendo otras capas ocultas la pérdida se incrementa. Pero a la hora de visualizar el acierto, este ha aumentado a más del 94%, una mejora de un 2% con respecto al modelo de una sola capa oculta. El mejor resultado se da, por muy poco, en el caso en el que la segunda capa oculta se introduce tras la concatenación de las primeras, caso que se muestra en la Figura 4-7.
Etiquetado automático de vídeo utilizando aprendizaje máquina 33 33 Figura 4-7. Acierto en el modelo con una segunda capa oculta tras concatenar las primeras En el resultado se ve que el acierto de la validación es rápidamente muy alto, aunque hasta la época 12 no se termina de estabilizar. En la gráfica de la pérdida es en la época 12 donde se da a su vez el mínimo, aunque después crece levemente. Para finalizar con el aumento de capas, se comprueba qué sucede al añadir una tercera capa oculta (Modelo 6), pero tras varias el número de neuronas en varias casos, el resultado es siempre un aumento enorme del error en comparación con el modelo anterior, un disminución del acierto a menos del 93%, y encima, al tener más parámetros, un aumento considerable de la carga computacional. Figura 4-8. Pérdida en el Modelo 6 con tres capas ocultas
40 Entrenamiento de la red y resultados 40 Figura 4-15. Resultados para clasificación de 50 clases Los resultados para el clasificador de 50 clases dan para acierto un máximo de 87.11%, y un incremento de la pérdida, pero el comportamiento estable tanto del acierto como la pérdida en validación vuelven a conseguirse, aun utilizando un mismo modelo, de solo dos capas ocultas y no muchas neuronas. Entre el clasificador de 10 y 20 clases, respecto al acierto, hay un decremento de un 4.87%, pero entre en el 10 y 50 clases el decremento es del 7.13%. La diferencia entre duplicar y quintuplicar el número de clases es de 2.26%, es decir, el acierto disminuye bastante al pasar de 10 a 20 clases, y sigue disminuyendo pero en menor medida conforme más clases hay. La base de datos utilizada es realmente multietiqueta, pero para este trabajo solamente se ha cogido la primera etiqueta dada por cada vídeo. Además, la probabilidad de que la primera etiqueta de cada vídeo tome un cierto índice o identificador va disminuyendo conforme mayor es el índice. Esta característica de la base de datos explica que el acierto disminuya en menor medida al clasificar más clases, ya que las nuevas clases que se van añadiendo tienen muy baja probabilidad de aparición. Por último en la Figura 4-17 se muestra un esquema con el resumen del modelo completo propuesto para la clasificación de vídeo, donde se identifican 3 partes principales: 1. Decodificación de los vídeos a imágenes a 1 frame/segundo. 2. Uso de la red convolucional Inception para extracción de características y posterior disminución de dimensiones a su salida. Se consiguen dos tipos de entrada, RGB y audio. 3. Uso de una red neuronal densamente conectada para aprender de las características y clasificar entre una serie de clases posibles. La base de datos YouTube-8M ofrece de manera gratuita los dos primeros puntos, permitiendo descargar libremente los archivos con las características de los vídeos ya procesadas, que son los que con diferencia mayor complejidad y carga computacional requieren, haciendo más sencilla la tarea de clasificar vídeo.
Etiquetado automático de vídeo utilizando aprendizaje máquina 41 41 Figura 4-16. Estructura completa del clasificador
42
43 5 CONCLUSIONES Y LÍNEAS FUTURAS ste trabajo ha permitido aprender, incluyendo una base teórica y una implementación programada, como utilizar una red neuronal para implementar un clasificador, en particular de vídeo. De manera sencilla la base de datos de YouTube-8M permite el libre acceso para cualquier persona a vídeos procesados de manera que no ocupen tanto espacio y sean manejables para una red neuronal. En este último capítulo se exponen las conclusiones finales extraídas de los resultados experimentales y se exponen unas consideraciones acerca del futuro de esta rama del Aprendizaje Máquina, la clasificación de vídeo. 5.1 Conclusiones Las tareas de clasificación son de las que mayor tiempo tienen dentro de los campos de IA, Aprendizaje Máquina y Aprendizaje Profundo. La clasificación es esencial en la vida del ser humano para poder entender el mundo que le rodea, aunque ello conlleve a veces hacer representaciones con una pérdida de información de la realidad. La clasificación de imágenes ha sido el centro de la investigación de una ingente cantidad de ingenieros durante más de 60 años desde la aparición de conceptos como la neurona o perceptrón. Sentó una base en la visualización por ordenador, que aún continúa en investigación, con implicaciones que van desde hacer filtros y fotos graciosas donde puedes ver como serías de anciano en redes sociales a permitir conducir de manera autónoma un vehículo, gracias a, evidentemente, otras muchas tecnologías. Pero la clasificación de vídeo tiene un menor recorrido, debido a la dificultad computacional que conlleva procesar los vídeos, sea guardado en memoria o en tiempo real. Aun así hay mucha investigación en este ámbito, y competiciones como las de kaggle permiten que cada vez haya mayores avances en el tema. Las aportaciones de Google al presentar su base de datos YouTube-8M y utilizar esta página para presentar hasta tres años seguidos de competiciones haciendo uso de la base de datos, ha incrementado el interés de muchos investigadores en esta rama de la visión por ordenador. En esta línea, este trabajo pretende ser un primer acercamiento tanto al Aprendizaje Máquina en general, como a la clasificación de vídeo en particular. Se abarca un problema tan complejo como es la clasificación de vídeo de una manera simple pero potente, utilizando una red neuronal densamente conectada para ello. Los modelos de redes presentados demuestran que con pocas capas y neuronas se puede conseguir un potente clasificador. Se consigue una estabilidad en el error y un porcentaje de acierto más que aceptable, si bien es cierto que perdiendo una característica destacable de la base de datos original como es la multietiqueta. Pero las herramientas, sobretodo de hardware, como estudiante son limitadas. Además el hecho de no tener conocimientos previos de IA ni Aprendizaje Máquina ha hecho que la curva de aprendizaje fuera al principio de crecimiento lento, aunque constante, hasta llegar a poder tratar el problema propuesto, con la complejidad que conlleva. Se puede concluir que la arquitectura propuesta, los resultados obtenidos y el aprendizaje tanto de Python como de Aprendizaje Máquina conseguidos son más que satisfactorios. Este trabajo consigue ser un punto de partida para adentrarse en varios de estos campos que se van imponiendo como tecnología predominante en un futuro digital e inteligente. Las posibilidades que ofrecen son casi infinitas, permitiendo además a ingenieros de diferentes ramas, y personas no tan técnicas, acceder a herramientas que pueden brindar soluciones a problemas que aun ni han sido planteados. E
44 Conclusiones 44 5.2 Líneas futuras de la clasificación de vídeo Los vídeos pueden verse como una secuencia de imágenes, es decir, de matrices. Pero estas matrices tienen una característica particular que es la relación directa que hay entre una y la siguiente, que han permitido el desarrollo de nuevas tecnologías y arquitecturas que, por cuestión de tiempo y de complejidad computacional, han quedado fuera de este trabajo. Dentro de la rama de clasificación de vídeo, además habiendo utilizado YouTube-8M, hay que señalar las ideas que se usaron en el equipo que quedó en primer posición en la competición de kaggle en 2017 [37], donde demostraron que, entre otras, una arquitectura denominada Long Short Term Memory (LSTM) resultaba muy eficiente a la hora de clasificar vídeos. Este tipo de arquitectura es denominada con memoria porque toma la entrada actual y datos de entradas ya procesadas, de manera que para datos como vídeos donde hay una relación directa entre frames resulta muy efectiva. Junto a LSTM, existe la LSTM bidireccional (BiLSTM) utilizada también por varios concursantes, ya que es una arquitectura que había probado ser muy eficiente en reconocimiento del lenguaje, y prueban ser arquitecturas con una gran capacidad para capturar dependencias temporales entre frames [38]. Esta arquitectura difiere de cómo un ser humano puede llegar a clasificar un vídeo, ya que un ser humano lo ve secuencialmente de principio a fin, pero se este modelo puede incorporar información pasada y futura a la del frame que se esté tomando como entrada, logrando conseguir mejores relaciones. Otra arquitectura que utiliza valores pasados es GRU [39], que es más simple que LSTM y junto a esta forma parte de la familia denomina redes neuronales recurrentes (RNN). GRU se compone de menos parámetros, y busca una mayor eficiencia que LSTM, y ha sido usada junto a esta para las diferentes competiciones relacionadas con YouTube-8M. Para este tipo de tareas de clasificación se usa mucho la técnica a Mixture of Experts (MoE) [40] que puede resumirse en entrenar diferentes expertos para una misma tarea de clasificación, donde cada experto se especializa en un subconjunto de los casos posibles. Existe una capa softmax que da la probabilidad de elegir un experto. El problema es que hace falta mucha potencia computacional para este tipo de arquitecturas, ya que se entrenan diferentes clasificadores para cada vídeo, por lo que tener buenas y varias GPUs puede ser necesario. En resumen, durante los últimos años se han implementado diversas arquitecturas para la visión por ordenador, y más particularmente para tareas relacionadas con vídeo. La problemática de los vídeos incluye, además de introducir relaciones temporales a las espaciales que ya tienen las imágenes, la cantidad de espacio en disco que requiere almacenar los vídeos y la potencia del hardware requerido para su procesamiento. Aun así es una rama de gran importancia y tendrá un impacto cada vez mayor en el mundo, permitiendo hacer uso de herramientas de IA para multitud de tareas distintas.
45
46
47 ANEXO A: DESCARGA BASE DE DATOS En este anexo se explica cómo proceder para la descarga de la base de datos YouTube-8M, donde desde la página oficial [17] se ofrecen los pasos a dar. Para ello se muestran la siguiente captura hecha usando el sistema operativo Linux Mint, pero los pasos son análogos para otros. El procedimiento viene explicado en la web para las diferentes bases de datos que ofrece YouTube-8M. Es este trabajo se ha hecho uso de la denominada Video-level features dataset, de la versión de 2018. Desde la terminal, primero se accede a la carpeta donde se vayan a descargar los ficheros y una vez ahí de proceden a utilizar los siguientes comandos, donde se diferencia entre conjunto de entrenamiento, validación y test. El parámetro mirror deberá igualarse dependiendo de la zona geográfica a eu (Europa), us (América) o asia (Asia). Se deberá cambiar train por validate o test para cambiar el conjunto a descargar. Además hay que tener en cuenta que la base de datos ocupa mucho espacio, por lo que se ofrece un parámetro, shard que en este caso se utiliza para descargar una partición de 1/100 del total de la base de datos. Una buena recomendación es primero utilizar una pequeña parte de la misma para realizar todas las pruebas, y una vez se tenga un modelo bueno proceder a la descarga de toda o una mayor parte de ella. Una vez utilizado uno de los comandos para la descarga aparecerá información del tiempo y velocidad de descarga totales. Además irán apareciendo uno a uno los archivos .tfrecord junto al porcentaje de descarga.
48
49 ANEXO B: CÓDIGO CLASIFICADOR En este anexo se deja el código completo utilizado para el modelo que permite la clasificación de 20 clases distintas. Una vez se use este código, si se quieren probar otras arquitecturas solamente hay que modificar la parte de creación de la red, utilizando las funciones de Keras para añadir o quitar capas y/o neuronas. Además se pueden variar otros hiperparámetros como la función de activación o incluso el clasificador. En el caso que se quiera modificar el número de clases hay que cambiar los tamaños de los vectores de salida (Y_train, Y_validate, Y_test) al tamaño que se quiera utilizar, y modificar la capa de salida softmax, utilizando para ello el número de neuronas igual al número de clases. El resto del código no debe modificarse para un correcto funcionamiento. Para utilizar el conjunto de test es análogo a los conjuntos de entrenamiento y validación, cambiando donde pone en las variables y rutas train o validate por test. El código para el uso de la matriz de confusión ya se incluye en el texto. import tensorflow as tf import numpy as np import os from tensorflow.python.keras import backend as K from keras import models from keras import layers import keras from keras import Input from keras.models import Model #Cerramos cualquier sesion que pueda haber abierta por si acaso. K.clear_session() with tf.device('/gpu:0'): #Directorio donde estan los datos .tfrecord directorio = './data/train' contenido = os.listdir(directorio) #Creamos una lista con todos los archivos .tfrecord para ir posteriormente recorriendo uno a uno ficheros = [] for fichero in contenido: if os.path.isfile(os.path.join(directorio, fichero)) and fichero.endswith('.tfrecord'): ficheros.append(fichero) #Ceamos un array donde se van a ir incluyendo las entradas y salidas X_train_video = np.zeros(shape=(1,1024)) #Las entradas tendran tamaño 1024 y 128 X_train_audio = np.zeros(shape=(1,128)) Y_train = np.zeros(shape=(1,20)) #Las salidas tendran dimension igual al numero de clases num_n = 0 #Parametro para contabilizar los videos no utilizados #En este bucle vamos sacando para cada archivo tfrecord los parametros for i in ficheros:
56 Referencias 56 Pattern Recognition (CVPR), 2015, pp. 1-9, doi: 10.1109/CVPR.2015.7298594. [20] J. Deng, W. Dong, R. Socher, L. Li, Kai Li and Li Fei-Fei, ImageNet: A large-scale hierarchical image database, 2009 IEEE Conference on Computer Vision and Pattern Recognition, 2009, pp. 248-255, doi: 10.1109/CVPR.2009.5206848. [21] Lin, M., Chen, Q., and Yan, S., Network In Network, Disponible en: https://arxiv.org/abs/1312.4400, 2013. [22] NVIDIA CUDA Zone [consulta: 23 marzo 2021] Disponible en: https://developer.nvidia.com/cuda-zone [23]TPU de Cloud [consulta: 23 marzo 2021] Disponible en: https://cloud.google.com/tpu [24] Numpy The fundamental package for scientific computing with Python [consulta: 25 marzo 2021] Disponible en: https://numpy.org/ [25] Matplotlib: Visualization with Python [consulta: 25 marzo 2021] Disponible en: https://matplotlib.org/ [26] Pandas: Python Data Analysis Library [consulta: 25 marzo 2021] Disponible en: https://pandas.pydata.org/ [27] TensorFlow [consulta: 26 marzo 2021] Disponible en: https://www.tensorflow.org/ [28] Keras: the Python deep learning API [consulta: 26 marzo 2021] Disponible en: https://keras.io/ [29] Battle of the deep learning frameworks [consulta: 28 marzo 2021] Disponible en: https://towardsdatascience.com/battle-of-the-deep-learning-frameworks-part-i-cff0e3841750 [30] K. Kiviluoto and E. Oja, Softmax-network and S-Map-models for density-generating topographic mappings 1998 IEEE International Joint Conference on Neural Networks Proceedings. IEEE World Congress on Computational Intelligence (Cat. No.98CH36227), 1998, pp. 2268-2272 vol.3, doi: 10.1109/IJCNN.1998.687214. [31] Unpingco, J. Python for Probability, Statistics, and Machine Learning (2nd ed. 2019.). Springer International Publishing, 2019 Disponible en: https://doi.org/10.1007/978-3-030-18545-9 [32] D. Petkovic, The need for accuracy verification of machine vision algorithms and systems, Proceedings CVPR '89: IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 1989, pp. 439- 440, doi: 10.1109/CVPR.1989.37885. [33] Ting K.M. Confusion Matrix. In: Sammut C., Webb G. (eds) Encyclopedia of Machine Learning and Data Mining. Springer, Boston, MA , 2016. Disponible en: https://doi.org/10.1007/978-1-4899-7502-7_50-1 [34] Reading a confusion matrix [consulta: 24 abril 2021] Disponible en: https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781787125933/6/ch06lvl1sec41 /looking-at-different-performance-evaluation-metrics [35] R. Zaheer and H. Shaziya, A Study of the Optimization Algorithms in Deep Learning, 2019 Third International Conference on Inventive Systems and Control (ICISC), 2019, pp. 536-539, doi: 10.1109/ICISC44355.2019.9036442. [36]DotCSV [consulta: 23 marzo 2021] Disponible en: https://www.youtube.com/c/DotCSV/videos [37] Miech, A., Laptev, I., and Sivic, J., Learnable pooling with Context Gating for video classification, 2017. Disponible en: https://arxiv.org/abs/1706.06905. [38] Zou, Haosheng et al. The YouTube-8M Kaggle Competition: Challenges and Methods, 2017 Disponible en: https://arxiv.org/abs/1706.09274 [39] Cho, K., Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation, ,2014. Disponible en: https://arxiv.org/abs/1406.1078 [40] M. I. Jordan, Hierarchical mixtures of experts and the EM algorithm IEE Colloquium on Advances in Neural Networks for Control and Systems, 1994, pp. 1/1-1/3.