SAR2Agri 这类方法要解决的核心问题,不是“用深度学习给农业遥感影像分类”这么简单,而是“如何让模型真正理解 SAR 强度数据”。光学遥感影像的像素值接近人眼感知的地表反射特征,但 SAR 强度图里的数值来自雷达后向散射,受斑点噪声、入射角、地形、土壤湿度和作物结构共同影响。直接把光学影像的分割、分类模型搬过来,经常出现训练集精度高、换一块地就失效的现象。SAR2Agri 这个名字里的 “Learning Intensity Representations” 点出了关键:不是改模型结构,而是先学习一种适合农业监测任务的强度表征。本文围绕这个思路,说明 SAR 强度数据从原始回波到模型输入的完整链路,用一套最小可运行的 PyTorch 示例演示如何构造时序强度表征,并给出数据组织、特征验证、软件衔接和生产部署的实践建议。
农业监测对遥感数据的要求很明确:要在作物生长季内高频、稳定地获取地表信息。光学遥感受云雨影响严重,多雨地区在关键物候期经常拿不到干净影像。SAR 合成孔径雷达主动发射微波,不受光照和大部分天气条件限制,Sentinel-1 这类卫星可以提供 6 到 12 天重复观测的 C 波段双极化数据。这也是 SAR2Agri 这类工作选择 SAR 作为输入的原因。但 SAR 数据不是拿过来就能用,它需要经过原始回波仿真、聚焦、多视、滤波、地形校正等一系列处理,才能成为深度学习模型可以消费的强度图。理解这条链路,是正确设计表征学习流程的前提。
1. 先理解 SAR 强度表征在农业监测中的位置
1.1 从原始回波到强度图像的链路
SAR 卫星记录的不是一张普通照片,而是地面散射体对雷达脉冲的原始回波数据。热词里反复出现的“sar原始回波仿真数据”“sar回波数据集”“一幅图生成sar原始回波数据”,本质上都是在围绕这条链路做文章。原始回波经过距离压缩和方位压缩后,会得到单视复数影像 SLC,每个像素包含幅度和相位信息。多数农业监测任务不直接使用相位,而是取幅度平方得到强度数据,再经过多视处理降低斑点噪声,最后做辐射定标和地形校正,得到后向散射系数图。
在这个链条里,强度图已经是“处理后的产品”,但它仍然不是深度学习的理想输入。原因在于 SAR 强度数据的统计特性与光学影像完全不同。相干成像机制会产生乘性斑点噪声,同一块均质地表在 SAR 图像上的强度值呈大幅波动。农田在 C 波段 VH 极化的后向散射主要来自作物冠层体散射,VV 极化则同时受地表和冠层影响,两个通道的组合本身就包含作物结构信息。SAR2Agri 这类表征学习方法,第一步就是把这些原始强度统计量转换成语义更稳定的特征。
从实践角度看,一般不建议从原始回波开始做农业监测研究。原始回波数据量大、处理链条长,普通研究者很难拿到完整的卫星原始回波数据。常见做法是直接使用经过定标和地形校正的 Sentinel-1 GRD 强度产品,或者使用模拟软件生成的 SAR 回波仿真数据来验证算法在不同极化、不同入射角下的鲁棒性。SAR 回波仿真数据的好处是地面真值完全已知,适合做表征学习的消融实验,但仿真数据与真实数据的分布差异需要额外处理。
1.2 为什么农业监测不能照搬光学影像模型
很多刚接触 SAR 深度学习的开发者,第一个想法是把 RGB 三通道换成 VV、VH、入射角三个通道,然后直接跑语义分割网络。这个做法能跑通,但精度和泛化能力往往不理想。
问题出在几个层面。第一,光学影像像素值大致稳定,同一种地物在不同时间的变化主要体现在光谱反射率上;SAR 强度值却会因为土壤水分、降雨、风、收割活动发生剧烈跳变,单时相强度图几乎无法区分作物类别。第二,SAR 强度图动态范围很大,农田后向散射系数可能从 -25 dB 到 5 dB 之间变化,直接用线性值训练,模型会被少数高亮像素主导。第三,SAR 图像存在固有的斑点噪声,如果不做滤波或设计噪声鲁棒的网络结构,模型学到的是噪声模式而不是作物模式。
所以,SAR2Agri 的核心观点是:在进入像素级分类或回归之前,先做一个强度表征学习步骤。这个步骤可以从时间序列中提取出稳定、可迁移的物候特征,让后续分类器面对的不是原始强度,而是经过学习的高层表示。农业监测里特别适合这种做法,因为作物类型与物候曲线强相关:水稻在移栽期 VH 后向散射明显上升,小麦在抽穗期 VV/VH 比值发生变化。学习强度表征,本质上是让模型自己发现这些物理规律。
1.3 农业监测任务里“表征”到底指什么
表征在农业监测里不是一个抽象概念,它需要能被下游任务验证。通常有三层含义。
第一层是单像素时间序列表征。把每个像素在时间维上的强度变化看作一条曲线,表征学习的目标是压缩这条曲线,保留作物类别和物候阶段最相关的信息。比如一个长度为 40 的 VH 时间序列,可以用一个 64 维向量表示,这个向量再输入分类器判断作物类型。
第二层是空间邻域表征。农田不是孤立像素,作物行向、田埂、灌溉设施都会影响雷达散射。模型需要从空间邻域中提取纹理信息,这通常由卷积或局部注意力完成。
第三层是跨极化表征。VV 和 VH 不是独立通道,两者比值和差值能反映散射机制。一个设计良好的强度表征模块,应该能自动学习两个极化通道之间的组合关系。
SAR2Agri 的方法论核心,就是把这三层表征放在同一个框架里学习,而不是人工设计后向散射指数。人工特征在特定区域有效,换一个农作物体系、换一个地形条件,指数阈值得重新标定。学习表征则通过数据驱动方式适应新场景,这也是它被命名为 “Learning Intensity Representations” 的原因。
2. 环境准备与数据约定:先把实验边界定清楚
2.1 需要的软件、Python 依赖和验证数据
开始写代码之前,先明确环境。我的建议是使用 Python 3.9 以上版本,深度学习框架选择 PyTorch,因为遥感领域开源模型和论文复现代码大多基于 PyTorch。地理栅格读取使用 rasterio,它在处理 tif、投影信息、多波段读取方面比 OpenCV 更适合遥感数据。
下面是一份可用的环境依赖列表,实际项目请先确认版本兼容性:
| 组件 | 推荐版本范围 | 用途 |
|---|---|---|
| Python | 3.9 至 3.11 | 运行环境 |
| PyTorch | 1.13 至 2.2 | 表征学习模型 |
| rasterio | 1.3 以上 | 读取 SAR 强度 GeoTIFF |
| numpy | 1.24 以上 | 数值处理 |
| matplotlib | 3.7 以上 | 可视化验证 |
| scikit-learn | 1.2 以上 | 分类评估、降维可视化 |
| tqdm | 4.65 以上 | 训练进度展示 |
依赖文件可以这样组织:
conda create -n sar2agri python=3.10 conda activate sar2agri conda install -c conda-forge rasterio pip install torch numpy matplotlib scikit-learn tqdm关于数据来源,学习阶段不要一开始就使用几十 G 的大区域影像。SAR2Agri 类方法的核心验证点是“表征是否有效”,不是“模型跑得多快”。建议先准备一个包含 2 到 3 种作物、连续 20 到 30 个时相的 Sentinel-1 GRD 强度数据集,切成小 patch 用于训练。如果暂时没有真实数据,也可以使用 SAR 回波仿真软件生成强度图,但要在文章里说明这是仿真数据,不能直接代表真实分布。
2.2 数据目录结构:时序强度图如何组织
SAR 强度数据通常按时间编号存储。项目目录推荐这样组织:
data/ region_a/ S1A_20230601_VV.tif S1A_20230601_VH.tif S1A_20230613_VV.tif S1A_20230613_VH.tif ... labels/ crop_type.tif split/ train_ids.txt val_ids.txtlabels/crop_type.tif 是类别标签图,每个像素值为整数类别编号。split 文件夹记录训练和验证使用的图幅编号,避免相邻区域泄漏到验证集。这里有一个容易被忽略的点:SAR 影像相邻像素空间高度相关,裁剪 patch 时必须确保同一时间序列的所有 patch 要么全在训练集,要么全在验证集,不能让同一地块的不同 patch 同时出现在训练和验证中。
2.3 标签设计:作物类别和物候阶段
农业监测标签有两种常见形式。一种是分类标签,例如“水稻”“玉米”“大豆”,适合作物制图任务。另一种是物候阶段标签,例如“移栽期”“分蘖期”“抽穗期”,适合做物候监测。
分类标签可以直接作为监督信号。物候标签则更复杂,同一作物在同一个时相反季节不同,最好把“像素-时间”组合作为样本,标签是当前像素在当前时间处于的物候阶段。SAR2Agri 的表征学习可以同时服务于这两种任务:如果是分类任务,表征模块的输出进入分类头;如果是物候估计,学习到的强度表征按时间排序后输入回归头。
设计标签时要注意类别数量不要太多。农业监测常见问题是类别样本极不平衡,某个地块类别占 90%,其他类别总共占 10%。这种情况下,训练时需要使用类别权重或 focal loss,否则模型会退化到“把所有像素预测为多数类”。
3. 构建一个最小 SAR2Agri 风格的强度表征学习流程
3.1 输入设计:空间窗口加时间序列
SAR2Agri 的输入设计需要考虑两个维度:空间维度和时间维度。
空间维度上,农田纹理与作物行向有关,patch 太小时模型看不到纹理结构,patch 太大时边界混合严重。对于 Sentinel-1 GRD 数据,一般 32x32 到 64x64 像素的窗口比较合适,对应地面大约 300 到 600 米范围,足够覆盖一块中小型农田。
时间维度上,把每个 patch 在所有时相的强度图堆叠起来。假设有 N 个时相,每个时相包含 VV 和 VH 两个通道,那么一个样本的形状是 (N, 2, H, W),或者把通道放到前面变成 (2N, H, W)。推荐保留时间维,方便模型利用时间注意力机制。
下面是一个 Dataset 示例,用于按时序读取 patch:
import os import numpy as np import rasterio import torch from torch.utils.data import Dataset class SARTimeSeriesDataset(Dataset): def __init__(self, image_dir, label_path, date_list, patch_size=32, transform=None): self.image_dir = image_dir self.label_path = label_path self.date_list = date_list self.patch_size = patch_size self.transform = transform with rasterio.open(label_path) as src: self.label = src.read(1) self.height = src.height self.width = src.width self.transform_meta = src.transform self.valid_pixels = np.argwhere(self.label > 0) print(f"valid samples: {len(self.valid_pixels)}") def __len__(self): return len(self.valid_pixels) def _read_single_date(self, date_str): vv_path = os.path.join(self.image_dir, f"{date_str}_VV.tif") vh_path = os.path.join(self.image_dir, f"{date_str}_VH.tif") with rasterio.open(vv_path) as src: vv = src.read(1) with rasterio.open(vh_path) as src: vh = src.read(1) return vv, vh def __getitem__(self, idx): cx, cy = self.valid_pixels[idx] half = self.patch_size // 2 y1 = max(0, cy - half) y2 = min(self.width, cy + half) x1 = max(0, cx - half) x2 = min(self.height, cx + half) time_series = [] for date_str in self.date_list: vv, vh = self._read_single_date(date_str) vv_patch = vv[x1:x2, y1:y2] vh_patch = vh[x1:x2, y1:y2] stack = np.stack([vv_patch, vh_patch], axis=0) time_series.append(stack) # shape: (T, C, H, W) sample = np.stack(time_series, axis=0).astype(np.float32) label = self.label[cx, cy] - 1 if self.transform is not None: sample = self.transform(sample) return torch.from_numpy(sample), label这段代码有几个关键点。第一,标签位置使用行优先索引,与 rasterio 读取数组的坐标对应。第二,每个时相单独读取一个文件,会带来大量 IO,实际数据量大时建议先把所有时相读入内存,或者使用内存映射。第三,边界 patch 会被裁剪成不完整尺寸,推荐在初始化时直接过滤掉距离边界小于 half 的像素,避免样本尺寸不一致。
3.2 强度表征模块:从强度序列到隐向量
表征模块的设计目标是输入时间序列强度图,输出一个紧凑的、对下游任务有用的向量。这里给出一个简洁的基线结构:先用二维卷积提取空间特征,再沿时间维做全局平均池化和一维卷积,最后得到表征向量。
import torch.nn as nn class IntensityEncoder(nn.Module): def __init__(self, in_channels=2, feat_dim=64, num_dates=20): super().__init__() self.spatial_conv = nn.Sequential( nn.Conv2d(in_channels, 16, kernel_size=3, padding=1), nn.BatchNorm2d(16), nn.ReLU(inplace=True), nn.Conv2d(16, 32, kernel_size=3, padding=1), nn.BatchNorm2d(32), nn.ReLU(inplace=True), nn.AdaptiveAvgPool2d((1, 1)) ) self.temporal_conv = nn.Sequential( nn.Conv1d(32, 64, kernel_size=3, padding=1), nn.BatchNorm1d(64), nn.ReLU(inplace=True), nn.Conv1d(64, feat_dim, kernel_size=3, padding=1), ) self.num_dates = num_dates def forward(self, x): # x shape: (B, T, C, H, W) b, t, c, h, w = x.shape x = x.view(b * t, c, h, w) spatial_feat = self.spatial_conv(x) # (B*T, 32, 1, 1) spatial_feat = spatial_feat.view(b, t, -1).permute(0, 2, 1) # (B, 32, T) temporal_feat = self.temporal_conv(spatial_feat) # (B, feat_dim, T) representation = temporal_feat.mean(dim=2) # (B, feat_dim) return representation这个编码器把时间和空间分开处理,空间卷积负责提取每个时相的纹理特征,时间卷积负责建模物候变化。它不是一个最先进的结构,但足够作为 SAR2Agri 表征学习的基线。实际研究里可以用 Transformer 的 attention 替换时间卷积,或者使用 3D 卷积同时建模时空关系,但基线版本的可解释性更好,便于后续排查问题。
3.3 监督训练与自监督训练两种模式
SAR2Agri 的表征学习可以在两种模式下运行。
监督模式最简单。在上面的编码器后面接一个线性分类头,用作物类型标签做交叉熵损失:
class SupervisedSAR2Agri(nn.Module): def __init__(self, num_classes, feat_dim=64): super().__init__() self.encoder = IntensityEncoder(in_channels=2, feat_dim=feat_dim) self.classifier = nn.Linear(feat_dim, num_classes) def forward(self, x): rep = self.encoder(x) logits = self.classifier(rep) return logits自监督模式更贴近 SAR2Agri “学习表征”的本意,因为农业标签往往难以获取。常见做法是时间序列对比学习:同一像素在不同时相窗口下的强度序列是正样本对,不同位置或不同作物区域的序列是负样本对。模型学习让正样本的表征靠近、负样本的表征远离。训练完成后,编码器输出的表征可以直接用于聚类或下游分类。
自监督方案在真实项目中更容易落地,因为不需要逐像素标注标签。农业地块类型标注成本很高,需要地面调查和专家解释。使用自监督表征学习,可以先在大范围无标注 SAR 时序数据上预训练编码器,再用少量标注样本微调分类头。这种方法符合 SAR2Agri 的核心理念。
3.4 参数说明:训练超参数和调参方向
表征学习模型的超参数对实验影响很大,下面列出几个关键项:
| 参数 | 常见设置 | 调小的影响 | 调大的影响 |
|---|---|---|---|
| patch_size | 32 | 纹理信息不足 | 边界样本增多,GPU 显存增大 |
| 时间序列长度 | 全季相 | 物候信息不完整 | 输入规模增大,需做时间降采样 |
| 特征维度 feat_dim | 64 | 表征表达能力受限 | 训练参数增多,容易过拟合 |
| 学习率 | 1e-3 至 1e-4 | 收敛慢 | 训练震荡 |
| 批次大小 | 32 至 128 | 梯度不稳定 | 显存不足 |
训练 SAR 模型时要特别注意批次大小对 BatchNorm 的影响。SAR patch 之间差异很大,批次太小时批统计量波动大,推荐批次至少 16 到 32。如果显存受限,优先减小 patch_size,而不是减小 batch_size。
4. 表征质量的验证方法:不能只看分类精度
4.1 下游分类精度评估
训练完成后,第一件事是验证表征在下游任务上的表现。作物分类精度是最直接的指标。用独立的验证集计算总体精度和各类别 F1 分数:
from sklearn.metrics import accuracy_score, f1_score, classification_report all_preds = [] all_labels = [] model.eval() with torch.no_grad(): for x, y in val_loader: logits = model(x) preds = logits.argmax(dim=1).cpu().numpy() all_preds.extend(preds) all_labels.extend(y.cpu().numpy()) acc = accuracy_score(all_labels, all_preds) f1_macro = f1_score(all_labels, all_preds, average='macro') print(f"Accuracy: {acc:.4f}, Macro F1: {f1_macro:.4f}") print(classification_report(all_labels, all_preds))如果 Macro F1 和 Accuracy 差距过大,说明模型只在多数类上表现好。这个指标比单一精度更能反映农业类别不平衡问题。
4.2 特征可视化:从表征向量看物候规律
分类精度高不等于表征有物理意义。SAR2Agri 强调学习强度表征,所以验证阶段还要检查表征是否捕捉到了物候规律。
最简单的方法是取同一像素在真实时序上的表征向量,按时间顺序排列,画出每一维特征的变化曲线。理想情况下,特征曲线在作物生长关键节点会出现明显拐点。因为表征是模型学出来的,不是人工设计的指数,需要人为检查这些曲线是否与已知物候一致。
另一种方法是 t-SNE 可视化。随机采样不同类别的像素,提取表征向量后用 t-SNE 降到二维平面,观察类别是否形成聚类。如果类别完全重叠,说明表征没有学到类别差异,需要检查训练是否收敛、数据是否存在时间错位问题。
4.3 消融实验:证明学习表征比原始强度有效
一个完整的 SAR2Agri 风格实验,必须回答“学习强度表征”到底带来了什么收益。最简单的消融设计如下:
| 实验 | 输入 | 模型 | 说明 |
|---|---|---|---|
| A | 单时相 VV+VH 强度 | 分类器 | 验证单时相基线 |
| B | 全时序 VV+VH 强度 | 分类器 | 验证时序信息的作用 |
| C | 全时序强度 + 学习表征 | 分类器 | 完整 SAR2Agri 流程 |
| D | 去掉时间卷积的编码器 | 分类器 | 验证时间建模的有效性 |
在相同训练设置下,对比这四组实验的精度和 F1。如果 C 组明显优于 B 组,说明表征学习流程有效;如果差异很小,则可能是分类器本身已经足够强大,表征学习没有发挥应有效果,这时需要检查训练损失是否收敛,或者特征维度是否过小。
5. 与现有 SAR 处理软件的工作流衔接
5.1 SNAP 预处理导出强度图
SAR2Agri 方法输入的是强度图,而不是原始回波,所以预处理必须依赖专业 SAR 处理软件。ESA 的 SNAP 是常用的开源选择,支持 Sentinel-1 数据从 SLC 到 GRD 的完整处理链。
对于农业监测,推荐的处理顺序是:轨道校正、热噪声去除、多视、斑噪滤波、辐射定标、地形校正。地形校正很重要,山区农田的局部入射角会影响后向散射强度,如果跳过这一步,模型会把地形效应误学成作物特征。
处理后导出为 GeoTIFF 时,要注意保持分辨率一致。同一时间序列的 VV 和 VH 波段必须重采样到相同网格,避免像素级不对齐。导出时可以直接把 VV 和 VH 写入同一个多波段 tif,或者分别存储但保证地理变换完全相同。SNAP 的 GRD 产品常见分辨率是 10 米,但默认导出可能是浮点后向散射系数,处理时不要丢失投影和分辨率元数据。
5.2 SAR 处理软件与 Python 深度学习的边界
专业 SAR 处理软件负责生成强度产品,Python 深度学习框架负责表征学习。两者边界要清晰。不要让 Python 代码承担地形校正、极化定标这些会引入系统性误差的操作,也不要让 SAR 处理软件承担模型训练。
有一个常见的混合场景是使用 SAR 回波仿真数据来扩增训练集。仿真软件可以生成不同作物结构、不同入射角下的回波数据,再经过处理得到强度图。这种方式可以用来补充标签稀缺的作物类型,但必须注意仿真数据和真实 SAR 数据的分布差异。建议采用域适应策略:先在仿真数据上预训练,再用真实数据微调,而不是直接把仿真数据混入训练集。
注意:仿真数据可以做预训练和规律验证,但不能替代真实数据处理链路的检验。使用仿真数据跑通的方法,换到真实 Sentinel-1 数据后仍然要重新验证。
5.3 原始回波仿真数据在算法研究中的作用
热词中反复出现“sar原始回波仿真数据”“sar回波数据集”“一幅图生成sar原始回波数据”,说明回波仿真在研究中的需求很明确。SAR 原始回波仿真可以从场景几何和电磁散射模型出发,生成指定成像参数下的回波信号。这种方法对研究“处理链路误差如何影响下游表征”很有价值:可以手动控制噪声水平、定标误差,观察表征学习的鲁棒性。
当输入材料没有提供完整实验环境时,写代码时可以使用仿真生成的强度图作为占位数据。但要注意,仿真强度图的噪声分布经过简化,与真实 SLC 聚焦后的强度分布不完全一致。表征学习模型如果只在仿真数据上训练,真实数据上可能失效。稳妥的做法是把仿真数据当作“单元测试”,验证模型结构能跑通、梯度能传播、表征维度合理,再切换真实数据做正式实验。
6. 常见问题与排查链路
6.1 训练损失不下降或精度一直不变
现象:模型训练多轮,损失几乎不下降,或验证精度保持在一个很低的值。
排查顺序:
- 检查输入数据的数值范围。SAR 强度线性值通常很大,建议先做分贝转换:
10 * log10(x + 1e-8),再归一化到 0 到 1 或标准化。 - 检查标签是否从 0 开始。PyTorch 交叉熵损失要求类别编号从 0 开始,如果标签是 1 到 N,会报错或训练异常。
- 检查时间序列是否按时间顺序排列。如果日期列表乱序,时间卷积会学习到错误的时序依赖。
- 检查是否存在大量空值或异常值。Sentinel-1 GRD 影像边缘或海洋区域可能有无效像素,需要在 Dataset 中遮挡或填充。
最常见原因是输入尺度问题。SAR 强度动态范围超过 30 dB,对应线性值可能从 0.001 到 300,如果不做对数变换,梯度会被少数高值像素主导。
6.2 训练集精度高、验证集精度低
现象:训练集精度超过 95%,验证集精度只有 70% 左右。
可能原因有三个。第一,空间数据泄漏:同一地块的 patch 同时出现在训练集和验证集,模型记住了位置而不是作物特征。第二,类别极度不平衡,模型把多数类学得很好,少数类精度很低。第三,特征维度太大,模型没有足够样本约束,过拟合到训练集的噪声模式。
解决方案:
- 在 split 阶段按地块或图幅划分,不要按 patch 随机划分。
- 使用基于类别的加权损失。
- 降低 feat_dim,增加数据增强。
- 在训练时对强度图做小幅噪声扰动,增加对斑点噪声的鲁棒性。
6.3 不同地形区域的特征不一致
现象:模型在平原地区验证精度高,在山区或丘陵地区精度明显下降。
这是因为地形影响局部入射角,同样作物在不同坡向上的后向散射强度差异很大。如果在预处理阶段做了地形校正,这种差异会部分消除,但不会完全消失。表征学习阶段可以采用两种策略:一是把局部入射角作为额外通道输入模型,让模型学习地形因素;二是分区域建模,山区和平原使用不同模型或不同归一化参数。
从 SAR2Agri 的角度看,更好的方案是在输入中加入入射角或地形信息,让表征模块显式区分“作物导致的散射差异”和“地形导致的散射差异”,而不是把两者混在同一个特征空间里。
7. 生产环境注意事项与扩展方向
7.1 大规模推理时的瓦片化处理
研究阶段模型处理的是小 patch,生产环境面临的是大范围影像。一个省份级别的 Sentinel-1 时序强度影像可能达到数千 G 像素,无法一次性放入 GPU 显存。推理时需要按瓦片滑动窗口处理:
- 将整景影像按 512x512 或 1024x1024 的瓦片切分。
- 每个瓦片按时间序列读取同地理范围的 VV/VH 数据。
- 将瓦片输入模型,得到表征或分类结果。
- 拼接结果时去掉边缘 overlap 部分,避免边界伪影。
瓦片之间要有 50 到 100 像素的重叠,用于消除边缘处卷积特征不完整的问题。
7.2 与光学影像和多源数据的融合
SAR 强度表征不排斥光学影像。实际农业监测中,SAR 和光学是互补的:光学影像空间纹理清晰,但云雨天气缺失;SAR 全天候获取,但语义解释困难。一种混合方案是:在 SAR 强度表征学习的同时,训练一个光学影像编码器,两个表征向量在特征空间中对齐。这样在光学影像缺失的时间点,可以用 SAR 表征补全。
如果要做这种融合,需要注意两种数据在时间和空间上的对齐。时间对齐指 SAR 和光学影像日期应尽量接近,避免因为作物生长阶段不匹配导致特征冲突。空间对齐指两种数据必须配准到同一像素网格。操作上建议以 Sentinel-1 强度图为基准,把光学影像重采样到 SAR 网格。
7.3 时间序列缺失与轨道不一致的问题
SAR 卫星有固定重访周期,但不同轨道的入射角不同。同一个地区相邻两条轨道的 VH 强度可能存在系统性差异。生产环境中,如果某一期数据只有单轨道覆盖,另一期只有双轨道覆盖,模型看到的时间序列会混入轨道偏差。
处理方案是在预处理阶段尽量统一覆盖范围。如果数据来自多个轨道,可以把轨道号作为额外标签加入训练。SAR2Agri 的表征学习对这种系统性偏移比较敏感,因为时间卷积会把它当成物候变化。在训练数据中加入不同轨道、不同入射角的样本,是增强表征鲁棒性的有效手段。
7.4 可复用的实践检查清单
在项目发布或实验复现前,可以按以下清单逐项检查:
| 检查项 | 具体标准 |
|---|---|
| 数据尺度 | 强度是否完成分贝转换和归一化 |
| 数据对齐 | VV/VH 是否重采样到同一网格,时相顺序是否正确 |
| 标签编号 | 是否从 0 开始连续编号 |
| 数据划分 | 是否按地块或图幅划分 train/val,避免空间泄漏 |
| 输入通道 | 是否包含入射角、地形等信息,还是只使用原始强度 |
| 验证指标 | 是否同时报告 Accuracy 和 Macro F1 |
| 消融实验 | 是否对比了不加表征学习的基线 |
| 预处理链路 | 是否使用了 SNAP 等软件做定标和地形校正 |
| 仿真数据使用 | 是否明确标注仿真数据只能用于预训练和结构验证 |
| 生产推理 | 是否设计了瓦片化和重叠策略 |
如果要从零开始实践 SAR2Agri 风格的表征学习,最值得投入的三件事是:先把预处理链路跑通并验证影像对齐情况,再设计一个能区分作物类型的时序编码器,最后严格按地块划分数据做消融实验。这三步做扎实之后,无论是换更复杂的模型结构,还是加入光学影像融合,都是在已经稳定的地基上迭代。SAR 强度表征学习的核心难点不是模型容量,而是数据背后的物理规律是否被正确建模,这一点在后续扩展中会越来越明显。