O blog da AWS
Como treinar um modelo de aprendizado de máquina para reconhecer a colheita com o AWS Earth & SageMaker Autopilot
Por Maximiliano Paz, Arquiteto de Soluções de Startups
Recentemente Machine Learning deixou de ser uma aspiração e passou a ser uma parte fundamental dos negócios.
Neste blog eu irei demonstrar como criar um modelo de aprendizado de máquina usando o Amazon SageMaker Autopilot: uma ferramenta que serve para treinar modelos automaticamente usando fontes tabuladas de informações e 3 tipos de algoritmos (no momento da publicação): Linear Learning, XGBoost e MLP (você não precisa selecionar um deles, o Amazon SageMaker AutoPilot seleciona automaticamente o algoritmo apropriado), para identificar qual tipo de corte está em um determinado ponto, baseando essa descoberta nas informações públicas obter da AWS Earth, especificamente a partir do satélite Sentinel-2.
Neste post:
- Parte I: Informações de base necessárias
- Parte II: Baixar imagens de satélite
- Parte III: Processar imagens para enriquecer o conjunto de dados
- Parte IV: Treinar o modelo
- Parte V: Testar a inferência
Parte I: Informações de base necessárias
O primeiro passo é ter o que é conhecido como “Ground truth” ou “verdade de campo”, que é a informação empírica para mais tarde inferir sobre lugares onde não temos informações.
Neste caso, a nossa informação é:
Tipo de colheita, Latitude, Longitude e Data de cultivo 2018/2019
E suas tags:
S/s = Soja, m/m = Milho, N = Campo Natural, U=Urbano, A=Água, G=Girassol, T = Trigo
Parte II: Baixar imagens de satélite
A primeira coisa que fazemos é enriquecer os dados usando informações de satélite e suas diferentes bandas para conhecer o reflexo desses pontos e converter essas informações em dados que podem ser processados pelo Amazon SageMaker AutoPilot (dados tabulares)
Para isso, o serviço Amazon Sagemaker nos permite usar Notebooks Jupyter, usaremos Python3 com Conda.
Na console, procuramos o serviço Amazon SageMaker e dentro criaremos um Jupyter Notebook:
Colocamos um nome e, neste caso, alteraremos o tamanho da instância por ml.t3.2xlarge devido ao uso da memória que precisamos para processar as imagens, o restante dos valores será como predefinido:
É muito importante notar que a instância que estamos criando tem um custo por hora, se deixar de usá-la, é recomendável desativá-la para que pare de gerar custo por computação.
Assim que a instância for criada, poderemos acessar clicando em “Open Jupyter”
Em seguida, vamos criar nossa instância dentro do notebook
Uma vez dentro do notebook, a primeira coisa que vamos fazer é instalar a biblioteca rasterio:
Esta biblioteca nos permite analisar imagens de satélite.
Agora baixamos as imagens de satélite para ver os valores das bandas nos pontos que temos com a colheita ou “Ground Truth”.
Nós baixamos o conjunto de dados sentinel-2:
Neste caso, baixamos as bandas: B02 (banda azul) – exemplo, B03 (banda verde), B04 (banda vermelha) e B08 (banda infravermelho) para o Tile (quadrantes) HNH/HPH (já que nestes 2 quadrantes os dados da “Ground Truth” são distribuídos; em 4 datas diferentes: 2 de maio e 2 de novembro, isso é apenas para restringir o trexemplo).
Para isso, usamos a biblioteca “boto3” que permite interagir com os serviços da AWS, como neste caso com o serviço Amazon S3 que contém informações públicas para imagens de satélite.
Parte III: Processar imagens para enriquecer o conjunto de dados
Com cada banda atribuímos uma variável por cor de banda (vermelho, azul, verde, nir) e seus valores.
O próximo passo é atribuir as imagens a valores e tamanhos que podemos processar por banda:
Um valor que vamos adicionar será o índice de vegetação, que é calculado com a faixa vermelha e a faixa infravermelha e determina a saúde das plantas em um intervalo de -1 a 1:
Agora que temos todas as informações, podemos pesquisar os valores em um determinado ponto por linha/coluna:
Vamos fazer o mesmo para os valores vermelho, verde, azul e infravermelho:
Na próxima etapa, substituímos Linha/Coluna, por pontos Latitude e Longitude, que informações de campo vamos usar:
(Vamos usar como exemplo o ponto de Lat/Long da primeira imagem do blog:
Colheita: Soja, long ፦62.14416325 & lat ፦33.80020221
O que fazemos um ponto long/lat em linha/col com base no tamanho da imagem e no número de pontos, para isso usamos a biblioteca pyproj que transforma latitude/longitude em x, y pontos:
Vamos adicionar esses valores às nossas informações atuais, para usar o que já temos:
Atribuímos as variáveis que usamos para cada banda por data de cada imagem (neste caso, apenas 2 datas são mostradas como exemplo, com suas respectivas 4 bandas por data de amostra) e atribuímos os valores de vermelho, verde, azul, NIR e NDVI para cada data:
E o código que cuidará de ler os valores do CSV (nosso “Ground truth”) e adicionar os valores a um novo CSV criado para isso:
Isso resulta em:
Se o ponto estiver dentro da latitude/longitude, imprime os valores obtidos, caso contrário, dará erro, em tudo o que dá erro você tem que processá-los em outro Tile (no exemplo mostrado eu só processei a tile HNH, para ter todos os resultados que você tem que processar o tile HPH também… sempre falando no caso de amostra)
Uma vez que isto é feito e adicionado as outras 2 datas para completar a amostragem (mesmas etapas, mas em imagens de datas diferentes), o resultado se parece com este:
Com essas informações, agora podemos treinar nosso modelo do Amazon SageMaker AutoPilot
Parte IV: Treine o modelo
Colocamos nosso CSV dentro de um bucket do Amazon S3 e copiamos o nome do resultado:
Vamos fazer isso usando o console:
No serviço do Amazon Sagemaker, no lado esquerdo “Amazon SageMaker Studio” e selecione “Início rápido”, crie uma função ou selecione uma já criada e clique em Enviar.
Clique em Open Studio:
Uma vez dentro, “Create Experiment” em “Components and registries”:
E conclua as informações sendo a coisa mais importante do bucket do Amazon S3 onde está o conjunto de dados que criamos no Notebook, o destino (que é o atributo do conjunto de dados necessário para fazer a previsão) e o bucket de destino:
E eles também podem limitar o treinamento no tempo, número de tentativas e número de candidatos e selecionar “Advanced Settings”:
Depois de clicar em “Create Experiment”, o Amazon SageMaker AutoPilot começará o treinamento
Uma vez que o modelo é treinado, eles verão resultados diferentes para os diferentes experimentos automáticos:
Uma vez terminado, selecione o modelo com a melhor “accuracy”, clique em “deploy model”
Neste caso, vamos selecionar um endpoint em tempo real e colocar as seguintes variáveis:
Se eles quisessem ver a porcentagem de certeza, eles têm que adicionar como “inference response content”, além de predicted_label, accuracy_rate.
Agora, se formos ao Amazon SageMaker na console, poderemos ver o endpoint que está sendo criado:
Uma vez criado, podemos chamá-lo para fazer inferência em tempo real, para fazer a inferência o modelo precisa dos valores de: Longitude, Latitude, Data, NDVI, Vermelho, Verde, Azul e NIR
Parte V: Testar a inferência
E para testá-la temos os seguintes pontos onde sabemos os resultados:
M -62.128740 -33.791581
S -62.215580 -33.843258
N -62.091203 -33.771852
Tomamos os valores de cada um dos pontos usando as funções mostradas acima:
E enviamos esses valores para o modelo para executar a inferência:
Resultado correto, embora com pouco nível de Certeza sobre o exemplo de soja, testamos no exemplo de milho:
Neste caso, o resultado foi correto e com um nível mais alto de Certeza:
E a mesma inferência pode ser realizada a partir de uma função lambda, desde que tenham os valores das bandas:
Definimos o evento Test com os valores como se você os recebesse por chamada de API:
E o resultado:
Finalmente, para evitar cobranças, exclua todos os recursos criados.
Conclusão
O uso do Sagemaker Autopilot simplifica a escolha e o treinamento do modelo, permitindo valor a um conjunto de dados sem a necessidade de executar uma pipeline completa de aprendizado de máquina para alcançá-lo e facilita a inferência em tempo real ou em lote.