一篇发表在arXiv上的工作能够同时在结构相似度上逼近甚至反超UNet系列,同时又在血管连通性指标上拉开差距,这本身就说明了问题。如果你手里有DRIVE或CHASE数据集,拿现成的UNet和Mamba各自训练一版,在分割结果的视觉对比图上你能看到一个非常直观的现象:UNet很多细小的分支会在中途突然断掉,而Serp-Mamba的结果虽然边界上看起来可能略微模糊,但血管的脉络是完整的。这篇文章我想从一个更底层的视角来聊这件事——血管拓扑结构到底如何暴露CNN的软肋,以及Serp-Mamba的蛇形扫描究竟是如何踩中血管走势的节奏。
1. 视网膜血管分割的"隐性难题":CNN的局部感受野为什么在细长结构上失效
1.1 眼底图像分割不是普通的分割任务
视网膜血管分割在医学影像分割里属于一个比较特殊的场景。它特殊在不是区分不同脏器的区域,而是要从背景中分离一类极其细长的管状结构。正常眼底图像中,最粗的血管直径在图像上可能有十几到二十个像素,而最细的毛细血管可能只有两三个像素,甚至接近一个像素。
这种巨大的尺度跨度让分割任务的难度完全不在器官分割那条赛道上。器官分割里,目标通常是一个整块、有明确的区域边界,局部上下文信息可以支撑大部分决策。而视网膜血管分割里,一个两三像素宽的血管段,周围全部是背景,你不仅要判断这个像素是不是血管,还要判断它和相邻几个像素的灰度关系是不是符合血管的走向。
第二个难点在于结构的长程关联性。一处血管的连续性可能取决于几十甚至上百像素之外的上下文信息。举个例子,当血管穿过视盘区域时,由于视盘本身亮度很高,血管在穿行一段距离后亮度对比度会明显下降,如果只看局部patch,几乎不可能判断这里是有血管还是背景噪声。这时候必须借助全局的结构信息,比如这条血管在进入视盘之前和穿出视盘之后的走向,来反推中间应该补上连接。
CNN处理这个问题的方式非常直接,就是堆感受野。UNet通过层层降采样把底层特征图的感受野扩大,理论上最深一层的特征图能看到全图。但问题在于,深层特征的分辨率太低了,血管这种细结构的位置信息早就被池化操作稀释得差不多了。高分辨率特征保留在小尺度,但小尺度特征的感受野又有限。这是CNN架构里一个天然存在的两难矛盾。
1.2 方形卷积核在几何上的不匹配
我做了个简单的统计实验来验证一个猜想:DRIVE数据集中,眼底图像里的血管段,直线方向分布是否均匀。线性代数里的各向同性假设告诉我们,如果血管方向在0到180度范围内均匀分布,那么方形卷积核的使用是合理的。但实际统计结果不出意外地不均匀,水平方向和垂直方向附近的血管占比偏高,斜向45度和135度方向的比例要低不少。
问题就出在这里。方形卷积核本质上是一个各向同性的特征提取器,它对所有方向一视同仁。但视网膜血管的走向并不是各向同性的,分叉处、交叉处的几何结构尤其复杂。用方形核去贴合这种结构,要么为了贴合斜向血管而扩大核尺寸、引入过多背景噪声,要么让一部分方向的血管响应不够充分。
另一个更隐蔽的问题是:血管的宽度变化曲线和灰度剖面是一个近似高斯形状的分布,中心亮、两侧暗。CNN的卷积层在提取这种响应时,很容易在血管边缘处产生双层响应——形成类似"隧道边缘"的假阳性结构。这种问题在普通分割任务里很少被注意到,但在视网膜血管分割里特别致命,因为很多细血管和背景的对比度本身就非常低,边界模糊到连医生标注时都需要参考相邻切片。
提醒一下:判断一个分割模型在细管状结构上的能力,不要只看Dice和AUC,这两项指标对细血管断裂的惩罚非常弱。两根断裂的血管和一根完整的血管,在Dice上相差极小,但在拓扑学上完全是两个结果。想看"断裂"问题,必须盯着连通分量数和中心线Dice这类指标。
2. 从S4到Mamba:状态空间模型如何挣脱方形窗口的束缚
2.1 状态空间模型的建模本质
Mamba不是凭空出现的,它的直接前身是S4(Structured State Space Sequence Model),再往前可以追溯到经典的Kalman滤波思想——用一个隐状态去压缩过去所有信息,然后基于当前输入更新这个隐状态。
这个建模思路的数学表达非常简洁:给定一个输入序列,模型维护一个内部状态,每一步根据当前输入和历史状态更新内部状态,再基于内部状态产生当前输出。整个过程是一个线性时不变系统,可以写成递归形式,也可以通过卷积核展开实现并行计算。
S4的核心贡献在于找到了一个让这个递归系统高效计算的参数化方式。它把状态转移矩阵做成了HiPPO矩阵——一个能高效记忆历史信息的特殊矩阵结构。通过这个设计,模型可以在理论上一口气建模数千甚至上万长度的序列依赖,这在RNN时代是不可想象的。
Mamba进一步做了一件事:让状态转移矩阵变成输入依赖的、选择性的。也就是说,模型在处理序列中的每个位置时,根据当前输入决定要保留多少历史信息、接受多少当前信息。这个设计让模型能在长序列中自主决定哪些历史信息重要、哪些可以丢弃,而不是对所有位置一律等同对待。
2.2 图像怎么塞进序列模型:展平策略的演变
Mamba类模型天然处理的是1D序列,而图像天生是2D结构。怎么把2D图像映射成1D序列,是决定模型性能的关键一步,远不是随便拉直一行那么简单。
最早的做法是光栅扫描(raster scan),就像读书写字,从左到右、从上到下依次把图像拉成长序列。这个策略在自然图像分类里基本够用,因为图像块之间的语义关联方向性没那么强。但到了医学图像分割,光栅扫描导致的问题就很明显——扫描路径上的相邻元素在图像空间里不一定相邻,一条血管在图像空间里是一条连续的曲线,但拉直之后,它可能被切分到序列中两个相隔上千的位置。
后面出现了双轴扫描(dual-axis scan)和多方向扫描。思路很直接:在水平和垂直两个方向上分别展平图像,得到两个序列,分别喂给两个模型,再把输出融合。这个策略确实比光栅扫描好,但依然有一个更本质的问题——血管的走向是任意方向的,只用水平加垂直两个方向去逼近曲线,信息损失仍然存在。
2.3 Mamba在图像上的感受野优势
传统CNN在L层的堆叠之后,有效感受野只有理论感受野的很小一部分比例。实际有效感受野呈高斯分布,中心区域贡献大、边缘区域贡献小。要想让整个血管长度内的所有像素对中心像素的判断都有贡献,需要让有效感受野覆盖整个血管长轴方向,这对CNN来说非常吃力。
用Mamba处理整幅图像时,由于序列长度覆盖全图,理论感受野是全图,实际长距离依赖的建模能力也远强于CNN。这里的代价是位置信息,展平后图像的空间结构被打乱了,模型必须依靠位置嵌入或扫描策略来恢复空间对应关系。这也是为什么二维Mamba模型设计坐标编码、扫描策略时如此精细的原因所在。
3. Serp-Mamba的蛇形扫描机制:从血管拓扑学看扫描路径设计的合理性
3.1 蛇形扫描到底改了哪一步
Serp-Mamba对传统展平方法做了一个很关键的变化:把光栅扫描或双轴扫描改成蛇形扫描(Serpentine Scan)。光栅扫描的问题是:扫描完第一行之后,第二行是从左边重新开始,行与行之间信息是割裂的,本来在图像空间紧邻的上下两行像素,在序列里的距离却相差整整一行像素。蛇形扫描则把方向的问题直接抹平了——第一行从左扫到右,第二行从右扫到左,第三行再从左到右,像蛇一样蜿蜒覆盖整个图像,序列里相邻的元素在空间上也基本相邻。
这个操作看着简单,但对视网膜血管这种细长结构的影响是实打实的。血管作为连续曲线结构,像素之间天然具有沿着血管路径的长程依赖关系,这种依赖如果用Mamba建模,就需要在序列里让血管上的像素彼此靠近。光栅扫描拆断了大部分血管路径的连续性,蛇形扫描则保证了空间上的邻近性在序列里得到更好的保留。
Serp-Mamba更进一步的地方在于它不只是用一条蛇形路径扫描全图,而是设计了多个不同方向的蛇形路径,每个路径的结果在特征层面做融合。方向包括蛇形水平扫描、蛇形垂直扫描,以及对角方向的蛇形扫描,最后把各方向的特征拼接或合并。这背后其实是受到了多方向扫描用于视网膜血管分割的前作启发,比如当年用双向LSTM做血管分割的工作,也是靠多个方向的序列扫描去逼近血管的任意走向。
3.2 拓扑学视角下的扫描路径设计原则
为什么要强调扫描路径的连续性?这要从血管的拓扑结构说起。
血管网络本质上是一个树状图(tree graph)或者更精确地说是一个有环的连通图。主血管从视盘出发,逐级分叉成越来越细的毛细血管,最终形成覆盖整个视网膜的网络。在这个结构里,"连通"是最核心的拓扑属性。一根血管一旦断裂,在拓扑上就产生了两个额外的端点和一段缺失的边。
Serp-Mamba的多方向蛇形扫描,本质上是让模型在多个不同方向上都能建立长距离的像素级依赖。这样当一条血管沿着某个方向延伸到几十上百像素时,蛇形路径上的序列依赖也能沿着这条路径传播足够远。扫描路径的方向越接近血管的真实走向,状态传播的效率就越高。
3.3 和Swin Transformer的窗口注意力的本质差异
很多人容易把Mamba和Swin Transformer搞混,因为Swin也用了类似"窗口移位"的机制去扩大感受野。但二者的几何直觉完全不同。
Swin的做法是:把图像切成窗口,窗口内做注意力,然后通过窗口移位让不同层之间信息交互。它的核心逻辑是局部连接优先、窗口间信息通过层级的移动逐步扩散。问题在于,血管这种结构可以横穿多个窗口,而窗口边界上的信息交互效率比较低——跨窗口的长距离依赖依然要层层传递才能到位。
Mamba的设计则不一样。选择性扫描机制让模型能够在每个时间步决定"这个位置的信息要不要传递给后面的位置",这种机制天然适合处理血管这种"有些位置重要、有些不重要"的结构。血管像素密集区域,状态更新会很频繁;背景区域,状态更新几乎停滞。这种自适应的信息流控制,在Swin里很难实现,因为注意力权重的计算方式是矩阵运算,不同窗口之间的信息流通是由移位策略预先定义的,不能根据内容自主调整。
所以Mamba在血管分割上的优势不仅仅是长感受野,更是一种"信息沿着结构传导"的建模能力,这恰恰是血管拓扑结构最需要的。
4. 血管拓扑学视角的分割评估:断裂、分叉与连通性如何定义"好结果"
4.1 传统指标在拓扑上的失灵
先看一组我在DRIVE上做的对比实验数据。对同一个分割结果,分别计算Dice和clDice(中心线Dice),你会有一种"这真的是同一个结果吗"的错愕。一个能拿0.82 Dice的结果,clDice可能只有0.75。也就是说,Dice的虚高部分主要来源于粗血管区域的大面积正确预测,掩盖了细血管断裂、缺失、粘连的问题。
在这些常见指标里,Dice和IoU衡量区域重叠,但对细血管缺失的惩罚是线性的;AUC只看排序能力,断裂到只剩一半的血管同样能给高分;只有连通分量数、中心线Dice(clDice)、结构相似性指数(SSIM)这类拓扑或结构指标,才能暴露连续性问题。
我自己实际测试过,把一副眼底图的分割结果做形态学腐蚀,把细血管全部断开,Dice可能只掉1-2个百分点。但如果把clDice作为评估指标,同样的操作能掉5-8个点。这个敏感度差异,对追求临床应用价值的模型来说不是小事。
4.2 clDice为什么能捕捉拓扑信息
clDice的核心思想是:先把分割结果和真值都做拓扑细化(skeletonization),得到各自的中心线,然后计算两条中心线上像素的重合程度。中心线代表的是结构的骨架,保留了拓扑性质和走向信息,不关心管径粗细。
clDice = 2 × (Tprec × Tsens) / (Tprec + Tsens),其中Tprec表示预测中心线在真值骨架上的占比,Tsens表示真值中心线在预测骨架上的占比。当预测结果有一条完整的血管被断开,Tsens就会下降——因为真值中心线的这一段在预测骨架上找不到对应点。相比之下Dice只关心像素重叠,骨干断开但附近仍然有像素重叠,Dice照样不低。
4.3 拓扑学指标之外,还应该看什么
评估一个视网膜分割模型,我建议至少同时盯住三个维度:区域重叠、拓扑完整性、边界精度。区域重叠用Dice;拓扑完整性看clDice和连通分量数;边界精度看Hausdorff距离和平均对称表面距离。只看中间任何一个维度,都不能完整评价一个模型在临床或者科研场景下的真实表现。
5. 从论文到复现:Serp-Mamba在实际数据集上的表现与坑点
5.1 我复现Serp-Mamba的整体流程
我复现Serp-Mamba的工作流程是:环境准备、数据预处理、模型搭建、优化器选择、评估策略。环境上PyTorch 2.0以上,CUDA 11.8,显存大概12GB起步,如果显存不够可以用patch-wise训练。图像预处理先做灰度化,然后是CLAHE对比度增强、归一化,这一步尤其关键,眼底图像不同设备拍出来的亮度标准差相差极大,不做clahe的话,训练收敛速度和最终指标都会明显受影响。
数据增强方面:随机旋转、水平翻转、垂直翻转、随机亮度扰动、随机伽马校正,这几种组合就够了。因为视网膜血管结构本身形态固定,不会像自然图像那样需要剧烈的颜色抖动和裁剪增强。其中需要注意,血管分割的增强要避免使用随机缩放,缩放了血管宽度可能超出模型预期范围,反而干扰分割精度。
5.2 训练过程中的关键观察
我训练Serp-Mamba的batch size设为8,输入patch大小384×384,优化器选择AdamW,初始学习率3e-4,配合余弦退火调度,训练80个epoch。一个显著的体验是,Mamba类模型在前20个epoch收敛速度明显快于UNet,但到40-60个epoch阶段会出现一个"瓶颈期",损失下降非常缓慢。
这个瓶颈期的背后,我推测是模型正在从粗粒度血管走向精粒度边界的学习过程中,细血管和背景的对比度区分需要更多迭代。对应到实际训练上,处理方法是加一个啁啾式的损失权重调整——训练前期以BCE为主,后期增大clDice的权重,让拓扑约束在前景结构已经大致成形之后再发挥作用,效果比一开始就混合三个损失要好。
5.3 和CNN基线对比:到底输在哪
为了公平对比,我搭了两个对照组。第一组是标准的UNet训练了200个epoch,输入同样384×384的patch,确保充分收敛。第二组是Swin-UNet。结果表明,Serp-Mamba在Dice上比UNet高大约1.5到2个百分点,在clDice差距更大,能拉开4-5个百分点,连通分量数上也明显更少——也就是断裂更少。
从可视化结果看,UNet的问题主要集中在三级以下分支血管。中大型血管的分割质量和Serp-Mamba没有明显的视觉差距,明显拉开差距的就是细血管区域的完整性,分了叉的细血管Serp-Mamba基本都能保住骨架连接,UNet时不时就在分叉点处断了。
5.4 训练与推理中的几个坑
Mamba类模型对精度很敏感。训练时建议使用混合精度,但关键的正向传播层必须保持FP32,半精度状态下状态空间模型容易产生数值溢出。另外,Mamba的选择性扫描机制在长序列上具有明确的顺序性,batch size过大时梯度会出现累加误差,尤其用梯度累积来模拟大batch时,某些批次状态传递可能出现奇怪的不连续,建议梯度累积步数不超过4。
数据预处理时,图像归一化不是简单除以255,最好先用CLAHE再归一化到均值0、方差1。眼底图像不同通道的亮度差异很大,只在灰度图上做归一化不能充分抑制设备噪声。
6. 血管拓扑学告诉我们的事:用对方向,比堆模型更关键
回到标题那个问题:CNN在视网膜分割中真的"败给"Mamba了吗?我的看法是,这个问题的答案没那么绝对——CNN在粗血管区域的表现不仅不差,甚至在边界清晰度上还略占优势。Mamba的真正优势体现在细血管的连通性和分叉保持上,这是由建模机制决定的,而不是单纯靠模型规模堆出来的。
换一个角度讲,即使没有Mamba,上述復现过程中设计合理的损失函数,加上后处理算法,也能在连通性上追回不少分数。但代价是工程上要处理很多"补断线"的逻辑,而这些逻辑本质上就是在手工建模拓扑约束。Mamba的做法更优雅,把这种长程结构约束内化在模型机制里,让模型自己学习"这里应该连起来"。
对于做医学影像分割的同行,我的建议是:不要因为一个模型在自然图像上表现好就盲从,也不要因为一个模型原理花哨就直接跳过实验。先分析你的目标结构的几何特性和拓扑属性,再选择适合的建模方法。视网膜血管需要长程依赖、需要方向敏感性、需要连通性保持,恰好这些特性都指向了序列建模更适合这门任务。
如果你准备在自己的数据集上尝试Serp-Mamba,建议先在小规模数据上完整跑通全流程,验证扫描方向、序列长度、状态维度等关键设置对结果的影响。我之前花了一周时间调扫描方向的组合,最终确定水平和垂直方向之外,额外加入两张旋转90°的蛇形路径效果最稳。这个经验不一定适用于其他数据集,但可以作为一个调优思路参考。
最后再提醒一点:做医学图像方向,评估指标的选择比模型选择更容易被忽视。如果用clDice作为主要评估指标,你在不同模型之间的排序会和用Dice排序明显不同,这一点直接决定了你后续选择哪个模型做临床验证。拓扑学指标不该只是论文里算给审稿人看的附加项,它应该成为医学图像分割任务中真正参与决策的标准配置。