octubre 22, 2020 10:15 am

Jesús

La semana pasada aprendimos a convertir cualquier red entrenada para clasificación de imágenes, en un detector de objetos, con mínimo esfuerzo.

Sin embargo, nos topamos con una serie de inconvenientes:

  • Usar pirámides de imágenes y ventanas deslizantes es extremadamente lento, lo que impide que usemos el detector en tiempo real.
  • El detector es demasiado sensible a la selección de parámetros, lo que lo vuelve poco versátil en la práctica.
  • Como la red no se entrena para detectar objetos, sino para clasificar, nunca aprende de sus errores.

¿Qué podemos hacer, entonces? ¿Cómo podemos crear mejores detectores?

La respuesta es simple: entrenando redes específicamente para detección de objetos, que no sólo produzcan una etiqueta, sino la ubicación del elemento en la foto. 

Ahora bien, este tipo de redes están entre las más complejas de entender, implementar y entrenar, pero ello no quiere decir que no podamos aprovecharlas, al menos en contextos controlados.

Así como existen redes pre-entrenadas que podemos utilizar para clasificar imágenes sin necesidad de entrenamiento alguno, también hay un amplio menú de detectores vanguardistas y muy eficientes que podemos explotar con tan sólo unas cuantas líneas de código.

Hoy te enseñaré cómo.

Al final de este artículo sabrás:

¡Comencemos!

Detectores de Objetos en TensorFlow Hub

detectores-de-objetos-tfhub

Detectores de Objetos en TFHub

Como ya habrás intuido, nos apoyaremos en TensorFlow Hub para poder detectar objetos en nuestras imágenes, sin necesidad de entrenar un modelo desde cero.

Si quieres saber más sobre qué es TensorFlow Hub y por qué es tan cool, lee la sección Una Breve Introducción a TensorFlow Hub de este artículo.

Si haces clic aquí, notarás que la gama de detectores que tenemos a nuestra disposición es muy amplia y nutrida, habiendo sido la mayoría de ellos entrenados en un conjunto de datos tan importante, significativo, útil y masivo como ImageNet, conocido como Common Objects in Context (COCO).

TensorFlow Object Detection API

tf-object-detection-api

TensorFlow Object Detection API

¿Recuerdas que al principio mencioné que las redes detectoras de objetos están entre las más difíciles de entender, implementar y entrenar?

Bueno, es tan así que para facilitar la tarea, contamos con un proyecto experimental, open source, apadrinado por Google, conocido como TensorFlow Object Detection API, que hace mucho más sencilla la tarea de entrenar y adaptar las arquitecturas más vanguardistas, como Faster-RCNN y Mask-RCNN, a nuestras necesidades.

En un próximo artículo aprenderemos a entrenar nuestros propios detectores de objetos con este API.

Sin embargo, en este proyecto usaremos el TensorFlow Object Detection API para visualizar las detecciones hechas por el modelo que bajaremos de TensorFlow Hub.

Configurando el Proyecto con virtualenv

Como de costumbre, echemos un vistazo a la estructura del proyecto:

estructura-del-proyecto

Estructura del proyecto

Los archivos más importantes, son:

  • datasmarts/detect.py, el cual contiene la lógica del proyecto.
  • resources/mscoco_label_map.pbtxt, que contiene las clases COCO, necesarias para visualizar las detecciones.

De resto, tenemos las imágenes de prueba, así como el resultado, en el directorio output, de pasarlas por el detector.

Lo siguiente que nos toca es crear y activar el entorno de desarrollo, con virtualenv:

Una vez dentro del virtualenv, debemos instalar el TensorFlow Object Detection API, lo cual es un poco engorroso, pero no tan traumático ? . 

Ubicados en la raíz del proyecto, clona el repositorio del API, así:

git clone --depth 1 https://github.com/tensorflow/models

Luego, ejecuta los siguientes comandos, uno por uno, los cuales instalan el protobuf-compiler, compilan los archivos relevantes del API, y producen los scripts de Python que aprovecharemos más adelante:

¡Listo! Lo que queda es instalar el resto de librerías, las cuales se listan en el archivo requirements.txt

Ejecuta este comando para terminar la configuración del proyecto:

pip install -r requirements.txt

Implementación del Script de Detección de Objetos con TensorFlow Hub

Abre el archivo datasmarts/detect.py, e importa las librerías necesarias. Verás que estamos trayéndonos varias funciones y módulos del TensorFlow Object Detection API, que usaremos para visualizar los resultados del detector:

Define la función load_image(), la cual toma la ruta a una imagen en disco, y retorna un lote (“batch”) compuesto por esa imagen, como un arreglo de NumPy:

Luego, implementa la función get_and_save_predictions(), que como su nombre indica, corre el detector de objetos por una imagen de entrada, guardando los resultados en disco:

Si te fijas, en el bloque anterior usamos la función visualize_boxes_and_labels_on_image_array() del Object Detection API. Esto nos permite, con impresionante facilidad, tomar la salida del detector de objetos, y dibujar las detecciones, junto con la clase de cada objeto y la probabilidad asociada. En la próxima sección verás varios ejemplos de esto.

Tenemos que cargar las clases del conjunto de datos COCO, para que la visualización de las detecciones tenga sentido y sea humanamente interpretable:

Por si sientes curiosidad, así se ve el archivo resources/mscoco_label_map.pbtxt:

¡Esta es la parte buena! Descarguemos e instanciemos una versión de Faster-RCNN entrenada en COCO:

¿Ves qué fácil es?

Para finalizar, corramos el modelo sobre todas las imágenes de prueba en el proyecto. Guardaremos los resultados en el directorio output.

¡Eso es todo! ¿Te parece si corremos el programa?

Detección de Objetos con TensorFlow Hub

Corre el script implementado en la sección anterior, así:

PYTHONPATH=. python datasmarts/detect.py

La primera vez se tardará un poco, ya que el programa tiene que descargar Faster-RCNN de TensorFlow hub. Al cabo de unos minutos, el script habrá finalizado y deberías ver las detecciones en la carpeta output.

En el primer ejemplo, vemos que el detector localizó con 100% de confianza al elefante y su cría:

detección-elefantes

Detección correcta de los elefantes ?

Genial, ¿no? ¿Sabes qué es más cool aún? Faster-RCNN puede detectar montones de objetos, pertenecientes a diferentes categorías, aún si se encuentran tapados o en segundo plano:

detección-carros

Detección múltiple de carros, camionetas y personas

¿Viste cómo la red detectó a las personas y a la camioneta, a pesar de que no se encuentran en primer plano? ?

Pero no todo son bombos y platillos, ya que el detector puede equivocarse, como en esta foto:

detección-perro

Detección correcta de un Pug... ¿Y un fantasma? ?

Si bien Faster-RCNN detectó al perro, con 100% de certeza, e incluso identificó su raza (Pug), también localizó erróneamente a una persona en el mantel de la mesa de la izquierda. Sin embargo, este falso positivo tiene una baja probabilidad, por lo que si ajustamos la tolerancia (parámetro min_score_thresh en visualize_boxes_and_labels_on_image_array()), podemos deshacernos de él.

Resumen

En el artículo de hoy aprendimos a explotar el poder de detectores entrenados en COCO para localizar objetos en nuestras propias imágenes.

Por supuesto, la facilidad con la que llevamos a cabo este proceso es posible gracias a la vasta cantidad de detectores a nuestra disposición en TensorFlow Hub, así como la conveniencia del TensorFlow Object Detection API a la hora de visualizar los resultados.

No obstante, esta es una estrategia válida si queremos detectar elementos de interés en imágenes cuyo dominio se solape con las clases del conjunto de datos COCO, lo cual no es descabellado, puesto que como ocurre con ImageNet, COCO abarca un amplio número de categorías comunes, desde carros y muebles, pasando por animales y personas.

Te invito a descargar el código y a experimentar con otros modelos y parámetros, para que afiances tu entendimiento.

Cuéntame, ¿qué te pareció el post? ¿Planeas usar TensorFlow Hub en un futuro proyecto?

Déjamelo saber en los comentarios, o envíame un correo a ??  jesus@datasmarts.net.

¡Nos vemos pronto! ¡Un abrazo!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.

Paso 2/2: Celebra tu NUEVO EMPLEO en Machine Learning ?

A %d blogueros les gusta esto: