Bienvenidos a AboutData.blog de Gold Light Data, donde exploramos lo último en Big Data, IA, ML, Analítica de Negocios e Inteligencia de Negocios. Únete a nosotros para mantenerte informado y empoderado en el dinámico mundo de la tecnología de datos.

Automatización completa de los workflows para la detección de objetos

Mostraremos cómo automatizar el entrenamiento de los modelos de detección de objetos (y sus predicciones).

Anotando ubicaciones de objetos en imágenes

El uso de imágenes como datos de entrada para el entrenamiento de modelos es ampliamente aceptado. Cuando se cargan imágenes, se crean nuevas fuentes y se les asigna un ID correspondiente. Estas fuentes se agregan a un nuevo objeto de fuente compuesta que incluye un nuevo tipo de campo: imagen. Las imágenes se pueden combinar con otros tipos de datos y se les pueden asignar una o más etiquetas utilizando el campo de etiquetas.

Sin embargo, ¿qué sucede si se necesita detectar objetos específicos en la imagen y determinar su ubicación? Para este propósito se utiliza la detección de objetos. El objetivo de un modelo de detección de objetos es predecir las regiones de la imagen donde se pueden encontrar los objetos específicos de interés.

La detección de objetos es un problema de aprendizaje supervisado, lo que significa que el algoritmo requiere ejemplos de regiones anotadas en los datos de entrenamiento para aprender. Para abordar este problema, se ha definido un nuevo tipo de campo llamado Regiones. Este campo contiene la etiqueta que identifica al menos uno de los objetos que se desea detectar, así como sus coordenadas en la imagen. Si hay más de un objeto en la misma imagen, el campo contendrá una lista de ellos.

Para crear datos de entrenamiento efectivos, es necesario proporcionar no solo las imágenes, sino también anotaciones que determinen los cuadros y etiquetas de los objetos de interés en las imágenes de entrenamiento.

El ejemplo de los gatitos adorables

Lo gatos son animales curiosos, inteligentes, elegantes y delicados. No es de extrañar que sean dueños de Internet y que tengan casi el monopolio de los conjuntos de datos de demostración de detección de objetos. Así que honremos la tradición y armemos un conjunto de datos de imágenes de gatos para ilustrar la publicación de hoy.

gatos


Esta pequeña colección de imágenes fue recuperada de pexels.com. Continuamos, ubicamos y etiquetamos los ojos, y agregamos un archivo de anotaciones que contiene sus ubicaciones en cada imagen. Podríamos, muy bien, etiquetar y ubicar otras partes del cuerpo (como narices u orejas) y almacenarlas todas en el mismo campo de regiones o en un campo separado. El campo Regiones si se desea crear modelos separados para cada tipo de objeto. En este ejemplo, lo mantendremos simple pero se entiende la idea. Los datos de las anotaciones finalizadas se ven de la siguiente manera.

gatos_anotaciones


Cada fila contiene la información relacionada con una de las imágenes. El primer campo contiene la ruta relativa a ese archivo de imagen (almacenado en mi computadora portátil en este caso) y el segundo campo almacena la información de las regiones como una lista de listas. Cada una de estas listas internas comienza con el nombre de la etiqueta más la parte superior, izquierda, ancho y alto de la región expresada en coordenadas relativas (como la relación con las dimensiones de la imagen). Otros formatos de coordenadas, como el número absoluto de píxeles para esas medidas también son aceptables siempre que sean coherentes en todo el conjunto de datos.

Para cargar las imágenes anotadas, creamos un archivo .zip que contiene tanto el CSV y las imágenes. Eso es todo lo que necesitamos para empezar a usar BigML.

Creación de un modelo de detección de objetos utilizando los enlaces

Los enlaces de Python resultan ser la biblioteca más actualizada que se puede usar para interactuar con BigML desde cualquier aplicación cliente de Python. En este caso, nos gustaría cargar el archivo comprimido que contiene nuestras imágenes y las anotaciones de las regiones correspondientes.

from bigml.api import BigML
api = BigML()
composite_source = api.create_source(
    "cats.zip",
    {"name": "Cats' eyes example"})
api.ok(composite_source)

Con este código, creas una conexión con BigML (siempre que tus credenciales hayan sido previamente colocadas como variables de entorno) y cargas el archivo comprimido. Eso inmediatamente da inicio a la creación de una fuente compuesta que contendrá una nueva fuente por imagen y asociará las regiones correspondientes a cada una de ellas. El comando api.ok espera a que finalice el proceso asincrónico y finalmente almacena la fuente compuesta en la variable correspondiente. El resultado se mostrará en el tablero como se ve a continuación.

gatos_fuente


Como se ve, una fuente compuesta tabla+imagen se ha creado asociando el ID de origen generado para cada imagen (almacenado en el campo nombre_de_archivo.imagen) con las regiones definidas en el archivo de anotaciones.

Ojos de gato


El siguiente paso para el entrenamiento es crear un conjunto de datos a partir de él.

dataset = api.create_dataset(composite_source)
api.ok(dataset)

Las etiquetas y los límites de las regiones se resumirán fácilmente y, siguiendo ese paso, estaremos listos para el modelado. Naturalmente, tendremos que usar deepnet para conocer las posiciones de los objetos de interés.

deepnet = api.create_deepnet(dataset)
api.ok(deepnet)

Eso puede llevar un poco de tiempo, incluso para esta fuente compuesta simple de 9 imágenes. Al final, verás en el tablero que los resultados se expresan como la comparación de las regiones originales y las detectadas por el entrenamiento de deepnet.

gatos_deepnet


La variable de deepnet contendrá la descripción de las capas y los coeficientes que se han encontrado para ajustarse a los datos de entrenamiento.

Automatización de detección de objetos del lado del servidor

WhizzML es el Lenguaje Específico de Dominio (DSL) ofrecido por BigML para manejar la automatización en la plataforma. La buena noticia es que los pasos para crear un modelo de detección de objetos con WhizzML son casi idénticos a los de los modelos simples de clasificación o regresión. La única diferencia es que para los problemas de detección de objetos, el campo objetivo del modelo tiene el nuevo tipo Regiones. Sin embargo, debido a que este campo es el último en el conjunto de datos ni siquiera hay que indicar explícitamente que es el campo objetivo. BigML lo infiere de forma predeterminada.

(define data-repo
  "https://github.com/mmerce/notebooks/raw/master/object_detection/data")
(define data-url
  (str data-repo "/cats.zip"))

(define composite-source-id (create-source {
  "remote" data-url
  "name" "Server-side Cats' eyes example"}))
(define dataset-id (create-dataset composite-source-id))
(define deepnet-id (create-deepnet dataset-id))

Ejecutar esto en REPL de WhizzML te ayudará a crear el modelo de deepnet que es capaz de detectar los ojos de los gatos en una nueva imagen.

Detectar los objetos

El objetivo de la deepnet que creamos arriba es para detectar la existencia de cualquier ojo en la imagen y sus ubicaciones. Un gran diferenciador es que los modelos BigML son procesables en el mismo momento en que se crean, por lo que puede usar las deepnet creadas previamente para producir predicciones de inmediato. Repasemos un ejemplo de esto usando los enlaces de Python.

data_url = \
    "https://github.com/mmerce/notebooks/raw/master/object_detection/data"
prediction = api.create_prediction(
    deepnet, {"filename.image": "%s/cat_eyes_test.jpg" % data_url})

Para hacer una predicción, se carga la imagen de prueba y una fuente se crea a partir de ella. Luego, el método llama a la API para crear la predicción correspondiente utilizando ese ID de origen y la deepnet creada previamente.

gatos_prediccion

Por supuesto, se puede hacer lo mismo en el lado del servidor.

(define test-data
  (str data-repo "/cat_eyes_test.jpg"))
(define source-id (create-source {"remote" test-data}))

(define prediction-id (create-prediction {
  "model" deepnet-id
  "input_data": {"filename.image" source-id}))

¡Y al bajar el umbral de puntuación, incluso podemos detectar los ojos de un tipo diferente de bestia!

prediction = api.create_prediction(
    deepnet, {"filename.image": "smeagol.png", "region_score_threshold": 0.3})

smeagol_prediccion
Llamar a una API remota puede no ser adecuado en algunos escenarios de EdgeML restringido o de tipo embebido que requieren predicciones locales. Para esos casos, BigML ofrece la clase Deepnet en los enlaces de Python, que es capaz de interpretar la información de la deepnet y producir predicciones localmente al llamar a su método .predict.

from bigml.deepnet import Deepnet
local_deepnet = Deepnet(deepnet)
local_deepnet.predict("cat_eyes_test.png")

Dónde cat_eyes_test.png es la imagen en la que queremos detectar los objetos y se encuentra en el directorio actual.

La detección de objetos en imágenes se puede automatizar utilizando BigML de manera similar a la resolución de problemas de clasificación o regresión. La complejidad del procesamiento de datos de imagen se maneja automáticamente en segundo plano por la plataforma. Esto significa que puedes entrenar modelos y producir predicciones basadas en datos de imagen sin tener que preocuparte por los detalles técnicos.

Los usuarios experimentados de BigML saben que la plataforma prioriza el uso de abstracciones adecuadas para procesos homogéneos, trazables, escalables y reutilizables. Si eres nuevo en BigML, ¡bienvenido al mundo del aprendizaje automático automatizado! La plataforma te permite centrarte en el desarrollo de modelos y en la toma de decisiones informadas en lugar de preocuparte por el procesamiento de datos de imagen.

Tags :

Author: Iván Torres
Author: Iván Torres

Iván Torres actualmente cuenta con una Maestría en Ciencias en Analítica de Negocios e Inteligencia Artificial Aplicada, otorgada por la Universidad de Charleston (West Virginia, USA), también es profesor de Ingeniería y Maestría en la Universidad TecMilenio, y ha contribuido en diferentes proyectos tecnológicos como analista, consultor y líder para empresas de ámbito internacional acumulando más de 15 años de experiencia en los campos de desarrollo de Software, Big Data, analítica de negocio e I.A. Editor de About Data Blog.

Deja un comentario

Categories