Tutorial: Entrenamiento de un modelo de detección de objetos con AutoML y Python

SE APLICA A:Extensión ML de la CLI de Azure v2 (actual)SDK de Python azure-ai-ml v2 (actual)

En este tutorial, aprenderá a entrenar un modelo de detección de objetos mediante ML automatizado de Azure Machine Learning con la extensión de la CLI v2 de Azure Machine Learning y el SDK de Python v2 para Azure Machine Learning. Este modelo de detección de objetos identifica si la imagen contiene objetos, como una lata, una caja, una botella de leche o una botella de agua.

El aprendizaje automático automatizado acepta tanto valores de configuración como datos de entrenamiento y, después, realiza una iteración automática por las combinaciones de diferentes métodos de estandarización o normalización de características, modelos y valores de hiperparámetros para llegar al mejor modelo.

En este tutorial escribirá código con el SDK de Python y aprenderá las siguientes tareas:

  • Descargar y transformar datos
  • Entrenar un modelo de detección de objetos de aprendizaje automático automatizado
  • Especificar valores de hiperparámetros para el modelo
  • Realizar un barrido de hiperparámetros
  • Implementación del modelo
  • Visualizar detecciones

Requisitos previos

  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar. Pruebe hoy mismo la versión gratuita o de pago de Azure Machine Learning.

  • Python 3.6 o 3.7 son compatibles con esta característica

  • Complete los pasos que se describen en Inicio rápido: Introducción a Azure Machine Learning si aún no tiene un área de trabajo de Azure Machine Learning.

  • Descargue y descomprima el archivo de datos *odFridgeObjects.zip. El conjunto de datos se anota en formato Pascal VOC, donde cada imagen corresponde a un archivo XML. Cada archivo XML contiene información sobre dónde se encuentra su archivo de imagen correspondiente, y también contiene información sobre los rectángulos delimitadores y las etiquetas de objeto. Para usar estos datos, primero debe convertirlos al formato JSONL necesario, como se muestra en la sección Conversión de los datos descargados a JSONL del cuaderno.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

Este tutorial también está disponible en el repositorio azureml-examples de GitHub. Si quiere ejecutarlo en su propio entorno local, configúrelo con las instrucciones siguientes

Configuración de destino de proceso

En primer lugar, debe configurar un destino de proceso para usarlo para el entrenamiento del modelo de aprendizaje automático automatizado. Los modelos de aprendizaje automático automatizado para tareas de imagen requieren SKU de GPU.

En este tutorial se usa la serie NCsv3 (con GPU V100), ya que este tipo de destino de proceso aprovecha varias GPU para acelerar el entrenamiento. Además, puede configurar varios nodos para aprovechar el paralelismo al ajustar hiperparámetros para el modelo.

El siguiente código crea un proceso de GPU de tamaño Standard_NC24s_v3 con cuatro nodos.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

Cree un archivo .yml con la siguiente configuración.

$schema: https://azuremlschemas.azureedge.net/latest/amlCompute.schema.json 
name: gpu-cluster
type: amlcompute
size: Standard_NC24s_v3
min_instances: 0
max_instances: 4
idle_time_before_scale_down: 120

Para crear el proceso, ejecute el siguiente comando de la CLI v2 con la ruta de acceso al archivo .yml, el nombre del área de trabajo, el grupo de recursos y el id. de suscripción.

az ml compute create -f [PATH_TO_YML_FILE] --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

El proceso creado se puede proporcionar con la clave compute en el archivo YAML de configuración de la tarea automl:

compute: azureml:gpu-cluster

Configuración del experimento

Puede usar un experimento para realizar un seguimiento de las ejecuciones de entrenamiento del modelo.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

El nombre del experimento se puede proporcionar con la clave experiment_name de la siguiente manera:

experiment_name: dpv2-cli-automl-image-object-detection-experiment

Visualización de datos de entrada

Una vez que tenga los datos de la imagen de entrada preparados en JSONL (líneas JSON), puede visualizar los rectángulos delimitadores de datos ciertos para una imagen. Para ello, asegúrese de que ha instalado matplotlib.

%pip install --upgrade matplotlib

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
from PIL import Image as pil_image
import numpy as np
import json
import os

def plot_ground_truth_boxes(image_file, ground_truth_boxes):
    # Display the image
    plt.figure()
    img_np = mpimg.imread(image_file)
    img = pil_image.fromarray(img_np.astype("uint8"), "RGB")
    img_w, img_h = img.size

    fig,ax = plt.subplots(figsize=(12, 16))
    ax.imshow(img_np)
    ax.axis("off")

    label_to_color_mapping = {}

    for gt in ground_truth_boxes:
        label = gt["label"]

        xmin, ymin, xmax, ymax =  gt["topX"], gt["topY"], gt["bottomX"], gt["bottomY"]
        topleft_x, topleft_y = img_w * xmin, img_h * ymin
        width, height = img_w * (xmax - xmin), img_h * (ymax - ymin)

        if label in label_to_color_mapping:
            color = label_to_color_mapping[label]
        else:
            # Generate a random color. If you want to use a specific color, you can use something like "red".
            color = np.random.rand(3)
            label_to_color_mapping[label] = color

        # Display bounding box
        rect = patches.Rectangle((topleft_x, topleft_y), width, height,
                                 linewidth=2, edgecolor=color, facecolor="none")
        ax.add_patch(rect)

        # Display label
        ax.text(topleft_x, topleft_y - 10, label, color=color, fontsize=20)

    plt.show()

def plot_ground_truth_boxes_jsonl(image_file, jsonl_file):
    image_base_name = os.path.basename(image_file)
    ground_truth_data_found = False
    with open(jsonl_file) as fp:
        for line in fp.readlines():
            line_json = json.loads(line)
            filename = line_json["image_url"]
            if image_base_name in filename:
                ground_truth_data_found = True
                plot_ground_truth_boxes(image_file, line_json["label"])
                break
    if not ground_truth_data_found:
        print("Unable to find ground truth information for image: {}".format(image_file))

Con las funciones auxiliares anteriores, para cualquier imagen determinada puede ejecutar el código siguiente para mostrar los rectángulos delimitadores.

image_file = "./odFridgeObjects/images/31.jpg"
jsonl_file = "./odFridgeObjects/train_annotations.jsonl"

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

Carga de datos y creación de una MLTable

Para usar los datos en el entrenamiento, cárguelos en la instancia predeterminada de Blob Storage del área de trabajo de Azure ML y regístrelos como un recurso. Las ventajas de registrar datos son:

  • Facilidad para compartirlos con otros miembros del equipo
  • Control de versiones de los metadatos (ubicación, descripción, etc.)
  • Seguimiento de linaje

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

Cree un archivo .yml con la siguiente configuración.

$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
name: fridge-items-images-object-detection
description: Fridge-items images Object detection
path: ./data/odFridgeObjects
type: uri_folder

Para cargar las imágenes como un recurso de datos, ejecute el siguiente comando de la CLI v2 con la ruta de acceso al archivo .yml, el nombre del área de trabajo, el grupo de recursos y el id. de suscripción.

az ml data create -f [PATH_TO_YML_FILE] --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

El siguiente paso consiste en crear MLTable a partir de los datos en formato JSONL, como se muestra a continuación. MLTable empaqueta los datos en un objeto que se puede consumir en el entrenamiento.

paths:
  - file: ./train_annotations.jsonl
transformations:
  - read_json_lines:
        encoding: utf8
        invalid_lines: error
        include_path_column: false
  - convert_column_types:
      - columns: image_url
        column_type: stream_info

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

La siguiente configuración crea datos de entrenamiento y validación a partir de la MLTable.

target_column_name: label
training_data:
  path: data/training-mltable-folder
  type: mltable
validation_data:
  path: data/validation-mltable-folder
  type: mltable

Configuración del experimento de detección de objetos

Para configurar ejecuciones de ML automatizado para tareas relacionadas con imágenes, cree un trabajo de AutoML específico de la tarea.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

task: image_object_detection
primary_metric: mean_average_precision

En el trabajo AutoML, puede especificar los algoritmos de modelo con el parámetro model_name y configurar los valores para realizar un barrido de hiperparámetros en un espacio de búsqueda definido para encontrar el modelo óptimo.

En este ejemplo, entrenaremos un modelo de detección de objetos con yolov5 y fasterrcnn_resnet50_fpn, que se han entrenado previamente en COCO, un conjunto de datos de detección, segmentación y subtítulos de objetos a gran escala que contiene miles de imágenes etiquetadas con más de 80 categorías de etiquetas.

Límites de trabajo

Puede controlar los recursos invertidos en el trabajo de entrenamiento de imágenes de AutoML especificando timeout_minutes, max_trials y max_concurrent_trials para el trabajo en la configuración del límite. Consulte la descripción detallada sobre los parámetros de los límites para trabajos.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

Barrido de hiperparámetros para tareas de imagen

Puede realizar un barrido de hiperparámetros en un espacio de búsqueda definido para encontrar el modelo óptimo.

El código siguiente define el espacio de búsqueda para preparar el barrido de hiperparámetros para cada algoritmo definido, yolov5 y fasterrcnn_resnet50_fpn. En el espacio de búsqueda, especifique el intervalo de valores de learning_rate, optimizer, lr_scheduler, etc. para que AutoML elija mientras intenta generar un modelo con la métrica principal óptima. Si no se especifican valores de hiperparámetros, se usan valores predeterminados para cada algoritmo.

Para la configuración del ajuste, use el muestreo aleatorio para seleccionar muestras de este espacio de parámetros mediante random sampling_algorithm. Los límites de trabajos configurados anteriormente indican a ML automatizado que pruebe un total de 10 evaluaciones con estas muestras distintas, ejecutando dos pruebas a la vez en nuestro destino de proceso, que se ha configurado con cuatro nodos. Cuantos más parámetros tenga el espacio de búsqueda, más pruebas necesitará para encontrar modelos óptimos.

También se usa la directiva de bandidos de terminación anticipada. Esta directiva finaliza configuraciones de bajo rendimiento; es decir, aquellas configuraciones que no están dentro del margen del 20 % de la configuración de mejor rendimiento, que ahorra recursos de proceso de forma considerable.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

sweep:
  sampling_algorithm: random
  early_termination:
    type: bandit
    evaluation_interval: 2
    slack_factor: 0.2
    delay_evaluation: 6
search_space:
  - model_name:
      type: choice
      values: [yolov5]
    learning_rate:
      type: uniform
      min_value: 0.0001
      max_value: 0.01
    model_size:
      type: choice
      values: [small, medium]

  - model_name:
      type: choice
      values: [fasterrcnn_resnet50_fpn]
    learning_rate:
      type: uniform
      min_value: 0.0001
      max_value: 0.001
    optimizer:
      type: choice
      values: [sgd, adam, adamw]
    min_size:
      type: choice
      values: [600, 800]

Una vez definidos el espacio de búsqueda y la configuración de barrido, puede enviar el trabajo para entrenar un modelo de imagen con el conjunto de datos de entrenamiento.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

Para enviar el trabajo de AutoML, ejecute el siguiente comando de la CLI v2 con la ruta de acceso al archivo .yml, el nombre del área de trabajo, el grupo de recursos y el id. de suscripción.

az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Al realizar un barrido de hiperparámetros, puede ser útil visualizar las distintas configuraciones que se probaron con la interfaz de usuario de HyperDrive. Para navegar a esta interfaz de usuario, vaya a la pestaña "Ejecuciones secundarias" de la interfaz de usuario de la instancia principal de automl_image_run anterior, que es la ejecución primaria de HyperDrive. A continuación, puede ir a la pestaña "Ejecuciones secundarias" de esta.

Como alternativa, aquí puede ver directamente la ejecución primaria de HyperDrive e ir a su pestaña "Ejecuciones secundarias":

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

CLI example not available, please use Python SDK.

Registrar e implementar el modelo

Una vez completada la ejecución, puede registrar el modelo que se creó a partir de la mejor ejecución (configuración que dio lugar a la mejor métrica principal). Puede registrar el modelo después de descargarlo o bien al especificar la ruta de acceso "azureml" con el jobid correspondiente.

Obtener la mejor ejecución

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

CLI example not available, please use Python SDK.

Registro del modelo

Registre el modelo mediante la ruta de acceso "azureml" o bien mediante la que se ha descargado localmente.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

 az ml model create --name od-fridge-items-mlflow-model --version 1 --path azureml://jobs/$best_run/outputs/artifacts/outputs/mlflow-model/ --type mlflow_model --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Después de registrar el modelo que quiere usar, puede implementarlo mediante el punto de conexión en línea administrado deploy-managed-online-endpoint

Configuración del punto de conexión en línea

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: od-fridge-items-endpoint
auth_mode: key

Creación del punto de conexión

Con el elemento MLClient creado anteriormente, ahora crearemos el punto de conexión en el área de trabajo. Este comando iniciará la creación del punto de conexión y devolverá una respuesta de confirmación mientras continúa la creación del punto de conexión.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

az ml online-endpoint create --file .\create_endpoint.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

También podemos crear un punto de conexión por lotes para la inferencia por lotes en grandes volúmenes de datos durante un período de tiempo. Compruebe el cuaderno de puntuación por lotes de detección de objetos para la inferencia por lotes mediante el punto de conexión por lotes.

Configuración de la implementación en línea

Una implementación es un conjunto de recursos necesarios para hospedar el modelo que realiza la inferencia real. Crearemos una implementación para nuestro punto de conexión mediante la clase ManagedOnlineDeployment. Puede usar las SKU de máquina virtual de CPU o GPU para el clúster de implementación.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

name: od-fridge-items-mlflow-deploy
endpoint_name: od-fridge-items-endpoint
model: azureml:od-fridge-items-mlflow-model@latest
instance_type: Standard_DS3_v2
instance_count: 1
liveness_probe:
    failure_threshold: 30
    success_threshold: 1
    timeout: 2
    period: 10
    initial_delay: 2000
readiness_probe:
    failure_threshold: 10
    success_threshold: 1
    timeout: 10
    period: 10
    initial_delay: 2000 

Creación de la implementación

Con el elemento MLClient creado anteriormente, ahora crearemos la implementación en el área de trabajo. Este comando iniciará la creación de la implementación y devolverá una respuesta de confirmación mientras continúa la creación de la implementación.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

az ml online-deployment create --file .\create_deployment.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Actualización del tráfico:

La implementación actual está establecida para recibir un 0 % de tráfico de manera predeterminada. Puede establecer el porcentaje de tráfico que debe recibir la implementación actual. La suma de porcentajes de tráfico de todas las implementaciones con un punto de conexión no debe superar el 100 %.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

az ml online-endpoint update --name 'od-fridge-items-endpoint' --traffic 'od-fridge-items-mlflow-deploy=100' --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Prueba de la implementación

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

CLI example not available, please use Python SDK.

Visualización de detecciones

Ahora que ha puntuado una imagen de prueba, puede visualizar los rectángulos delimitadores de esta imagen. Para ello, asegúrese de que tiene matplotlib instalado.

SE APLICA A:Extensión de ML de la CLI de Azure v2 (actual)

CLI example not available, please use Python SDK.

Limpieza de recursos

No complete esta sección si planea ejecutar otros tutoriales de Azure Machine Learning.

Si no va a usar los recursos creados, elimínelos para no incurrir en cargos.

  1. En Azure Portal, seleccione Grupos de recursos a la izquierda del todo.
  2. En la lista, seleccione el grupo de recursos que creó.
  3. Seleccione Eliminar grupo de recursos.
  4. Escriba el nombre del grupo de recursos. A continuación, seleccione Eliminar.

También puede mantener el grupo de recursos pero eliminar una sola área de trabajo. Muestre las propiedades del área de trabajo y seleccione Eliminar.

Pasos siguientes

En este tutorial de aprendizaje automático, ha realizado las tareas siguientes:

  • Ha configurado un área de trabajo y ha preparado datos para un experimento.
  • Ha entrenado un modelo de detección de objetos automatizado.
  • Ha especificado valores de hiperparámetros para el modelo.
  • Ha realizado un barrido de hiperparámetros.
  • Ha implementado el modelo.
  • Ha visualizado detecciones.

Nota

El uso del conjunto de datos Fridge Objects está disponible a través de la licencia de MIT.