---
title: xuannv_embddings
canonical_url: "https://www.modelscope.cn/datasets/WeijieWu/xuannv_embddings"
md_url: "https://www.modelscope.cn/datasets/WeijieWu/xuannv_embddings.md"
repository: WeijieWu/xuannv_embddings
chinese_name: "玄女底座嵌入数据集"
last_updated: 2026-06-27
license: "Apache License 2.0"
storage_size: "221 GB"
downloads: 6234
stars: 0
---

# xuannv_embddings

> xuannv_embddings - WeijieWu 在 ModelScope 开源的数据集。Xuannv Embedding Dataset — 哈尔滨多源遥感数据集与预计算嵌入向量

WeijieWu/xuannv_embddings 是 ModelScope 魔搭社区上的数据集，存储大小 221 GB，采用 Apache License 2.0 许可。

- **Repository**: WeijieWu/xuannv_embddings
- **License**: Apache License 2.0
- **Storage size**: 221 GB
- **Downloads**: 6234
- **Stars**: 0
- **Last updated**: 2026-06-27

Source: https://www.modelscope.cn/datasets/WeijieWu/xuannv_embddings

---

# Xuannv Embedding Dataset — 哈尔滨多源遥感数据集与预计算嵌入向量

## 数据集简介

本数据集是 **AlphaEarth Foundations 改进版（xuannv embedding）** 项目的配套数据，包含哈尔滨新区的多源遥感影像数据及其预计算嵌入向量。该项目的核心目标是**解决嵌入坍缩问题并提升时间敏感性**，使模型能够执行高精度的遥感变化检测任务。

- **空间范围**：哈尔滨新区（含松北、太阳岛等区域）
- **时间范围**：2023-01 至 2025-12
- **Patch 数量**：424 个空间格网（128×128 像素原始分辨率）
- **数据格式**：GeoTIFF（原始数据）+ NumPy `.npy`（嵌入向量）

---

## 目录结构

```
.
├── README.md                          # 本文件
├── raw_data/                          # 原始遥感数据
│   ├── scene_index.json               # 时间索引文件
│   ├── s2/                            # Sentinel-2 光学影像
│   ├── s1/                            # Sentinel-1 SAR 影像
│   ├── landsat/                       # Landsat 光学影像
│   ├── dem/                           # 数字高程模型
│   ├── worldcover/                    # ESA WorldCover 土地覆盖
│   ├── dynamic_world/                 # Dynamic World 土地覆盖
│   └── jrc_water/                     # JRC 全球水体数据
├── embeddings/                        # 预计算嵌入向量
│   ├── v4_official/
│   │   └── monthly_embeddings_2025/   # V4 官方版本月度嵌入
│   └── v5_mixed_scale/
│       └── monthly_embeddings_2025/   # V5 混合尺度版本月度嵌入
└── annotations/                       # 变化检测人工标注
    ├── june.shp / .shx / .dbf ...     # 6 月标注
    ├── aug.shp ...                    # 8 月标注
    ├── September.shp ...              # 9 月标注
    ├── October.shp ...                # 10 月标注
    ├── SAR建筑工地.shp ...             # SAR 建筑工地标注
    ├── SAR房屋拆除.shp ...             # SAR 房屋拆除标注
    ├── SAR疑似违建.shp ...             # SAR 疑似违建标注
    └── SAR非农非粮.shp ...             # SAR 非农非粮标注
```

---

## 原始数据说明

### 输入源（3 类，用于编码器）

| 数据源 | 类型 | 时间频率 | 景数 | 波段说明 | 预处理 |
|--------|------|----------|------|----------|--------|
| **S2** | 光学 | 约 5 天 | 180 景 | B2, B3, B4, B8, B11, B12（6 波段） | log(x+1)/10 → z-score → ±6σ clip |
| **S1** | SAR | 约 12 天 | 96 景 | VV, VH（2 波段） | clip[-30,10] dB → z-score → ±6σ clip |
| **Landsat** | 光学 | 约 16 天 | 76 景 | 与 S2 对齐的 6 波段 | log(x+1)/10 → z-score → ±6σ clip |

### 目标源（4 类静态数据，仅用于重建监督）

| 数据源 | 类型 | 波段数 | 说明 |
|--------|------|--------|------|
| **DEM** | 连续值 | 1 | 数字高程 |
| **WorldCover** | 分类 | 1 | 11 类土地覆盖（ESA） |
| **Dynamic World** | 分类 | 1 | 9 类土地覆盖（Google） |
| **JRC Water** | 连续值 | 1 | 水体概率/掩码 |

### 文件组织

每个 Patch 的目录结构示例（以 `s2/patch_000000/` 为例）：

```
patch_000000/
├── 20230103.tif
├── 20230105.tif
├── 20230113.tif
└── ...
```

文件名格式为 `YYYYMMDD.tif`（单景）或 `YYYYQN.tif`（季度）。所有影像已对齐到统一的空间格网，尺寸为 128×128 像素。

### scene_index.json 解读

```python
import json

with open("raw_data/scene_index.json") as f:
    index = json.load(f)

# index 包含三个键："s2", "s1", "landsat"
# 每个键对应一个日期字符串列表
print(index["s2"][:5])   # ['20230103', '20230105', ...]
print(f"S2 总景数: {len(index['s2'])}")      # 180
print(f"S1 总景数: {len(index['s1'])}")      # 96
print(f"Landsat 总景数: {len(index['landsat'])}")  # 76
```

---

## 嵌入向量说明（核心内容）

### 基本属性

| 属性 | 值 |
|------|-----|
| **文件格式** | NumPy `.npy`（二进制） |
| **数组形状** | `(128, 64, 64)` = `(embedding_dim, H, W)` |
| **数据类型** | `float32` |
| **空间分辨率** | 64×64（原始 128×128 经过编码器下采样） |
| **嵌入维度** | 128 维 |
| **归一化状态** | 已做 L2 归一化 + vMF 采样，位于单位超球面上 |
| **适用距离** | 余弦距离（1 - cosine_similarity）或欧氏距离 |

### 命名规则

```
patch_{6位编号}_{YYYY-MM}.npy

示例：
  patch_000000_2025-04.npy   → patch 0 在 2025 年 4 月的嵌入
  patch_000123_2025-08.npy   → patch 123 在 2025 年 8 月的嵌入
```

### 文件规模

- **V4 official**：2121 个文件，约 4.2 GB
- **V5 mixed scale**：2121 个文件，约 4.2 GB
- 覆盖约 424 个 patch × 若干个月份（2025 年 4/6/8/9/10 月等）

### 版本差异

| 版本 | 特点 | 推荐场景 |
|------|------|----------|
| **V4 official** | 标准双窗口时序对比训练 | 通用变化检测、基线对比 |
| **V5 mixed scale** | 混合长间隔（≥6 月）与短间隔（1–3 月）时序对比 | 对时间跨度敏感的任务、需要捕捉快慢变化的场景 |

---

## 快速开始：加载嵌入向量

### 单文件加载

```python
import numpy as np

# 加载 V5 版本某个 patch 某个月的嵌入
emb = np.load("embeddings/v5_mixed_scale/monthly_embeddings_2025/patch_000000_2025-04.npy")

print(emb.shape)      # (128, 64, 64)
print(emb.dtype)      # float32
print(emb.min(), emb.max())  # 约 [-1, 1]，已 L2 归一化
```

### 批量加载同一 Patch 的所有月份

```python
import glob
import numpy as np

patch_id = "000000"
pattern = f"embeddings/v5_mixed_scale/monthly_embeddings_2025/patch_{patch_id}_*.npy"
files = sorted(glob.glob(pattern))

# 加载为列表
embs = [np.load(f) for f in files]
months = [f.split("_")[-1].replace(".npy", "") for f in files]

for m, e in zip(months, embs):
    print(f"{m}: {e.shape}")
```

### 构建变化检测数据集

```python
import glob
import numpy as np
import torch
from torch.utils.data import Dataset

class ChangeDetectionEmbeddingDataset(Dataset):
    """基于预计算嵌入向量的变化检测数据集.

    原理：对同一 patch 的两个不同月份嵌入计算距离，距离越大表示变化越显著。
    """
    def __init__(self, embedding_dir, patch_ids=None, month_pairs=None):
        self.embedding_dir = embedding_dir
        self.patch_ids = patch_ids or self._discover_patches()
        self.month_pairs = month_pairs or [("2025-04", "2025-10")]
        self.samples = self._build_samples()

    def _discover_patches(self):
        files = glob.glob(f"{self.embedding_dir}/patch_*_2025-04.npy")
        return sorted([f.split("_")[-2] for f in files])

    def _build_samples(self):
        samples = []
        for pid in self.patch_ids:
            for m1, m2 in self.month_pairs:
                f1 = f"{self.embedding_dir}/patch_{pid}_{m1}.npy"
                f2 = f"{self.embedding_dir}/patch_{pid}_{m2}.npy"
                samples.append((f1, f2, pid, m1, m2))
        return samples

    def __len__(self):
        return len(self.samples)

    def __getitem__(self, idx):
        f1, f2, pid, m1, m2 = self.samples[idx]
        e1 = torch.from_numpy(np.load(f1)).float()  # (128, 64, 64)
        e2 = torch.from_numpy(np.load(f2)).float()  # (128, 64, 64)

        # 计算像素级余弦距离作为变化强度图
        # e1, e2 已 L2 归一化，cosine_distance = 1 - dot_product
        cos_sim = (e1 * e2).sum(dim=0)  # (64, 64)
        change_map = 1.0 - cos_sim       # 值域 [0, 2]，越大变化越显著

        return {
            "patch_id": pid,
            "months": (m1, m2),
            "emb_t1": e1,
            "emb_t2": e2,
            "change_map": change_map,
        }

# 使用示例
dataset = ChangeDetectionEmbeddingDataset(
    embedding_dir="embeddings/v5_mixed_scale/monthly_embeddings_2025",
    month_pairs=[("2025-04", "2025-10"), ("2025-06", "2025-09")],
)
print(f"样本总数: {len(dataset)}")

sample = dataset[0]
print(f"变化图尺寸: {sample['change_map'].shape}")  # (64, 64)
```

### 训练下游分类头

```python
import torch
import torch.nn as nn
import numpy as np
from glob import glob

class EmbeddingConvHead(nn.Module):
    """轻量卷积头，基于嵌入向量做像素级分类."""
    def __init__(self, embed_dim=128, num_classes=11):
        super().__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(embed_dim, 64, 3, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, num_classes, 1),
        )

    def forward(self, emb):
        # emb: (B, 128, 64, 64)
        return self.conv(emb)

# 模拟训练循环
model = EmbeddingConvHead(embed_dim=128, num_classes=11)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()

# 加载一个 batch 的嵌入和对应标签（假设标签从 WorldCover 读取）
emb_batch = torch.stack([
    torch.from_numpy(np.load(f"embeddings/v5_mixed_scale/monthly_embeddings_2025/patch_{i:06d}_2025-04.npy"))
    for i in range(8)
]).float()

# 前向 + 反向（此处仅为演示，实际需配合标签）
logits = model(emb_batch)
print(f"输出 logits 形状: {logits.shape}")  # (8, 11, 64, 64)
```

---

## 下游任务建议

### 1. 变化检测（Change Detection）

**核心思想**：对同一空间位置不同时间的嵌入向量计算距离，距离越大变化概率越高。

**推荐方法**：
- **余弦距离**：`change = 1 - cosine_similarity(emb_t1, emb_t2)`（推荐，因嵌入已 L2 归一化）
- **欧氏距离**：`change = ||emb_t1 - emb_t2||_2`
- **训练下游头**：在冻结嵌入的基础上，训练轻量 U-Net 或 MLP 头做变化分割

**评估基准**：使用 `annotations/` 中的 shapefile 标注计算 ROC-AUC。

### 2. 土地覆盖分类（Land Cover Classification）

**核心思想**：利用嵌入向量的语义信息做像素级分类。

**推荐方法**：
- 加载 `raw_data/worldcover/` 或 `raw_data/dynamic_world/` 作为标签
- 将嵌入向量 `(128, 64, 64)` 上采样或保持原尺寸
- 训练 `Conv2d` 分类头（1×1 或 3×3 卷积）

### 3. 时序分析（Temporal Analysis）

**核心思想**：利用月度嵌入序列捕捉地表演化趋势。

**推荐方法**：
- 对同一 patch 构建时间序列 `[(month, emb)]`
- 应用 1D-CNN、LSTM 或 Transformer 做时序建模
- 检测异常时间点（如突然的建筑施工、植被变化）

---

## 技术细节

### 编码器架构（生成嵌入的模型）

嵌入向量由以下流程生成：

1. **SensorEncoderBank**：分别对 S2、S1、Landsat 编码
2. **STPBlocks**（8 层）：Space-Time-Precision 三路径时空编码
3. **时间条件 Summary Query**：基于窗口边界做注意力池化
4. **VMFBottleneck**：Conv1×1 压缩到 128 维
5. **推理时 L2 归一化 + vMF 采样**：保证嵌入分布在单位超球面上

### 关键设计决策

- **训练时跳过 L2 Norm**：在 pre-norm 空间计算反坍缩损失
- **推理时标准 L2 + vMF**：保证 embedding 在球面上，适合 cosine similarity
- **静态数据仅作目标**：DEM、WorldCover、Dynamic World、JRC Water 不参与编码器输入
- **双窗口增强**：训练时使用不重叠双窗口 + 时序对比损失提升时间敏感性

---

## 引用与致谢

本数据集基于 AlphaEarth Foundations 改进版项目构建。如果您在研究或项目中使用了本数据集，请引用相关论文（待发表）。

**数据使用条款**：
- 本数据集仅供学术研究使用
- 原始遥感数据来源于公开卫星影像（Sentinel-2、Sentinel-1、Landsat）及公开产品（ESA WorldCover、Dynamic World、JRC Water）
- 嵌入向量为模型预计算输出，遵循相同学术使用协议

---

## 联系与反馈

如有问题或建议，欢迎通过 ModelScope 社区或项目仓库提交 Issue。
