1. 遥感图像处理的新“王牌”为什么是Mamba最近在遥感圈子里Mamba这个词的热度是越来越高。如果你还在埋头苦调Transformer或者CNN可能就有点out了。我刚开始接触Mamba的时候第一反应也是这又是什么新出的“花架子”但跟着几篇论文跑下来尤其是在处理动辄几百个波段的高光谱数据时我才真正体会到它的厉害。简单来说Mamba就像是一个记忆力超群、计算效率又高的“超级大脑”特别擅长处理遥感图像这种数据量大、信息维度高的序列数据。传统的卷积神经网络CNN在处理图像时擅长捕捉局部特征比如地物的边缘、纹理。但对于高光谱图像每个像素点背后都是一条从可见光到红外、包含数百个连续波长的光谱曲线这条曲线里藏着地物材质的“指纹”信息。CNN在这条长长的光谱维度上就显得有些力不从心它更关注空间上的“邻居”对光谱这个“通道维度”上的长距离依赖关系建模能力有限。后来Transformer来了它的自注意力机制能关注全局信息理论上很适合。但问题也来了自注意力机制的计算复杂度是序列长度的平方级。一张高光谱图像空间尺寸可能不大但光谱维度一拉平序列长度轻松破万那个计算量和内存占用普通实验室的显卡根本扛不住训练起来慢得像蜗牛。Mamba的出现正好击中了这个痛点。它基于一种叫做“状态空间模型”State Space Model, SSM的数学框架。你可以把它想象成一个非常精巧的动态系统系统有一个内部状态它会根据当前的输入和之前的状态更新自己并产生输出。关键在于这个更新过程是线性的计算复杂度只和序列长度呈线性关系。这意味着无论你的高光谱数据有100个波段还是400个波段Mamba处理它的速度增长是平缓的不像Transformer那样会指数级爆炸。这就为处理大范围、高光谱、多时相的遥感数据打开了新的大门。我实测过在同样的数据上一个轻量化的Mamba模型训练速度能比同参数量的Transformer快上好几倍这对于需要快速迭代的实验来说简直是福音。所以Mamba在遥感领域火起来绝不是偶然。它本质上提供了一种新的、高效的“全局建模”工具尤其适合遥感数据“光谱维度长”、“空间上下文广”、“时序变化连续”这些特点。从高光谱图像分类到地物变化检测研究者们正在把Mamba这把“新锤子”精准地敲向遥感处理中的一个个“硬钉子”。接下来我们就深入看看它具体是怎么大显身手的。2. 高光谱图像分类让Mamba“看懂”光谱的奥秘高光谱图像分类可以说是遥感领域的经典难题也是检验一个模型是否“懂”遥感的试金石。它的目标很简单给图像中的每一个像素打上正确的地物类别标签比如森林、水体、建筑、农田。难点在于不同地物在光谱曲线上可能只有细微的差别而同类地物因为光照、湿度等因素光谱又会有变化。以前我们得费劲做特征工程现在深度学习的思路是让模型自己从数据里学。Mamba在这里的玩法核心就一句话把三维的高光谱立方体空间高×空间宽×光谱波段巧妙地变成一维序列让SSM去挖掘光谱间的深层关系。2.1 核心挑战与解决思路从3D到1D的“艺术”Mamba原本是为语言这类一维序列设计的。面对高光谱图像这个“三维立方体”直接硬套肯定不行。研究者们的智慧就体现在这个“序列化”的过程上。目前主流的思路有两种我把它叫做“分而治之”和“双管齐下”。“分而治之”的代表是SpectralMamba。它的思路很直观既然分类任务最终要消除空间差异聚焦光谱特征那我就先把空间信息“压缩”掉。具体怎么做呢它先把图像分成一个个小块Patch然后用卷积层提取每个块的空间特征相当于把一块区域的信息浓缩成一个特征向量。这样一来一个HxWxC高、宽、波段的图像就变成了N个特征向量每个向量代表一个区域的光谱概要。然后Mamba登场它把这些特征向量当作一个序列沿着序列方向也就是不同的图像块进行扫描和学习挖掘不同区域光谱特征之间的关联。这种方法特别适合地物分布比较均匀、空间上下文相对简单的场景。“双管齐下”的思路就更精细一些以SS-MambaSpectral-Spatial Mamba和S2Mamba为代表。它们认为空间和光谱信息都极其重要不能偏废。所以它们会同时进行两种扫描或建模。例如SS-Mamba会分别沿着光谱维度和空间维度把图像“切”成序列。想象一下把高光谱立方体像切面包一样横着切固定空间位置看所有波段的变化得到光谱序列竖着切固定某个波段看所有空间位置得到空间序列。然后用两个独立的Mamba模块分别处理这两种序列最后再用设计好的融合模块比如加法、门控机制把光谱特征和空间特征结合起来。S2Mamba则提出了更复杂的“双向光谱扫描”和“空间-光谱混合门控”目的都是更充分、更智能地融合两类信息。我在复现这类模型时发现这种双分支结构虽然复杂一点但在农田与裸地交错、城市绿地与建筑混合这类复杂场景下分类精度确实有可观的提升。2.2 关键模块拆解不只是扫描更是融合光有思路还不够模型里的具体模块才是性能提升的关键。这里我挑几个有代表性的模块用更直白的话解释一下它们是怎么工作的。Piece-wise Sequential Scanning (PSS分段顺序扫描)这是SpectralMamba里的一个模块。你想高光谱波段那么多从头到尾一次性扫描模型可能记不住那么长的依赖关系。PSS的做法是把整个光谱波段分成几段比如每50个波段为一段先在每一段内部用Mamba进行精细建模捕捉段内的局部光谱细节。然后再以段为单位进行更高层次的序列建模。这就像读书先精读每一章节再把握整本书的脉络比一口气囫囵吞枣地读完整本要有效得多。Gated Spatial-Spectral Merging (GSSM门控空间-光谱融合)这是紧跟着PSS的模块。经过PSS处理后我们得到了富含光谱信息的特征。但之前用卷积压缩空间信息时那些特征也没丢。GSSM就像一个聪明的“调度员”它有一个门控机制通常是一个小神经网络比如全连接层加Sigmoid函数这个机制会计算一个0到1之间的权重。这个权重决定了在最终的特征里来自光谱分支的特征和来自空间分支的特征各自应该占多大比例。对于光谱特征独特的地物比如不同种类的矿物门控可能会更偏向光谱分支对于纹理结构重要的地物比如不同朝向的屋顶门控可能会更偏向空间分支。这种动态的、自适应的融合方式比简单地把两个特征相加或拼接要强大得多。Bi-directional Spectral Scanning Mechanism (BSS双向光谱扫描机制)这是S2Mamba里的一个亮点。常规的序列模型往往只从一个方向比如从左到右读取信息。但光谱曲线没有绝对的方向性从波段400nm到500nm的信息和从500nm回看400nm的信息可能同等重要。BSS机制让Mamba能够同时从光谱维度的“两端”向中间扫描或者进行某种形式的前后向信息交换。这就确保了模型在分析某个波段时既能考虑到比它波长更短能量更高的波段信息也能考虑到比它波长更长能量更低的波段信息从而获得更全面的光谱上下文理解。实现上这通常意味着在SSM的计算图里同时进行前向和后向的扫描然后将结果融合。3. 变化检测用Mamba捕捉大地的“脉搏”如果说高光谱分类是给地球拍一张静态的“体检报告”那么变化检测就是在做动态的“健康监测”。它通过对比不同时间拍摄的同一地区的遥感图像自动找出哪里发生了变化是新建了一片楼还是森林砍伐了一块或者是洪水淹没了农田。这个任务对模型的时序建模能力和空间细节把握能力要求极高。Mamba在这里的用武之地就在于它能高效地建模时空序列。3.1 时空序列建模两个时相的“对话”变化检测的输入通常是成对的图像时相T1和时相T2。传统方法可能分别提取特征再比较差异容易丢失时序间的关联。而Mamba的思路是将两个时相同一位置的信息或者其特征组织成一个时空序列让模型自己去学习“变”与“不变”的模式。以ChangeMamba这篇工作为例它设计得非常系统像搭积木一样为变化检测提供了丰富的编码器和解码器选项。它的核心思想是“多尺度时空状态空间建模”。简单说就是模仿经典的U-Net或Swin Transformer构建一个多阶段的编码器。在每一个阶段它并不是单独处理T1或T2的图像而是通过一个精心设计的Spatio-Temporal State Space (STSS) 模块来联合处理双时相特征。这个STSS模块内部Mamba扮演了关键角色。它可能将来自T1和T2的局部特征图展平、拼接或交错形成一个更长的序列然后在这个序列上运行SSM。这样一来模型在提取深层特征时就已经在潜意识里对比着两个时相的信息了。它能捕捉到“这里T1是植被T2变成了裸土”这种细微的时序演变信号而不仅仅是空间上的差异。这种设计让我想起教小孩找不同不是让他分别记住两张图而是让他同时看着两张图去找区别效果自然更好。另一个有趣的模型是RSCaMa它甚至不满足于只输出一个变化区域二值图而是想用自然语言描述变化——“从2022年到2023年该区域东南角新增了一片矩形建筑群”。它提出了CaMa层里面包含两个专门的SSMSD-SSM空间差异感知SSM和TT-SSM时间遍历SSM。SD-SSM专注于分析同一时相内不同空间位置特征的差异这有助于理解地物的空间布局TT-SSM则专注于分析同一空间位置在不同时相间特征的演变这直接对应着变化。这两个SSM并行工作它们的输出被融合后再交给后续的网络生成文字描述。这种显式地分离空间和时间建模的思路让模型的可解释性更强了一些。3.2 从特征到变化图解码器的设计哲学有了强大的编码器提取出富含时空信息的特征接下来就需要解码器把这些特征“翻译”成我们最终想要的变化图。这里Mamba模型常常与一些成熟的结构相结合。一种主流做法是采用类U-Net的对称结构。编码器部分像上面说的用多级Mamba模块下采样提取不同尺度的特征。解码器部分则通过上采样逐步恢复空间分辨率。关键的一步是“跳跃连接”它将编码器早期阶段包含更多空间细节的特征直接拼接到解码器对应阶段。在这个过程中Mamba模块可以继续被用在解码器中对融合后的特征进行进一步的提炼和去噪。例如在解码器的某一层上采样后的特征与跳跃连接来的特征拼接后形成一个新序列可以再通过一个轻量的Mamba块来整合不同来源的信息确保最终生成的变化图边界清晰、噪声少。另一种思路是引入注意力机制或门控机制作为补充。比如RS3Mamba它在主编码器之外还使用了一个辅助编码器。辅助编码器里的VSS Block是标准的视觉Mamba模块而主编码器里则用了一个叫CCM的模块这个模块同时使用了基于窗口的注意力捕捉全局上下文和卷积捕捉局部细节然后将两者融合。在解码时它采用了UNetformer中的解码器。这种混合架构的思路很实用用Mamba高效地捕获长程全局依赖再用注意力或卷积这些经典工具来弥补Mamba在极端局部细节建模上可能存在的不足。在实际调参中我发现这种混合模型往往比纯Mamba架构更容易收敛在细小变化如道路拓宽、单栋房屋建设的检测上表现更稳健。4. 超越分类与变化Mamba的更多遥感舞台高光谱分类和变化检测是当前Mamba在遥感领域应用最火热的方向但它的潜力远不止于此。一些前沿工作已经开始将Mamba推向图像融合、超分辨率甚至去噪等任务这些任务共同的特点是都需要对图像进行高度精细化的重建或增强对模型的细节保持能力和全局协调能力要求很高。4.1 图像融合与超分辨率重建更清晰的世界遥感图像融合特别是全色锐化Pan-sharpening是一个经典问题。全色图像空间分辨率高但只有一个波段灰度图多光谱图像色彩丰富但空间分辨率低。融合的目标是得到一张兼具高空间分辨率和高光谱信息量的图像。Pan-Mamba这篇论文就针对此任务进行了设计。它的创新点在于设计了Channel Swapping Mamba Block和Cross-modality Mamba Block。前者有点像“换位思考”让全色通道的部分信息和多光谱通道的部分信息进行交换在浅层就建立起轻量的跨模态交互。后者则更深入利用Mamba来建模全色和多光谱特征之间固有的、复杂的关系。全色图像中的边缘和纹理信息高频如何与多光谱图像中的颜色和材质信息低频对应和融合Mamba的状态空间模型非常适合学习这种跨模态的、序列化的映射关系。我尝试用他们的代码对GF-2卫星数据进行融合发现相比传统方法和小型CNNPan-Mamba在保持光谱保真度颜色不失真方面表现尤其突出建筑边缘的“伪彩色”现象明显减轻。在超分辨率任务上FMSR频率辅助Mamba超分辨率模型提供了一个新视角。它意识到图像的高频细节边缘、纹理和低频信息平坦区域在频域上分布不同。因此它专门设计了一个Frequency Selection Module (FSM频率选择模块)利用快速傅里叶变换将特征转换到频域然后有选择地增强或过滤不同频率的分量。这个频域处理后的特征会与常规视觉Mamba模块VSSM提取的特征通过一个混合门控模块HGM进行自适应融合。这个思路非常巧妙相当于给Mamba这个“全局建模大师”配了一个“细节放大镜”让它不仅关注像素间的全局关系还能有针对性地修复高频细节。在将低分辨率遥感图像如30米分辨率上采样到高分辨率如10米的任务中这种结合频域先验知识的方法能生成更清晰、更真实的地物边界。4.2 图像去噪从数据中还原真实遥感图像在获取和传输过程中不可避免地会引入噪声尤其是在成像条件不佳或传感器灵敏度有限的情况下。高光谱图像去噪尤为困难因为噪声会在数百个波段上呈现出复杂的光谱相关性。HSIDMamba这篇工作直接挑战了这个难题。它提出了一个双向状态空间模型来应对高光谱去噪。它的核心是一个Bidirectional State Space Module。为什么是“双向”因为对于去噪任务一个像素点的干净值应该由其周围所有像素包括上下左右所有方向的噪声观测值共同推断出来。单向扫描会引入方向性偏差。这个模块内部通过深度可分离卷积DWConv和SS2D二维选择性扫描状态空间模型等组件实现了对空间-光谱立方体的双向、全局建模。更重要的是它还引入了一个Spectral Attention模块。这个注意力模块不是Transformer里那种昂贵的全局注意力而是通过平均池化、二维卷积等轻量操作构建的旨在显式地建模光谱波段之间的重要性权重。有些波段可能受噪声污染严重有些则相对干净模型需要学会区别对待。最后通过Hyper Continuous Scan Block将这些模块像搭积木一样组织起来。我在处理一些受条纹噪声和高斯噪声混合污染的高光谱数据时对比了传统低秩方法和基于CNN的方法HSIDMamba在平滑均匀区域和保留尖锐边缘之间取得了更好的平衡光谱曲线的失真也更小。5. 实战入门动手搭建你的第一个遥感Mamba模型看了这么多原理和应用是不是手痒想试试别担心从零开始搭建一个Mamba模型来处理遥感图像并没有想象中那么难。下面我就以一个简化版的高光谱图像分类任务为例带你走一遍流程。我们会使用PyTorch框架和开源mamba-ssm库。5.1 环境准备与数据获取首先确保你的Python环境建议3.8以上并安装核心库。mamba-ssm是官方实现效率很高。pip install torch torchvision pip install causal-conv1d1.1.0 # Mamba的依赖 pip install mamba-ssm数据方面我们可以从经典的Indian Pines或Pavia University高光谱数据集开始。这些数据很容易在公开数据集网站找到。下载后你通常会得到一个.mat文件里面包含数据立方体data和对应的标签gt。我们写一个简单的数据加载类import numpy as np import scipy.io as sio import torch from torch.utils.data import Dataset, DataLoader class HyperspectralDataset(Dataset): def __init__(self, data_path, patch_size5): 加载高光谱数据集并生成小块样本。 Args: data_path: .mat文件路径 patch_size: 提取的局部空间块大小奇数如5,7,9 mat sio.loadmat(data_path) self.data mat[data] # 形状: (H, W, C) self.labels mat[gt] # 形状: (H, W) self.patch_size patch_size self.half_patch patch_size // 2 # 获取所有有标签的像素位置 self.pos_list np.argwhere(self.labels 0) # 对数据进行归一化沿光谱维 self.data (self.data - self.data.mean(axis(0,1), keepdimsTrue)) / (self.data.std(axis(0,1), keepdimsTrue) 1e-9) def __len__(self): return len(self.pos_list) def __getitem__(self, idx): x, y self.pos_list[idx] label self.labels[x, y] - 1 # 标签通常从1开始转为从0开始 # 提取以(x,y)为中心的空间块 x_start, x_end x - self.half_patch, x self.half_patch 1 y_start, y_end y - self.half_patch, y self.half_patch 1 # 处理边界情况用0填充 data_patch np.pad(self.data, ((self.half_patch, self.half_patch), (self.half_patch, self.half_patch), (0,0)), modeconstant) patch data_patch[x_start:x_endself.half_patch*2, y_start:y_endself.half_patch*2, :] # 注意填充后的索引 # 调整维度顺序为 (C, H, W) 以适应PyTorch patch torch.FloatTensor(patch).permute(2, 0, 1) label torch.LongTensor([label]) return patch, label5.2 构建一个简易的SpectralMamba分类网络现在我们来构建模型。这里我们实现一个极度简化的SpectralMamba思想版本先用卷积压缩空间信息然后用Mamba处理光谱序列。import torch.nn as nn from mamba_ssm import Mamba class SimpleSpectralMamba(nn.Module): def __init__(self, num_bands, num_classes, patch_size5, d_model128, d_state16, d_conv4): super().__init__() # 1. 空间特征提取器用卷积把 (C, H, W) 的空间块压缩为 (d_model, 1, 1) self.spatial_encoder nn.Sequential( nn.Conv2d(num_bands, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.GELU(), nn.Conv2d(64, d_model, kernel_size3, padding1), nn.AdaptiveAvgPool2d((1, 1)) # 全局平均池化得到 (d_model, 1, 1) ) # 2. 展平并添加位置编码这里用可学习的位置编码 self.pos_embed nn.Parameter(torch.randn(1, 1, d_model)) # 3. Mamba层处理序列。这里我们把每个样本看作长度为1的序列但d_model是特征维度。 # 实际上更复杂的实现会把一批样本的所有像素点连成一个长序列。 # 这里为简化我们使用Mamba处理特征维度上的“序列”这是一种变通更严谨的做法需重排维度。 self.mamba Mamba( d_modeld_model, d_stated_state, d_convd_conv, expand2, # 扩展因子 ) # 4. 分类头 self.classifier nn.Sequential( nn.LayerNorm(d_model), nn.Linear(d_model, num_classes) ) def forward(self, x): # x: (B, C, H, W) # 压缩空间信息 spatial_feat self.spatial_encoder(x) # (B, d_model, 1, 1) spatial_feat spatial_feat.squeeze(-1).squeeze(-1) # (B, d_model) # 添加位置编码本例中序列长度为1所以直接加 feat spatial_feat self.pos_embed # (B, 1, d_model) - (B, d_model) 广播相加 # 为了适应Mamba的输入要求 (B, L, D)增加序列维度L1 feat feat.unsqueeze(1) # (B, 1, d_model) # Mamba处理 mamba_out self.mamba(feat) # (B, 1, d_model) mamba_out mamba_out.squeeze(1) # (B, d_model) # 分类 out self.classifier(mamba_out) # (B, num_classes) return out5.3 训练与评估要点有了模型和数据就可以开始训练了。这里有几个我在实践中总结的要点优化器与学习率Mamba模型对学习率比较敏感。建议使用AdamW优化器并配合热身Warmup和余弦退火Cosine Annealing学习率调度。初始学习率可以设得小一点比如3e-4到5e-4。import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR, LinearLR model SimpleSpectralMamba(num_bands200, num_classes16, d_model128) optimizer optim.AdamW(model.parameters(), lr5e-4, weight_decay0.05) # 先线性warmup 5个epoch再余弦退火 scheduler_warmup LinearLR(optimizer, start_factor0.01, total_iters5) scheduler_cosine CosineAnnealingLR(optimizer, T_max95) # 假设总epoch 100 # 实际训练循环中先调用scheduler_warmup.step()再调用scheduler_cosine.step()损失函数高光谱数据通常类别不平衡背景像素类别0远多于其他类别。直接使用交叉熵损失会导致模型偏向背景。建议使用带权重的交叉熵损失nn.CrossEntropyLoss(weightclass_weights)权重可以根据训练集中各类别像素数量的倒数来计算。评估指标不要只看整体准确率Overall Accuracy, OA它会被占多数的背景类主导。一定要看平均准确率Average Accuracy, AA和Kappa系数。AA是每类准确率的平均值更能反映模型对少数类的识别能力。Kappa系数考虑了随机分类的预期精度是衡量分类一致性的更稳健指标。from sklearn.metrics import confusion_matrix, cohen_kappa_score import numpy as np def evaluate(model, dataloader, device): model.eval() all_preds [] all_labels [] with torch.no_grad(): for data, label in dataloader: data, label data.to(device), label.to(device).squeeze() output model(data) pred output.argmax(dim1) all_preds.append(pred.cpu().numpy()) all_labels.append(label.cpu().numpy()) all_preds np.concatenate(all_preds) all_labels np.concatenate(all_labels) # 计算混淆矩阵 cm confusion_matrix(all_labels, all_preds) OA np.sum(np.diag(cm)) / np.sum(cm) # 计算每类准确率忽略可能为0的除项 class_acc np.diag(cm) / (np.sum(cm, axis1) 1e-9) AA np.mean(class_acc) Kappa cohen_kappa_score(all_labels, all_preds) return OA, AA, Kappa, cm跑完几个epoch后你可能会发现这个简易模型的效果可能不如ResNet但这很正常。我们只是为了演示流程。要获得SOTA结果你需要引入更复杂的结构比如前面提到的分段扫描、双向扫描、门控融合等模块并且可能需要在更大的数据集如Houston2013, Berlin上进行预训练或更长时间的训练。不过这个简单的框架已经包含了Mamba应用于遥感图像的核心思想特征压缩 → 序列化 → SSM建模。沿着这个思路你可以自由地添加或修改模块探索属于你自己的Mamba变体。