---
license: mit
library_name: pytorch
pipeline_tag: image-feature-extraction
tags:
- remote-sensing
- earth-observation
- geospatial
- foundation-model
- multispectral
- elevation
- masked-autoencoder
- ecology
- semantic-segmentation
- canopy-height
- biomass
datasets:
- isprs-potsdam
---
# FLORO: A Multimodal Geospatial Foundation Model for Ecological Remote Sensing Across Sensors and Scales
FLORO is a multimodal geospatial foundation model designed to learn transferable representations from heterogeneous remote sensing observations. It was developed for ecological and environmental remote sensing applications where data often vary across sensors, spatial resolutions, spectral definitions, and available modalities.
Paper: [arXiv:2605.28174](https://arxiv.org/abs/2605.28174)
Project page: [FLORO project page](https://jorlrodriguezg.github.io/floro/)
Code: [GitHub repository](https://github.com/jorlrodriguezg/floro)
Hugging Face: [jorlrodriguezg/floro](https://huggingface.co/jorlrodriguezg/floro)
## Model description
FLORO uses masked autoencoding pretraining with multimodal Earth observation inputs. The released checkpoint corresponds to a Vision Transformer-based encoder trained with multispectral and elevation-related inputs.
The model is intended as a general-purpose encoder for ecological remote sensing tasks, including:
- semantic segmentation
- canopy height estimation
- biomass, nitrogen, and carbon regression
- scene classification
- spectral or modality reconstruction
## Input representation
FLORO uses grouped input channels to represent heterogeneous optical and auxiliary remote sensing modalities. Rather than assuming a fixed sensor-specific band order, the model organizes information into modality groups and uses validity channels to indicate which groups are available or valid for a given sample.
### Optical stream
The optical stream contains spectral reflectance information and corresponding validity indicators. It can represent visible, red-edge, near-infrared, and shortwave-infrared information depending on sensor availability.
| Group | Description |
|---|---|
| Blue, Green, Red | Visible optical bands |
| Red edge | Vegetation-sensitive red-edge band |
| Near infrared | NIR vegetation-sensitive band |
| Near infrared A | Additional NIR-like band when available |
| SWIR 1, SWIR 2 | Shortwave-infrared bands |
| Validity channels | Indicators for available or valid spectral groups |
### Auxiliary stream
The auxiliary stream represents terrain and radar information.
| Group | Description |
|---|---|
| Elevation | DSM, DTM, DEM, or related terrain-derived information |
| SAR VV | Sentinel-1 vertical transmit / vertical receive backscatter |
| SAR VH | Sentinel-1 vertical transmit / horizontal receive backscatter |
| Validity channels | Indicators for available or valid auxiliary modalities |
## Intended use
FLORO is intended for research in remote sensing, ecological monitoring, dryland vegetation mapping, environmental applications, and downstream adaptation of geospatial foundation models.
Example use cases include:
- adapting the encoder for semantic segmentation of high-resolution UAV or aerial imagery
- using FLORO features for canopy height or biomass regression
- evaluating transfer learning across sensors and spatial resolutions
- studying multimodal fusion between spectral and topographic information
## Limitations
FLORO was designed for ecological remote sensing and may require task-specific adaptation before deployment. Performance can depend on spatial resolution, band definitions, radiometric preprocessing, geographic region, and downstream decoder design.
The model should not be used as a standalone decision system for high-stakes environmental, legal, or policy decisions without validation on the target domain.
## Loading the checkpoint
The Hugging Face release includes both checkpoint formats:
- `checkpoints/floro_encoder_202603_ep150.safetensors`: recommended for new PyTorch workflows.
- `checkpoints/floro_encoder_202603_ep150.pth`: original PyTorch checkpoint, kept for reproducibility and direct use with PANGAEA-style configurations.
Direct downloads:
- [Safetensors checkpoint](https://huggingface.co/jorlrodriguezg/floro/resolve/main/checkpoints/floro_encoder_202603_ep150.safetensors)
- [Original PyTorch checkpoint](https://huggingface.co/jorlrodriguezg/floro/resolve/main/checkpoints/floro_encoder_202603_ep150.pth)
```python
from floro import FLOROGeoEncoder
from safetensors.torch import load_file
model = FLOROGeoEncoder(
image_size=256,
patch_size=16,
multispectral_channels=13,
modalities_channels=5,
d_model=1024,
depth=24,
num_heads=16,
mlp_ratio=4,
pos_embed_type="absolute",
)
state_dict = load_file("checkpoints/floro_encoder_202603_ep150.safetensors")
model.load_state_dict(state_dict, strict=False)
model.eval()
```
For PANGAEA benchmark runs, the encoder configs in `pangaea-bench/configs/encoder/` point to the original `.pth` checkpoint:
```yaml
encoder_weights: ./checkpoints/floro_encoder_202603_ep150.pth
download_url: https://huggingface.co/jorlrodriguezg/floro/resolve/main/checkpoints/floro_encoder_202603_ep150.pth
```
To convert the original PyTorch checkpoint to `safetensors`, run:
```bash
python scripts/convert_checkpoint_to_safetensors.py \
--input checkpoints/floro_encoder_202603_ep150.pth \
--output checkpoints/floro_encoder_202603_ep150.safetensors
```