La revolución de Computer Vision: YOLO 2016

Cgferrari
Eryx
Published in
6 min readOct 5, 2023

YOLO (You Only Look Once) es un algoritmo de detección de objetos en imágenes que sacrifica un poco de precisión para lograr una mayor velocidad. Tiene muchas iteraciones pero vamos a revisar solamente la primera versión, publicada en Arxiv en el 2016. Compartimos el link al final de todo en la bibliografía.

En ese momento ya existían métodos de deep learning para detectar objetos que eran mejores que otros más tradicionales, y que se basaban en reaprovechar algoritmos de clasificación aplicándolos en distintos cortes de las imágenes de entrada. Estos modelos están compuestos por muchos módulos diferentes y son lentos tanto para entrenar como para hacer inferencias. La propuesta innovadora de YOLO es que posee una única red neuronal, por eso el acrónimo. Al pasar la imagen por la red, esta devuelve los objetos presentes en la imagen. Logran, entonces, reconocimiento en tiempo real de 45 fps y llega hasta 155 fps con versiones livianas del modelo.

Descripción del modelo

Para predecir qué objetos hay en cada imagen YOLO la divide en una grilla de S x S (los autores utilizan S=7). Cada celda de la grilla es responsable de detectar un solo objeto. Cual? Aquellos cuyo centro están en ella. Para clarificar: si un objeto está entero contenido en una celda, esa celda es naturalmente responsable de detectarlo. Pero si un objeto es grande y ocupa muchas celdas, la responsable de detectarlo es la que contiene el centro del objeto.

Las predicciones de cada celda vienen en la forma de B bounding boxes (ellos usan B=2) con su confidence score que va a reflejar la probabilidad de que la caja contenga un objeto y qué tan bien lo engloba.

Las bounding boxes est 5 valores: (x,y,w,h,c), todos están entre cero y uno. En este sentido hay un detalle técnico que resulta molesto:

  • (x,y) son el centro de la caja, pero relativos a la celda de la grilla
  • (w,h) son el ancho y el alto de la caja, pero relativos al tamaño de la imagen.
  • c es la confianza, formalmente la definen como P(obj) x IOU

Además, cada celda también da una predicción de clase.
En el paper los autores definen que la predicción de clase está condicionada a que haya un objeto en la grilla, por lo tanto la va a dar siempre, es decir que el vector que predice las clases da una predicción asumiendo que hay un objeto.

No sé si hay un objeto o no, pero si lo hubiera, sería este.

Otro detalle es que el algoritmo solo da una tira de predicciones de clases, independientemente de la cantidad de cajas B.

Imagen de ejemplo de la grilla con sus predicciones del paper.

El modelo

La red neuronal tiene 26 capas y está separada en un esqueleto y una cabeza, backbone y head respectivamente. Para el backbone los autores se basan en GoogleLeNet y construyen una red de 24 capas convolucionales para sacarle las features a la imagen. Luego pasan el resultado por dos fully connected layers donde se obtienen las tiras de predicciones para cada celda. Usan Leaky Relu entre las capas.

También encontramos implementaciones que utilizan distintas redes disponibles como backbone, por ejemplo ImageNet ó VGG16.

Visualización de la arquitectura de la red

La estructura es la siguiente:

  • INPUT: imágenes de $448x448$, aunque esto es fácilmente adaptable.
  • 24 Capas Convolucionales.
  • 2 Capas completamente conectadas.
  • OUTPUT: Un cubo de S x S x (5B+C) con las predicciones para cada celda de la grilla. Cada tira de 5B+C tiene concatenadas las predicciones de cada una de las B bounding boxes y después la tira con la detección de las C clases. La red devuelve una de estas tiras por cada celda.

Entrenamiento

Primero hacen un pre-entrenamiento de las capas convolucionales usando ImageNet para clasificación con imágenes de menor resolución. Lo dejaron entrenando una semana entera con el Imagenet dataset. Luego cambiaron la cabeza para hacer detección. La nueva cabeza es la que devuelve las bounding boxes y las class predictions todo junto.

Ahora miremos la función de pérdida.

Función de pérdida

Lo primero a remarcar es que utilizan pérdida cuadrática, que no es lo ideal para predecir las clases de los objetos, pero funciona más o menos bien como propósito general.
El objetivo de esta función es que en cada celda se tome la bounding box responsable (La que tiene el mayor IOU con la caja real) y el vector de probabilidad de clases y realicen la pérdida cuadrática contra la ground truth.

Formalmente, la loss function¡ tiene la siguiente forma:

Donde las indicadoras 1_ij^obj valen 1 si la caja j de la celda i es responsable por predecir el objeto. Lo mismo para 1_ij^noobj que vale 1 si no hay objeto en la celda i.

Las primeras dos lineas son las pérdidas cuadráticas de las bounding box. Aparece un detalle. Aplican la raíz cuadrada en los términos de ancho w y largo h para penalizar los errores de cada caja de manera acorde a su tamaño. Si una caja chica tiene un error, la raíz cuadrada lo va a amplificar, pero si una caja grande tiene un error, la raíz cuadrada lo mitigará.
Las 3 y 4 son los términos de la confianza de cada bounding box. Finalmente, la última línea es la pérdida cuadrática del vector de probabilidad de clases.

Entrenan durante, aproximadamente, 200 épocas ajustando el learning rate y logran resultados muy buenos, como podemos observar en la siguiente tabla que también fue publicada en el paper.

YOLO y Fast YOLO (una versión liviana de YOLO con menos capas convolucionales) superan ampliamente a los modelos que corren en tiempo real.

Comparación de Mean Average precision y fps para YOLO y distintos modelos de detección de objetos para el PASCAL Dataset 2007 y 2012.

Discusión y conclusión

Los enfoques anteriores a YOLO ensamblaban modelos independientes. Algunos de estos hacían la clasificación en una sliding window. Otros, como R-CNN y Fast-RCNN, tienen algoritmos que proponen regiones que luego pasan por una red de clasificación y Faster-RCNN presenta una red convolucional para proponer regiones de interés. Lo que tienen en común estos modelos es que poseen partes disjuntas y reaprovechan redes de clasificación de objetos. Estas partes deben entrenarse y ajustarse por separado.

YOLO usa una única red neuronal: un backbone bastante estándar de capas convolucionales y una capa fully connected que devuelve varias tiras de predicciones, una por cada celda. La ventaja es que cada imagen pasa por la red una sola vez.
Al comparar performance, Fast y Faster-RCNN tienen apenas mejor mean average precision (mAP) pero son redes más pesadas y más lentas. YOLO en cambio puede correr en tiempo real a más del doble de la velocidad.
En la sección 4 del paper se encuentra una comparativa más detallada entre YOLO y sus competidores.

Desde que salió el primer paper de YOLO en 2016, la detección de objetos avanzó mucho: se obtuvieron mejoras tanto en los algoritmos como en la calidad de los datasets. En este artículo nos concentramos en la primera iteración del algoritmo, pero es importante decir que la disciplina del object detection continuó creciendo desde entonces.

--

--