Image Predictions

Earth Engine provides ee.Model as a connector to models hosted on Vertex AI. This connector sends image or table data as online prediction requests to a trained model deployed on a Vertex AI endpoint. The model outputs are then returned as Earth Engine images or tables.

ee.Model.predictImage

Use model.predictImage() to make predictions on an ee.Image using a hosted model. The ee.Image is used to create tiles (image patch) of bands which are then sent to the hosted model. The return type of predictImage() is an ee.Image which can be added to the map, exported, or used in other computations.

Input Options

When performing inference using on a ee.Image there are a number of parameters used in the ee.Model connector. These controls are for the input bands and properties, the input image patch tiling, output image patch size and output image bands.

Bands and Properties

To specify the input bands and properties use the following parameters:

inputProperties

inputProperties is a list of property names to forward to every prediction instance. Numeric, string, and boolean properties are supported.

inputTypeOverride

inputTypeOverride is a dictionary of property and or band names with specific type and dimension information provided. This might be necessary because many Earth Engine algorithms create outputs with dynamic types that cannot be inferred until runtime.

For example if you are computing "slope" by mapping the ee.Terrain.slope function over a collection you will need to specify the output type of "slope" in our inference inputs like so:

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

TIP: If you encounter the error message that a band or property "cannot be converted to a tensor," a possible solution is to use a type override to force the input to a given type.

inputShapes

inputShapes is a dictionary of band names and array-pixel shape. To send your model array-valued pixels with lengths greater than 1 then set the inputShapes argument. to be set. The argument is similar to inputTypeOverride but is specific to input band shapes for image predictions. For example, to encode three bands, (1) "ndvi_series" as a 1D time series with 12 values, (2) "temp" as a scalar, and (3) "patch" as a 2D pixel array, use the following:

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

outputBands

outputBands is a dictionary of output band names to an object containing the ee.PixelType and dimensions of the band. Here dimensions should be the same as the length of the tensor shape array. In other words, scalar data with shape () should have dimension 0, 1D data with shape (N) should have dimensions 1, 2D data with shape (N, M) should have dimensions 2. For example, an output band named "B1" with array-valued pixels with shape is specified with the following:

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

Tile Sizes

You control how the image is tiled using the following parameters:

  • inputTileSize
  • inputOverlapSize
  • outputTileSize

Input Tile Sizes

To set input tile sizes use inputTileSize and inputOverlapSize. Set these parameters by providing a pair of tile width and height in pixels (for example [32, 32]). The total patch size is determined by adding the inputTileSize and outputTileSize heights and widths.

For example, a fully convolutional model may expect inputs with shape (256 x 256 x Channels). If we are worried about edges effects between inference results, we can discard inputOverlapSize[0] pixels from the left and right, and inputOverlapSize[1] from the top and bottom of each inference result. This will result in more prediction calls in order to fully cover the prediction area.

For example if our model expects (256 x 256 x 3) and we want to discard the 32 border pixels we would specify the following:

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

NOTE: The inputOverlapSize is a total x and y overlap. If you intend to have a buffer of N pixels around the entire image the overlap would then be [2N, 2N]

Output Tile Size

To set the output tile size set the outputTileSize argument. If outputTileSize is not set the default tile size is identical to inputTileSize.

For some models the output size may be different from the input size. For example, a classification model may accept (256, 256, Channels) shaped inputs, but return tensors with the shape (1, 1, 1). In this case the outputTileSize needs to be set to [1, 1]. This is fairly common with models that return the output of probability (at a reduced resolution) of some tile characteristic.

Projection

Nearly all convolutional models will expect input of a fixed projection. This is because most convolutional models are trained on a fixed scale. In this case, set the fixInputProj parameter to true in your call to ee.Model.fromVertexAi() and specify the data's projection in the proj parameter.

The input Image's projection and the model's fixed projection will affect the output values. See the EE Reprojection guide.