Skip to main content

A PydanticV2 validation and serialization libary for the STAC ML Model Extension

Project description

stac-model

Python support PyPI Release Repository Releases

Contributions Welcome

uv Pre-commit Semantic versions Pipelines

A PydanticV2 and PySTAC validation and serialization library for the STAC ML Model Extension

Python Version Support

[!NOTE] stac-model package versions and MLM specification versions are independently managed.

  • MLM Extension Specification: Versioned as vX.Y.Z (e.g., v1.5.1)
  • stac-model Package: Versioned as stac-model-vX.Y.Z (e.g., stac-model-v0.5.2)

Python Version Compatibility:

stac-model Version Python Version
>=0.6.0 3.11+
<0.6.0 3.10+

Installation

pip install -U stac-model

or install with uv:

uv add stac-model

Then you can run

stac-model --help

Creating example metadata JSON for a STAC Item

stac-model

This will make this example item for an example model.

Validating Model Metadata

An alternative use of stac_model is to validate config files containing model metadata using the MLModelProperties schema.

Given a YAML or JSON file with the structure in examples/torch/mlm-metadata.yaml, the model metadata can be validated as follows:

import yaml
from stac_model.schema import MLModelProperties

with open("examples/mlm-metadata.yaml", "r", encoding="utf-8") as f:
    metadata = yaml.safe_load(f)

MLModelProperties.model_validate(metadata["properties"])  

Exporting and Packaging PyTorch Models, Transforms, and Model Metadata

As of PyTorch 2.8, and stac_model 0.4.0, you can now export and package PyTorch models, transforms, and model metadata using functions in stac_model.torch.export. Below is an example of exporting a U-Net model pretrained on the Fields of The World (FTW) dataset for field boundary segmentation in Sentinel-2 satellite imagery using the TorchGeo library.

📝 Note: To customize the metadata for your model you can use this example as a template.

import torch
import torchvision.transforms.v2 as T
from torchgeo.models import Unet_Weights, unet
from stac_model.torch.export import save

weights = Unet_Weights.SENTINEL2_3CLASS_FTW
transforms = torch.nn.Sequential(
  T.Resize((256, 256)),
  T.Normalize(mean=[0.0], std=[3000.0])
)
model = unet(weights=weights)

save(
    output_file="ftw.pt2",
    model=model,  # Must be an nn.Module
    transforms=transforms,  # Must be an nn.Module
    metadata="metadata.yaml",  # Can be a metadata yaml or stac_model.schema.MLModelProperties object
    input_shape=[-1, 8, -1, -1],  # -1 indicates a dynamic shaped dimension
    device="cpu",
    dtype=torch.float32,
    aoti_compile_and_package=False,  # True for AOTInductor compile otherwise use torch.export
)

The model, transforms, and metadata can then be loaded into an environment with only torch and stac_model as required dependencies like below:

import yaml
from torch.export.pt2_archive._package import load_pt2

pt2 = load_pt2(archive_path)
metadata = yaml.safe_load(pt2.extra_files["mlm-metadata"])

# If exported with aoti_compile_and_package=True
model = pt2.aoti_runners["model"]
transforms = pt2.aoti_runners["transforms"]

# If exported with aoti_compile_and_package=False
model = pt2.exported_programs["model"].module()
transforms = pt2.exported_programs["transforms"].module()

# Inference
batch = ...  # An input batch tensor
outputs = model(transforms(batch))

Creating a STAC Item from a PyTorch Model

You can generate a valid STAC Item using the Machine Learning Model (MLM) Extension.

The example below demonstrates creating a STAC Item from a U-Net model pretrained on the Fields of The World (FTW) dataset for field boundary segmentation in Sentinel-2 satellite imagery, using the TorchGeo library

from stac_model.examples import unet_mlm
from stac_model.torch import MLModelExtension
from torchgeo.models import unet, Unet_Weights

# Use default TorchGeo UNet weights
weights = Unet_Weights.SENTINEL2_2CLASS_NC_FTW
model = unet(weights=weights)

# Create an ItemMLModelExtension using the MLM extension
item_ext = MLModelExtension.from_torch(
    model,
    weights=weights,
    item_id="pytorch_geo_unet"
)

For a more complete example including STAC Item properties, geometry, and datetime ranges, see unet_mlm() in stac_model/examples.py.

📈 Releases

You can see the list of available releases on the GitHub Releases page.

For release procedure, see Building and Releasing.

📄 License

License

This project is licenced under the terms of the Apache Software License 2.0 licence. See LICENSE for more details.

💗 Credits

Python project templated from galactipy.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stac_model-0.6.0.tar.gz (37.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stac_model-0.6.0-py3-none-any.whl (30.3 kB view details)

Uploaded Python 3

File details

Details for the file stac_model-0.6.0.tar.gz.

File metadata

  • Download URL: stac_model-0.6.0.tar.gz
  • Upload date:
  • Size: 37.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stac_model-0.6.0.tar.gz
Algorithm Hash digest
SHA256 92b788a4f887dbd3f7716e69350c33c034c7bd60fc1d16a9a56b6dd57356d4e2
MD5 5b730cee4f328b2cf0833391b0653fc7
BLAKE2b-256 ee4256fd74df41b420669f66bdbdcc0477deca71f51d0824c64c97fcd973055e

See more details on using hashes here.

File details

Details for the file stac_model-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: stac_model-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 30.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stac_model-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ac6f1722278fc1422fed3f41c9274e7aac6b9084b32c05aad319cda6866418dd
MD5 3e165dbdb8981aea8dcabaa4e1fcefc5
BLAKE2b-256 6c211515b0588c38a4d0bf4dabf5fe56edbd4921b0893207cb8aed8e3bc514be

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page