074、超分在遥感图像中的应用:卫星图像增强与目标检测协同

发布时间:2026/7/8 9:02:20
074、超分在遥感图像中的应用:卫星图像增强与目标检测协同 074、超分在遥感图像中的应用卫星图像增强与目标检测协同去年接了个遥感项目甲方给的数据是0.5米分辨率的卫星图要检测出0.3米以下的小型车辆。第一次跑YOLOv5召回率只有可怜的0.12检测框基本都在瞎猜。当时盯着屏幕上的马赛克状车辆脑子里蹦出的第一个念头就是得先让图像“看得清”再谈“找得准”。这个场景在遥感领域太典型了——卫星受限于轨道高度和传感器物理极限分辨率永远不够用。超分辨率重建在这里不是炫技是刚需。遥感图像超分的特殊性普通自然图像超分你关心的是纹理细节是否自然、边缘是否锐利。遥感图像超分核心诉求完全不同保持地物几何结构的保真度。一辆车超分后变成两辆车或者把圆形储油罐变成椭圆形这种“细节”就是灾难。我踩过最深的坑是直接用EDSR在遥感数据上训练。EDSR对自然图像效果很好但遥感图像有大量重复纹理农田、屋顶、规则几何结构道路、建筑EDSR的残差块容易产生伪影——把农田的纹理误判为建筑边缘生成出根本不存在的房屋轮廓。后来换用RCANResidual Channel Attention Networks通道注意力机制对遥感图像更友好。RCAN能自动聚焦到关键频段对规则纹理的保持比EDSR好一个档次。但RCAN参数量太大在轨部署时推理速度感人。实战RCAN遥感数据微调代码实现上我习惯用PyTorch从零搭RCAN而不是直接调现成库。原因很简单遥感数据预处理和自然图像差异太大现成库的归一化策略往往不适用。# 这里踩过坑遥感图像通常是16位TIFF直接归一化到[0,1]会丢失暗部细节defnormalize_remote(img,percentile2):# 别这样写img (img - img.min()) / (img.max() - img.min())# 遥感图像有大量极暗区域水体和极亮区域云顶全局归一化会把中间地物压扁lownp.percentile(img,percentile)highnp.percentile(img,100-percentile)imgnp.clip(img,low,high)return(img-low)/(high-low1e-8)RCAN的核心是残差组Residual Group和通道注意力。训练时有个关键trick先用L1损失训50个epoch再切到感知损失。L1损失保证像素级保真度感知损失提升视觉质量。直接上感知损失遥感图像的边缘容易产生振铃效应。classRCAN(nn.Module):def__init__(self,n_resgroups10,n_resblocks20,n_feats64):super().__init__()# 头部的卷积层这里用3x3而不是5x5遥感图像高频信息集中在局部self.headnn.Conv2d(3,n_feats,3,padding1)# 残差组每个组包含多个残差块self.bodynn.Sequential(*[ResidualGroup(n_resblocks,n_feats)for_inrange(n_resgroups)])# 上采样部分用亚像素卷积而不是反卷积# 反卷积在遥感图像上容易产生棋盘格伪影亚像素卷积更稳定self.upsamplenn.Sequential(nn.Conv2d(n_feats,n_feats*4,3,padding1),nn.PixelShuffle(2))训练数据准备上别直接用公开的遥感数据集如UC Merced——分辨率太低超分效果有限。我自己的做法是从Google Earth Engine下载0.3米分辨率的WorldView-3图像下采样到0.6米作为LR原图作为HR。这样构造的配对数据超分效果在真实场景中泛化最好。超分与检测的协同设计很多人把超分和检测做成串行流水线先超分再检测。这种做法有个致命问题——超分模型不知道下游检测任务需要什么。超分模型可能把车辆轮廓锐化得过于夸张导致检测模型误判为其他物体。我尝试过端到端联合训练但效果并不理想。遥感图像超分和检测的loss尺度差异太大超分的L1 loss在0.01量级检测的classification loss在1量级直接联合训练超分部分很快被压制。最终采用的方案是特征级协同让超分模型和检测模型共享backbone的前几层在特征空间进行超分而不是在像素空间。# 共享backbone设计别把超分和检测完全分开classSharedBackbone(nn.Module):def__init__(self):super().__init__()# 前3层共享提取低级特征self.sharednn.Sequential(nn.Conv2d(3,64,3,padding1),nn.ReLU(),nn.Conv2d(64,64,3,padding1),nn.ReLU(),nn.Conv2d(64,128,3,padding1,stride2))# 超分分支从共享特征重建高分辨率图像self.sr_branchSRBranch(128)# 检测分支从共享特征做目标检测self.det_branchDetectionBranch(128)训练时采用两阶段策略第一阶段只训练共享backbone超分分支第二阶段冻结共享backbone只训练检测分支。这样既保证了超分质量又让检测分支在高质量特征上学习。在轨部署的妥协卫星上算力有限FPGA或NPU为主GPU很少。RCAN的参数量约15M在轨部署太奢侈。我做过一个轻量化版本把残差组从10个压缩到4个残差块从20个压缩到8个通道数从64降到32。PSNR从38.2dB降到36.1dB但推理速度提升了5倍在Xilinx Zynq上能跑到30fps。另一个trick是量化感知训练。直接训练FP32模型再量化到INT8PSNR会掉2-3dB。用QAT量化感知训练在训练过程中模拟量化误差最终INT8模型只掉0.5dB对检测任务的影响几乎可以忽略。个人经验别迷信公开数据集。遥感图像超分的数据分布和自然图像差异巨大自己构造配对数据是绕不开的。花一周时间在GEE上爬数据比花一个月调模型参数更有价值。检测任务才是最终评价标准。PSNR高不代表检测效果好。我见过PSNR 40dB的超分结果检测mAP反而比PSNR 38dB的低——因为超分模型过度锐化产生了虚假纹理。建议在验证集上同时监控PSNR和检测mAP以mAP为最终优化目标。多尺度训练是王道。遥感图像中地物尺度差异极大从几米的车辆到几百米的建筑单一尺度超分效果有限。我采用随机裁剪多尺度下采样策略让模型适应2x、3x、4x不同倍率实际部署时根据目标大小动态选择倍率。注意云遮挡。遥感图像常有云层遮挡超分模型会把云层纹理误判为地物细节。一个简单处理在训练数据中加入云层掩码让模型学习忽略遮挡区域。效果立竿见影。别忽略后处理。超分后的图像直接送检测效果往往不如加一个轻量的去噪模块。我习惯在超分输出后接一个3x3的引导滤波能有效抑制伪影对检测mAP提升约2-3个百分点。这个方向还在快速演进最近Transformer-based的超分模型如SwinIR在遥感图像上表现不错但推理速度是瓶颈。如果你有在轨部署需求建议还是以CNN为主Transformer作为离线增强手段。