
简介遥感影像中的云层遮挡严重干扰地表信息识别这篇学术论文面向该问题提出并验证了一种基于深度学习的多角度云检测方法。传统方法往往仅利用多光谱、多通道信息该方法则进一步引入多角度特征研究以编解码卷积网络为骨干网络针对多角度信息设计了专门的特征提取流程利用大量遥感影像和POLDER传感器获取的多角度反射率数据对模型进行训练与测试最终达到91.39%的全局精度和83.99%的平均重叠率并通过对比实验解释了单角度云检测的局限性证实多角度信息可有效提升检测精度。内容预览显示该文刊发于《大气与环境光学学报》包含中英文摘要、引言、网络设计、实验设置、结果讨论等完整章节有助于系统掌握研究脉络与可复现细节。整个资源包内仅含1个PDF文档压缩后大小6.74MB已有148人学习下载适合从事遥感数据处理、深度学习模型研究的研究人员与研究生也可作为云检测方向技术调研与论文写作的参考文献和专业指导资料。1. 多角度遥感影像云检测为什么深度学习能解决视角盲区多角度遥感影像通过不同观测天顶角在同一时刻或短时间内对同一区域进行多次拍摄MISR、三线阵相机以及商业多角度传感器都属于这类设备。云检测是遥感影像预处理的第一道关卡但在单视影像里云与冰雪、盐碱地、高亮建筑在可见光波段高度混淆误检和漏检率一直压不下来。引入多角度观测之后云层在不同视角下表现出明显的视差和纹理变化这部分信息是单视角无法获取的。这样一种问题正适合用深度学习做特征提取。常规做法是把多角度影像作为多通道或多分支输入用深度卷积网络端到端学习云的语义特征。后面章节围绕这条技术路线展开覆盖任务建模、影像预处理、模型结构、训练配置和精度验证目标是让读者能独立实现一个可用的多角度云检测系统。2. 云检测任务建模从逐像素分类到多视角特征融合2.1 任务本质与评价指标设定云检测在遥感处理链路里通常被定义为逐像素语义分割问题每个像素独立预测为「云」或「非云」。一些生产级系统会进一步细分厚云、薄云和云影但多角度场景下的主流做法是先解决二分类再基于二值掩膜做类别细化。原因在于多角度影像的标注成本高逐像素的精细标注本身就稀缺二分类能在有限样本下把模型先训练稳定。评价指标要按像素级和影像级分开看。像素级常用指标是准确率Accuracy、精确率Precision、召回率Recall和 F1 分数。云检测任务里非云像素占比往往超过 80%准确率会被大量「非云预测对」的样本撑高。一块 1024x1024 的影像里云只占 15%一个把全部像素预测为非云的模型 Accuracy 有 85%但 IoU 是 0显然不能说明检测能力。生产上更看重 IoU 和 F1前者评估区域重合度后者均衡精确率和召回率。多角度场景还有一个特殊指标是「跨视角一致性」同一地面目标在不同角度下的检测结果应当保持稳定。如果模型在一个视角里检出云、另一个视角里检不出通常说明该区域特征在某个角度下被遮挡或亮度极端或者模型在视角融合时没有学到可靠的互补关系。这类样本建议单独收集作为后续难例挖掘的输入。2.1.1 指标计算的参考代码import numpy as np from sklearn.metrics import confusion_matrix def cloud_metrics(y_true, y_pred): # y_true / y_pred: 展平后的一维二值数组1 表示云 cm confusion_matrix(y_true, y_pred, labels[0, 1]) tn, fp, fn, tp cm.ravel() iou tp / (tp fp fn 1e-6) f1 2 * tp / (2 * tp fp fn 1e-6) precision tp / (tp fp 1e-6) recall tp / (tp fn 1e-6) return {IoU: iou, F1: f1, Precision: precision, Recall: recall}这段代码把预测结果和二值标签展平后计算混淆矩阵再用 TP、FP、FN 推算四个指标。1e-6的加项是为了防止分母为零遥感大图里可能一整块区域都没有云分割数组全是 0此时纯 numpy 计算会报除零警告。工程上建议把这段指标计算放进一个独立模块训练循环每轮验证结束都调用输出到日志里与上一次实验对比。2.2 基线模型选型UNet 还是 DeepLabV3云检测属于密集预测任务主流基线是 UNet 和 DeepLabV3。UNet 的编码器-解码器结构配合跳跃连接在保持空间细节上有天然优势适合云的边缘提取DeepLabV3 使用空洞卷积扩大感受野对大片厚云的内部一致性更好。选型经验是薄云边缘多、尺度变化大优先考虑 UNet厚云连片、边界模糊考虑 DeepLabV3 或在其解码端加入注意力机制。遥感领域近几年还有一种常见做法是在 UNet 的中间层插入坐标注意力Coordinate Attention模块。云的分布虽然与地理位置无强关联但方向性的特征对薄云纹理和破碎云边缘更敏感坐标注意力能把这种方向感知能力引入特征提取过程。相比直接替换整个骨干网络插入模块的改动风险更小也更容易在已有框架里实验。多角度场景下还需要把基线结构扩展成多分支输入。将同一地物的五个视角影像分别送入共享权重的编码器分支再在特征层融合这种设计比直接拼接通道能保留每个视角的独立特征。共享权重也意味着模型参数不会随着视角数量线性增长对于多角度数据量不大的现实情况这是控制过拟合的关键。2.3 特征融合的两种实现方式多角度信息的融合在模型层面有两大分支。早期融合把多个角度的影像在通道维度直接拼接模型的输入通道数变为 C x NN 是视角数量。这种方案实现最简单对显存也更友好但网络必须自己学会对准不同视角的空间位置关系。在训练数据不足时模型容易把注意力放在个别视角的强特征上忽略其他视角的补充信息。特征级融合是另一种主流做法每个角度过独立的编码器在某一固定层输出特征图然后用拼接、逐元素相加或注意力机制融合。逐元素相加的实现门槛最低但前提是不同视角的特征已经处于同一空间尺度因此几何配准和重采样必须做扎实否则融合后会出现重影。注意力融合则对每个空间位置自动学习不同视角的权重表达能力更强代价是额外的参数和显存开销。class MultiViewEncoder(nn.Module): def __init__(self, base_encoder, feat_dim256, num_views5): super().__init__() self.encoder base_encoder self.fusion nn.Sequential( nn.Conv2d(feat_dim * num_views, feat_dim, kernel_size1), nn.BatchNorm2d(feat_dim), nn.ReLU(inplaceTrue) ) def forward(self, views): # views: list[Tensor]每个元素形状 (B, 3, H, W) feats [self.encoder(v) for v in views] fused torch.cat(feats, dim1) # (B, feat_dim * num_views, H, W) return self.fusion(fused)上面的MultiViewEncoder是最简特征级融合实现。每个视角独立过同一个base_encoder在通道维度拼接后用 1x1 卷积压缩通道并做非线性变换。1x1 卷积在这里负责跨视角信息交互理论上每个输出通道可以学到不同视角特征的加权组合。base_encoder可以是 UNet 的编码部分也可以换成 ResNet 或 EfficientNetfeat_dim对应编码器输出通道数。提示训练时如果发现融合层的梯度明显大于编码器可以给 1x1 卷积单独设更低的学习率或者把BatchNorm2d换成LayerNorm能让多分支训练更稳定。3. 多角度影像预处理配准、增强与数据集划分3.1 辐射归一化与几何配准多角度影像的预处理有两个硬性要求辐射一致性和几何一致性。辐射一致性指不同视角的影像在亮度、对比度上要统一。多角度传感器通常在获取时已完成辐射定标但业务化应用中拿到的数据可能来自不同时相、不同传感器这时候要做直方图匹配或相对辐射归一化。否则模型会把角度差异误当成光谱差异在融合时产生虚假特征。几何配准更关键。多角度影像获取时卫星姿态和地形起伏会导致同一地物在不同视角影像上的位置偏移不做配准的话像素级融合就没有意义。常规流程是先用 SIFT 或 ORB 提取特征点再用 RANSAC 估计单应矩阵进行重采样把各视角影像统一到某一个参考视角的网格上。云层高度较高时运动视差会导致云体本身在不同视角间的位移比地面地物更大这种情况可以先用粗略云检测把云区域掩膜掉在地面区域上做配准。gdalwarp -t_srs EPSG:32650 -r bilinear -tr 10 10 \ view_angle_00.tif view_angle_26.tif \ -overwrite aligned_stack.tifGDAL 的gdalwarp完成重投影和重采样。-t_srs指定目标坐标系-tr设置输出分辨率-r bilinear选择双线性插值。双线性插值对薄云边缘的影响在可接受范围内三次卷积更平滑但计算开销高最近邻会保留原始值但容易产生锯齿。在业务化批处理里我一般会把这一步写进预处理流程的固定脚本而不是在训练脚本里临时调用。3.2 多视角同步的数据增强多角度影像的数据增强与普通遥感影像最大的不同是增强操作必须对同一地物的所有视角施加完全一致的变换。如果只对其中一个视角做随机翻转或旋转会破坏多角度影像之间的几何对应关系模型接收到的输入在地理意义上不再一致。def sync_transform(images, mask, angle, flip): # images: 多个视角影像的列表mask: 云掩膜 # 示意实现实际可用 albumentations 的 ReplayCompose 完成 rotated [rotate(img, angle) for img in images] rotated_mask rotate(mask, angle) if flip: rotated [flip_lr(img) for img in rotated] rotated_mask flip_lr(rotated_mask) return rotated, rotated_masksync_transform把同一个角度和翻转标志应用到全部视角和标签上保证增强后的多视角影像仍然满足几何对应关系。工程上用 albumentations 的ReplayCompose可以实现同样的效果它会记录随机参数并同步重放到多张图上。常用的增强包括随机旋转 0 到 360 度、随机翻转、亮度扰动和尺度缩放。尺度缩放必须放在配准之后做且所有视角的缩放因子保持一致避免在输入阶段引入新的视角错位。3.3 数据集划分策略与标注注意点多角度数据的标注比单视角影像更贵。常见做法是先选一个中心视角做精细标注再用配准关系把标签映射到其他视角。映射后的标签必须人工抽检因为在云边界和地形起伏区域配准误差会被放大标注的云边缘错位会直接误导模型学习。数据划分时要按「场景」划分而不是按「像素」或「图块」随意混分。同一块区域的多角度观测如果同时出现在训练集和验证集里指标会虚高。原因是模型已经见过该区域的整体特征验证时只是换了个角度本质上属于记忆测试而非泛化测试。合理做法是把同一地理区域的所有多角度观测视为一个整体整体划分到训练、验证或测试集。划分策略典型场景主要风险随机像素划分快速调参数据泄漏验证指标虚高按地理场景划分正式实验场景间地物类别不平衡按时间划分泛化能力测试季节和光照差异大模型掉点明显这张表列了三种常见划分方式。随机像素划分只在模型调试阶段用用在正式实验会把结果吹得很高按场景划分是最常用的按时间划分适合检验模型在不同季节、不同光照条件下的稳定性多角度数据如果覆盖多个季度建议专门留一段时间段做外部测试。4. 训练配置与多角度调参实践4.1 损失函数加权交叉熵配合 Dice 损失云检测的标签存在明显的类别不平衡。一片影像中云通常只占 10% 到 30%直接使用交叉熵会让模型倾向于把所有像素预测为非云。加权交叉熵是第一个手段给云类像素更高的权重权重设置通常根据训练集正负样本比例估算。Dice 损失直接优化区域重叠度对小目标和边界不规则目标更友好但单独使用时在训练初期梯度不稳定。实际训练中常用的还是组合损失。多角度模型由于融合分支的存在参数更新路径比单视角长纯 Dice 损失很容易在前期震荡交叉熵梯度形状更平稳两者按固定权重组合能兼顾收敛速度和边界质量。损失曲线里如果再叠加一个验证集 IoU 的监控基本可以判断组合权重是否合适。class SegLoss(nn.Module): def __init__(self, alpha0.5, num_classes2, pos_weight3.0): super().__init__() self.alpha alpha self.ce nn.CrossEntropyLoss(weighttorch.tensor([1.0, pos_weight])) def forward(self, logits, target): ce self.ce(logits, target) probs torch.softmax(logits, dim1) # 取云类概率计算 Dice intersection (probs[:, 1] * (target 1).float()).sum() dice 1 - (2 * intersection 1e-6) / ( probs[:, 1].sum() (target 1).float().sum() 1e-6 ) return self.alpha * dice (1 - self.alpha) * cealpha控制 Dice 和交叉熵的比例工程上常用 0.5 起调。pos_weight是交叉熵中云类的样本权重按训练集统计的正负样本比设置遥感大场景里一般落在 2 到 5 之间。代码里的 Dice 计算直接作用于 softmax 后云类的概率图配合(target 1)的二值掩膜求交集简洁但显存开销略大适合单卡小 batch 实验。4.2 epoch、batch size 与学习率设定多角度遥感影像的显存消耗比单视角大得多。输入 1024x1024 影像时单视角已经接近单卡训练上限多分支结构等于在同样的空间分辨率下乘以视角数量。常见 batch size 只能取 2 到 8学习率和 batch size 必须联动调整。经验准则是 batch size 每翻一倍学习率按 1.5 到 2 倍上调batch size 为 4 时 Adam 学习率从 1e-4 起步batch size 为 8 时可以尝试 2e-4。epoch 数量不宜过大。遥感分割任务在 60 到 100 轮之间收敛多角度数据因为要学视角一致性收敛会更慢往往要加 20 到 30 轮才能看到验证集 IoU 平台期。训练过程应该监控每个 epoch 的验证 IoU 和损失而不只是看最终结果。如果验证损失出现平台期超过 15 轮优先检查学习率是否已经降得太低以及数据增强是否过强导致模型一直没拟合。optimizer torch.optim.AdamW(model.parameters(), lr2e-4, weight_decay1e-5) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max80)AdamW 的权重衰减实现比 Adam 规范适合分割模型。CosineAnnealing 让学习率按余弦曲线降到接近 0训练中后期收敛更加平滑。T_max80表示 80 个 epoch 完成一个完整下降周期多角度任务如果 epoch 数设到 120可以相应调整 T_max 为 120 或加入 warm restarts。4.3 多角度训练中的显存控制与正则化训练多角度模型的显存压力来自三个地方多视角输入、特征拼接和多尺度训练。一个直接的做法是只在编码器最后的 1/4、1/8 尺度做特征融合更深层次的特征本身具有更大的感受野对视角错位的容忍度更高。在浅层融合反而会放大配准残差对薄云边缘没有帮助。另一个工程技巧是随机视角丢弃。实际业务中某些区域可能只有 4 个视角另一些区域有 6 到 7 个视角模型不能假设输入视角数量固定。训练时随机丢弃部分视角让网络学会在视角缺失时仍然输出可靠结果。这种随机性本质上是一种正则化也避免了模型对某一特定视角的过度依赖。多角度模型在小 batch 下训练还有一个容易踩的坑BatchNorm 的统计量估计不稳定。batch size 小到 2 或 4 时BatchNorm 的均值和方差波动大可能导致验证指标抖动明显。一个实用做法是训练结束后在训练集上重新前向传播一次把 BatchNorm 的 running mean 和 running variance 更新为全局统计量或者把 BatchNorm 替换为 GroupNorm后者的计算不依赖 batch 维度在多视角输入的场景里通常更稳定。5. 结果验证与部署前的三个实用技巧模型训练完成后数字指标之外还要做空间维度的验证。云检测的误差集中在云的边缘、薄云和冰雪交界的区域。建议每次验证时保存预测概率图和真实掩膜的叠加图按场景归档方便回溯是哪一类地物造成的误检。第一个技巧是误差空间的矢量分析。把漏检FN和误检FP的像素分别提取出来转成矢量图层叠加到原始影像上观察两类误差主要聚集在哪些地物类型。薄云边缘漏检和冰雪区域误检是两类不同的问题前者通常需要增强薄云样本后者则需要引入短波红外或卷云波段做辅助输入。第二个技巧是概率阈值的敏感性分析。模型输出的概率一般不会正好在 0.5 处分成两类遍历 0.3 到 0.7 的阈值画出 F1 曲线能直观看出模型输出置信度的可靠性。如果 F1 曲线在 0.4 到 0.6 之间平坦说明模型置信度分布健康如果曲线尖峰明显说明大多数样本置信度集中在阈值附近部署时要对阈值做额外标定。第三个技巧是模型导出时的动态尺寸支持。ONNX 导出如果固定了输入分辨率业务端就无法处理大幅影像。导出前把网络中的全局池化改为自适应池化并验证多个输入尺寸下输出形状保持一致。最后可以统计每块 512x512 滑窗推理的耗时若发现边缘区域异常缓慢检查是否在推理阶段误开了梯度计算。以上三个技巧按顺序执行先看误差分布再定概率阈值最后核对导出格式。后面的滑窗拼接阶段再配合重叠区投票多角度云检测就能从前期的模型实验平滑过渡到接近生产的状态。本文还有配套的精品资源点击获取