Implementación y aceleración de algoritmos de IA sobre Raspberry Pi
Autor
Marcos Abellán Campos
Tutores
Sergio Antonio Cuenca Asensi Tecnología informática y computación
Antonio Martínez Álvarez Tecnología informática y computación
Grado en Ingeniería Robótica
ALICANTE, Abril 2021
Preámbulo y Motivación
En este documento se va a tratar la nueva tendencia de desarrollo de algoritmos en sistemas embebidos, más en concreto, algoritmos de clasificación y localización de objetos.
En la actualidad, el desarrollo de nuevos sistemas inteligentes está obligando al sector a polarizarse entre sistemas que se ejecutan en remoto y sistemas que se ejecutan de forma local. Dependiendo de la tarea que se pretende llevar a cabo y de los recursos de los que se dispone puede ser recomendable un tipo de implementación u otra.
La intención de este documento es estudiar posibles implementaciones sobre sistemas embebidos de recursos limitados dentro del campo del reconocimiento visual en la actualidad. El algoritmo más relevante que cabe mencionar es YOLO y la plataforma sobre la que se trabajará será el último modelo de Raspberry Pi 4. Se intentará, por otra parte, llevar a cabo la aceleración del sistema que se implemente.
Finalmente, se expondrán los resultados de la manera más genérica posible y se propondrán unas conclusiones sobre las partes más relevantes que se han observado.
Agradecimientos
En primer lugar, me gustaría agradecerle a mi familia el apoyo que me han brindado, ya no durante la creación de este proyecto, sino desde siempre. Por supuesto otra parte importante sin la que este documento tampoco habría llegado a existir nunca, son mis amigos, a los cuales también les agradezco su fidelidad y paciencia. Todos tenemos dentro una pequeña parte de las personas que nos rodean, aquellas con las que compartes tu vida, y yo tengo la suerte de contar con las mejores.
Por otra parte, me gustaría agradecer a la entidad Intigia S.L y a su gerente Daniel Gutierrez, por haberme prestado el material y la ayuda necesarios para afrontar el desarrollo de este proyecto.
Finalmente, me gustaría dar las gracias a mi tutor, Sergio Cuenca y a todos los profesionales de la Universidad de Alicante, por todos los conocimientos que he adquirido gracias a ellos. Y no solo conocimientos, también tengo que agradecerles nuevas habilidades y capacidades que he logrado dominar gracias al esfuerzo y la dedicación tanto de ellos como educadores, como el mío propio como estudiante.
Para mis padres y mi hermano.
Sin vosotros no sería quien soy, os quiero.
Índice general
Introducción 17
1.1. Introducción al reconocimiento visual 19
Objetivos 23
Estado del arte 25
3.1. Algoritmos de detección de objetos 26
3.1.1. Detectores previos al ‘deep learning’ 27
2.1.2. Redes neuronales convolucionales (CNN) 29
2.1.3. Algoritmos ‘two-stage detectors’ 33
2.1.4. Algoritmos ‘one-stage detectors’ 38
2.1.5. Resumen de los algoritmos vistos 42
2.2. Algoritmos de detección sobre plataformas embebidas 44
Herramientas utilizadas 51
4.1. TensorFlow Lite 52
4.2. YOLOv4 56
Experimentos y resultados 61
5.1 Librería YOLOv4 63
5.1.1. Aspectos generales de la librería 64
5.1.2. Conversión y cuantización 70
5.1.3. Precisión de los modelos 75
5.1.4. Resultados de YOLOv4 80
5.2 Alternativas de aceleración 86
5.2.1. Aceleración de YOLOv4 en Raspberry Pi 4 87
5.2.2. PyArmNN 88
5.2.3. NNPack 89
5.2.4. Yolo Fastest 91
5.2.5. Aceleración de YOLOv4 con Google Coral TPU 95
Conclusión 103
Bibliografía 107
Anexo I. Lista de proyectos auxiliares 109
Anexo II. Referencias a las fuentes de las figuras 112
Lista de figuras
Figura 1. Hitos en la detección de objetos.
Figura 2. Detector HOG.
Figura 3. Detector DPM.
Figura 4. Operación convolución.
Figura 5. Operación ‘pooling’.
Figura 6. Arquitectura de una ‘Convolutional Neural Network’.
Figura 7. Arquitectura RCNN’.
Figura 8. Mejoras de Fast RCNN’.
Figura 9. Comparativa de velocidad de detección de los algoritmos ‘two stage’.
Figura 10. Tabla comparativa SSD, YOLO y Faster R-CNN.
Figura 11. Arquitectura SqueezeDet.
Figura 12. Tabla comparativa de los principales algoritmos de detección.
Figura 13. Especificaciones familia Jetson de Nvidia.
Figura 14. Tabla comparativa de algoritmos de detección sobre distintas plataformas.
Figura 15. Mejoras de YOLOv4 en rendimiento y precisión.
Figura 16. Estructura YOLOv4.
Figura 17. Tabla resumen de las mejoras de YOLOv4.
Figura 18. Diagrama organizativo de YOLOv4.
Figura 19. Primera prueba de detección.
Figura 20. Reducción tamaños por cuantización de YOLOv4.
Figura 21. Reducción tamaños por cuantización de Tiny YOLOv4.
Figura 22. Diagrama de cálculo de IoU.
Figura 23. Fórmulas para calcular la precisión y la recuperación.
Figura 24. Resultados AP clase ‘airplane’ YOLOv4.
Figura 25. Resultados mAP YOLOv4.
Figura 26. Rendimiento de cuantizaciones en la plataforma x86.
Figura 27. Rendimiento de cuantizaciones en la plataforma ARM.
Figura 29. Precisión de los modelos cuantizados.
Figura 29. Resultado Coral con videos a diferentes resoluciones.
Lista de tablas
Tabla 1. Resumen de características de algoritmos de detección.
Tabla 2. Resumen de características de las plataformas embebidas.
Tabla 3. Descripción métodos de ‘common’.
Tabla 4. Descripción métodos de ‘tf’.
Tabla 5. Descripción métodos de ‘tflite’.
Tabla 6. Resultados de intentar acelerar la Raspberry Pi sin acelerador externo.
Tabla 7. Diferencias entre usar y no usar la micro SD a distintas resoluciones.
Tabla 8. Recopilación final de los resultados en rendimiento y precisión.
1. Introducción
Hoy en día, el campo del aprendizaje automático está en un proceso de aceleración exponencial tanto en uso como en popularidad. Esto ha sido posible gracias a los diversos avances científicos y técnicos en dicha disciplina.
Las mejoras en capacidad de cómputo de los sistemas, con chips más potentes y más eficientes, sumado al desarrollo de nuevas técnicas como las redes neuronales convolucionales entre muchas otras, ha desembocado en el estado del arte actual.
En los últimos años el mundo ha sido testigo de cómo se han puesto en marcha cientos de centros de datos con servidores para llevar a cabo tareas de todo tipo, desde tareas de almacenamiento de datos, hasta ejecución remota de distintos servicios de cómputo.
La ventaja de estas herramientas remotas es que no es necesario hacer desembolsos de grandes de dinero para poder lograr grandes capacidades de computación, basta con alquilar los equipos a grandes compañías.
Cuando se aplica todo lo anterior al campo del aprendizaje automático se obtiene la capacidad de entrenar sistemas inteligentes vanguardistas, precisos y eficientes. Los sistemas actuales, aun con la potencia disponible, necesitan de días o incluso semanas para converger en herramientas finales. Sin embargo, una vez que el sistema ha sido moldeado y entrenado, los requisitos necesarios para poder llevar a
cabo predicciones son mucho menores. Por ello, los últimos años el campo de la inteligencia artificial ha sufrido una cierta polarización entre la ejecución remota y la ejecución local.
De forma remota, se pueden usar dispositivos modestos como nodo central y basta una conexión a internet estable para llevar a cabo la implementación de algoritmos de inteligencia artificial complejos. Por ejemplo, puede usarse una placa embebida de bajos recursos como herramienta final acompañada de una conexión a internet y un nodo externo encargado de la carga de trabajo computacional.
Sin embargo, la anterior implementación acarrea problemas de gran magnitud. La latencia de comunicación en tareas críticas en tiempo real, la falta de conexión a internet y la mala estabilidad de la señal son las más destacables. Por ejemplo, en sistemas de conducción autónoma, donde los tiempos de respuesta son muy reducidos y está en riesgo la vida de seres humanos, la ejecución remota no es una opción viable. Esto es así porque el sistema depende de la respuesta del nodo externo para llevar a cabo la toma de decisiones que pueden suponer la vida o la muerte de los ocupantes del vehículo. No todas las aplicaciones tienen vinculada esta enorme responsabilidad desde luego. No obstante, la dependencia de sistemas externos es una limitación considerable cuando se desea llevar a cabo un proyecto de estas características.
Por esta razón los vehículos que tienen esas capacidades montan los equipos en el propio dispositivo para no depender de un sistema externo. En este caso en concreto, los vehículos de más modernos montan tarjetas gráficas de última generación y grandes sistemas de sensorización.
Pero, ¿qué ocurre si el dispositivo en el que se pretende implementar el sistema de detección debe tener unas dimensiones menores o bien el producto final que se pretende obtener tiene que ser más modesto? En estos casos sería primordial poder
usar sistemas embebidos de tamaño y consumo reducido como la Raspberry Pi, anteriormente mencionada, u otras soluciones parecidas para llevar a cabo la tarea.
Así es como nace un nuevo nicho de mercado de computación ‘in the edge’. Grandes empresas como Nvidia, Google e Intel, ya han desarrollado sistemas con altas prestaciones de tamaño y consumo reducidos. Estos sistemas son capaces de llevar a cabo tareas de cómputo de alto valor añadido en tareas de inteligencia artificial y visión por ordenador.
En cualquier caso, cada vez hay más demanda de servicios tecnológicos en general.
Para lograr los objetivos de este proyecto se van a estudiar los sistemas embebidos aplicados a tareas de reconocimiento visual.
1.1. Introducción al reconocimiento visual
Lograr un sistema capaz de llevar a cabo la tarea del reconocimiento visual era imposible de llevar a cabo hace unos años. Se lograron pequeños avances, pero estaban lejos del rendimiento y precisión de los seres humanos. Con los avances tecnológicos actuales se está llegando cada vez más lejos en la tarea de detección de objetos, llegando incluso a implementar sistemas capaces de detectar y catalogar en tiempo real un número enorme de objetos. Por ello, la tarea de reconocimiento en imágenes se considera relativamente superada en ciertos aspectos básicos. No obstante, queda aún muchos hitos por lograr para llegar a la precisión, velocidad y fluidez que alcanzan las personas.
El objetivo principal de un sistema de detección de objetos es extraer información de una determinada escena para después poder procesarla y ofrecer una interpretación.
Cuando se procesa la información de una imagen se obtiene la posición y la clasificación de los objetos más relevantes de la escena.
Cabe destacar que hay una notable diferencia entre clasificar y localizar. La clasificación consiste en determinar qué clase de objetos aparecen en una escena sin llegar a alterar la entrada. Por otro lado, la localización implica señalar dentro de la imagen inicial la posición de los objetos clasificados, alterando de esa forma la entrada.
Sin embargo, ¿un ordenador es capaz de actuar como lo haría un ser vivo detectando y localizando diferentes objetos? Los humanos hacen uso de los ojos para capturar información del entorno que nos rodea. Después procesan esos datos en el cerebro.
En el caso de las máquinas, se lleva a cabo un procedimiento similar: una cámara captura una imagen o una secuencia de imágenes que son analizadas por el procesador del dispositivo. Pero una imagen no es interpretada de la misma forma por los seres vivos que por un procesador. Para un ordenador una imagen es una matriz de números que representa una serie de valores de intensidad.
Una vez expuesto lo anterior, si para un ordenador las imágenes no son más que un conjunto de datos numéricos agrupados de forma matricial, ¿cómo pueden ser capaces de analizar los datos y detectar objetos en esas imágenes?, o incluso diferenciar unas imágenes de otras. Al fin y al cabo, si un ser humano intentara interpretar esas mismas matrices que codifican esa información tampoco serían capaces de ver más que un conjunto de números.
Los seres humanos son capaces de entender e interpretar su entorno porque son aprenden a hacerlo desde que nacen. Por esto, aunque una imagen digital no sea más que un conjunto agrupado de una forma concreta, es una manera tan válida de representación como la que perciben los humanos. Ahora bien, continuando con el símil del nacimiento, si el ser humano adquiere la capacidad de localizar y clasificar
los objetos de su entorno desde que son pequeños, ¿cómo puede lograr un resultado similar una máquina? Esto se logra mediante diversas técnicas de inteligencia artificial.
Los sistemas de detección de objetos implementados mediante técnicas de visión por ordenador fueron los primeros en ser desarrollados y tienen ciertas limitaciones.
Dependiendo de la tarea y del algoritmo el sistema será más o menos óptimo, pero hay tareas complejas que estos algoritmos tradicionales de visión no son capaces de resolver de manera eficiente. Por ejemplo, el problema clásico de la detección de objetos ha tenido una difícil solución a través técnicas de visión y ha llevado varias décadas de investigación. Además, el sistema de detección de objetos resultante a través de una implementación llevada a cabo con estas técnicas no es flexible a cambios en la tarea final.
Para estos casos más complejos se complementa la visión por ordenador con sistemas de inteligencia artificial más avanzados. El 'machine learning' o aprendizaje automático consiste en dotar a una máquina con la habilidad de aprender por sí misma. Si se une la rama del aprendizaje automático con técnicas de visión, se pueden lograr resultados excepcionales en tareas complejas. El aprendizaje automático se puede dividir a su vez, en aprendizaje supervisado, no supervisado, por refuerzo y algoritmos genéticos.
Lo más común en el campo del reconocimiento de objetos es el uso de un tipo de sistemas de aprendizaje supervisado llamado redes neuronales. Las rede neuronales más eficaces y eficientes con el manejo de imágenes son las redes neuronales convolucionales. Sobre ellas se hablará más en profundidad más adelante.
2. Objetivos
El objetivo, como bien recoge el título del documento, es el de implementar y acelerar uno o varios algoritmos de detección de objetos usando una placa embebida para llevar a cabo la inferencia. No se pretende crear un sistema desde cero sino usar implementaciones o soluciones actuales y sobre ellas construir el presente proyecto.
Sin embargo, los algoritmos de detección demandan una serie de recursos y las plataformas embebidas suelen tener recursos limitados. Por esa razón tendrá que realizarse modificaciones o mejoras sobre el algoritmo para optimizarlo al máximo, obteniendo el mejor rendimiento posible.
Después de mencionar el objetivo principal, un objetivo secundario que se desprende del principal sería el de poder llevar a cabo la inferencia de objetos en tiempo real.
Para que esto sea posible es necesario poder procesar imágenes a un ritmo lo suficientemente alto como para que no se note el salto entre imágenes. Por tanto, se usarán video e imágenes como datos de entrada.
El planteamiento inicial abarca la posibilidad de implementar diversos algoritmos y comparar el rendimiento que cada uno de ellos podía ofrecer. Sin embargo, cabe la posibilidad de que, al intentar estudiar muchos algoritmos distintos, esto provoque que el principal objetivo del proyecto, que es la optimización y aceleración, no se realice satisfactoriamente. Por esta razón, se va a focalizar la implementación en un único algoritmo, el más óptimo, más extendido o que sea interesante en algún aspecto.
En etapas finales de las implementaciones se evaluará la inclusión o no de otros algoritmos de detección. Inicialmente, se seleccionará un único algoritmo y una única plataforma embebida sobre la que sacar el máximo rendimiento posible.
3. Estado del arte
Un algoritmo es un conjunto de instrucciones a seguir para resolver un determinado problema. Actualmente, las instrucciones y los programas tradicionales han dejado paso a sistemas inteligentes capaces de aprender, sin embargo, en última instancia, la definición de algoritmo de detección es la misma: un sistema cerrado al cual se le suministran imágenes, estas son procesadas y dan lugar a una información de salida.
La salida consiste en las posiciones y etiquetas de los objetos detectados. Las técnicas modernas han permitido un aumento significativo en rendimiento y precisión de los sistemas. Van a estudiarse, sin embargo, los principales avances en este campo en los últimos 20 años, abarcando tanto algoritmos más tradicionales de visión por ordenador como complejas redes neuronales.
Figura 1. Hitos en la detección de objetos. Fuente: [23].
Las principales mejoras de los algoritmos modernos con respecto a algoritmos más tradicionales son en precisión de detección y eficiencia. Los más destacables son los siguientes:
Mejoras en precisión:
- Variaciones entre clases: Se mejoran las detecciones entre objetos del mundo real con distintos colores, formas y posiciones.
- Condiciones de imágenes y entornos sin restricciones: se obtiene un mejor desempeño en entorno con peor iluminación, condiciones climáticas, punto de vista, sombras y con desenfoques.
- Ruido en la imagen: se manejan mejor las imágenes con baja resolución, ruido de compresión y distorsiones de filtro.
- Mayor rango: miles de categorías nuevas del mundo real que pueden ser distinguidas y clasificadas por el detector.
Mejoras en eficiencia:
- Implementación en sistemas móviles de gama baja con limitados recursos.
- Distinción de miles de tipos de objetos en tiempo real.
- Manipulación de datos a gran escala.
3.1. Algoritmos de detección de objetos
En los siguientes párrafos se van analizar los diferentes algoritmos de reconocimiento de objetos que han sido desarrollados los últimos años y cuáles son los más óptimos. Cada método tiene sus puntos fuertes y sus usos, que serán brevemente expuestos. Finalmente, se expondrá cuál de entre todos ellos se considera el más adecuado para ser optimizado en una plataforma embebida.
3.1.1. Detectores previos al ‘deep learning’
Detector Viola-Jones
Viola-Jones es el primer algoritmo competitivo para la detección de objetos en tiempo real. Viola-Jones fue creado por Paul Viola y Michael Jones en 2001. Su principal característica es que es capaz de detectar caras sin restricciones de color, piel o edad. El algoritmo funciona recorriendo la imagen y analizando secciones pequeñas. Hace uso de filtros de caja, de manera similar a como lo hacen otros algoritmos similares como SURF, para extraer características y analizar si hay un rostro humano en el fragmento inspeccionado. Las principales técnicas introducidas por este algoritmo son: imagen integral, detección en cascada y selección de características.
La imagen integral, por una parte, es una operación que supone la suma de todas las intensidades de los píxeles de una imagen contenida en la propia imagen. Por otro lado, la detección en cascada es una técnica que simplifica la clasificación, estableciendo etapas de detección. Si el fragmento analizado no supera alguna de las etapas, se descarta directamente, acelerando notablemente la velocidad de ejecución del algoritmo. Finalmente, la selección de características consiste en diferenciar y seleccionar puntos de la imagen que puedan considerarse de interés.
Detector HOG
Este descriptor fue desarrollado por N. Dalal and B. Triggs en 2005 e inicialmente tenía como principal objetivo la detección de peatones. Su funcionamiento se basa en el uso de los cambios de gradientes de una imagen para suponer bordes de objetos dentro de un determinado entorno. A partir de los gradientes se construye un
histograma con la información resultante. El gradiente representa la variación máxima de intensidad y la representa de forma vectorial, con magnitud y dirección.
El histograma, por otro lado, es simplemente una forma distinta de almacenar la información de una imagen. En lugar de guardar un orden espacial como la imagen original, solo se almacena la cantidad de veces que aparecen los distintos valores de intensidad de la imagen. Las ventajas de este algoritmo son principalmente su invariabilidad ante perturbaciones, lumínicas sobretodo y su linealidad a la hora de detectar diferentes clases dentro de una imagen.
Figura 2. Detector HOG. Fuente: [24].
Deformable Part-Based Model (DPM)
El algoritmo DPM fue desarrollado por P. Felzenszwalb y fue el ganador del desafío de detección del ‘dataset’ VOC entre 2008 y 2009. Esta implementación supone una mejora del algoritmo HOG. La principal característica del algoritmo es que usa la filosofía de resolución de problemas ‘divide y vencerás’, donde la descomposición de
objetos y la inferencia se resuelven por separado. Un descriptor DPM cuenta con dos filtros diferentes, un filtro raíz y otro filtro para las múltiples partes. El filtro raíz es un detector HOG de la imagen completa, mientras que el segundo, es un filtro HOG fragmentado en diferentes partes. Esta mejora tiene un impacto directo sobre la precisión del modelo. A lo largo de los años esta técnica ha sido objeto de diversas mejoras que han incrementado la precisión en las detecciones.
Figura 3. Detector DPM. Fuente: [25].
2.1.2. Redes neuronales convolucionales (CNN)
Los algoritmos expuestos hasta ahora resuelven el problema para el que fueron diseñados, pero no tienen un comportamiento inteligente. A partir del 2012 con la llegada de la arquitectura de red neuronal convolucional AlexNet, el estado de la técnica dio un giro radical. A partir de este momento, el problema de la detección de objetos ha sido abordado mayoritariamente desde el paradigma del ‘deep learning’ o aprendizaje automático profundo de manera exitosa.
Dentro del campo de la visión por ordenador lo más extendido son un tipo concreto de redes neuronales llamadas convolucionales o CNN. Una CNN es un tipo de red neuronal artificial entrenada mediante aprendizaje supervisado que procesa sus
capas imitando al ojo humano para identificar las características más importantes dentro de las imágenes. Para ello, las CNN contienen varias capas ocultas especializadas y con una jerarquía. Esto quiere decir que las primeras capas pueden detectar patrones sencillos como líneas, esquinas y curvas. Conforme la red se va haciendo más profunda los patrones ganan complejidad y se van especializando hasta reconocer formas complejas como objetos o animales.
En otras palabras, una red neuronal tradicional distribuye la información de cada pixel a una neurona de entrada, pero posteriormente el manejo interno de los datos consiste en interconexiones individuales entre neuronas. Las CNN, en cambio, usan capas de neuronas aplicadas secuencialmente, ofreciendo así una estructura óptima para el análisis de las imágenes. El secreto de las CNN reside en las operaciones de convolución y pooling.
La convolución es una operación matemática que se aplica generalmente sobre matrices. Consiste en usar los datos de los píxeles vecinos para mediante operaciones sencillas calcular un nuevo valor de numérico relacionado con todos los que lo han generado. La convolución da lugar a una imagen resultante de igual dimensión basada en la imagen original pero completamente distinta. A la estructura que se utiliza para transformar la imagen durante la convolución se la llama kernel o máscara. Dependiendo de la dimensión y los valores del kernel, se obtienen resultados diferentes. Cada máscara representa un filtro distinto que sirve para destacar un patrón concreto dentro de la imagen. Una CNN está compuesta por muchas capas de neuronas que son sometidas a gran cantidad de convoluciones.
Todo esto deriva en una secuencia de patrones más o menos complejos que a su vez convergen en detecciones finales.
Figura 4. Operación convolución. Fuente: [26].
Durante el proceso de convolución se aplican funciones de activación para filtrar los datos más importantes y que los píxeles menos relevantes dejen de ser relevantes en capas posteriores. Para que los datos obtenidos durante cada convolución vayan dando lugar a patrones reconocibles cada vez más marcados es necesario ir concentrando y especializando los esfuerzos de la red. Las capas de ‘pooling’ son las que se encargan de esta tarea.
Figura 5. Operación ‘pooling’. Fuente: [27].
Las capas de ‘pooling’ tienen la función de reducir la dimensionalidad de los datos que se están procesando. De esta manera se reduce así el número de parámetros del aprendizaje, centrándose en los más relevantes. Existen diferentes tipos de capas de
‘pooling’ que afectan a una determinada región seleccionando el píxel de mayor, menor valor o una media entre todos. Sin embargo, la operación más común es ‘max.
Pooling’.
Figura 6. Arquitectura de una ‘Convolutional Neural Network’. Fuente: [28].
2.1.3. Algoritmos ‘two-stage detectors’
Llegados a este punto se debe distinguir entre detectores de una y dos etapas. Los detectores de una etapa tratan la detección de objetos como un simple problema de regresión. Partiendo de una imagen de entrada aprenden las probabilidades pertenencia a una clase y las coordenadas del cuadro de detección. Por otra parte, los detectores de dos etapas usan una primera red para generar regiones de interés. En la segunda etapa, se procesan las propuestas de región de interés y se lleva a cabo la clasificación y localización final. Los algoritmos de dos etapas por lo general, ofrecen resultados mejores en términos de precisión, pero suelen ser más lentos.
Region-Based Convolutional Neural Network (RCNN)
Este algoritmo fue desarrollado por R. Girshick en el año 2013. Este detector analiza regiones concretas de las escenas. El primer paso del algoritmo consiste en seleccionar las regiones más apropiadas para ser analizadas. Hasta 2000 regiones pueden llegar a ser extraídas y propuestas en esta primera etapa. Posteriormente, se hace uso de una red neuronal convolucional que ha sido entrenada a partir de AlexNet. Finalmente, un clasificador determina a qué clase pertenece la región propuesta.
A pesar de las grandes mejoras que supuso este algoritmo, tiene ciertos inconvenientes que fueron objetivo de mejora durante varios años. RCNN mejoró hasta un 58.5% el porcentaje de acierto de las tecnologías de reconocimiento de objetos previas que se encontraban en un 33.7% (DPM-v5), sobre el ‘dataset’ VOC- 2007.
A pesar de la gran mejora de precisión de RCNN, tiene varios inconvenientes. Por un lado, se necesita mucho tiempo para entrenar la red. Esto es así porque necesita
clasificar 2000 propuestas de regiones. Por otro lado, no se puede implementar en tiempo real, ya que cada imagen necesita alrededor de 47 segundos para ser procesada. Además, puesto que la selección de las regiones de interés se realiza de manera previa al análisis, este proceso no está sujeto a un proceso de aprendizaje.
Todo ello conduce a una generación de propuestas de regiones subóptimas o incorrectas. Para resolver estos inconvenientes, el mismo año se propuso el algoritmo SPPNet.
Figura 7. Arquitectura RCNN’. Fuente: [23].
Spatial Pyramid Pooling Network (SPPNet)
SPPNet fue desarrollado poco después que RCNN por Kaimin He. SPPNet supone una mejora de rendimiento con respecto al algoritmo anterior. Con RCNN se necesita una imagen de entrada con tamaño fijo, lo cual obliga al algoritmo a redimensionar la región propuesta que se va a analizar. Esto genera una merma en el rendimiento que SPPNet soluciona introduciendo el concepto de "spatial Pyramid Pooling (SPP) layer". SPP permite que la red neuronal convolucional produzca una secuencia de
longitud fija independientemente del tamaño de la región de interés, solucionando de esta forma cualquier dependencia sobre la escala. Además, mediante SPPNet solo se calculan las características de la imagen una sola vez, a partir de la imagen completa.
De esta manera SPPNet es capaz de ofrecer un porcentaje de acierto del 59.2%
aumentando la velocidad. A pesar de las mejoras, SPPNet tiene muchos inconvenientes como que el entrenamiento aún es multietapa y los tiempos de inferencia siguen siendo altos. Para resolver estos inconvenientes, se introdujo Fast RCNN.
Fast Region Convolutional Neural Network (Fast RCNN)
Fast RCNN supone una mejora con respecto a RCNN y SPPNet. Fue implementado por R. Girshick en el año 2015. Fast RCNN es capaz de entrenar simultáneamente el detector y el ‘BB regressor’. Este último es el valor de la posición y el tamaño de la caja delimitadora del punto de interés, calculada de forma regresiva.
Los límites de velocidad de detección se mantienen, pero el porcentaje de acierto aumenta desde un 58% hasta el 70% sobre el ‘dataset’ VOC-2007.
Figura 8. Mejoras de Fast RCNN’. Fuente: [23].
Faster Region Convolutional Neural Network (Faster RCNN)
Faster RCNN fue implementado el mismo año que Fast RCNN por el autor S. Ren.
Su objetivo es resolver el principal inconveniente de sus algoritmos predecesores, la velocidad de ejecución. Faster RCNN fue el primer algoritmo de detección en ofrecer un rendimiento de hasta 17 FPS o imágenes por segundo. El sistema usado para ello fue una GPU Tesla K40 y la arquitectura ZFNet. La principal diferencia entre ambos es que Faster RCNN implementa una ‘Region Proposal Network’, que es una red específica para proponer regiones de interés. De esta manera se resuelve también el inconveniente que tenía inicialmente el algoritmo RCNN, donde la selección de regiones de interés era llevada a cabo por un algoritmo fijo. Por otro lado, la precisión de Faster RCNN se mantiene en torno al 70% con el ‘dataset’ VOC-2007.
A continuación, se presenta un gráfico que refleja las diferencias de rendimiento de los algoritmos presentados hasta ahora. Se observa que Faster RCNN es capaz de procesar imágenes cada 0.2 segundos, lo que supondría 5 FPS usando la arquitectura de red VGGNet.
Figura 9. Comparativa de velocidad de detección algoritmos ‘two stage’. Fuente: [29].
Mask R-CNN
Este algoritmo es una extensión de Faster RCNN y fue desarrollado por Kaiming He en 2017. El objetivo principal de Mask RCNN es resolver los problemas en la segmentación en visión por ordenador; es decir, separar los objetos relevantes de una imagen del fondo. De esta manera se pueden manejar varias clases en una misma imagen de forma más precisa y eficiente.
Mask R-CNN produce tres salidas: una etiqueta de clase, coordenadas del cuadro de detección y la máscara del objeto. Mask R-CNN detecta de manera eficiente objetos al mismo tiempo genera una máscara de segmentación para cada objeto detectado.
Sus puntos fuertes son que es simple de entrenar y flexible. Mask R-CNN utiliza ResNet-FPN como modelo principal para extraer características. Sin embargo, el principal inconveniente del algoritmo es que tiene un coste computacional algo superior a sus predecesores. Ofrece un rendimiento máximo de alrededor de 5 FPS con una Tesla K40.
2.1.4. Algoritmos ‘one-stage detectors’
You Only Look Once (YOLO)
YOLO es el algoritmo más robusto, rápido y sencillo de todos los estudiados hasta el momento. Fue desarrollado por R. Joseph en el año 2015 y es capaz, manteniendo una precisión muy alta, de aumentar la velocidad de detección hasta poderse usar en tiempo real de manera fluida. En otras palabras, YOLO es capaz de funcionar a una tasa de 155 FPS con una precisión del 52% o de 45 FPS con una precisión del 63%
usando el ‘dataset’ VOC-2007 y una GPU Tesla K40.
En los algoritmos de dos etapas se obtenían las regiones de interés, lo cual requería un cierto procesado previo con su consiguiente coste temporal y computacional. En YOLO y el resto de algoritmos de una etapa la imagen de entrada es sometida directamente a una red convolucional. La red de YOLO separa la imagen en regiones, analiza estas regiones y ofrece cuadros delimitadores y probabilidades de pertenencia a una cierta clase.
Los inconvenientes de YOLO son que tiene dificultades para detectar objetos pequeños y que su precisión es menor que los detectores de dos etapas. Sin embargo, es idónea para implementaciones en tiempo real donde se busca una velocidad de inferencia suficiente como para analizar un gran número de imágenes por segundo.
A pesar de ser un algoritmo con pocos años, YOLO ha sufrido diversas mejoras (YOLOv2, YOLOv3 y YOLOv4) para intentar aumentar el porcentaje de precisión manteniendo la velocidad de detección que le hace destacar entre el resto de algoritmos.
Single Shot Multi-Box Detector (SSD)
Este algoritmo fue implementado por W. Liu en el año 2016. Al igual que YOLO, procesa la imagen de entrada directamente. Sin embargo, aunque SSD sea considerado un algoritmo de una etapa, guarda similitudes con la arquitectura de RCNN expuesta anteriormente. En lugar de producirse dos etapas en serie, una para generar propuestas de región y otra para detectar el objeto de la región propuesta, se utiliza una única etapa para detectar múltiples objetos. Uno de los inconvenientes de los detectores de una etapa es la dificultad a la hora de detectar objetos pequeños.
Para intentar solucionar este problema SSD introdujo técnicas de detección de múltiples etiquetas a diferentes resoluciones. Para mejorar la velocidad de detección en tiempo real que ofrecía Fast RCNN, SSD eliminó la red de propuesta de regiones (RPN).
Figura 10. Tabla comparativa SSD, YOLO y Faster R-CNN. Fuente: [30].
Como puede observarse en la figura 10, SSD es capaz de mantener la tasa de precisión de modelos como Faster RCNN, mejorando mucho la velocidad de inferencia y brindando hasta los 59 FPS. Este valor está por debajo de YOLO que es capaz de ofrecer un rendimiento de hasta 155 FPS.
Para concluir, los principales inconvenientes de SSD son que su eficacia está directamente relacionada con el número de tamaños de cuadros por defecto que usa en la detección. Además, SSD obtiene más clasificaciones erróneas que RCNN.
Retina-Net
Este algoritmo fue desarrollado por Y. Lin en el año 2017. El principal objetivo de Retina-Net es mejorar la precisión de SSD. Como se ha observado, YOLO es un sistema que brinda un gran rendimiento a costa de sacrificar cierto porcentaje de precisión. Por otro lado, SSD soluciona en cierta medida este problema, pero genera grandes conjuntos de posibles ubicaciones de objetos que cubren de manera muy densa algunas áreas de la imagen. Esto crea un desequilibrio de clases que puede provocar que algunos objetos pasen desapercibidos. Estos desequilibrios son corregidos por Retina-Net, focalizándose durante la fase de entrenamiento en los ejemplos mal clasificados.
SqueezeDet
SqueezeDet fue implementado por Bichen Wu en el año 2016. Este algoritmo es extremadamente ligero, rápido y bastante preciso. Se desarrolló para poder funcionar en vehículos autónomos por lo que debe consumir poca energía y ser eficiente en el uso de la memoria.
El primer paso del algoritmo consiste en aplicar una serie de filtros convolucionales a la imagen de entrada. Esto genera unos mapas de características de alta profundidad, pero baja resolución. A continuación, se usa una capa convolucional llamada ConvDet que trabaja específicamente con estos mapas de características generados en primer lugar. De ConvDet se obtienen las cajas de detección.
Finalmente, la imagen resultante es filtrada para obtener la estimación final.
Lo que convierte SqueezeDet un algoritmo tan óptimo es el modelo que le da forma, SqueezeNet, tiene un tamaño de solo 8 MB en comparación con AlexNet que tiene alrededor de 200 MB. Esta mejora en rendimiento con respecto al modelo AlexNet se logra sin perder precisión en la detección. Este modelo consta de aproximadamente dos millones de parámetros entrenables y alcanza 57.2 FPS entrenado para detectar coches, ciclistas y peatones con el conjunto de datos de Kitti.
Figura 11. Arquitectura SqueezeDet. Fuente: [23].
CornerNet
El último algoritmo de detección sobre el que se va a hablar es CornerNet, el cual fue desarrollado por Hei Law en el año 2018. La novedad que introduce este algoritmo es que cambia la manera de representar los datos. Hasta ahora, la detección se representa mediante un cuadro de detección. Con CornerNet estos datos se ven simplificados a dos puntos sobre la zona de interés, situados en las esquinas superior
izquierda e inferior derecha. La salida de la red es, por tanto, un vector de pares de esquinas en lugar de otra imagen o una etiqueta.
Este método supone una gran simplificación para los algoritmos de una etapa, además de una mejora en la precisión. Sin embargo, los puntos clave pueden ser incorrectos para el objeto detectado. Para resolver ese problema se introdujo un tercer punto central, naciendo la variante CenterNet. Esta mejora del algoritmo aumenta el porcentaje de precisión, pero la velocidad de inferencia disminuye.
2.1.5. Resumen de los algoritmos vistos
Tras haber expuesto los principales algoritmos de detección que se han estado desarrollando los últimos años, se va a proceder a recopilar las características principales en una única tabla comparativa.
Algoritmo Características
RCNN -Proposición de regiones de interés.
-Mejoras del porcentaje de acierto.
-Bastante tiempo de entrenamiento y ejecución.
SPPNet
-Inclusión de una capa SPP (Spatial Pyramid Pooling) para solucionar el problema de dependencia de escala.
-Entrenamiento multietapa y tiempo de inferencia demasiado alto todavía.
Fast RCNN -Capaz de entrenar simultáneamente el detector y el
‘Bounding Box regressor’.
-Mejora del porcentaje de acierto con respecto RCNN.
Faster RCNN -Mejora significativa de la velocidad de predicción, 5 FPS y hasta 17 con arquitectura ZFNet.
-Uso de una red específica para proponer regiones de interés en lugar de un algoritmo fijo.
Mask R-CNN -Mejora de la segmentación de las imágenes.
-Relativamente simple de entrenar y flexible.
-Coste computacional alto.
YOLO
-Precisión de detección media y velocidad de inferencia muy alta, hasta 155 FPS.
-Uso de una única etapa de procesamiento, una única red sobre toda la imagen.
-Dificultad de detección de objetos pequeños.
SSD
-Similitudes estructurales con RCNN,
prescindiendo de la red de proposición de regiones.
-Intento de solución de la dificultad de detección de objetos pequeños mediante etiquetado a diferentes resoluciones.
Retina-Net -Solución de desequilibrios entre clases introducidos por SSD mediante una correcta focalización durante la fase de entrenamiento.
SqueezeDet -Rápido, ligero y bastante preciso.
-Consumo de energía y tamaño reducido.
-Uso de la capa convolucional ConvDet.
CornerNet
-Nueva manera de representar los datos mediante únicamente dos puntos en lugar de una caja delimitadora.
-La variante CenterNet añade un tercer punto para evitar detecciones erróneas, aumentando precisión a costa de una ligera merma en la velocidad.
Tabla 1. Resumen de características de algoritmos de detección.
A continuación, en la figura 12 se muestran las principales diferencias en rendimiento y precisión de los algoritmos expuestos hasta ahora. Se aprecian diferencias en la precisión, pero los mayores avances se pueden observar con respecto al rendimiento expresado en imágenes por segundo.
Figura 12. Tabla comparativa de los principales algoritmos de detección. Fuente: [23].
2.2. Algoritmos de detección sobre plataformas embebidas
Hasta el momento se han introducido los conceptos básicos y los algoritmos más actuales dentro del paradigma de la detección de objetos. Sin embargo, el objetivo de este trabajo es hacer funcionar uno de estos algoritmos de detección en una plataforma embebida. Por ello, a continuación, se van a analizar las diferentes plataformas embebidas disponibles actualmente. Se van a comentar brevemente sus principales características, puntos fuertes e inconvenientes.
Graphics Processing Unit o GPU
Antes de comenzar a enumerar y desgranar los dispositivos embebidos más interesantes del mercado actual, es necesario destacar primero el desempeño que las tarjetas gráficas dedicadas tiene dentro del paradigma de la detección de objetos.
Al estar trabajando en todo momento con imágenes, tanto durante la fase de entrenamiento como en la inferencia posterior, las GPU son una herramienta excelente para estas tareas. Cuentan con hardware y software especializado para trabajar con imágenes. Por esta razón, tradicionalmente se hace uso de GPUs de altas prestaciones para llevar a cabo el entrenamiento de los modelos en lugar de la CPU.
Las librerías de CUDA y OpenCL, especializadas en el manejo de datos en paralelo, son las más reseñables en este tipo de tareas.
Por otra parte, la inferencia de los modelos también se hace de manera más acelerada mediante una GPU. Sin embargo, en este proyecto no se pretende entrenar ningún modelo sino usar uno ya existente. Además, se pretende hacer uso de un sistema embebido de tamaño y prestaciones limitadas. Por esta razón, se descarta desde un primer momento la implementación de un sistema de aceleración mediante GPU.
Raspberry Pi 4
Raspberry Pi son una serie de ordenadores integrados promovidos por la Raspberry Pi Foundation desde Reino Unido con el objetivo de proveer a todo el mundo de sistemas de cómputo asequibles. Las placas Raspberry Pi se caracterizan tener una gran flexibilidad a pesar de su bajo coste. Esto es así porque integran una gran variedad de puertos de entrada y salida.
El modelo Pi 4, supone mejoras de rendimiento con respecto a sus predecesores en velocidad de procesamiento, ejecución multimedia, memoria y conectividad. Los componentes más reseñables de este dispositivo residen en su SoC, un Cortex-A72 (ARM v8) 64-bit. Puede ser complementado con hasta 8 GB de memoria RAM LPDDR4. La arquitectura del SoC es ARM, lo que proporciona una eficiencia energética destacable, un consumo reducido y, por consecuencia, poca necesidad de refrigeración de los componentes.
Internamente el Cortex-A72 integra componentes interesantes como por ejemplo NEON SIMD, que es un acelerador para codificación y decodificación multimedia, gráficos 2D/3D, gaming y hasta aplicaciones de visión por computador y deep learning. Otro coprocesador integrado es el encargado de las operaciones de coma flotante, VFPv4.
Por otro lado, en cuanto a conectividad cuenta con WIFI 2.4/5.0 GHz IEEE 802.11a, bluetooth 5.0, dos puertos micro HDMI, cuatro puertos USB 2.0 y 3.0, puerto RJ-45, Jack de 3.5 mm, micro USB tipo C para la alimentación y GPIO. El puerto GPIO ofrece gran cantidad de entradas de propósito general y es lo que brinda gran versatilidad al dispositivo.
Nvidia Jetson TX2
Nvidia es una multinacional conocida principalmente por comercializar unidades de procesamiento gráfico, comúnmente llamadas tarjetas gráficas. Sin embargo, también cuenta con líneas de producto enfocadas a circuitos integrados dentro de su catálogo. Los últimos años Nvidia ha comenzado a explorar este nuevo nicho.
Sus GPU tanto de escritorio como de la gama profesional son excelentes en tareas de entrenamiento de redes neuronales por alto poder de cómputo. No obstante, el
tamaño de los equipos y el consumo de los recursos hace inviable usar estas GPU con equipos móviles y de bajo consumo.
Por esta razón Nvidia ha desarrollado una línea de sistemas embebidos llamada Jetson. Dentro de esta familia de dispositivos hay diferentes soluciones muy interesantes para el mundo de la inteligencia artificial y la visión por computador.
Destacan el kit de desarrollo Jetson Nano y la placa Jetson TX2. Nvidia ofrece productos con mejor rendimiento y eficiencia que soluciones como la Raspberry Pi 4. Además, cuentan con una librería llamada NVIDIA Jetpack especializada en Deep Learnig, aplicaciones de CV y aceleración por GPU, entre otras. Sin embargo, los productos de la gama Jetson suelen ser menos económicos que el kit de desarrollo de Raspberry Pi 4.
A continuación, se van a mostrar dos tablas comparativas. En la figura 13 se exponen las características hardware de la familia Jetson de Nvidia. En la figura 14, se compara el rendimiento de las placas TX1, TX2 y AGX entre sí y contra una estación de trabajo con una GPU GTX 1080. Para llevar a cabo la comparativa se usan los principales algoritmos de detección analizados en apartados previos.
Figura 13. Especificaciones familia Jetson de Nvidia. Fuente: [31].
Figura 14. Tabla comparativa de algoritmos de detección sobre distintas plataformas.
Fuente: [23].
ZYNQ Board
La compañía Xillinx es una empresa especializada en el desarrollo de plataformas FPGA. Las FPGA o Field Programmable Gate Array, es un tipo de hardware capaz de ser programado. En otras palabras, las FPGA son un conjunto de puertas lógicas programables. Esta funcionalidad convierte a las FPGA en plataformas de desarrollo extremadamente versátiles.
Las placas de la familia Zynq-7000 SoC integran tanto el sistema de procesamiento como la lógica programable en un solo chip. Esto quiere decir que cuentan tanto con hardware programable como con un procesador Arm Cortex-A9. Esto permite crear un entorno especializado y optimizado para la tarea que se pretende llevar a cabo.
Como desventajas, las FPGA suelen tener recursos más limitados y precios altos.
Sobre las Zynq-7000 SoC se puede concluir que en su versatilidad reside su atractivo para los desarrolladores, pero también su gran limitante a la hora de ser usado en soluciones definitivas.
Comparativa entre las distintas placas embebidas
Plataforma Características
GPU -Eficaces para tareas de entrenamiento e inferencia.
-Cuentan con librerías como CUDA o OpenCL, especializadas en el manejo de datos en paralelo.
-Consumo, prestaciones y coste elevado.
Raspberry Pi 4
-Bajo coste, alrededor de los 60 dólares.
-Alta flexibilidad y bajo consumo.
-Varias configuraciones de memoria y gran conectividad.
-Prestaciones muy limitadas.
Nvidia Jetson Family -Hardware específico para ‘deep learning’ y posibilidad de uso de la librería Jetpack.
-Precio entre 130 y 600 dólares.
-Altas prestaciones y extremadamente eficientes.
ZYNQ Board -Hardware capaz de ser programado específicamente para una tarea concreta.
-Extremadamente versátil y eficiente.
-Prestaciones relativamente limitadas -Precios de entre 150 y 300 dólares.
Tabla 2. Resumen de características de las plataformas embebidas.
4. Herramientas utilizadas
Descritos los objetivos generales y las limitaciones del proyecto, es momento de concretar de manera definitiva las partes que lo forman. En primer lugar, el algoritmo finalmente seleccionado para ser implementado es YOLO. A pesar de que se han observado resultados notables en muchos algoritmos, YOLO es el que mayor rendimiento ofrece. En pruebas, siendo ejecutado mediante una GPU ha logrado hasta 155 FPS. Las placas embebidas, como se ha comentado previamente, cuentan con unas limitaciones de potencia y consumo. Es por ello, que se necesita el algoritmo más rápido disponible.
Por otro lado, la placa embebida que se ha decidido usar en este proyecto, es la Raspberry Pi 4. Se ha podido observar que la Raspberry Pi no es el dispositivo más potente del mercado dentro del ecosistema de los sistemas embebidos. Sin embargo, su bajo coste, su versatilidad y lo extendido que está su uso en proyectos de todo tipo la hacen idónea para un estudio de estas características.
Finalmente, cabe destacar que se va intentar usar el entorno de desarrollo TensorFlow Lite para llevar a cabo este proyecto. YOLO es un algoritmo originalmente desarrollado en Darknet, el cual es un entorno de trabajo diseñado por el propio creador de YOLO, R. Joseph. Por otro lado, se han llevado a cabo implementaciones de YOLO y sus posteriores versiones mediante Open CV. En este caso, se va a buscar hacer funcionar la arquitectura de YOLO en el entorno de TensorFlow.
4.1. TensorFlow Lite
TensorFlow es una plataforma de código abierto especializada en el desarrollo del aprendizaje automático. Dentro del ecosistema de TensorFlow se encuentran integradas diferentes herramientas y bibliotecas que permiten a desarrolladores e investigadores trabajar de forma flexible, cómoda e intuitiva a la hora de realizar nuevos avances dentro del campo del aprendizaje automático.
TensorFlow fue desarrollado originalmente por investigadores e ingenieros de Google, más en concreto por el equipo de Google Brain. En 2015 fue lanzado bajo licencia de código abierto. El entorno proporciona APIs estables de Python y C ++, entre otros lenguajes.
El nombre TensorFlow proviene de las operaciones que las redes neuronales realizan sobre las estructuras que conforman la red. Estas estructuras son fundamentalmente vectores multidimensionales que son conocidos como tensores.
Dentro del ecosistema de TensorFlow hay una herramienta llamada TensorFlow Lite con capacidad para ayudar a los desarrolladores a incorporar los modelos de aprendizaje automático a dispositivos móviles. Esto permite realizar inferencias de manera local en los dispositivos, en lugar de tener que acudir a un servidor o sistema externo de procesamiento. Esta solución tecnológica tiene ventajas e inconvenientes.
Por un lado, la latencia es muy baja al no tener que conectarse de forma externa.
Además, no se precisa de una conexión a internet estable, lo cual lo hace apropiado para entornos rurales o alejados de núcleos urbanos. Por otra parte, el consumo energético será por lo general menor y se cuenta con una privacidad. Otra ventaja a tener en cuenta es que el flujo de trabajo es fluido y sencillo si se trabaja dentro del entorno de TensorFlow.
El principal inconveniente de usar TensorFlow Lite para optimizar y adaptar los modelos reside en que los recursos de los dispositivos móviles suelen ser bastante limitados, principalmente en almacenamiento y potencia de cálculo. Se precisa por tanto de modelos más optimizados.
TensorFlow Lite tiene dos componentes principales que son el intérprete y el conversor. El intérprete es el objeto sobre el cual se lleva a cabo la inferencia del modelo. Mediante el intérprete se carga el modelo nativo de TensorFlow Lite y se estructuran los tensores y los datos de entrada para posteriormente llevar a cabo las predicciones.
Por otro lado, el convertidor es el objeto mediante el cual se transforma un modelo de TensorFlow a uno de formato nativo Lite. Sobre el convertidor también pesan las optimizaciones basadas en cuantización. Existen otras maneras posibles de optimización llamadas poda y ‘clustering’, pero no pertenecen a las herramientas propietarias de TensorFlow Lite. A continuación, se analizarán todas las soportadas por la plataforma.
Cuantización
La cuantificación consiste en reducir la precisión de los parámetros que codifican un modelo de aprendizaje automático. Por defecto los pesos de una red suelen estar almacenados en coma flotante de 32 bits. El modelo resultante tiene un tamaño más reducido y suele tener una velocidad de inferencia mayor.
Cuantización de rango dinámico
La cuantización de rango dinámico recibe este nombre debido a que la optimización se puede llevar a cabo de forma dinámica mientras se produce la inferencia del modelo. Se produce una primera optimización donde la talla del modelo se reduce a una cuarta parte. Sin embargo, durante la inferencia de dicho modelo es posible realizar operaciones de cuantización y descuantización, adaptándose al hardware
disponible. De esta manera, si se disponen de núcleos especializados en operaciones con coma flotante, enteros o una combinación de ambos, es posible que cada núcleo opere con el tipo de dato para el que está más preparado.
Sobre este tipo de modelos donde la optimización se produce después del entrenamiento y no durante, puede haber una pérdida en la precisión. Por ello, es necesario controlar que la precisión obtenida no sea mucho menor a la del modelo original.
Cuantización de enteros
En esta estrategia de optimización se pretende convertir los pesos y las salidas de activación de números con coma flotante 32 bits a números de coma fija de 8 bits.
Esto genera un modelo más reducido y con menor latencia, a priori. Esta optimización es muy eficaz cuando se trabaja con ciertos aceleradores como los Edge Tensor Processor Units o TPUs. Estos dispositivos operan con valores enteros de forma mucho más rápida de lo que lo hacen otros microprocesadores. Por esta razón, cuando se cuantiza un modelo en TensorFlow Lite para trabajar con enteros de 8 bits, se propicia un aumento del rendimiento a través de los aceleradores externos.
Para llevar a cabo la cuantización de enteros es necesario calibrar o estimar el rango previamente de todos los tensores de punto flotante del modelo original. Esto es así porque, aunque en el modelo se disponen de tensores constantes como los pesos, hay otros tensores que son variables y necesitan de una cierta calibración mediante la ejecución de algunos ciclos de inferencia. Durante las iteraciones de calibración se realizan predicciones sobre imágenes aleatorias de un conjunto de imágenes. El
‘dataset’ tiene que ser suministrado de manera externa.
Existe una variedad de cuantización de enteros en la cual no todos los valores de pesos y las salidas de activación se cuantifican a 8 bits. Cuando las activaciones son sensibles al proceso de cuantización, manteniéndose en 16 bits, se obtienen menores
pérdidas en la precisión del modelo resultante. Esta variedad de cuantización enteros se encuentra actualmente en fase de desarrollo.
Cuantización en coma flotante de 16 bits
Este tipo de cuantización cambia el tamaño de los datos del modelo original de 32 a 16 bits. Esto permite una reducción del modelo a la mitad de su tamaño original, a cambio de un impacto mínimo en latencia y precisión. Este tipo de transformaciones a 16 bits benefician mucho a cierto tipo de hardware, como las GPU, que son capaces de computar de forma nativa con esta precisión de datos. Sin embargo, este tipo de cuantización no resulta a priori interesante para lograr los objetivos de este proyecto.
Poda
La poda es una técnica que consiste en eliminar los pesos que afectan de forma poco significativa sobre la decisión durante el proceso de inferencia de la red. En otras palabras, si se determina que una serie de parámetros dentro de la red puede ser eliminado sin que ello produzca una pérdida en el acierto, se eliminan. La poda no tiene un efecto significativo sobre la latencia ni el tamaño del modelo, pero si lo hace más compacto y mejorando su compresibilidad.
Clustering
El ‘clustering’, al igual que la técnica de poda, no ofrece mejoras en tamaño ni tiempo de ejecución de los modelos. El ‘clustering’ es un procedimiento que mejora la capacidad de compresión de una red. Esta técnica se basa en agrupar los pesos de cada capa del modelo en un número predefinido de grupos para que compartan un determinado valor de peso.
D esta manera se reduce la complejidad de la red, al no tener muchos valores numéricos de pesos posibles.
4.2. YOLOv4
YOLOv4 es la cuarta versión actualizada del algoritmo de detección desarrollada por fuentes oficiales en 2020. Fue implementado por el autor Alexey Bochkovskiy, entre otros. YOLOv4 supone grandes mejoras en precisión con respecto a su predecesor, logrando hasta 43.5% de precisión y 65 FPS sobre el ‘dataset’ MS COCO. YOLOv4, al igual que sus versiones anteriores, ha sido entrenado para ser capaz de detectar hasta 80 clases de objetos diferentes.
Figura 15. Mejoras de YOLOv4 en rendimiento y precisión. Fuente: [32].
Arquitectura de YOLOv4
La arquitectura del detector está dividida en cuatro partes independientes: una capa de entrada, columna, cuello y cabeza. La capa de entrada es una composición sencilla que recibe y distribuye los datos de entrada a la red hacia futuras capas.
Figura 16. Estructura YOLOv4. Fuente: [32].
La etapa etiquetada en el diagrama de la Figura 16 como la columna, está compuesta por un conjunto de capas donde se lleva a cabo el proceso de extracción de características de la imagen de entrada. Existen diferentes algoritmos como ResNet, DenseNet y VGG capaces de llevar a cabo esta tarea. Sin embargo, YOLOv4 implementa CSPDarknet53.
La estructura del cuello es un conjunto de capas intermedias y tiene la función de obtener mapas de características a partir de los datos de salida suministrados por la etapa anterior. YOLOv3 usaba Feature Pyramid Network (FPN) para obtener las características a diferentes escalas, resolviendo de esta forma la dependencia de la escala de los objetos en la detección. YOLOv4 usa en cambio, los algoritmos Spatial Pyramid Pooling (SPP) y Path Aggregation Network (PAN). Como se ha visto en el algoritmo SPPNet, las capas de SPP son las encargadas de solucionar el problema de la escala. Por otro lado, PAN es un algoritmo especializado en mejorar los resultados del proceso de segmentación con respecto a versiones previas de YOLO.
Finalmente, el núcleo del algoritmo es el mismo que el de YOLOv3. Es la parte de la red encargada de llevar a cabo la detección y la localización final. Se usan distintos tamaños de escala para detectar diferentes tamaños de objetos.
Mejoras de YOLOv4
Los desarrolladores del algoritmo hacen uso de dos tipos de métodos para llevar a cabo mejoras en la precisión del algoritmo. Por un lado, se tiene la estrategia ‘Bag of freebies’ o BoF, que consiste en aplicar las mejoras a la fase de entrenamiento.
Alterando la estrategia de entrenamiento se puede llevar a cabo una mejora en la precisión sin tener un impacto en el coste de inferencia, únicamente a través del coste de entrenamiento. Un ejemplo claro y sencillo de estrategia BoF sería el aumento de datos de entrenamiento. Partiendo de un conjunto de datos y aumentándolo por medio de transformaciones, se pueden obtener más imágenes con más variaciones que ayudan a la red a entrenar de mejor manera.
Por otra parte, la estrategia ‘Bag of specials’ o BoS, consiste en implementar mejoras posteriores al entrenamiento. Esto produce que aumente ligeramente el coste computacional durante la predicción pero que tiene un impacto significativo en la precisión de las detecciones. Un ejemplo, serían las propias capas SPP expuestas anteriormente.
YOLOv4 incluye un número significativo de mejoras y no es el objetivo de este apartado analizarlas. Sin embargo, la siguiente figura recoge todas estas mejoras.
Figura 17. Tabla resumen de las mejoras de YOLOv4. Fuente: [33].
Librería YOLOv4 para TensorFlow Lite
La principal razón por la que se seleccionó esta versión de YOLO para llevar a cabo el desarrollo de este proyecto, es porque se encontró una librería de YOLv4 escrita en Python por el autor Hyeonki Hong[1]. Esta librería está diseñada como una API que convierte el modelo original de YOLOv4 de Darknet al entorno TensorFlow Lite. Una vez que se tiene el modelo en el formato nativo de TensorFlow Lite, la propia librería tiene métodos para llevar a cabo la inferencia de imágenes y videos. El autor se basó en el trabajo de Việt Hùng[2], el cual planteaba una solución similar.
Además, esta librería, no solo es útil por las herramientas de transformación e inferencia descritas, sino que además cuenta con parámetros para poder llevar a cabo la cuantización de los modelos. De esta forma, simplemente con unas ligeras modificaciones en el código original es posible obtener modelos cuantizados. Se puede, por lo tanto, obtener distintas versiones del modelo para analizarlas y continuar con el proceso de optimización.
Por otra parte, gracias al trabajo desarrollado por el autor Cartucho[3], es posible evaluar la precisión de los modelos de TensorFlow Lite resultantes a partir de un conjunto de datos como VOC-2007 o MS COCO.
Además, el propio autor implementa la librería enfocada a llevar a cabo la inferencia con ayuda de un acelerador externo o TPU. Por esa razón, es posible llevar a cabo configuraciones compatibles con este dispositivo y todas estas configuraciones, están integradas dentro de la librería y forman parte del propio desarrollo seguido por el autor.
5. Experimentos y resultados
El punto de partida fue la web oficial de YOLO. El autor original del algoritmo expone los resultados obtenidos y diversos modelos de YOLO. Los modelos están compuestos por un fichero de configuración que alberga la estructura de la red y otro que guarda los pesos[4]. Los modelos más actuales e interesantes son YOLOv3 y Tiny-YOLOv3. Para poder trabajar con del entorno de TensorFlow Lite era necesario disponer de un modelo en formato nativo, con la terminación ‘tflite’. Este fichero incluye la misma información que los ficheros de configuración y pesos dentro del entorno Darknet. Al no ser YOLO un algoritmo desarrollado nativamente con TensorFlow no era posible obtener el modelo ya generado, aunque inicialmente era lo que se pretendía.
A continuación, se decidió buscar un método para transformar los ficheros del entorno Darknet a TensorFlow Lite. Se encuentró una herramienta específica capaz de transformar YOLO al formato nativo de Keras[5]. Una vez convertido formato Keras, el propio entorno de TensorFlow Lite facilita un sencillo método para lograr una segunda conversión hasta el modelo Lite definitivo[6].
Una vez que se dispuso del modelo en el formato adecuado, era necesario comprobar que la conversión se había producido correctamente. La mejor forma de comprobar que el modelo funcionaba era llevar a cabo un proceso de inferencia donde se introduce una imagen y se busca obtener una predicción. Para llevar a cabo la predicción dentro con TensorFlow Lite se hace mediante el intérprete. El intérprete es un objeto diseñado para cargar el modelo, configurarlo y finalmente invocar la
inferencia. Se podría decir que el intérprete es el núcleo de TensorFlow Lite, el encargado de manejar los tensores. Cabe destacar, que es necesario vincular las características de los tensores de entrada y de salida de la red con el modelo que se está trabajando.
A partir de aquí, se buscó un código de ejemplo sobre donde se aplicara el proceso de inferencia[7] y se ejecutó. El resultado no fue el esperado. Un error durante la ejecución relacionado con una incompatibilidad entre la versión 2.0 de TensorFlow y los métodos de OpenCV impidió poder obtener los resultados de la predicción.
Estos métodos tienen el cometido de cargar y manipular la imagen de entrada. Se probó sustituir estos métodos de OpenCV por métodos nativos de TensorFlow como
‘tf.io.read_file’. Sin embargo, los errores de incompatibilidad persistieron.
Llegado a estas alturas, se evaluó la situación y puesto que lo que se pretendía era analizar el éxito de la conversión del modelo al entorno de TensorFlow Lite. Se modificó el fichero de inferencia para que cargara datos más simples en lugar de imágenes. Tampoco se llegó a obtener ninguna predicción.
El error más llamativo de todos los que se obtuvieron durante todo este proceso de prueba fue uno que estaba relacionado con las dimensiones de la imagen de entrada.
Se probó a aplicar métodos para redimensionar la imagen, sin embargo, el error no desapareció. Si el problema no parecía residir en los datos de entrada, podía tratarse del propio modelo.
En una tercera entrada relacionada con la inferencia se observó un paso inicial adicional que consistía en analizar los datos de los tensores de entrada y salida de la red[8]. Los tensores, son las estructuras principales dentro del entorno de TensorFlow y están basadas en vectores de datos multidimensionales. Mostrando por pantalla los datos de los tensores de entrada del modelo se observó que los datos de entrada del modelo eran simples en lugar de una matriz de valores numéricos que representaran los pixeles. Se concluyó, por tanto, que el modelo resultante de la