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.
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.
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.
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.
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.
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.
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})
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.