046、超分在卫星遥感地物细节重建与多光谱超分技术去年接了个卫星遥感超分的项目甲方给的数据是WorldView-3的16波段多光谱影像要求把全色波段Pan的0.3米分辨率“迁移”到多光谱波段上同时保留8个短波红外通道的物理意义。第一次跑完模型结果惨不忍睹——植被区域出现了伪纹理水体边缘像被狗啃过最要命的是多光谱波段之间的光谱相关性全乱了原本NDVI指数算出来是0.7的地方超分后变成了0.3。甲方技术负责人直接甩了句“你们这模型把卫星数据当照片修了”这个坑踩得值。卫星遥感超分和手机拍照超分完全是两码事核心矛盾在于遥感影像的每个像素都有物理辐射值超分不能只追求视觉好看必须保证地物光谱特征不变形。一、卫星超分的特殊约束别把辐射值当RGB普通超分模型处理的是8位RGB图像像素值0-255损失函数用L1或L2视觉上差不多就行。但卫星多光谱影像通常是16位甚至32位浮点每个波段代表特定波长的地物反射率。比如近红外波段NIR的数值直接关联植被健康度你把它超分后数值偏移了5%NDVI计算就会出问题。我踩过的第一个坑是直接用EDSR训练多光谱数据。EDSR的残差块设计对自然图像很友好但卫星影像的纹理特征和自然图像完全不同——自然图像有大量平滑渐变区域卫星影像则是高频细节建筑物边缘、道路和低频背景水体、裸地的极端混合。EDSR在平滑区域容易产生振铃效应导致水体表面出现虚假纹理这在遥感解译里是致命错误。后来换成了RCANResidual Channel Attention Networks通道注意力机制确实能更好地捕捉多光谱波段间的相关性。但RCAN的原始设计是针对RGB的直接套用16波段会出问题通道注意力权重会偏向能量较高的波段比如近红外导致低能量波段比如海岸蓝波段被压制。解决办法是在通道注意力模块前加一层可学习的波段归一化让每个波段的特征分布对齐到零均值单位方差。代码里这样写# 波段归一化层踩过坑才加的classBandNorm(nn.Module):def__init__(self,n_bands):super().__init__()# 别用nn.BatchNorm它会破坏波段间的独立性self.weightnn.Parameter(torch.ones(1,n_bands,1,1))self.biasnn.Parameter(torch.zeros(1,n_bands,1,1))defforward(self,x):# 每个波段独立归一化保留物理意义meanx.mean(dim[2,3],keepdimTrue)stdx.std(dim[2,3],keepdimTrue)1e-8return(x-mean)/std*self.weightself.bias二、多光谱超分的核心光谱一致性损失视觉超分用PSNR和SSIM就够了但遥感超分必须加光谱约束。我试过在损失函数里加光谱角SAM损失效果不错但训练不稳定。后来发现更实用的方法是在生成器输出后接一个“光谱投影层”把超分结果投影到原始多光谱的低分辨率空间再计算投影误差。这个思路来自一个失败的尝试——我最初想用GAN生成高分辨率多光谱结果判别器学会了区分“真实高分辨率”和“生成高分辨率”但生成器为了骗过判别器开始编造光谱特征。比如某块农田的真实NDVI是0.6生成器为了纹理逼真把NDVI改成了0.8判别器居然没发现因为纹理确实像农田。解决方案是引入“物理一致性损失”用超分后的高分辨率多光谱影像降采样回低分辨率和原始低分辨率影像计算L1损失。这个降采样过程必须模拟卫星传感器的调制传递函数MTF不能简单用双线性插值。MTF参数可以从卫星的元数据文件里读或者用刃边法从影像本身估计。# 模拟卫星传感器的降采样别用torch.nn.functional.interpolatedefmtf_downsample(hr,mtf_params):# mtf_params: [sigma_x, sigma_y, scale_factor]# 先用高斯模糊模拟MTF再降采样kernel_sizeint(2*mtf_params[0]*31)ifkernel_size%20:kernel_size1# 必须奇数别问我怎么知道的gaussianget_gaussian_kernel(kernel_size,mtf_params[0])blurredF.conv2d(hr,gaussian,paddingkernel_size//2)# 降采样用像素融合不是插值returnF.avg_pool2d(blurred,mtf_params[2])三、地物细节重建边缘保持与纹理迁移卫星影像的细节重建有个特殊问题建筑物边缘在低分辨率下是亚像素级的直接超分容易产生锯齿。我试过边缘增强损失如梯度损失但梯度损失对噪声敏感卫星影像的传感器噪声虽然低但经过超分网络会被放大。一个实用的技巧是“边缘先验引导”用Canny边缘检测器从全色波段提取边缘图作为辅助输入送入超分网络。全色波段分辨率高边缘信息丰富多光谱波段虽然分辨率低但光谱信息全两者互补。网络结构上我用了双流设计一个流处理全色波段提取空间特征另一个流处理多光谱波段提取光谱特征中间用交叉注意力融合。# 双流融合模块注意不要直接concatclassCrossAttentionFusion(nn.Module):def__init__(self,pan_dim,ms_dim,hidden_dim):super().__init__()# 全色作为query多光谱作为key和valueself.query_projnn.Conv2d(pan_dim,hidden_dim,1)self.key_projnn.Conv2d(ms_dim,hidden_dim,1)self.value_projnn.Conv2d(ms_dim,hidden_dim,1)defforward(self,pan_feat,ms_feat):# 这里踩过坑注意力图要加softmax温度系数否则梯度消失Qself.query_proj(pan_feat)Kself.key_proj(ms_feat)Vself.value_proj(ms_feat)attntorch.matmul(Q.flatten(2).transpose(1,2),K.flatten(2))/(Q.size(1)**0.5)attnF.softmax(attn,dim-1)outtorch.matmul(attn,V.flatten(2).transpose(1,2))returnout.transpose(1,2).view_as(pan_feat)四、实战中的那些坑数据预处理卫星影像的DN值到反射率的转换必须做对。我见过有人直接用DN值训练结果模型学会了“DN值越大越亮”这种伪规律换一颗卫星的数据就崩了。正确的做法是先做辐射定标再做大气校正得到地表反射率然后归一化到[-1,1]或[0,1]。归一化参数要记录推理时反归一化回去。训练策略多光谱超分不能直接用全色波段作为GT。全色波段是宽波段多光谱是窄波段两者物理含义不同。正确的做法是用全色波段作为空间引导用原始低分辨率多光谱作为光谱约束目标高分辨率多光谱需要从更高分辨率的传感器如WorldView-3的0.3米全色通过光谱响应函数模拟得到。这个模拟过程叫“光谱降质”需要卫星的光谱响应曲线。评估指标别只看PSNR和SSIM。遥感领域更看重SAM光谱角衡量光谱保真度、ERGAS相对全局综合误差、UIQI通用图像质量指数。我见过一篇论文PSNR做到38dB但SAM高达10度这种超分结果在遥感解译里基本不能用。推理速度卫星影像通常很大几万乘几万像素不能整图送入网络。用滑动窗口推理时窗口重叠要至少1/4否则拼接处会有明显接缝。更高效的做法是用Laplacian金字塔分解先超分低频部分再逐层添加高频细节。五、个人经验性建议如果你刚开始做遥感超分别一上来就上Transformer。先把RCAN或EDSR调好加光谱一致性损失跑通全流程。Transformer在遥感上的优势主要体现在长距离依赖建模但卫星影像的纹理通常是局部重复的比如农田、建筑群CNN的局部感受野反而更高效。数据增强方面别用随机裁剪和翻转就完事。卫星影像有地理坐标旋转会破坏方向性特征比如道路走向、建筑物朝向。建议只做水平翻转和90度旋转避免任意角度旋转。色彩增强更不能用会破坏光谱物理意义。最后多光谱超分的结果一定要做“光谱验证”。找个已知地物比如水体、植被、裸土计算超分前后的光谱曲线看形状是否一致。如果光谱曲线出现“毛刺”或“偏移”说明模型在编造光谱信息需要调整损失函数权重或网络结构。这个领域还在快速发展但核心问题始终是如何在提升空间分辨率的同时不丢失光谱信息的物理真实性。别被论文里的SOTA数字迷惑落地时甲方只关心一件事——你的超分结果能不能直接用于地物分类或变化检测。