Predicciones de imágenes

Earth Engine proporciona ee.Model como conector a los modelos alojados en Vertex AI. Este conector envía datos de imágenes o tablas como solicitudes de predicción en línea a un modelo entrenado implementado en un extremo de Vertex AI. Luego, los resultados del modelo se muestran como imágenes o tablas de Earth Engine.

ee.Model.predictImage

Usa model.predictImage() para hacer predicciones en un ee.Image con un modelo alojado. ee.Image se usa para crear mosaicos (parche de imagen) de bandas que luego se envían al modelo alojado. El tipo que se muestra de predictImage() es un ee.Image que se puede agregar al mapa, exportar o usar en otras operaciones.

Opciones de entrada

Cuando se realiza una inferencia en un ee.Image, hay una serie de parámetros que se usan en el conector ee.Model. Estos controles son para las bandas y propiedades de entrada, el mosaico de parches de imagen de entrada, el tamaño del parche de imagen de salida y las bandas de imagen de salida.

Bandas y propiedades

Para especificar las bandas y propiedades de entrada, usa los siguientes parámetros:

inputProperties

inputProperties es una lista de nombres de propiedades para reenviar a cada instancia de predicción. Se admiten propiedades numéricas, de cadena y booleanas.

inputTypeOverride

inputTypeOverride es un diccionario de nombres de propiedades o bandas con información específica de tipo y dimensión. Esto puede ser necesario porque muchos algoritmos de Earth Engine crean resultados con tipos dinámicos que no se pueden inferir hasta el tiempo de ejecución.

Por ejemplo, si calculas "pendiente" asignando la función ee.Terrain.slope a una colección, deberás especificar el tipo de salida de "pendiente" en nuestras entradas de inferencia de la siguiente manera:

inputTypeOverride = {
  "slope": {
    "type": "PixelType",
    "precision": "float",
    "dimensions": 0,
    "min": -100.0,
    "max": 100.0
  }
}

SUGERENCIA: Si encuentras el mensaje de error que indica que una banda o propiedad “no se puede convertir en un tensor”, una posible solución es usar una anulación de tipo para forzar la entrada a un tipo determinado.

inputShapes

inputShapes es un diccionario de nombres de bandas y formas de array de píxeles. Para enviar los píxeles con valor de array de tu modelo con longitudes superiores a 1, establece el argumento inputShapes. El argumento es similar a inputTypeOverride, pero es específico de las formas de banda de entrada para las predicciones de imágenes. Por ejemplo, para codificar tres bandas, (1) "ndvi_series" como una serie temporal de 1D con 12 valores, (2) "temp" como un escalar y (3) "patch" como un array de píxeles de 2D, usa lo siguiente:

inputShapes = {
  "ndvi_series": [12],  # 12 ndvi samples
  "temp": [], # scalar
  "patch": [2, 2], # 2px * 2px patch
}

outputBands

outputBands es un diccionario de nombres de bandas de salida a un objeto que contiene el ee.PixelType y las dimensiones de la banda. Aquí, las dimensiones deben ser las mismas que la longitud del array de forma del tensor. En otras palabras, los datos escalares con forma () deben tener la dimensión 0, los datos de 1D con forma (N) deben tener la dimensión 1, y los datos de 2D con forma (N, M) deben tener la dimensión 2. Por ejemplo, una banda de salida llamada "B1" con píxeles con valores de array con forma se especifica con lo siguiente:

outputBands = {
  'B1': {'type': ee.PixelType.float(), 'dimensions': 1}
}

Tamaños de las tarjetas

Puedes controlar cómo se organiza la imagen en mosaicos con los siguientes parámetros:

  • inputTileSize
  • inputOverlapSize
  • outputTileSize

Tamaños de tarjetas de entrada

Para establecer los tamaños de las tarjetas de entrada, usa inputTileSize y inputOverlapSize. Para establecer estos parámetros, proporciona un par de valores de ancho y alto de la tarjeta en píxeles (por ejemplo, [32, 32]). El tamaño total del parche se determina sumando las alturas y los anchos de inputTileSize y outputTileSize.

Por ejemplo, un modelo completamente convolucional puede esperar entradas con la forma (256 x 256 x canales). Si nos preocupan los efectos de los bordes entre los resultados de la inferencia, podemos descartar inputOverlapSize[0] píxeles de la izquierda y la derecha, y inputOverlapSize[1] de la parte superior e inferior de cada resultado de la inferencia. Esto generará más llamadas de predicción para cubrir por completo el área de predicción.

Por ejemplo, si nuestro modelo espera (256 × 256 × 3) y queremos descartar los 32 píxeles del borde, especificaríamos lo siguiente:

ee.Model({
  "endpoint": endpoint,
  "inputTileSize": [192, 192],
  "inputOverlapSize": [64, 64],
  # rest omitted.
}

NOTA: inputOverlapSize es una superposición total de x e y. Si deseas tener un búfer de N píxeles alrededor de toda la imagen, la superposición sería [2N, 2N].

Tamaño de la tarjeta de salida

Para establecer el tamaño de la tarjeta de salida, establece el argumento outputTileSize. Si no se establece outputTileSize, el tamaño de la tarjeta predeterminado es idéntico a inputTileSize.

En algunos modelos, el tamaño de salida puede ser diferente del tamaño de entrada. Por ejemplo, un modelo de clasificación puede aceptar entradas con la forma (256, 256, Canales), pero muestra tensores con la forma (1, 1, 1). En este caso, outputTileSize debe establecerse en [1, 1]. Esto es bastante común con los modelos que muestran el resultado de la probabilidad (en una resolución reducida) de alguna característica de la tarjeta.

Proyección

Casi todos los modelos de convolución esperan la entrada de una proyección fija. Esto se debe a que la mayoría de los modelos de convolución se entrenan en una escala fija. En este caso, establece el parámetro fixInputProj en true en tu llamada a ee.Model.fromVertexAi() y especifica la proyección de los datos en el parámetro proj.

La proyección de la imagen de entrada y la proyección fija del modelo afectarán los valores de salida. Consulta la guía de reproyección de EE.