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.