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, necesita 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.9 o 3.10 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:
- Instale y configure la CLI (v2) y asegúrese de instalar la extensión
ml
.
- Instale y configure la CLI (v2) y asegúrese de instalar la extensión
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.
- En Azure Portal, seleccione Grupos de recursos a la izquierda del todo.
- En la lista, seleccione el grupo de recursos que creó.
- Seleccione Eliminar grupo de recursos.
- 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.
Obtenga más información sobre Computer Vision en aprendizaje automático automatizado.
Aprenda a configurar AutoML para entrenar modelos de Computer Vision con Python.
Aprenda a configurar el entrenamiento incremental en modelos de Computer Vision.
Vea qué hiperparámetros están disponibles para las tareas de Computer Vision.
Ejemplos de código:
SE APLICA A: Extensión de ML de la CLI de Azure v2 (actual)
- Revise los ejemplos de código y los casos de uso detallados en el repositorio azureml-examples para obtener muestras de aprendizaje automático automatizado. Compruebe las carpetas con el prefijo "cli-automl-image-" para ver muestras específicas de la construcción de modelos de visión por ordenador.
Nota:
El uso del conjunto de datos Fridge Objects está disponible a través de la licencia de MIT.