Compartilhar via


Treinar um modelo de detecção de objetos pequenos com AutoML (versão prévia) (v1)

APLICA-SE A: SDK azureml para Pythonv1

Importante

Alguns comandos da CLI do Azure neste artigo usam a extensão azure-cli-ml ou v1 do Azure Machine Learning. O suporte à extensão v1 terminará em 30 de setembro de 2025. Você poderá instalar e usar a extensão v1 até essa data.

Recomendamos que você faça a transição para a extensão ml ou v2, antes de 30 de setembro de 2025. Para obter mais informações sobre a extensão v2, confira Extensão da CLI do Azure ML e SDK do Python v2.

Importante

Esse recurso está atualmente em visualização pública. Essa versão prévia é fornecida sem um contrato de nível de serviço. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.

Neste artigo, você aprenderá a treinar um modelo de detecção de objetos para detectar objetos pequenos em imagens de alta resolução com ML automatizados no Azure Machine Learning.

Normalmente, os modelos de pesquisa visual computacional para detecção de objetos funcionam bem para conjuntos de dados com objetos relativamente grandes. No entanto, devido à memória e às restrições computacionais, esses modelos tendem a ter um desempenho baixo quando são encarregados de detectar objetos pequenos em imagens de alta resolução. Como as imagens de alta resolução normalmente são grandes, elas são redimensionadas antes de serem inseridas no modelo, o que limita sua capacidade de detectar objetos menores – em relação ao tamanho inicial da imagem.

Para ajudar com esse problema, o ML automatizado dá suporte à divisão em blocos como parte das funcionalidades de visualização pública da visão computacional. A funcionalidade de divisão em blocos no ML automatizado baseia-se nos conceitos em O Poder da organização lado a lado para detecção de objetos pequenos.

Ao serem divididas em blocos, cada imagem é dividida em uma grade de blocos. Blocos adjacentes se sobrepõem nas dimensões de largura e altura. Os blocos são recortados do original, conforme mostrado na imagem a seguir.

Diagrama que mostra uma imagem sendo dividida em uma grade de blocos sobrepostos.

Pré-requisitos

Modelos com suporte

Há suporte para a detecção de objetos pequenos usando blocos para todos os modelos compatíveis com o ML Automatizado para imagens para a tarefa de detecção de objetos.

Habilitar a divisão em blocos durante o treinamento

Para habilitar a divisão em blocos, você pode definir o parâmetro tile_grid_size com um valor como (3, 2), no qual 3 é o número de blocos ao longo da dimensão da largura e 2 é o número de blocos ao longo da dimensão da altura. Quando esse parâmetro é definido como (3, 2), cada imagem é dividida em uma grade de 3 x 2 blocos. Cada bloco se sobrepõe aos blocos adjacentes, de modo que todos os objetos que se enquadram na borda do bloco sejam incluídos completamente em um dos blocos. Essa sobreposição pode ser controlada pelo parâmetro tile_overlap_ratio, que assume como padrão 25%.

Quando a divisão em blocos está habilitada, toda a imagem e os blocos gerados a partir dela passam pelo modelo. Essas imagens e blocos são redimensionados de acordo com os parâmetros min_size e max_size antes de alimentar o modelo. O tempo de computação aumenta proporcionalmente devido ao processamento desses dados extras.

Por exemplo, quando o parâmetro tile_grid_size é (3, 2), o tempo de computação seria de, aproximadamente, sete vezes quando comparado à não divisão em blocos.

Você pode especificar o valor para tile_grid_size em seu espaço de hiperparâmetro como uma cadeia de caracteres.

parameter_space = {
    'model_name': choice('fasterrcnn_resnet50_fpn'),
    'tile_grid_size': choice('(3, 2)'),
    ...
}

O valor do parâmetro tile_grid_size depende das dimensões da imagem e do tamanho dos objetos dentro da imagem. Por exemplo, um número maior de blocos seria mais útil quando há objetos menores nas imagens.

Para escolher o valor ideal desse parâmetro para o seu conjuntos de dados, você pode usar a pesquisa de hiperparâmetro. Para fazer isso, você pode especificar uma opção de valores para esse parâmetro em seu espaço de hiperparâmetro.

parameter_space = {
    'model_name': choice('fasterrcnn_resnet50_fpn'),
    'tile_grid_size': choice('(2, 1)', '(3, 2)', '(5, 3)'),
    ...
}

Divisão em blocos durante a inferência

Quando um modelo treinado com divisão em blocos é implantado, a divisão em blocos também ocorre durante a inferência. O ML automatizado usa o valor tile_grid_size do treinamento para gerar os blocos durante a inferência. Toda a imagem e os blocos correspondentes passam pelo modelo, e as propostas de objeto deles são mescladas para a saída de previsões finais, como na imagem a seguir.

Diagrama que mostra propostas de objeto de imagem e blocos sendo mesclados para formar as previsões finais.

Observação

É possível que o mesmo objeto seja detectado em vários blocos. A detecção de duplicação é feita para remover essas duplicatas.

A detecção de duplicatas é feita executando-se NMS nas propostas dos blocos e da imagem. Quando várias propostas se sobrepõem, aquela com a pontuação mais alta é escolhida e as outras são descartadas como duplicatas. Duas propostas são consideradas sobrepostas quando a interseção sobre a união (iou) entre elas é maior que o parâmetro tile_predictions_nms_thresh.

Você também tem a opção de habilitar a divisão em blocos somente durante a inferência sem habilita-la no treinamento. Para fazer isso, defina o parâmetro tile_grid_size somente durante a inferência, e não no treinamento.

Isso pode melhorar o desempenho de alguns conjuntos de dados, e não irá incorrer em custo extra gerado pela divisão em blocos no momento do treinamento.

Hiperparâmetros da divisão em blocos

A seguir estão os parâmetros que você pode usar para controlar o recurso de divisão em blocos.

Nome do Parâmetro Descrição Padrão
tile_grid_size O tamanho da grade a ser usado para a divisão em blocos de cada imagem. Disponível para uso durante o treinamento, a validação e a inferência.

Tupla de dois inteiros passados como uma cadeia de caracteres, por exemplo, '(3, 2)'

Observação: definir esse parâmetro aumenta proporcionalmente o tempo de computação, pois todos os blocos e imagens são processados pelo modelo.
sem valor padrão
tile_overlap_ratio Controla a taxa de sobreposição entre blocos adjacentes em cada dimensão. Quando os objetos que se enquadram no limite do bloco são muito grandes para caber completamente em um dos blocos, aumente o valor desse parâmetro para que os objetos caibam completamente em pelo menos um dos blocos.

Deve ser um valor float em [0, 1).
0,25
tile_predictions_nms_thresh A interseção sobre o limite de união a ser usada para fazer a nms (supressão não máxima) ao mesclar previsões de blocos e imagem. Disponível durante a validação e a inferência. Altere esse parâmetro se houver várias caixas detectadas por objeto nas previsões finais.

Deve ser um valor float em [0, 1].
0,25

Blocos de anotações de exemplo

Consulte o notebook de exemplo de detecção de objeto para ver exemplos de código detalhados de configuração e treinamento de um modelo de detecção de objeto.

Observação

Todas as imagens neste artigo são disponibilizadas de acordo com a seção de uso permitido do contrato de licenciamento do MIT. Copyright © 2020 Roboflow, Inc.

Próximas etapas