Blog de Amazon Web Services (AWS)

Cómo entrenar un modelo de machine learning para reconocer cosecha con AWS Earth & SageMaker Autopilot

Por Maximiliano Paz, Arquitecto de Soluciones Startup AWS Argentina

 

Recientemente Machine Learning dejo de ser una aspiración, es una parte fundamental para los negocios.

Como parte del equipo de AWS simplificamos el uso de Machine Learning (aprendizaje automatizado) para que cualquier persona, sea desarrollador, científico de datos o investigadores puedan tener acceso a construir aplicaciones inteligentes.

En este blog demuestro como hacer un modelo de machine learning usando Amazon SageMaker Autopilot: una herramienta que sirve para entrenar modelos de manera automática usando como base fuentes de información tabulada y 3 tipos de algoritmos (al momento de realizar el post): Aprendizaje lineal, XGBoost y MLP (no hace falta seleccionar uno de estos, Amazon SageMaker AutoPilot selecciona automáticamente el algoritmo adecuado), para identificar que tipo de cosecha se encuentra en un punto dado, basando este descubrimiento en la información pública que obtenemos de AWS Earth, específicamente del satélite Sentinel-2.

 

En este post:

  • Parte I: Información base necesaria
  • Parte II: Descargar imágenes satelitales
  • Parte III: Procesar las imágenes para enriquecer el dataset
  • Parte IV: Entrenar el modelo
  • Parte V: Probar la inferencia

 

Parte I: Información base necesaria

El primer paso es contar con lo que se conoce como “Ground truth” o “verdad de campo”, que es la información empírica para posteriormente inferir sobre lugares de los que no tenemos información.

En este caso nuestra información es:

Tipo de cosecha, Latitud, Longitud, y fecha del cultivo 2018/2019

 

 

Y sus etiquetas:

S/s = Soja, M/m= Maíz, N=Campo Natural, U=Urbano, A=Agua, G=Girasol, T=Trigo

 

Parte II: Descargar imágenes satelitales

Lo primero que hacemos es enriquecer los datos usando la información del satélite y sus diferentes bandas para conocer el reflejo de estos puntos, y convertir esta información en datos que puedan ser procesados por Amazon SageMaker AutoPilot (datos tabulares)

Para esto el servicio de Amazon Sagemaker nos permite usar Jupyter Notebooks, vamos a usar python3 con conda.

En la consola, buscamos el servicio de Amazon SageMaker y dentro vamos a crear una Jupyter Notebook:

 

 

Ponemos un nombre y en este caso vamos a cambiar el tamaño de la instancia por ml.t3.2xlarge debido al uso de memoria que necesitamos para procesar las imágenes, el resto de los valores van a quedar como vienen predefinidos:

 

 

Es muy importante tener en cuenta que la instancia que estamos creando tiene un costo por hora, si la dejan de usar se recomienda apagarla para que deje de generar costo por cómputo.

Una vez creada la instancia, vamos a poder acceder haciendo click en “Open Jupyter”

 

 

Posteriormente vamos a crear nuestra instancia dentro de la notebook

 

 

Una vez dentro de la notebook, lo primero que vamos a hacer es instalar la librería rasterio:

 

 

Esta librería nos permite analizar las imágenes satelitales.

Ahora descargamos las imágenes satelitales para ver los valores de las bandas en los puntos que tenemos con la cosecha o “Ground Truth”.

Descargamos el dataset de sentinel-2:

 

 

En este caso descargamos las bandas: B02 (banda azul) – ejemplo, B03 (banda verde), B04(banda Roja) & B08 (banda infrarroja) para los Tile (cuadrantes) HNH/HPH (ya que en esos 2 cuadrantes están repartidos los datos de “Ground Truth”; en 4 fechas distintas: 2 fechas de mayo y 2 de noviembre, esto es solo para acotar el caso de ejemplo).

Para esto usamos la librería “boto3” que permite realizar interacciones con servicios de AWS como en este caso con el servicio de Amazon S3 que contiene la información pública de las imágenes satelitales.

 

Parte III: Procesar las imágenes para enriquecer el Dataset

Paso siguiente es asignar las imágenes a valores y tamaños que podamos procesar por banda:

Con cada banda asignamos una variable por color de banda (red, blue, green, nir) y sus valores.

 

 

Un valor que vamos a agregar va a ser el índice de vegetación, que se calcula con la banda roja y la banda infrarroja y determina la salud de las plantas en un rango de -1 a 1:

 

 

Ahora que tenemos toda la información, Podemos buscar los valores en un punto dado por row/column:

 

 

Hagamos lo mismo para los valores de rojo, verde, azul e infrarrojo:

 

 

En el paso siguiente reemplazamos Row/Column, con puntos de Latitud y Longitud, que la información de campo que vamos a utilizar:

(tomo como ejemplo el punto de Lat/Long de la primera imagen del blog:

Cosecha: Soja, long: -62.14416325 & lat: -33.80020221

Lo que hacemos un punto de long/lat en row/col basándonos en el tamaño de la imagen y la cantidad de puntos, para esto usamos la librería pyproj que transforma latitude/longitud a puntos x, y:

 

 

Vamos a agregar estos valores a nuestra información actual, para usamos lo que ya tenemos:

 

 

Asignamos las variables que usamos de cada banda por fecha de cada imagen (en este caso se muestran solo 2 fechas como ejemplo, con sus respectivas 4 bandas por fecha de muestra) y se asignan los valores de rojo, verde, azul, NIR y NDVI de cada fecha:

 

 

Y el código que se va a encargar de tomar los valores del CSV (nuestro “Ground Truth”) y agregar los valores a un nuevo CSV creado para esto:

 

 

Esto da como resultado:

 

 

Si el punto está dentro de latitud/longitud, imprime los valores conseguidos, caso contrario da error, sobre todos los que da error hay que procesarlos en otro Tile (en el ejemplo mostrado solo procesé el tile HNH, para tener todos los resultados hay que procesar el tile HPH también…siempre hablando en el caso de muestra)

Una vez realizado esto y agregadas las otras 2 fechas para completar el muestreo (mismos pasos, pero sobre imágenes de fechas distintas), el resultado queda así:

 

 

Con esta información ya podemos entrenar nuestro modelo de Amazon SageMaker AutoPilot

 

Parte IV: Entrenar el modelo

Ponemos nuestro CSV dentro de un bucket de Amazon S3 y copiamos el nombre del resultado:

 

 

 

 

Esto lo vamos a hacer usando la consola:

Dentro del servicio de Amazon Sagemaker, lateral izquierdo “Amazon SageMaker Studio” y posteriormente seleccionan “Quick start”, crean un role o seleccionan uno ya creado; y click en submit.

Click en Open Studio:

 

 

Una vez adentro, “Create Experiment” dentro de “Components and registries”:

 

 

Y completar la información siendo lo más importante el bucket de Amazon S3 donde está el dataset que creamos en la Notebook, el target (que es el atributo del dataset del que se requiere hacer la predicción) y el bucket de destino:

 

 

Y también pueden limitar el entrenamiento en tiempo, cantidad de intentos y cantidad de candidatos y seleccionan los “Advanced Settings”:

 

 

Una vez que hagan click en “Create Experiment”, Amazon SageMaker AutoPilot va a comenzar el entrenamiento

 

 

Una vez que el modelo se vaya entrenando, van a ver diferentes resultados para los diferentes experimentos automáticos:

 

 

Una vez terminado, seleccionan el modelo con mejor “accuracy”, hacen click en “deploy model”

En este caso, vamos a seleccionar un endpoint real-time y poner las siguientes variables:

 

 

Si quisieran ver el porcentaje de certeza, tienen que agregar como “inference response content”, además de predicted_label, accuracy_rate.

Ahora si vamos a Amazon SageMaker en la consola, vamos a poder ver el endpoint siendo creado:

 

 

Una vez creado, podemos llamarlo para hacer inferencia en tiempo real, para realizar la inferencia el modelo necesita los valores de: Longitud, Latitud, fecha, NDVI, rojo, verde, azul & NIR.

 

Parte V: Probar la inferencia

Y para testearlo contamos con los siguientes puntos en los que sabemos los resultados:

 

M            -62.128740          -33.791581

S              -62.215580          -33.843258

N             -62.091203         -33.771852

 

Tomamos los valores de cada uno de los puntos usando las funciones anteriormente mostradas:

 

 

Y enviamos esos valores al modelo para realizar la inferencia:

 

 

Resultado correcto, aunque con poco nivel de Certeza sobre el ejemplo de la soja, probamos sobre el ejemplo del maíz:

 

 

En este caso el resultado fue correcto y con mayor nivel de Certeza:

 

 

Y la misma inferencia podría ser realizada desde una función de lambda, siempre que tengan los valores de las bandas:

 

 

Configuramos el evento Test con los valores como si los recibiese por llamada de API:

 

 

Y el resultado:

 

 

Finalmente, para evitar cargos, eliminar todos los recursos creados.

Conclusión

El uso de Sagemaker Autopilot simplifica la elección y el entrenamiento de modelos, y permite darle valor a un dataset sin tener la necesidad de realizar un pipeline completo de machine learning para lograrlo, y facilita la inferencia tiempo real o batch.

 

 


Sobre los autores

Maximiliano Paz es Arquitecto de Soluciones en Startup en AWS Argentina