Detección de objetos I: YOLO

Rubén Rodríguez Abril

Los algoritmos de Detección de Objetos son una de las innovaciones más recientes dentro de la Visión Artificial. En este artículo introduciremos este método y describiremos los detalles técnicos de uno de sus principales algoritmos: YOLO. 

Detección de objetos

La Detección de Objetos es aquella técnica de Visión Artificial que localiza objetos individuales, pertenecientes a diferentes clases predeterminadas, en una imagen de entrada. La localización se realiza trazando un cuadro delimitador alrededor del objeto detectado. Dicho cuadro delimitador es definido por cinco números: coordenadas (x,y) de su centro, dimensiones (b,h) del cuadro y clase (C) a la que pertenece el objeto.

Como en el caso de la clasificación de imágenes, la detección de objetos también está basada en el uso repetido de capas de convolución seguidas de otras densamente conectadas. La capa de salida es la que ofrece la información sobre las coordenadas y clase de la ventana.

Métricas del algoritmo

Durante los primeros momentos del entrenamiento, las ventanas generadas por la red tendrán una dimensión y posición azarosas. A medida que la red entrene estas ventanas generadas coincidirán en posición y tamaño con las que el banco de imágenes ofrece como verdad subyacente (ground truth).

Índice de Jaccard

Por lo pronto diremos que en esta disciplina juegan un papel fundamental los conceptos de índice de Jaccard y precisión media (mean average precision, mAP).

El índice de Jaccard, también llamado intersección sobre unión, mide el área común de solapamiento entre dos ventanas (intersección) y la divide entre la superficie resultante de unir a las dos en una (unión), en el modo mostrado en la imagen.

Si las dos ventanas son coincidentes, la intersección sobre unión es uno. Si no tienen superficie en común, su valor es cero. En algunos sistemas de localización de objetos, cuando el índice de Jacquard entre dos ventanas es superior a 0,5 se dice que ha habido un positivo. Y en caso contrario, un negativo.

La precisión media

La precisión media (mAP, mean Average Precision) ha sido utilizada para medir el rendimiento de los sistemas de localización de objetos en los diferentes concursos convocados a tal efecto (como PASCAL VOC o MS COCO). Es el resultado de la combinación de dos variables diferentes: la precisión (precision) y el recuerdo (recall).

La precisión cuantifica lo siguiente: de todas las ventanas detectadas hasta el momento por la red, ¿qué porcentaje de ellas son auténticas, es decir, coinciden con los que existen en la verdad subyacente?

El recuerdo (recall), por su parte, mide otro fenómeno: de todos las ventanas con objetos existentes en la verdad subyacente, ¿qué porcentaje han sido detectados hasta ahora por la red? Esta última es una función monótona: a medida que vamos avanzando a lo largo de todos los datos, su valor sólo puede aumentar.

En cualquier caso, no es necesario que el lector recuerde los pormenores técnicos de la definición de la precisión media. Le basta con tener en cuenta que este parámetro es una métrica (metric) utilizada para medir el rendimiento de una red en la tarea de detección de objetos.

Sistemas de detección de objetos

Por lo general, los sistemas de detección de objetos son redes compuestas de dos secciones. La primera de ellas, la sección convolucional, tiene como misión transformar información geométrica en información semántica. La segunda, la sección densamente conectada, es la encargada de realizar la detección propiamente dicha. Esta detección puede realizarse en una o dos fases.

En el primer supuesto, la red reconoce objetos y traza ventanas de un sólo golpe, sin desperdiciar poder computacional. Es el caso del algoritmo YOLO, cuyo nombre, You Look Only Once, hace referencia, precisamente a esta característica.

En el segundo supuesto, la red crea en primer lugar regiones candidatas, que se hacen pasar a través de una red clasificadora. Si la puntuación de ésta sobrepasa un cierto umbral, se entiende que la detección se ha producido. Es el caso del algoritmo R-CNN y sus sucesores, que son muy utilizados en procedimientos de segmentación de instancia, objeto del siguiente artículo de esta serie.

La red de detección de objetos YOLO

El principio de YOLO es básico. A la imagen procesada por la sección convolucional se le aplica una cuadrícula de S×S casillas. El algoritmo de detección de objetos operará sobre cada una de estas casillas de la manera que expondremos a continuación.

Predictores

Las ventanas delimitadoras son trazadas por predictores, que son ternas de cinco neuronas de salida que señalan respectivamente las coordenadas (x,y) del centro de la ventana, sus dimensiones (b,h) y la fiabilidad (f) atribuida a esta ventana. El nivel de fiabilidad es el resultado de multiplicar la probabilidad de que exista un objeto dentro de la caja delimitadora con el índice de Jacquard estimado entre esta caja y la de la verdad subyacente.

f = P(o)J(A,B)

donde P(o) es la probabilidad de que la ventana encierre un objeto determinado, y J(A,B) la estimación del índice de Jacquard entre la ventana A (predicha) y la ventana B (que corresponde a la verdad subyacente). Si la fiabilidad es superior a cierto umbral (normalmente 0,5) se considera que se ha producido una detección de objeto.

En cada casilla existirán B predictores. Las cinco neuronas que los forman son las neuronas selectoras, las cuales contienen información geométrica. Su valor de salida debe estar normalizado entre 0 (borde inferior de la imagen) y 1 (borde superior de la imagen).

Clasificación en YOLO

Además de los predictores, cada casilla está dotada de otras C neuronas, que señalan la probabilidad de que el objeto detectado por la celdilla pertenezca a una entre C clases determinadas. Estas neuronas clasificadoras contienen información semántica. Su valor, al tratarse de una probabilidad, también oscila entre 0 y 1. Esta probabilidad es la que se utiliza para el cálculo de la fiabilidad.

Construcción de ventanas

Como consecuencia de lo dicho el número de neuronas de salida debe ser igual al marcado por la siguiente fórmula:

N = S×S×(B×5+C)

donde S×S es la resolución del mapa de segmentación (número de casillas), B es el número de predictores por casilla y C el número de clases. En el trabajo Redmon et al., que presentó el algoritmo YOLO, los autores fijaron una dimensión de 7×7 , dos predictores por casilla y un número de clases de veinte. Entonces, a cada casilla le correspondieron treinta neuronas en la capa de salida.

Estructura de una casilla. A la derecha las neuronas clasificadoras (en número de veinte) y a la izquierda los predictores encargados de generar las ventanas (en este caso dos). En la primera fase del entrenamiento estas ventanas tendrán un tamaño y posición aleatorios. La fiabilidad (en morado) es la probabilidad que dicha ventana haya realizado una detección exitosa de un objeto de la clase detectada por las neuronas selectoras. Es un parámetro creado por la propia red, que mide la «calidad» de la ventana propuesta. A medida que la red aprende, tenderá a aumentar la fiabilidad de las ventanas generadas.

Generación de ventanas y clasificación de casillas son los dos procesos paralelos que son la base de la detección de objetos en YOLO.

Las neuronas clasificadoras de la capa de salida confeccionan un mapa de segmentación de la imagen. Las neuronas selectoras de cada casilla del mapa (que en la imagen forman una cuadrícula de 7×7) vinculan dicha casilla con una clase de objeto (árboles, edificios). Al mismo tiempo, los dos predictores de la casilla generan las ventanas.

Solapamiento de ventanas

Existe la posibilidad de que dos o más predictores tracen su ventana sobre un mismo objeto, produciéndose con ello un caso detección múltiple. Para evitar esto, los datos de salida son sometidos a un algoritmo de supresión no-maximal (non maximum-supression). Si dos ventanas que detectan una misma clase de objeto tienen un índice de Jaccard superior a cierto umbral, se considera que se ha producido un solapamiento y una detección múltiple. Y la ventana que tenga menor fiabilidad es eliminada de la lista.

Arquitectura de la red YOLO

La arquitectura de la red del algoritmo YOLO consiste en 24 capas convolucionales, intercaladas por capas de agrupación (max-pool). Todas las capas son convolucionales o de pooling, salvo las dos últimas, que están densamente conectadas. La última de ellas viene conformada por las neuronas selectoras y las neuronas clasificadoras.

En todos los casos, la función de activación es la rectificadora con escape (leaky ReLU), salvo en el caso de la última capa, en que se aplica la función rectificadora a secas (ReLU).

Arquitectura del algoritmo de detección de objetos YOLO.
Arquitectura de la red de detección de objetos YOLO. Imagen para móvil.

Arquitectura de la red clasificadora de YOLO. Todas las capas son convolucionales (en negro) o de pooling (en azul), salvo las dos últimas, que están densamente conectadas (en magenta). La entrada viene constituida por una imagen de dimensiones 448×488 y 3 canales de color. La salida viene conformada por por un tensor (matriz tridimensional) de 7x7x30. Se trata de 7×7 (49) casillas dotadas de 30 neuronas cada una. De estas 30 neuronas, 10 corresponden a las coordenadas de las dos ventanas (neuronas selectoras) y 20 a las puntuaciones de cada una de las clases (neuronas clasificadoras).

Función de pérdida en YOLO

La función de pérdida es del tipo L2, lo que transforma al entrenamiento en un problema de regresión cuadrática. La función es una suma de los cuadrados de las diferencias entre los valores producidos y los valores esperados (verdad subyacente). Explicamos este método en nuestro artículo sobre aprendizaje neuronal.

Predictor responsable

A cada ventana de la verdad subyacente se le va asignar un predictor responsable. El predictor elegido será aquél cuya ventana muestre un mayor índice de Jacquard con la ventana objetivo. Sólo las neuronas selectoras de los predictores responsables contribuyen al cálculo de la función de pérdida (y de su gradiente). El resto de las neuronas selectoras son ignoradas.

En cada predictor responsable, el cálculo de su función de pérdida se hace mediante la fórmula siguiente fórmula

L_{p} = λ_{c}\left [(x-x_{0})^2 + (y-y_{0})^2 + (\sqrt{b}-\sqrt{b_{0}})^2 + (\sqrt{h}-\sqrt{h_{0}})^2\right ] + (f – f_{0})^2
L_{p} = λ_{c}\begin{bmatrix} (x-x_{0})^2\\+\\ (y-y_{0})^2\\+\\ (\sqrt{b}-\sqrt{b_{0}})^2\\+\\(\sqrt{h}-\sqrt{h_{0}})^2\end{bmatrix}+ (f – f_{0})^2
En el trabajo inicial, los autores fijaron la constante λ_{c} en 5. La razón de que se utilice la raíz cuadrada de las dimensiones de la ventana en el cálculo es que de este modo los errores en las grandes ventanas sufren menos penalización que en los de las pequeñas. f y f_{0} representan la fiabilidad esperada y la fiabilidad real, respectivamente.

Con el objeto de que el gradiente de las neuronas selectoras no crezca demasiado rápido y conduzca a la inestabilidad del sistema las cajas que no contienen objetos contribuirán también a la función de pérdida del siguiente modo:

L_{s} = λ_{s}(f – f_{0})^2
donde la constante λ_{s} es igual a 0,5.

Por último, las neuronas clasificadoras de aquellas casillas donde existan objetos, contribuirán a la función de pérdida a través del siguiente término:

L_{c} = ∑(p(c) – p_{o}(c))^2

donde p(c) es la probabilidad de que en la casilla correspondiente haya un objeto de la clase c. La probabilidad p_{o}(c) es la fracción de la casilla que, en la verdad subyacente, está cubierta por una ventana de un tipo de objeto c.

Ecuación de la función de pérdida

La función de pérdida total es igual a:

L = ∑L_{p} + ∑L_{s} + ∑L_{c}

El primer sumatorio se realiza a través de todos los predictores responsables, el segundo a lo largo de las casillas que no contienen objetos y el tercero a través de todas las neuronas clasificadoras.

El gradiente de esta función de pérdida es el que se retropropaga a las capas iniciales de la red.

Preentrenamiento de la detección de objetos

La red debe someterse a un procedimiento de preentrenamiento. Debemos para ello crear otra red clasificadora con las 20 primeras capas convolucionales de YOLO, a las que se unirán (durante el preentrenamiento) una capa de average-pooling y otra densamente conectada. La red será entrenada para clasificar imágenes entre las 1.000 clases de ImageNet, hasta que alcancemos un 5 top-error (error en las 5 primeras) de 88%.

Tras ello, las 20 primeras capas convolucionales serán unidas al resto de las capas de YOLO, cuyos pesos sinápticos serán inicializados aleatoriamente. El entrenamiento utilizado por Redmon et al. duró 135 épocas. Durante el mismo se usaron extensamente las técnicas de apagado de neuronas (dropout) y aumento de datos (data augmentation) con el objetivo de prevenir el sobreajuste de la red (overfitting).

Mejoras del algoritmo de detección de objetos

Desde su aparición hasta la actualidad, el algoritmo YOLO ha sido objeto de varias mejoras tendentes a aumentar su capacidad de detección de objetos a varias escalas, así como su velocidad. La detección de objetos suele emplearse en marcos dinámicos como los sistemas de videovigilancia o las cámaras de los drones, por lo que en ella la velocidad de procesamiento goza de una importancia fundamental. La versión 4 del algoritmo (TOLOv4) es capaz de obtener una precisión media bastante alta incluso cuando el número de marcos por segundo (frames per second, FPS) a procesar es superior a 100.

Las mejoras introducidas en las versiones 3 y 4 han incrementado la mezcla de información semántica y geométrica procedentes de diferentes niveles de la red. En la sección convolucional se han introducido conexiones residuales, así como una arquitectura parecida a la de U-Net, que los autores han denominado red de pirámides de rasgos (Feature Pyramid Network).

Observaciones finales

Existen un par de elementos en este algoritmo que a nuestro juicio merecen una cierta reflexión, o cuando menos atención, por parte del lector.

En primer lugar, como consecuencia del preentrenamiento la mayor parte de la sección convolucional de la red de YOLO es similar a la existente en una red clasificadora. Es evidente, pues, que también en el ámbito de la detección de datos la convolución juega un papel fundamental, funcionando de un modo idéntico al de los sistemas de clasificación. A pesar de que la sección convolucional es relativamente profunda, en las capas finales de la misma todavía existe información geométrica suficiente como para poder dibujar con la suficiente precisión ventanas alrededor de los objetos.

Efecto Droste en un edificio de apartamentos. Si el índice de Jacquard de una ventana con su sucesiva es superior a 0,5, la detección de una de ellas no se produce.

En segundo lugar, el algoritmo no-maximal aplicado para descartar dobles detecciones de un mismo objeto impide la correcta interpretación de estructuras anidadas o recursivas tipo matrioshkas o el efecto Droste. En estos casos, dos ventanas de una misma clase se solapan, produciéndose el descarte (erróneo) de una de ellas. A nuestro juicio, éste es un claro supuesto de no comprensión de estructuras autorreferentes por parte de los autómatas.

En el próximo artículo, analizaremos una técnica de reconocimiento visual híbrida entre la segmentación semántica y la detección de objetos, y que está estrechamente emparentada con esta última: la segmentación de instancia.

Lecturas recomendadas

– Huang, G. et al (2016). Deep Networks with Stochastic Depth.

– Srivastava, R. K., Greff, K. y Schmidhuber, J. (2015). Highway Networks.

– Larsson, G., Maire, M. y Shakhnarovich, G. (2017). FractalNet: Ultra-Deep Neural Networks without Residuals.

Imagen destacada de GoogLeNet
Deep Learning

GoogLeNet