BiliSakura's picture
Upload SkySense++ Transformers checkpoints
8d93654 verified
|
Raw
History Blame Contribute Delete
4.58 kB
---
license: apache-2.0
tags:
- remote-sensing
- earth-observation
- skysensepp
- feature-extraction
pipeline_tag: feature-extraction
---
# SkySense++ Transformers
HuggingFace-compatible checkpoints for SkySense++ zero-shot MSL backbones, converted from the official release weights.
## Checkpoints
| Directory | Modality | Architecture | Source |
|-----------|----------|--------------|--------|
| `skysensepp-swinv2-msl-hr` | High-res optical | SwinV2 Huge + MSL | `skysensepp_release_hr.pth` |
| `skysensepp-vit-msl-s2` | Sentinel-2 | ViT-Large + MSL | `skysensepp_release_s2.pth` |
| `skysensepp-vit-msl-s1` | Sentinel-1 | ViT-Large + MSL | `skysensepp_release_s1.pth` |
| `skysensepp-fusion-neck` | Multi-modal fusion (optional) | TransformerEncoder | `fusion.*` from `skysensepp_release.ckpt` |
| `skysensepp-fewshot-release` | Full 1-shot segmentation | HR + S2 + S1 + fusion + VAE + UPerHead | `skysensepp_release.ckpt` |
Each subdirectory is a self-contained HuggingFace model repo with remote code (`trust_remote_code=True`).
The fusion neck is an **optional** component — backbone checkpoints do not include or require it by default.
The few-shot release bundles all submodules into one end-to-end model (~6.8 GB).
## Usage
```python
from transformers import pipeline
import torch
MODEL = "/path/to/SkySensePlusPlus-transformers/skysensepp-swinv2-msl-hr"
pipe = pipeline(
task="image-feature-extraction",
model=MODEL,
trust_remote_code=True,
device="cpu",
)
hr_img = torch.randn(1, 3, 512, 512)
annotation = torch.zeros(1, 512, 512, dtype=torch.long) # semantic class indices
features = pipe(hr_img, annotation=annotation)
print(features["last_hidden_state"].shape) # (1, 2816, 16, 16)
```
Sentinel-2 / Sentinel-1 backbones use the same pipeline pattern:
```python
s2_pipe = pipeline(
task="image-feature-extraction",
model="/path/to/skysensepp-vit-msl-s2",
trust_remote_code=True,
device="cpu",
)
s2_img = torch.randn(1, 10, 16, 16)
s2_anno = torch.zeros(1, 16, 16, dtype=torch.long)
features = s2_pipe(s2_img, annotation=s2_anno)
print(features["last_hidden_state"].shape)
```
SkySense++ MSL models require both imagery and a semantic annotation map. Use class index `0` for background/unlabeled regions during zero-shot feature extraction.
### Optional fusion neck
```python
fusion_pipe = pipeline(
task="skysensepp-fusion",
model="/path/to/skysensepp-fusion-neck",
trust_remote_code=True,
device="cpu",
)
# Concatenated HR + S2 + S1 stage-3 tokens per spatial location
hidden_states = torch.randn(256, 3, 2816)
fused = fusion_pipe(hidden_states)
print(fused["pooler_output"].shape) # (256, 1024)
```
### Few-shot / 1-shot segmentation
The full release model expects vertically stacked prompt+query inputs (prompt on top, query on bottom):
```python
from transformers import pipeline
import torch
MODEL = "/path/to/SkySensePlusPlus-transformers/skysensepp-fewshot-release"
pipe = pipeline(
task="skysensepp-fewshot",
model=MODEL,
trust_remote_code=True,
device=0, # GPU recommended (~24 GB); CPU OOMs at 1024×512 HR
)
# Stacked HR (3, 1024, 512), S2/S1 with seq=2, RGB targets (ImageNet-normalized)
hr = torch.randn(1, 3, 1024, 512)
s2 = torch.randn(1, 10, 2, 32, 32)
s1 = torch.randn(1, 2, 2, 32, 32)
targets = torch.randn(1, 3, 1024, 512) # use real RGB annotation maps in practice
anno_mask = torch.zeros(1, 8, 4, dtype=torch.long)
anno_mask[:, 4:, :] = 1 # mask query (bottom) half
result = pipe(hr, s2_img=s2, s1_img=s1, targets=targets, anno_mask=anno_mask)
print(result["logits"].shape) # (1, 65, 512, 512) — query region only
```
## Conversion
Source project: `/home/czy/local/projects/SkySensePlusPlus-transformers`
```bash
conda activate rsgen
python scripts/convert_checkpoint_to_hf.py \
--input-path /path/to/skysensepp_release_hr.pth \
--modality hr \
--output-dir /path/to/skysensepp-swinv2-msl-hr \
--clean-output
# Full few-shot release (~6.8 GB)
python scripts/convert_checkpoint_to_hf.py \
--input-path /path/to/skysensepp_release.ckpt \
--modality fewshot \
--output-dir /path/to/skysensepp-fewshot-release \
--clean-output
```
## Notes
- HR conversion skips Swin relative-position buffers (`relative_position_index`, `relative_coords_table`). These are **deterministically recomputed** at init from window geometry — not randomly initialized. Learned CPB weights (`cpb_mlp`, `logit_scale`) are loaded.
- The few-shot model uses the same 62 skipped HR buffers; all 1522 learned tensors load with 0 unexpected keys.