前言遥感变化检测旨在比较同一区域不同时间获取的图像定位地表覆盖变化服务于城市扩张监测、灾害评估与环境监管等应用。论文地址Synergy of Content and Style: Enhanced Remote Sensing Change Detection via Disentanglement and Refinement代码仓库dyzy41/CSDNet我创建了一个用于复现变化检测模型的仓库https://github.com/Auorui/CDLab风格差异对检测精度的影响在双时相数据中风格差异来自于不同拍摄时间、光照条件、季节变化或传感器噪声会引入伪变化和背景干扰使传统方法难以准确检测真实变化。论文在多个数据集上用 UMAP 二维投影可视化了低层特征的域间差异分布。论文提出的思路是将遥感图像特征分为“内容特征”结构和语义信息如建筑、道路“风格特征”光照、季节、噪声等非结构信息只是现有方法通常直接去除风格信息但有些风格信息如纹理或边缘对变化检测仍有用。论文提出选择性保留有用风格信息同时抑制干扰。因此论文提出了 CSDNet主要创新了两个模块内容-风格解耦模块CSDM使用 Instance Normalization 分离内容与风格特征引入动态通道门控机制channel gating选择性保留有助于检测的风格特征同时抑制噪声提升双时相图像特征对齐能力使模型更关注真实变化而非风格差异。上下文内容精炼模块CCRM在解码阶段对编码后的特征进行通道-空间联合门控精炼有效抑制解码中引入的噪声和伪变化同时保持边界清晰并结合多尺度特征金字塔与特征交换机制实现编码与解码阶段的特征交互与融合从而改进微小目标和复杂地物的变化检测能力并提升整体鲁棒性。接下来我们将学习 CSDNet 的两个核心模块。内容-风格解耦模块CSDMnn.InstanceNorm2d 对每个通道在空间维度上进行归一化使每个通道的均值为 0、方差为 1。归一化后得到的可以被视作内容特征它保留了图像的结构和语义信息例如建筑、道路等同时抑制了全局风格变化如亮度、对比度、季节性变化。风格特征通过残差形式得到也就是下图左下角所示它把原始特征中被归一化去掉的部分提取出来包含光照、纹理、阴影等可能对变化检测有帮助的非结构信息。风格特征会进入StyleStrip当中实现动态通道选择。经典的两个全局池化提取全局统计信息这两个池化分支提取了风格特征在通道维度上的整体响应帮助判断哪些通道更重要将 avg 分支和 max 分支的特征相加再通过 1×1 卷积生成通道 gatesigmoid生成每个通道的值在 [0,1] 之间表示该通道风格特征的重要性。最后风格特征按 gate 权重加权只保留对变化检测有帮助的部分同时抑制无用噪声。最后将经过筛选的风格特征与内容特征重新融合得到净化后的特征这就是 CSDM 的输出。输出特征保留了结构信息内容和有用纹理信息风格同时抑制了背景噪声和无关风格变化。class GateBlock(nn.Module): def __init__(self, in_channels, reduction16): super(GateBlock, self).__init__() num_gates in_channels mid_channels in_channels // reduction # 平均池化分支 self.global_avgpool nn.AdaptiveAvgPool2d(1) self.fc1_avg nn.Conv2d(in_channels, mid_channels, kernel_size1, biasTrue) self.norm1_avg nn.LayerNorm((mid_channels, 1, 1)) self.relu nn.ReLU(inplaceTrue) # 最大池化分支 self.global_maxpool nn.AdaptiveMaxPool2d(1) self.fc1_max nn.Conv2d(in_channels, mid_channels, kernel_size1, biasTrue) self.norm1_max nn.LayerNorm((mid_channels, 1, 1)) # 两路汇合后的第二层 self.fc2 nn.Conv2d(mid_channels, num_gates, kernel_size1, biasTrue) self.gate_activation nn.Sigmoid() def forward(self, x): input x # avg 分支 avg self.global_avgpool(x) avg self.fc1_avg(avg) # LayerNorm 需要对 (C,1,1) 的张量指定 normalized_shape avg self.norm1_avg(avg) avg self.relu(avg) # max 分支 mx self.global_maxpool(x) mx self.fc1_max(mx) mx self.norm1_max(mx) mx self.relu(mx) # 两路特征相加再送入第二层 x self.fc2(avg mx) x self.gate_activation(x) return input * x class StyleStrip(nn.Module): def __init__(self, in_channels): super(StyleStrip, self).__init__() self.instance_norm nn.InstanceNorm2d(in_channels, affineTrue) self.style_strip GateBlock(in_channels, reduction16) def forward(self, x): x_IN_1 self.instance_norm(x) x_style_1 x - x_IN_1 x_style_1_useful self.style_strip(x_style_1) x_1 x_IN_1 x_style_1_useful return x_1双时相图像经过 CSDM 净化后各自得到了一组多尺度特征金字塔4个尺度。此时CSDNet 并没有直接将两组特征送入 FPN 进行融合而是先做了一步层级特征交换Layer Exchange。其核心实现非常简洁staticmethod def layer_exchange(x: List[torch.Tensor], y: List[torch.Tensor]) - Tuple[List[torch.Tensor], List[torch.Tensor]]: for i in range(0, len(x), 2): x[i], y[i] y[i], x[i] return x, y对两组特征金字塔每隔一层交换一次也就是将索引为 0、2 的层进行互换索引为 1、3 的层保持不变。交换后两组特征金字塔变成了混合状态每一组特征金字塔都同时包含了来自 T1 和 T2 时相的特征在送入 FPN 进行多尺度融合时两个时相的信息会被充分混合和对齐而不是孤立地各自处理。这种交叉注入的方式使得模型对时相之间的结构变化更加敏感同时也增强了特征的跨时相表达能力。经过 Layer Exchange 之后两组混合特征金字塔分别送入共享权重的 FPN进行多尺度特征融合为后续的解码和精炼阶段提供更丰富的跨时相信息基础。上下文内容精炼模块CCRM进入 CCRM 的输入特征是经过 FPN 融合和逐层上采样之后的解码特征。此时特征已经融合了多尺度信息但也不可避免地混入了上采样和融合带来的噪声与伪变化。因此CCRM 的第一步和 CSDM 完全一致同样使用 Instance Normalization 对特征进行再一次内容-风格分解值得注意的是这里的 nn.InstanceNorm2d 的 affineFalse意味着不引入可学习的缩放和偏移参数让内容特征保持纯净的归一化状态更加稳定可靠。风格特征进入进行联合的门控筛选。首先是通道维度上的筛选这一步的逻辑与 CSDM 中的 GateBlock 类似def forward(self, x): # --- 通道门控计算 --- avg_out self.fc_shared(self.avg_pool(x)) max_out self.fc_shared(self.max_pool(x)) channel_gate self.gate_activation(avg_out max_out) # shape: [B, C, 1, 1]风格特征分别经过全局平均池化和全局最大池化压缩为 [B, C, 1, 1] 的向量然后通过一个共享的两层 MLP1×1 卷积实现提取每个通道的重要性权重最终通过 Sigmoid 生成通道 gate。这里使用共享权重的 MLP 处理两个池化分支参数更少同时保留了 avg 和 max 两种统计信息的互补性。通道 gate 的形状为 [B, C, 1, 1]每个值表示对应通道的风格信息对变化检测的贡献程度。与 CSDM 只做通道筛选不同CCRM 额外引入了空间维度上的精细筛选这是 CCRM 相比 CSDM 最核心的创新点首先沿通道维度分别计算均值和最大值得到两张 [B, 1, H, W] 的空间统计图将二者拼接后送入一个 7×7 的大卷积核。使用大感受野卷积的原因是变化区域的判断往往需要结合周围的上下文信息而不只是单个像素的局部响应。最终生成形状为 [B, 1, H, W] 的空间 gate告诉模型哪些位置的风格信息是值得保留的。# --- 空间门控计算 --- # 沿着通道维度进行池化 avg_across_channels torch.mean(x, dim1, keepdimTrue) max_across_channels, _ torch.max(x, dim1, keepdimTrue) # 拼接并进行卷积 spatial_input torch.cat([avg_across_channels, max_across_channels], dim1) spatial_gate self.gate_activation(self.spatial_conv(spatial_input)) # shape: [B, 1, H, W]通道 gate 和空间 gate 依次作用于风格特征实现联合筛选x_gated x * channel_gate # 通道筛选[B,C,H,W] × [B,C,1,1] x_gated x_gated * spatial_gate # 空间筛选[B,C,H,W] × [B,1,H,W]由于广播机制这两步乘法可以直接作用在全尺寸特征图上无需额外的维度变换。筛选后的风格特征、只保留了既重要通道维度又位于关键位置空间维度的部分大幅度抑制了阴影、光照残余和上采样带来的伪纹理干扰。最后将筛选后的风格特征与内容特征重新融合得到精炼后的输出。总结CSDNet在编码阶段通过 Instance Normalization 将特征拆分为内容与风格两部分再借助通道门控机制有选择地保留对变化检测有帮助的风格信息从源头上抑制了光照、季节等风格差异对特征对齐的干扰。随后Layer Exchange 将两个时相的特征在层级上交叉混合使得进入 FPN 的特征天然地携带了跨时相的上下文信息增强了模型对真实变化的感知能力。解码阶段CCRM 在 CSDM 的基础上进一步引入了空间维度的门控筛选通过通道-空间联合精炼精准定位变化区域抑制上采样过程中引入的伪纹理和边界模糊问题。