1. 项目概述:PrithVi 到底解决了遥感圈儿的什么痛点
做遥感项目的老朋友应该都有印象,2023 年之前,我们训练一个用于地物分类或者变化检测的深度学习模型,基本路径是“找公开数据集 -> 拿 ImageNet 预训练权重 -> 在自有标注上 Fine-tune”。这套流程放在自然影像上挺顺,可一挪到遥感影像上就各种别扭:ImageNet 里的猫猫狗狗和卫星拍下来的农田、水体、城市建筑,视觉特征差异大到离谱;而且遥感影像动不动就是 512×512 起步、甚至几千乘以几千的大幅面,对模型感受野的要求和自然影像完全不是一个量级。说白了,我们缺的是一个真正“见过世面”的遥感基础模型。
Prithvi 就是奔着这个缺口来的。
Prithvi 的名字取自 NASA 地球信息学领域的一个老梗,Prithvi 在梵语里是“大地之母”的意思,由 NASA 和 IBM 合作推出,是一个专门面向遥感影像的预训练大模型。它不是某一个具体的分类网络,而是像 NLP 界的 BERT、视觉界的 ViT 那样,先在海量无标注遥感影像上做自监督预训练,然后把学到的特征迁移到各种下游任务里。官方放出来的是 1 亿参数级别的 ViT 架构,训练数据用的是 HLS 数据集——也就是 Landsat 和 Sentinel-2 两个卫星星座融合后的地表反射率产品,覆盖全球范围,时间跨度从 2017 年一直攒到 2022 年左右。
这篇博文我打算把这几个问题彻底掰开揉碎:PrithVi 的 Transformer 架构是怎么适配遥感影像的、MAE 掩码预训练在遥感数据上做了哪些改造、时间维度的多帧输入又怎么处理、以及我们实际做下游任务微调时踩过的坑和推荐参数。适合正在做遥感深度学习、又不想从零开始训模型的研究生和工程师参考,也适合第一次听说“遥感基础模型”这个概念、想快速建立起技术框架的读者。
2. PrithVi 的整体架构设计逻辑
2.1 为什么是 ViT 而不是 CNN 来打底
Prithvi 的骨架采用的是标准 Vision Transformer(ViT)结构,第一眼看上去和 2020 年 Dosovitskiy 等人提出的 ViT 没什么区别,但放在遥感场景下,这个选择背后的逻辑并不浅。
传统 CNN 通过卷积核逐层滑动提取特征,核心假设是“局部相邻像素具有高度相关性”。这个假设在自然影像里大体成立,可遥感影像的语义边界往往非常锐利——一条公路、一条河流、一块农田的边缘就是硬切开的。CNN 受限于固定大小的卷积核,如果感受野不够大,高层语义特征就很难同时覆盖大范围的上下文。你当然可以堆叠更多卷积层或者用空洞卷积扩大感受野,但随之而来的参数量和计算量增长,对遥感这种大幅面输入来说并不友好。
ViT 的做法是直接把影像切成固定大小的 patch(比如 16×16 或者 32×32),然后当成 token 序列送入 Transformer 的注意力机制里。每个 patch 都能通过自注意力直接和整幅图的其他任意 patch 建立联系,感受野天然就是全局的。这一点对遥感场景价值极大:一块 30 米分辨率的农田 patch,要判断它到底是耕地还是裸土,往往需要看到周围几公里范围内的水系分布、地形起伏、邻接地物的类型才能下结论。CNN 需要层层堆叠才能获得这种全局视角,ViT 在第一层就具备了。
2.2 多时相输入:PrithVi 对“时间”这个维度的特殊处理
遥感影像和自然影像最大的不同,就是它天然带有时间维度。同一块地,四月种水稻、七月泡水、十月收割,光谱特征完全不同;同一片城区,不同季节的植被覆盖度、建筑物阴影方向也在变。如果模型只吃单帧影像,等于把最宝贵的时间信息直接扔掉了。
PrithVi 的输入设计充分考虑了这一点。它在进行 MAE 预训练时,支持输入多帧同一地理位置、不同时间点的影像,一般选 3 到 6 帧。每一帧都切分成 patch token,然后在 token 序列中引入时间编码——也就是说,同一位置的 patch 在不同时间点的特征,会被模型显式地关联起来。官方实现里用的是可学习的时间位置编码,辅助 Transformer 区分当前处理的 patch 究竟来自哪一帧,这样后续的注意力计算既能感知空间上的邻接关系,也能感知时间上的先后关系。
这个设计和纯粹的单帧 ViT 相比,最大的提升在于:模型在学习地表特征时,不再只看静态的光谱反射率“快照”,而是能捕捉地表覆盖类型随季节、物候、气象条件变化的内在规律。预训练阶段学到这种动态规律后,下游在做作物分类、洪水监测、植被物候分析这些时间敏感性很强的任务时,需要的标注样本量可以肉眼可见地降下来。
2.3 参数规模与训练数据的“性价比”考量
PrithVi 官方放出的预训练权重,参数量在 1 亿级别,也就是 100M 左右。和 NLP 领域动辄几千亿参数的 GPT 相比,这个体量在视觉遥感领域其实是一个刻意收敛的选择。
为什么不能盲目上大模型?遥感影像本身的数据量和自然影像差距悬殊。ImageNet 有超过 1400 万张标注影像,而全球范围内公开、且经过辐射定标和几何校正的高质量遥感影像,虽然原始数据量很大,但真正干净、可用、无云遮挡的张数远没有想象的那么多。更重要的是,遥感预训练采用自监督方式,需要模型从无标注数据里自动学习到有物理意义的光谱和空间特征,参数规模过大而数据不够的话,预训练过程极易过拟合在少数地区或者少数季节的影像特征上,迁移到全球其他区域时表现一落千丈。
在实际使用中,100M 参数量的 ViT 也有一个非常现实的优点:显存友好。我们团队在单张 24GB 的 RTX 3090 上,输入 224×224 的 6 波段影像、批量大小设为 16,训练吞吐量依然可观。对比动辄需要多卡并行才能跑起来的更大体量视觉模型,这个规模对高校实验室和中小团队相当友好。
3. 核心机制解析:MAE 掩码自编码器在遥感数据里怎么玩
3.1 掩码自编码器的基本原理
PrithVi 预训练采用的核心方法是 Masked Autoencoder,也就是掩码自编码器,简称 MAE。这个思路最早由何恺明团队在 2021 年底提出,原本是给自然影像设计的一种自监督方法,PrithVi 把它引入遥感领域并做了一系列关键改造。
MAE 的原理用大白话讲是这样的:把所有输入影像的 patch token 随机遮掉一部分,比如遮掉 75%,然后让模型根据剩余的可见 patch 去重建那些被遮住的 patch。注意,模型看到的不是被遮patch的真实像素值,它需要通过“想象”来补全它们。为了把这件事做好,模型必须深刻理解地物的空间结构和光谱规律——知道一片区域是农田,就能推测出旁边被遮住的大概率还是农田;知道现在是洪水期,就能推断被遮住的低洼地带很可能被水覆盖了。
这里有一个关键设计细节:MAE 并不是让 Transformer 编码器把重建任务直接做出来,而是通过一个轻量级的解码器完成。编码器只处理可见的 patch,不参与对被遮 patch 的重建计算,这样可以大幅节省计算量——因为可见 patch 只占全部 patch 的一小部分(比如 25%),编码器的计算量就降到了原来的四分之一左右。解码器再统一把可见 patch 的编码结果和被遮 patch 的占位符拼接起来,做最后的像素重建。整个预训练完成后,解码器被丢弃,只保留编码器部分作为下游任务的特征提取器。
3.2 PrithVi 在掩码策略上的遥感化改造
如果直接把自然影像的 MAE 方案搬到遥感数据上,会遇到一个明显的适配问题:自然影像的三个波段(红、绿、蓝)基本覆盖了人眼感知的全部信息,而遥感影像常用的是多光谱波段组合。PrithVi 官方训练时输入了 6 个波段,具体包括可见光的红光、绿光、蓝光,以及近红外和两个短波红外波段。
多波段带来了一个影响:不同波段的信息量分布极不均匀。以水体识别为例,近红外波段对水体的吸收特性最敏感,而蓝光波段在浅水区域的表现又不同;对于植被,红光和近红外的比值变化能精确反映叶绿素含量。如果掩码策略对每个波段一视同仁地随机遮蔽,模型在重建时容易过度依赖某些信息量大的波段,而忽略其余波段的结构特征。PrithVi 的应对策略是在随机掩码时充分打乱空间位置的映射关系,让模型无法通过简单的波段插值来“蒙混过关”,必须真正学到跨波段的联合光谱特征。
这里面有个实操细节值得注意:PrithVi 的预训练输入虽然包含多光谱波段,但在位置编码的组织上仍然遵循了自然影像 MAE 的惯例——同一空间位置的各波段 patch 共享同一套 position embedding。这个选择的合理性在于,地面同一位置在不同波段的成像物理过程是同时发生的,它们的空间关系是一致的,共享位置编码相当于让模型天然地学会了“对齐”多波段观测,而不是把它们当成独立的图像去处理。
3.3 掩码比例的确定与重建目标
MAE 预训练中掩码比例是一个极其重要的超参数。何恺明团队在自然影像上的实验表明,75% 的掩码比例效果最好。原理在于掩码比例越高,模型从可见 patch 中推测缺失信息的难度越大,被迫学到更有迁移性的高级语义特征;但如果掩码比例过高,比如超过 85%,重建任务就变得过于困难,模型学到的大多是短程插值规律而不是真正的空间语义关系。
PrithVi 在遥感数据的实验中发现,考虑到遥感影像的空间分辨率多样、地表覆盖类型复杂,最优掩码比例虽然也在 75% 到 85% 这个区间附近,但官方权重采用的具体比例需要结合下游任务来做验证。不同空间分辨率的影像对掩码比例的敏感度不同:高分辨率影像中地物细节丰富,小比例掩码也能学到清晰的纹理特征;低分辨率影像中一个 patch 往往包含多种地物,掩码比例太低反而会让模型只关注局部特征而忽略长距离的空间依赖。
从实际使用效果来看,我们保留预训练默认的掩码比例基本不会出大问题。真正需要自定义掩码策略的场景是,你手头有非常规的波段组合,比如添加了 SAR 雷达数据或者热红外波段,此时建议先在小规模下游任务上做一次比例扫描,范围从 60% 到 85%,观察验证集指标的变化趋势再确定。
4. 微调实操:把 PrithVi 用到自己的遥感任务上
4.1 下游任务的适配范式
预训练只是第一步,我们要真正解决自己的应用问题,还得做微调。PrithVi 和几乎所有 ViT 架构大模型一样,支持两种主流的迁移学习范式:线性探测和全参数微调。
线性探测是说固定住预训练编码器的全部权重,只在最后接一层简单的分类头或者回归头,只训练这层头。这种方式适合标注样本非常少的情况,比如你手里只有几百个标注样本,而你想做的地物分类还特别细。因为预训练编码器本身已经对光谱和空间特征具备很强的感知能力,线性层只需要学到“如何把高维特征映射到自己的类别空间”。
全参数微调则是把预训练权重作为初始化,让所有层级的参数都参与训练。这种方式适合标注数据相对充足——比如几千甚至几万个样本的任务——且目标域与预训练数据分布差异较大的情况。在遥感领域,一个典型的应用就是洪水分割:预训练数据里的水体光谱特征和洪涝灾害中的浑浊水体差异很大,全参数微调能让模型更好地适应这个新分布。
PrithVi 官方论文里提到了它在多个任务上的微调实现,包括洪水分割、火灾疤痕检测、多标签分类等。所有这些任务的微调模式有一个共性:输入影像需要被裁剪成固定大小,并且在送入网络前做标准化处理——归一化的均值和标准差需要根据你自己的训练集重新统计,而不能直接套用预训练时的统计量,因为不同传感器的辐射定标参数不一样。
4.2 数据准备与预处理的关键环节
使用 PrithVi 微调的第一步,是把自己的数据格式转换成模型期望的样子。官方模型的输入尺寸一般是 224×224 像素,波段数固定为 6。如果你的原始影像是四波段(RGB + 近红外),需要决定如何生成另外两个短波红外波段的通道。
这里有一个我在实际操作中积累的重要经验:如果源数据缺少某些波段,千万不要用零填充来凑数。零填充会让模型在推理时接收到的输入分布和预训练时严重不一致。更靠谱的做法是利用现有波段的组合来拟合缺失波段,比如用近红外波段做一些数学变换生成近似短波红外的特征,或者干脆微调时把输入层替换成自己波段数量的版本,只初始化共享部分权重。后者的效果通常更好,代价是需要一点重新训练输入映射层的成本。
在时间维度的处理上,如果你做的是动态监测类任务,需要准备同一地理位置的多帧影像。PrithVi 官方预训练支持的是任意帧数的输入,但微调时最好固定为一个数值,比如 3 帧或 4 帧。如果目标场景的物候变化周期特别长,例如一年一熟农业区的作物生长监测,推荐帧数取 4 到 6 帧,尽量覆盖不同的物候阶段,模型才能真正学到变化模式。
4.3 微调超参数与训练策略参考
下面我把团队在实际微调中使用过、且效果比较稳定的一组超参数列在表格里,供大家参考。这些参数是基于 3 帧输入、224×224 尺寸遥感影像、单卡 24GB 显存的配置调试出来的,大家可以按自己的硬件和任务类型做微调。
| 超参数 | 推荐取值范围 | 我实际使用的值 | 说明 |
|---|---|---|---|
| 优化器 | AdamW | AdamW | 相比 Adam,权重衰减更稳定 |
| 基础学习率 | 5e-5 到 5e-4 | 1e-4 | 全参数微调时建议取小值 |
| 权重衰减 | 0.05 到 0.2 | 0.05 | 防止小数据集上过拟合 |
| 批量大小 | 4 到 16 | 8 | 取决于显存,小批量配小学习率 |
| 训练轮数 | 20 到 50 | 30 | 轮数太早停止会欠拟合 |
| 学习率调度 | 余弦退火 | 余弦退火 | 比阶梯下降更平滑 |
| 预热轮数 | 1 到 3 | 2 | 避免早期振荡 |
在实际训练中,我发现有两个超参数对最终精度影响最大。第一个是学习率。ViT 架构对学习率的敏感度远高于 CNN,如果直接用 ImageNet 训练 CNN 时惯用的 1e-3 量级学习率,损失曲线前期很容易爆掉。第二个是批量大小,它会直接影响 BatchNorm 的统计量(如果模型里用了 LayerNorm 则影响稍弱,但批量太小训练不稳定,批量太大显存扛不住)。
还有一个经验分享:我建议微调完成后,无论如何都抽出一小块标注数据做一次线性探测对比。如果线性探测的精度已经和全参数微调相差无几,说明你的任务和预训练特征高度一致,微调的价值主要在于学细节;如果线性探测精度明显偏低而全参数微调很高,说明预训练特征的基础能力还不够,全参数微调的收益更大。这个对比能帮你判断当前任务的难点到底在特征层面还是在分类器层面。
5. 常见问题与排查技巧实录
5.1 训练无法收敛或者收敛奇慢怎么办
这是我用 PrithVi 微调时遇到最多的问题,没有之一。模型的损失前期降得还行,但到某一步就进入平台期甚至反弹,训练结束后验证集的指标一塌糊涂。
排查看三个地方。第一,确认输入数据的归一化参数到底用的是谁的。我见过有同行直接使用官方 demo 里的均值和标准差去处理自己的 Landsat 影像,结果误差被放大得离谱。预训练数据集是 HLS 联合产品,虽然以 Landsat 和 Sentinel-2 为基础,但融合产品的数值范围经过特定处理,如果你的原始影像只是做过简单的辐射定标而没有做地表反射率反演,光谱分布差异是客观存在的。务必用自己的波段统计量重新计算归一化参数。
第二,检查是否有“死区光谱”混进训练集。遥感影像和自然影像最大的差异在于,云、云阴影、雪、传感器坏道等会造成大量异常像元。这些区域的光谱反射率特征和正常地物完全不同,模型如果频繁碰到它们,注意力机制很容易被带偏,学到一些奇怪的关联。训练前务必做好质量筛选,把含云量超过一定比例的影像剔除掉,或者做掩膜处理。
第三,多时相输入的帧间配准问题。如果你的多帧影像来自不同日期甚至不同传感器,必须确保它们在像素级别是对齐的。哪怕是几个像素的偏移,Transformer 的 patch 化处理也会放大这种误差,导致同一个空间位置在不同帧里对应了完全不同的地物。这个问题在目视检查时往往很难发现,最好用像素级的互相关指标做一次全自动的配准质量评估。
5.2 输入尺寸与 patch 调整的坑
PrithVi 预训练时使用的 patch size 一般是 16×16 或 32×32,输入图像如果调整到 224×224,就分别对应 14×14 或 7×7 的 patch 网格。很多初学者把自己的高分影像随便裁剪成 224×224 就送进网络,结果发现推理效果比预期差得多,原因往往在于裁剪时丢失了关键地物的完整结构。
我自己踩过的坑是:720×720 的城市高分影像包含一整片住宅区,直接缩放到 224×224 后,道路和建筑的边缘特征严重退化,分类精度掉了接近 10 个百分点。后来改成用滑动窗口裁切子图再推理,每个窗口 224×224,重叠率设 50%,最后把预测结果拼回去,效果提升非常明显。
PrithVi 官方权重里 patch size 是固定死的,但不代表你不能单独修改。如果你的输入影像分辨率特别高,比如 0.5 米分辨率的航拍影像,每 16×16 像素的区域可能只覆盖一个屋顶的局部,这样的 patch 语义粒度太细,模型很难提取有效特征。这时可以考虑把 patch size 放大到 32×32 或者 64×64,但注意这会让预训练的位置编码和模型参数量变化,通常需要在目标数据上做二次预训练来适应。
5.3 地表覆盖类别不平衡的应对
遥感场景里类别不平衡是常态。比如做城市地物分类,建筑物和道路类别在影像里占比很高,而水系、裸土往往只占很小比例。如果直接做像素级分类微调,模型大概率会牺牲小众类别去换取整体准确率,这是所有基于交叉熵训练的模型都存在的通病。
我们实践中比较有效的办法有两类。第一类是在损失函数层面做调整,比如使用带类别权重的交叉熵损失,权重值可以设为各类别样本数量的反比。第二类是在训练策略层面做调整,比如对小众类别做在线难例挖掘,每轮训练时额外补充一些小众类别样本的裁剪区域。这两类方法可以叠加使用,效果一般能从少数类别的 F1 分数上看到明显提升。
还有一个容易被忽视的细节:多时相数据中输入帧数量的选择,也会影响类别平衡。例如洪水监测中,洪水发生前、中、后的影像里水体覆盖范围差异极大,如果洪水期影像中水体占比过高而平水期占比很少,模型容易认为水体就是影像里的主导地物。建议在采样训练样本时,尽量让每个时相的数据量保持相对均衡。
5.4 硬编码数据增强与推理时一致性问题
遥感影像的数据增强策略和自然影像有一个明显区别:很多所谓的“标准增强”操作在遥感场景下是危险的。比如随机旋转 90 度还好,但任意角度的旋转会让地物的方向信息丢失——建筑物、道路网、农田走向都有明确的方向属性;随机裁剪如果处理不当,会把地物截断,让模型学到残缺特征。
另一个特别容易忽略的问题来自推理阶段。许多人的训练阶段做了随机翻转、随机裁剪等增强,但推理阶段把影像缩放到固定尺寸后忘了调整预处理的插值方式。训练时用的是双线性插值,推理时却因为代码习惯用了最近邻插值,这会导致模型输入的一致性和地址编码错位,精度下降还浑然不知。建议训练和推理统一采用同一套预处理管线,包括插值方式、归一化参数和通道顺序。
这个问题的排查方法很简单:挑一张验证集里的影像,分别用训练流程和推理流程各做一次预处理,对比像素级差异,确认是否完全一致。这个小动作能省掉好几次无谓的调参。
6. 生态价值与后续扩展方向
PrithVi 的价值并不限于它自己的权重,更在于它推动了遥感基础模型这个方向的生态发展。NASA 和 IBM 合作发布时就把模型权重和微调代码开源在 Hugging Face 平台上,遥感从业者可以直接拉起推理,不必重复造轮子。这之后,越来越多的团队尝试把 SAR 数据、高光谱数据、甚至气象数据纳入类似的预训练框架,PrithVi 的 MAE 改造思路和数据组织方式被大量引用。
从实战角度说,PrithVi 这类基础模型要想在项目里真正发挥作用,选型阶段就要想清楚自己的数据和任务属性:如果你做的是多时相动态监测类任务,PrithVi 的时间维度能力值得重点利用;如果只做单帧分类或目标检测,也可以先看看其他团队的遥感变体模型,比如基于 Swin Transformer 或者 DINOv2 微调出来的遥感版本,再做横向对比。
我个人非常看好的一个扩展方向是把 PrithVi 的时间建模能力用到时序数据插补上。很多遥感应用场景因为云雨天气导致观测时间不连续,传统的插值方法对复杂地表过程的效果很差。如果利用预训练模型学习到的时间动态规律,对被云遮挡区域做基于上下文的重建,可能比传统的时空插值精准得多,这是遥感基础模型从“感知”走向“认知”的一个典型案例。
现在回看我们做遥感深度学习这几年的变化,从手动设计特征到 CNN,从 CNN 到 ViT 大模型,本质上是在把越来越强的先验知识自动灌输给模型。PrithVi 把自然语言处理和视觉大模型领域验证过的方法论成功迁移到遥感领域,并且给出了开源可复现的完整方案,对工程界的参考价值是实打实的。用这个思路去搭建自己的遥感大模型流程,减少从零训练的成本,比纠结于某一次任务里的几个精度点更有意义。