Tutorial: Preparar um modelo de deteção de objetos com AutoML e Python

APLICA-SE A:Extensão v2 da CLI do Azure (atual)SDK python azure-ai-ml v2 (atual)

Neste tutorial, vai aprender a preparar um modelo de deteção de objetos com o ML automatizado do Azure Machine Learning com a extensão v2 da CLI do Azure Machine Learning ou o SDK Python v2 do Azure Machine Learning. Este modelo de deteção de objetos identifica se a imagem contém objetos, como uma lata, uma caixa, uma garrafa de leite ou uma garrafa de água.

O ML automatizado aceita definições de configuração e dados de preparação e itera automaticamente através de combinações de diferentes métodos de normalização/uniformização de funcionalidades, modelos e definições de hiperparâmetros para chegar ao melhor modelo.

Neste tutorial, escreve código com o SDK python e aprende as seguintes tarefas:

  • Transferir e transformar dados
  • Preparar um modelo automatizado de deteção de objetos de machine learning
  • Especificar valores de hiperparâmetros para o modelo
  • Executar uma limpeza de hiperparâmetros
  • Implementar o modelo
  • Visualizar deteções

Pré-requisitos

  • Para utilizar o Azure Machine Learning, primeiro precisará de uma área de trabalho. Se não tiver um, conclua Criar recursos que precisa para começar a criar uma área de trabalho e saber mais sobre como utilizá-la.

  • O Python 3.6 ou 3.7 é suportado para esta funcionalidade

  • Transfira e deszipe o * ficheiro de dadosodFridgeObjects.zip. O conjunto de dados é anotado no formato Pascal VOC, onde cada imagem corresponde a um ficheiro xml. Cada ficheiro xml contém informações sobre onde está localizado o ficheiro de imagem correspondente e também contém informações sobre as caixas delimitadoras e as etiquetas do objeto. Para utilizar estes dados, primeiro tem de convertê-lo no formato JSONL necessário, conforme visto na secção Converter os dados transferidos em JSONL do bloco de notas.

  • Utilize uma instância de computação para seguir este tutorial sem mais instalações. (Veja como criar uma instância de computação.) Em alternativa, instale a CLI/SDK para utilizar o seu próprio ambiente local.

    APLICA-SE A:Extensão v2 da CLI do Azure (atual)

    Este tutorial também está disponível no repositório azureml-examples no GitHub. Se quiser executá-lo no seu próprio ambiente local:

Configuração do destino de computação

Nota

Para experimentar computação sem servidor (pré-visualização), ignore este passo e avance para a Configuração da experimentação.

Primeiro, tem de configurar um destino de computação para utilizar para a preparação automatizada do modelo de ML. Os modelos de ML automatizados para tarefas de imagem requerem SKUs de GPU.

Este tutorial utiliza a série NCsv3 (com GPUs V100), uma vez que este tipo de destino de computação utiliza várias GPUs para acelerar a preparação. Além disso, pode configurar vários nós para tirar partido do paralelismo ao otimizar os hiperparâmetros para o seu modelo.

O código seguinte cria uma computação gpu de tamanho Standard_NC24s_v3 com quatro nós.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

Crie um ficheiro .yml com a seguinte configuração.

$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 criar a computação, execute o seguinte comando da CLI v2 com o caminho para o ficheiro .yml, o nome da área de trabalho, o grupo de recursos e o ID da subscrição.

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

Configuração da experimentação

Pode utilizar uma Experimentação para controlar as tarefas de preparação do modelo.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

O nome da experimentação pode ser fornecido com a experiment_name chave da seguinte forma:

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

Visualizar dados de entrada

Assim que tiver os dados de imagem de entrada preparados no formato JSONL (Linhas JSON), pode visualizar as caixas delimitadoras da verdade básica para uma imagem. Para tal, certifique-se de que instalou 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))

Ao utilizar as funções auxiliares acima, para qualquer imagem, pode executar o seguinte código para apresentar as caixas delimitadoras.

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

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

Carregar dados e criar MLTable

Para utilizar os dados para preparação, carregue dados para o Armazenamento de Blobs predefinido da área de trabalho do Azure Machine Learning e registe-os como um recurso. As vantagens de registar dados são:

  • Fácil de partilhar com outros membros da equipa
  • Controlo de versões dos metadados (localização, descrição, etc.)
  • Controlo de linhagem

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

Crie um ficheiro .yml com a seguinte configuração.

$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 carregar as imagens como um recurso de dados, execute o seguinte comando da CLI v2 com o caminho para o ficheiro .yml, o nome da área de trabalho, o grupo de recursos e o ID da subscrição.

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

O passo seguinte é criar MLTable a partir dos seus dados no formato jsonl, conforme mostrado abaixo. A MLtable empacota os seus dados num objeto consumível para preparação.

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

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

A configuração seguinte cria dados de preparação e validação a partir da MLTable.

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

Configurar a experimentação de deteção de objetos

Para configurar tarefas de ML automatizadas para tarefas relacionadas com imagens, crie uma tarefa específica do AutoML.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

Para utilizar a computação sem servidor (pré-visualização), substitua a linha 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

Limpeza automática de hiperparâmetros para tarefas de imagem (AutoMode)

Importante

Esta funcionalidade está atualmente em pré-visualização pública. Esta versão de pré-visualização é fornecida sem um contrato de nível de serviço. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Na sua tarefa de AutoML, pode realizar uma limpeza automática de hiperparâmetros para encontrar o modelo ideal (chamamos a este Modelo Automático de funcionalidade). Só especifica o número de avaliações; o espaço de pesquisa de hiperparâmetros, o método de amostragem e a política de terminação antecipada não são necessários. O sistema determinará automaticamente a região do espaço de hiperparâmetros para varrer com base no número de avaliações. Um valor entre 10 e 20 provavelmente funcionará bem em muitos conjuntos de dados.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

limits:
  max_trials: 10
  max_concurrent_trials: 2

Em seguida, pode submeter a tarefa para preparar um modelo de imagem.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

Para submeter a tarefa autoML, execute o seguinte comando da CLI v2 com o caminho para o ficheiro .yml, o nome da área de trabalho, o grupo de recursos e o ID da subscrição.

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]

Limpeza manual de hiperparâmetros para tarefas de imagem

Na sua tarefa de AutoML, pode especificar as arquiteturas do modelo com model_name o parâmetro e configurar as definições para efetuar uma limpeza de hiperparâmetros sobre um espaço de pesquisa definido para encontrar o modelo ideal.

Neste exemplo, vamos preparar um modelo de deteção de objetos com yolov5 e fasterrcnn_resnet50_fpn, ambos pré-preparados em COCO, um conjunto de dados de deteção, segmentação e legendagem de objetos em larga escala que contém mais de milhares de imagens etiquetadas com mais de 80 categorias de etiquetas.

Pode realizar uma limpeza de hiperparâmetros sobre um espaço de pesquisa definido para encontrar o modelo ideal.

Limites dos trabalhos

Pode controlar os recursos gastos na sua tarefa de preparação imagem autoML ao especificar o timeout_minutese max_trials o max_concurrent_trials para a tarefa nas definições de limite. Veja a descrição detalhada sobre os parâmetros Limites de Tarefas.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

O código seguinte define o espaço de pesquisa em preparação para a limpeza de hiperparâmetros para cada arquitetura yolov5 definida e fasterrcnn_resnet50_fpn. No espaço de pesquisa, especifique o intervalo de valores para learning_rate, optimizer, lr_scheduler, , etc., para a AutoML escolher, uma vez que tenta gerar um modelo com a métrica primária ideal. Se os valores de hiperparâmetros não forem especificados, os valores predefinidos são utilizados para cada arquitetura.

Para as definições de otimização, utilize a amostragem aleatória para escolher amostras deste espaço de parâmetros com o random sampling_algorithm. Os limites de tarefas configurados acima, indica ao ML automatizado para experimentar um total de 10 avaliações com estas amostras diferentes, executando duas avaliações de cada vez no nosso destino de computação, que foi configurado com quatro nós. Quanto mais parâmetros o espaço de pesquisa tiver, mais avaliações precisa para encontrar modelos ideais.

A política de cessação antecipada de bandidos também é utilizada. Esta política termina as avaliações de mau desempenho; ou seja, as avaliações que não estão dentro de 20% da avaliação com melhor desempenho, o que poupa significativamente recursos de computação.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

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]

Assim que o espaço de pesquisa e as definições de varrimento estiverem definidos, pode submeter a tarefa para preparar um modelo de imagem com o conjunto de dados de preparação.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

Para submeter a tarefa autoML, execute o seguinte comando da CLI v2 com o caminho para o ficheiro .yml, o nome da área de trabalho, o grupo de recursos e o ID da subscrição.

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]

Ao fazer uma limpeza de hiperparâmetros, pode ser útil visualizar as diferentes avaliações que foram experimentadas com a IU do HyperDrive. Pode navegar para esta IU acedendo ao separador "Tarefas subordinadas" na IU do automl_image_job principal acima, que é a tarefa principal do HyperDrive. Em seguida, pode aceder ao separador "Tarefas subordinados" deste.

Em alternativa, aqui abaixo, pode ver diretamente a tarefa principal do HyperDrive e navegar para o separador "Tarefas subordinadas":

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

CLI example not available, please use Python SDK.

Registar e implementar o modelo

Assim que a tarefa estiver concluída, pode registar o modelo que foi criado a partir da melhor versão de avaliação (configuração que resultou na melhor métrica primária). Pode registar o modelo após a transferência ou ao especificar o azureml caminho com o correspondente jobid.

Obter a melhor avaliação

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

CLI example not available, please use Python SDK.

Registar o modelo

Registe o modelo utilizando o azureml caminho ou o caminho transferido localmente.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

 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]

Depois de registar o modelo que pretende utilizar, pode implementá-lo com o ponto final online gerido deploy-managed-online-endpoint

Configurar o ponto final online

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

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

Criar o ponto final

Com o MLClient criado anteriormente, vamos agora criar o Ponto Final na área de trabalho. Este comando inicia a criação do ponto final e devolve uma resposta de confirmação enquanto a criação do ponto final continua.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

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

Também podemos criar um ponto final de lote para a inferência de lotes em grandes volumes de dados durante um período de tempo. Veja o bloco de notas de classificação do lote de deteção de objetos para inferência de lotes com o ponto final do batch.

Configurar a implementação online

Uma implementação é um conjunto de recursos necessários para alojar o modelo que faz a inferência real. Criamos uma implementação para o nosso ponto final com a ManagedOnlineDeployment classe. Pode utilizar SKUs de VM de GPU ou CPU para o cluster de implementação.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

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 

Criar a implementação

Com o MLClient criado anteriormente, vamos criar a implementação na área de trabalho. Este comando inicia a criação da implementação e devolve uma resposta de confirmação enquanto a criação da implementação continua.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

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

Atualizar tráfego:

Por predefinição, a implementação atual está definida para receber 0% de tráfego. pode definir a percentagem de tráfego que a implementação atual deve receber. A soma das percentagens de tráfego de todas as implementações com um ponto final não deve exceder os 100%.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

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]

Testar a implementação

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

CLI example not available, please use Python SDK.

Visualizar deteções

Agora que obteve uma imagem de teste, pode visualizar as caixas delimitadoras para esta imagem. Para tal, certifique-se de que tem o matplotlib instalado.

APLICA-SE A:Extensão v2 da CLI do Azure (atual)

CLI example not available, please use Python SDK.

Limpar os recursos

Não conclua esta secção se planear executar outros tutoriais do Azure Machine Learning.

Se não planear utilizar os recursos que criou, elimine-os para não incorrer em custos.

  1. No portal do Azure, selecione Grupos de recursos na extremidade esquerda.
  2. Na lista, selecione o grupo de recursos que criou.
  3. Selecione Eliminar grupo de recursos.
  4. Introduza o nome do grupo de recursos. Em seguida, selecione Eliminar.

Também pode manter o grupo de recursos, mas eliminar uma única área de trabalho. Apresente as propriedades da área de trabalho e selecione Eliminar.

Passos seguintes

Neste tutorial de machine learning automatizado, fez as seguintes tarefas:

  • Configurou uma área de trabalho e preparou dados para uma experimentação.
  • Preparado um modelo de deteção de objetos automatizado
  • Valores de hiperparâmetros especificados para o modelo
  • Efetuou uma limpeza de hiperparâmetros
  • Implementou o modelo
  • Deteções visualizadas

Nota

A utilização do conjunto de dados de objetos de frigorífico está disponível através da licença ao abrigo da Licença do MIT.