Detección de objetos mediante la API de TensorFlow

Contenidos

El mundo de la detección de objetos

Me encanta trabajar en el espacio del aprendizaje profundo. Francamente, es un campo vasto con una plétora de técnicas y marcos para analizar y aprender. Y la verdadera emoción de crear modelos de visión por computadora y aprendizaje profundo se produce cuando veo aplicaciones del mundo real como el reconocimiento facial y el seguimiento de la pelota en el cricket, entre otras cosas.

Y uno de mis conceptos favoritos de visión artificial y aprendizaje profundo es la detección de objetos. La capacidad de construir un modelo que pueda pasar por imágenes y decirme qué objetos están presentes, ¡es una sensación invaluable!

object-detection-using-tensorflow-api-1876609

Cuando los humanos miramos una imagen, reconocemos el objeto de interés en cuestión de segundos. Este no es el caso de las máquinas. Por lo tanto, la detección de objetos es un problema de visión por computadora para localizar instancias de objetos en una imagen.

Estas son las buenas noticias: las aplicaciones de detección de objetos son más fáciles de desarrollar que nunca. Los enfoques actuales de hoy se centran en la canalización de un extremo a otro que ha mejorado significativamente el rendimiento y también ha ayudado a desarrollar casos de uso en tiempo real.

En este artículo, lo guiaré a través de cómo construir un modelo de detección de objetos usando la popular API de TensorFlow. Si es un recién llegado al aprendizaje profundo, la visión por computadora y el mundo de la detección de objetos, le recomiendo que consulte los siguientes recursos:

Tabla de contenido

  1. Un marco general para la detección de objetos
  2. ¿Qué es una API? ¿Por qué necesitamos una API?
  3. API de detección de objetos de TensorFlow

Un marco general para la detección de objetos

Normalmente, seguimos tres pasos al crear un marco de detección de objetos:

  1. Primero, se utiliza un modelo o algoritmo de aprendizaje profundo para generar un gran conjunto de cuadros delimitadores que abarcan la imagen completa (es decir, un componente de localización de objetos)
    object-detection-1043039
  2. A continuación, se extraen características visuales para cada uno de los cuadros delimitadores. Se evalúan y se determina si y qué objetos están presentes en las cajas en función de las características visuales (es decir, un componente de clasificación de objetos)
    od2-2421447
  3. En el último paso de posprocesamiento, los cuadros superpuestos se combinan en un solo cuadro delimitador (es decir, supresión no máxima)
    od3-4507400

Eso es todo, ¡está listo con su primer marco de detección de objetos!

¿Qué es una API? ¿Por qué necesitamos una API?

API significa Interfaz de programación de aplicaciones. Una API proporciona a los desarrolladores un conjunto de operaciones comunes para que no tengan que escribir código desde cero.

Piense en una API como el menú de un restaurante que proporciona una lista de platos junto con una descripción de cada plato. Cuando especificamos qué plato queremos, el restaurante hace el trabajo y nos proporciona platos terminados. No sabemos exactamente cómo el restaurante prepara esa comida, y realmente no es necesario.

En cierto sentido, las API ahorran mucho tiempo. También ofrecen comodidad a los usuarios en muchos casos. Piénselo: los usuarios de Facebook (¡incluyéndome a mí!) Aprecian la posibilidad de iniciar sesión en muchas aplicaciones y sitios utilizando su ID de Facebook. ¿Cómo crees que funciona esto? ¡Usando las API de Facebook, por supuesto!

Entonces, en este artículo, veremos la API de TensorFlow desarrollada para la tarea de detección de objetos.

API de detección de objetos de TensorFlow

La API de detección de objetos de TensorFlow es el marco para crear una red de aprendizaje profundo que resuelve los problemas de detección de objetos.

Ya existen modelos previamente entrenados en su marco a los que se refieren como Model Zoo. Esto incluye una colección de modelos previamente entrenados entrenados en el conjunto de datos COCO, el conjunto de datos KITTI y el conjunto de datos de imágenes abiertas. Estos modelos se pueden usar para inferencias si estamos interesados ​​en categorías solo en este conjunto de datos.

También son útiles para inicializar sus modelos al entrenar en el nuevo conjunto de datos. Las diversas arquitecturas utilizadas en el modelo preentrenado se describen en esta tabla:

9-3172472

MobileNet-SSD

La arquitectura SSD es una red de convolución única que aprende a predecir las ubicaciones de los cuadros delimitadores y a clasificar estas ubicaciones en una sola pasada. Por lo tanto, SSD se puede entrenar de un extremo a otro. La red SSD consta de una arquitectura base (MobileNet en este caso) seguida de varias capas de convolución:

10-4630077

SSD opera en mapas de características para detectar la ubicación de los cuadros delimitadores. Recuerde: un mapa de características tiene el tamaño Df * Df * M. Para cada ubicación del mapa de características, se predicen k cuadros delimitadores. Cada cuadro delimitador lleva consigo la siguiente información:

  • Cuadro delimitador de 4 esquinas compensar ubicaciones (cx, cy, w, h)
  • Probabilidades de clase C (c1, c2,… cp)

SSD no predecir la forma de la caja, más bien dónde está la caja. Los k cuadros delimitadores tienen cada uno una forma predeterminada. Las formas se establecen antes del entrenamiento real. Por ejemplo, en la figura anterior, hay 4 casillas, lo que significa k = 4.

Pérdida en MobileNet-SSD

Con el conjunto final de casillas emparejadas, podemos calcular la pérdida de esta manera:

L = 1/N (L class + L box)

Aquí, N es el número total de cajas emparejadas. La clase L es la pérdida softmax para la clasificación y la ‘caja L’ es la pérdida suave L1 que representa el error de las cajas emparejadas. La pérdida suave L1 es una modificación de la pérdida L1 que es más robusta a los valores atípicos. En el caso de que N sea 0, la pérdida también se establece en 0.

MobileNet

El modelo MobileNet se basa en convoluciones separables en profundidad que son una forma de convoluciones factorizadas. Estos factorizan una convolución estándar en una convolución en profundidad y una convolución de 1 × 1 llamada convolución puntual.

Para MobileNets, la convolución en profundidad aplica un solo filtro a cada canal de entrada. La convolución puntual luego aplica una convolución 1 × 1 para combinar las salidas de la convolución en profundidad.

Una convolución estándar filtra y combina entradas en un nuevo conjunto de salidas en un solo paso. La convolución separable en profundidad divide esto en dos capas: una capa separada para filtrar y una capa separada para combinar. Esta factorización tiene el efecto de reducir drásticamente el cálculo y el tamaño del modelo.

mobilenet-5313784

¿Cómo cargar el modelo?

A continuación se muestra el proceso paso a paso a seguir en Google Colab para que pueda visualizar fácilmente la detección de objetos. También puede seguir el código.

Instalar el modelo

Asegúrate de tener pycocotools instalado:

Obtener tensorflow/models o cd al directorio principal del repositorio:

Compile protobufs e instale el object_detection paquete:

Importar las bibliotecas necesarias

Importe el módulo de detección de objetos:

Preparación del modelo

Cargador

Cargando mapa de etiquetas

Etiquete mapas de índices de mapas con nombres de categorías para que cuando nuestra red de convolución prediga 5, sepamos que esto corresponde a un avión:

En aras de la simplicidad, probaremos en 2 imágenes:

Modelo de detección de objetos mediante la API de TensorFlow

Cargue un modelo de detección de objetos:

Verifique la firma de entrada del modelo (espera un lote de imágenes de 3 colores de tipo int8):

Agregue una función contenedora para llamar al modelo y limpiar las salidas:

Ejecútelo en cada imagen de prueba y muestre los resultados:

A continuación se muestra la imagen de ejemplo probada en ssd_mobilenet_v1_coco (MobileNet-SSD capacitado en el conjunto de datos COCO):

index1-9418111

Inicio-SSD

La arquitectura del modelo Inception-SSD es similar a la del anterior MobileNet-SSD. La diferencia es que la arquitectura base aquí es el modelo Inception. Para saber más sobre la red de inicio, vaya aquí: Comprensión de la red de inicio desde cero.

¿Cómo cargar el modelo?

Simplemente cambie el nombre del modelo en la parte de Detección de la API:

Luego, haz la predicción siguiendo los pasos que seguimos anteriormente. ¡Voila!

RCNN más rápido

Las redes de detección de objetos de última generación dependen de algoritmos de propuesta de región para formular hipótesis sobre la ubicación de los objetos. Avances como SPPnet y Fast R-CNN han reducido el tiempo de ejecución de estas redes de detección, exponiendo el cálculo de la propuesta de región como un cuello de botella.

En Faster RCNN, alimentamos la imagen de entrada a la red neuronal convolucional para generar un mapa de características convolucional. A partir del mapa de características convolucional, identificamos la región de propuestas y las deformamos en cuadrados. Y al usar una capa de agrupación de RoI (capa de región de interés), los reformamos en un tamaño fijo para que pueda introducirse en una capa completamente conectada.

A partir del vector de características RoI, usamos una capa softmax para predecir la clase de la región propuesta y también los valores de compensación para el cuadro delimitador.

1psnvmjcyqirkhdpt3cfnxa-1055070

Para leer más en profundidad sobre Faster RCNN, lea este asombroso artículo – Una implementación práctica del algoritmo Faster R-CNN para la detección de objetos (Parte 2 – con códigos Python).

¿Cómo cargar el modelo?

Simplemente cambie el nombre del modelo en la parte de Detección de la API nuevamente:

Luego, haz la predicción siguiendo los mismos pasos que seguimos anteriormente. A continuación se muestra la imagen de ejemplo cuando se proporciona a un modelo RCNN más rápido:

selection_170-3752583

Como puede ver, esto es mucho mejor que el modelo SSD-Mobilenet. Pero viene con una compensación: es mucho más lento que el modelo anterior. Este es el tipo de decisiones que deberá tomar cuando elija el modelo de detección de objetos adecuado para su proyecto de aprendizaje profundo y visión por computadora.

¿Qué modelo de detección de objetos debería elegir?

Dependiendo de sus requisitos específicos, puede elegir el modelo correcto de la API de TensorFlow. Si queremos un modelo de alta velocidad que pueda funcionar en la detección de la transmisión de video a un alto fps, la red de detección de disparo único (SSD) funciona mejor. Como sugiere su nombre, la red SSD determina todas las probabilidades del cuadro delimitador de una vez; por tanto, es un modelo mucho más rápido.

Sin embargo, con la detección de un solo disparo, gana velocidad a costa de la precisión. Con FasterRCNN, obtendremos alta precisión pero baja velocidad. Así que explore y en el proceso, se dará cuenta de lo poderosa que puede ser esta API de TensorFlow.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.