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.
Pré-requisitos
Um Workspace do Azure Machine Learning. Para criar o workspace, confira Criar recursos do workspace.
Este artigo presume alguma familiaridade com a configuração de um experimento de machine learning automatizado para tarefas de visão computacional.
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.
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
- Saiba mais sobre como e onde implantar um modelo.
- Para obter definições e exemplos dos gráficos e métricas de desempenho fornecidos para cada trabalho, confira Avaliar resultados do experimento de machine learning automatizado.
- Tutorial: treinar um modelo de detecção de objetos (versão prévia) com o AutoML e o Python.
- Veja quais hiperparâmetros estão disponíveis para tarefas de pesquisa visual computacional.
- Fazer previsões com o ONNX em modelos de pesquisa visual computacional do AutoML