Physics-Aware Parameter-Efficient Fine-Tuning for Geospatial Foundation Models.
Project description
SpectraLoRA: Physics-Aware Fine-Tuning for Geospatial Foundation Models
SpectraLoRA is a specialized Parameter-Efficient Fine-Tuning (PEFT) library designed for multispectral satellite imagery. Unlike standard LoRA, which treats all input channels equally, SpectraLoRA introduces a Physics-Aware Gating Mechanism that dynamically routes information to specialized adapters based on the spectral signature of the terrain (e.g., Vegetation, Water, Urban).
This architecture is designed to fine-tune massive Geospatial Foundation Models (like IBM/NASA Prithvi-100M) on consumer hardware while enforcing physical consistency in predictions.
🏗️ System Architecture
SpectraLoRA operates as a "Sidecar" to the frozen foundation model. It intercepts data flow to inject physics context without altering the pre-trained weights.
Key Innovations
- Spectral Fingerprinting: Calculates real-time physics indices (NDVI, NDWI, BSI) before the model runs.
- Mixture-of-Experts (MoE): A bank of specialized Low-Rank Adapters (e.g., one for forests, one for cities).
- Dynamic Gating: A lightweight router that blends adapters based on the material properties of the image patch.
- Built-in MLOps Tracking: Automatically logs hyperparameters, training loss, and GeoAI-specific metrics (mIoU, Physics Violations) to local SQLite or enterprise PostgreSQL databases.
🖼️ Visualizing Results
SpectraLoRA is built to handle highly diverse, complex geographies—from arid deserts to dense coastal urban infrastructure. The library includes built-in batch prediction tools to visualize the AI's 4-class segmentation (Barren, Vegetation, Water, Urban) side-by-side with true-color satellite imagery.
(Example output showing true RGB imagery alongside the SpectraLoRA physics-routed prediction)
📂 Project Structure
SpectraLoRA/
├── spectra_lora/ # The Core Library Package
│ ├── __init__.py # API Exporter
│ ├── config.py # Phase 1: Global Configuration & Band Maps
│ ├── spectral_ops.py # Phase 1: The Physics Engine (NDVI/BSI Math)
│ ├── gating_network.py # Phase 2: The Neural Router (MLP)
│ ├── layers.py # Phase 2: The Custom SpectraLoRALayer
│ ├── model_wrapper.py # Phase 3: The Surgeon (Model Loader & Injector)
│ └── utils.py # Helpers: GeoTIFF Loading & Visualization
│
├── experiments/ # Execution Scripts & Testing
│ ├── train.py # Phase 4: Training Loop & Context Patching
│ ├── evaluate.py # Phase 4: Physics-Aware Evaluation Metrics
│ ├── predict.py # Phase 5: Batch Inference & Visualization tool
│ └── predictions_output/ # Saved side-by-side RGB vs AI prediction plots
│
├── setup.py # PyPI Installation Configuration
├── requirements.txt # Dependencies
├── LICENSE # MIT License
└── README.md # This file
📚 Documentation
For a complete guide on how the Physics Engine works, detailed API references, and advanced usage tutorials, please visit our official documentation site:
📖 Read the SpectraLoRA Documentation Here
🚀 Quick Start
Installation
You can install the library directly via pip:
pip install spectralora
(Alternatively, clone the repository and run pip install -r requirements.txt for development).
Usage (Python API)
Use SpectraLoRA to upgrade a standard Prithvi model with physics-aware adapters:
from spectra_lora import load_prithvi_model, inject_spectra_lora
# 1. Load the frozen Foundation Model (Prithvi-100M)
model = load_prithvi_model()
# 2. Perform Surgery: Inject SpectraLoRA layers
model = inject_spectra_lora(model)
# 3. The model is now ready for training!
# Only the adapter parameters (approx 1-5%) are trainable.
📖 Detailed File Guide
1. The Physics Core (spectra_lora/)
spectral_ops.py: The mathematical heart of the library. It takes raw satellite tensors and calculates 5 physics indices: NDVI (Vegetation), SAVI (Soil-Adjusted Vegetation), NDWI (Water), NDBI (Built-up), and BSI (Bare Soil). This ensures the model "sees" physics, not just pixels.config.py: The blueprint. Defines the Band Map (Blue=0, NIR=3, etc.) to ensure calculations are accurate for the Prithvi model. It also sets LoRA hyperparameters (Rank=4, Alpha=8).utils.py: Handles the messy parts of Geospatial AI. Containsload_geotiffto normalize 16-bit satellite data into float32 tensors, and visualization tools to debug the spectral fingerprint.
2. The Neural Architecture (spectra_lora/)
gating_network.py: A tiny Multi-Layer Perceptron (MLP). It takes the 5-dimensional physics vector fromspectral_opsand outputs soft mixing weights (e.g.,[0.8, 0.1, 0.1]) to control the adapters.layers.py: The custom PyTorch module. It replaces standard Linear layers. It contains:- The Frozen original weights.
- The Adapter Bank (3 parallel LoRA experts).
- The Gating Network.
- Logic: $Output = Frozen(x) + \sum_{i} (Gate_i(z) \cdot Adapter_i(x))$
3. The Integration (spectra_lora/)
model_wrapper.py: The "Surgeon." It downloads the Prithvi architecture code dynamically from Hugging Face (since it's not in standardtransformers), loads the weights, and recursively swaps Attention layers withSpectraLoRALayer.__init__.py: Exposes the high-level API so you can import functions cleanly.db.py: The MLOps database engine. Utilizes SQLAlchemy to auto-generate tracking schemas and securely log experiment data without forcing users to write manual SQL.
4. Experiments (experiments/)
train.py: The training engine. It includes a critical Runtime Patch (patch_model_for_context) that allows the model to access the global "Physics Context" without rewriting the original Prithvi code.evaluate.py: A custom validator. Beyond standard mIoU, it calculates a "Physics Violation Score"—counting how many times the model predicted "Vegetation" in a pixel where the NDVI was clearly "Desert."predict.py: A batch-processing visualization tool that iterates through.tifdatasets and outputs RGB-vs-Prediction maps.
📊 Citation
If you use this code for your research, please cite:
@software{spectralora2026,
author = {Munieb Abdelrahman},
title = {SpectraLoRA: Band-Specific Low-Rank Adaptation for Geospatial Foundation Models},
year = {2026},
url = {[https://github.com/MuniebA/SpectraLoRA](https://github.com/MuniebA/SpectraLoRA)}
}
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 spectralora-0.1.1.tar.gz.
File metadata
- Download URL: spectralora-0.1.1.tar.gz
- Upload date:
- Size: 18.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5928a2bd4d87d7995d59d291fa47d043b7677e5da0ed0325de478031f3ec897a
|
|
| MD5 |
97b836340ff9db62904a23d272f83239
|
|
| BLAKE2b-256 |
e309bcd832507040bd016344b4ce56c8fd187890f76cc2712ffb54a9057ec7c3
|
File details
Details for the file spectralora-0.1.1-py3-none-any.whl.
File metadata
- Download URL: spectralora-0.1.1-py3-none-any.whl
- Upload date:
- Size: 18.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f48afac9d649ad1d33a208a80ad041d3125ba9943fd4455d8142a607fe6ab135
|
|
| MD5 |
e97c29ee4323ea9aa82efe014abf4cd2
|
|
| BLAKE2b-256 |
d396236def0417631b968296c31118a0478b9a57956c1d614934b0c027cce744
|