A PydanticV2 validation and serialization libary for the STAC ML Model Extension
Project description
stac-model
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.
📄 License
This project is licenced under the terms of the Apache Software License 2.0 licence.
See LICENSE for more details.
💗 Credits
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stac_model-0.5.1.tar.gz.
File metadata
- Download URL: stac_model-0.5.1.tar.gz
- Upload date:
- Size: 37.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.29 {"installer":{"name":"uv","version":"0.9.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9292451ea9d740e0846c224bdf6b2ee595644afb21f11ba7d36326f22dc7b2f
|
|
| MD5 |
ee46a2e1ff9f37bfc57e7b1322d7defe
|
|
| BLAKE2b-256 |
74144967d816a45998dbc2364b3aff41af191c5cd32a56211481e10702df8401
|
File details
Details for the file stac_model-0.5.1-py3-none-any.whl.
File metadata
- Download URL: stac_model-0.5.1-py3-none-any.whl
- Upload date:
- Size: 30.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.29 {"installer":{"name":"uv","version":"0.9.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
097272c7b3ad6b76d7d55a7d937ca281fa6691a369140c924679ee1784875e53
|
|
| MD5 |
27775bb7d8d2a9bebc77fb00d95a761c
|
|
| BLAKE2b-256 |
2ec11548e2c192594a2cd5e51f01a4421dc7fa5375a3133338c9c49466658d51
|