遇见数据集

玄女底座嵌入数据集

收藏
魔搭社区2026-07-01 更新2026-07-15 收录
官方服务:

资源简介:

# 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。

提供机构:
maas
创建时间:
2026-04-28
二维码
社区交流群
二维码
科研交流群
商业服务