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 utilizando 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

  • Para usar Azure Machine Learning, primero necesitará un área de trabajo. Si no tiene una, complete Crear recursos necesarios para empezar para crear un área de trabajo y obtener más información sobre su uso.

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

  • 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.

  • Use una instancia de proceso para seguir este tutorial sin necesidad de realizar ninguna instalación adicional. Consulte cómo crear una instancia de proceso. O bien, instale la CLI o el SDK para usar su propio entorno local.

    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 desea ejecutarlo en su propio entorno local:

Configuración de destino de proceso

Nota:

Para probar el proceso sin servidor (versión preliminar), omita este paso y continúe con la Configuración experimental.

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 utiliza la serie NCsv3 (con GPUs V100), ya que este tipo de objetivo de cálculo utiliza 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]

Configuración del experimento

Puede usar un experimento para realizar un seguimiento de los trabajos 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 Machine Learning 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 trabajos 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)

Para usar el proceso sin servidor (versión preliminar), reemplace la línea compute: azureml:gpu-cluster por este código:

resources:
 instance_type: Standard_NC24s_v3
 instance_count: 4
task: image_object_detection
primary_metric: mean_average_precision
compute: azureml:gpu-cluster

Barrido automático de hiperparámetros en tareas de imagen (modo automático)

Importante

Esta característica actualmente está en su versión preliminar pública. Esta versión preliminar se proporciona sin un contrato de nivel de servicio. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En un trabajo de AutoML se puede realizar un barrido automático de hiperparámetros para encontrar el mejor modelo posible (llamamos a esta funcionalidad "modo automático"). Solo se especifica el número de ensayos; el espacio de búsqueda de hiperparámetros, el método de muestreo y la directiva de terminación anticipada no son necesarios. El sistema determinará automáticamente la región del espacio de hiperparámetros que se va a barrer en función del número de pruebas. Probablemente un valor entre 10 y 20 funcione bien en muchos conjuntos de datos.

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

limits:
  max_trials: 10
  max_concurrent_trials: 2

Después, puede enviar el trabajo para entrenar un modelo de imagen.

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]

Barrido manual de hiperparámetros en tareas de imagen

En el trabajo de AutoML, puede especificar las arquitecturas 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, ambos preentrenados en COCO, un conjunto de datos a gran escala de detección, segmentación y subtitulación de objetos que contiene más de miles de imágenes etiquetadas con más de 80 categorías de etiquetas.

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

Límites del 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 de los parámetros de los límites de trabajo.

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

El siguiente código define el espacio de búsqueda para preparar el barrido de hiperparámetros para cada arquitectura definida, 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 los valores de los hiperparámetros, se utilizarán los valores por defecto para cada arquitectura.

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 pone fin a las pruebas de bajo rendimiento, es decir, las que no están a menos de un 20 % de holgura de la prueba con mejor rendimiento, lo que ahorra muchos recursos informáticos.

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 evaluaciones que se probaron con la interfaz de usuario de HyperDrive. Para navegar a esta interfaz de usuario, vaya a la pestaña "Child jobs" (Trabajos secundarios) de la interfaz de usuario de la instancia principal de automl_image_job anterior, que es el trabajo primario de HyperDrive. A continuación, puede ir a la pestaña "Child jobs" (Trabajos secundarios) de esta.

Como alternativa, aquí puede ver directamente el trabajo primario de HyperDrive e ir a su pestaña "Child jobs" (Trabajos secundarios):

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 que se ha completado el trabajo, puede registrar el modelo que se creó a partir de la mejor evaluación (la configuración que dio lugar a la mejor métrica principal). Puede registrar el modelo después de descargarlo o bien especificando la ruta de acceso azureml con el correspondiente jobid.

Obtención de la mejor evaluació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 ruta 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 inicia la creación del punto de conexión y devuelve 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. Creamos una implementación para nuestro punto final utilizando 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

Usando MLClient creado anteriormente, crearemos la implementación en el espacio de trabajo. Este comando inicia la creación de la implementación y devuelve 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

Este comando inicia la creación de la implementación y devuelve una respuesta de confirmación mientras continúa la creación de la implementación.

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.