医学图像分割与通用语义分割:从U-Net到nnU-Net的主线脉络
做语义分割方向的研究和项目最难的不是看懂某一篇论文而是站在全局去判断“这个思路值不值得跟进”“这个方法在医学影像上能不能用”。我这两年把语义分割和医学图像分割两个方向的论文反复筛过几轮各种会议期刊、预印本、开源代码都过了一遍踩过不少只看标题就动手复现的坑也总结出了一套比较顺的读论文和选模型的方法。这篇就来盘一盘分割方向的主线脉络重点讲清楚医学图像分割和通用分割的差异以及哪些工作是真正值得精读的。如果你正准备入门分割方向或者已经在做医学影像相关的项目想快速建立自己的“论文地图”这篇文章可以直接当作索引用。1. 医学图像分割为什么不能照搬通用语义分割很多初学者会先入为主地认为医学图像分割只是通用语义分割在某个数据集上的应用把图像分类或分割的经典模型拿过来改个输入输出就能跑。这种思路不能算错但实际做项目时会发现医学影像的难度系数和通用视觉完全不在一个量级。得先弄清楚差异才能理解为什么后文提到的那些模型会被单独拎出来讲。先看数据的本质差异。通用分割处理的基本是自然图像比如街景、人像、家居场景类别之间的外观差异很大一个行人、一辆车、一棵树的纹理和形状有天然区分度。而医学图像往往是灰度影像CT、MRI、超声不同组织之间的灰度值接近边界不清晰病灶和周边正常组织的对比度可能只有几个灰度级。比如肝脏肿瘤分割肿瘤区域和肝实质在CT上都是软组织密度肉眼都很难分辨边界算法想单靠纹理或颜色特征切出准确轮廓难度非常大。再看样本量。通用分割常用的公开基准动辄上万张甚至几十万张标注图像而医学影像的标注高度依赖专业医生。一个熟练的放射科医生给一批CT切片逐层勾画器官边界一例就要几个小时所以医学分割公开数据集通常只有几十到几百例带精细标注的更是稀缺。数据量不足导致深度模型很容易过拟合训练集的Dice很高一换医院扫描仪、一换序列参数就崩。还有一个经常被忽略的问题类别不平衡。通用分割的类别分布虽然也有偏差但通常不会特别极端。医学场景里病灶区域往往只占整幅图像的百分之几甚至千分之几典型的比如肺结节检测结节像素可能只有整张CT的0.1%。如果用普通交叉熵损失模型很快就学会了把所有像素都预测为背景因为这样loss已经很低了。这也是医学分割必须特殊设计损失函数的原因。然后是空间维度的问题。通用分割处理的是2D图像3D的分割任务在自然图像领域很少遇到。但CT和MRI本身就是体数据横断面、冠状面、矢状面各有一组切片逐层2D分割会丢失切片间的空间连续性而直接做3D分割又要处理显存和标注密度的问题。医学图像分割的另一个常见场景是多模态输入同一个病人的T1加权MRI、T2加权MRI、增强扫描、PET/CT各序列提供不同方面的信息怎么把多模态特征有效融合也是通用分割很少考虑的课题。所以医学图像分割实际上是一个标签受限、边界模糊、正负类极端失衡、有时还是三维多模态输入的细分方向。通用分割的主线模型能提供基础能力但要在医学任务上真正落地必须针对这些特点做改造。下面几章从通用主线讲起再落到医学特化方案。2. 通用分割主线上的六个关键节点先梳理通用语义分割的发展主线。这条线其实非常清晰从全卷积到编码解码再到多尺度、注意力、Transformer每一代工作都在解决前一代的某个瓶颈。2.1 FCN开创了“全卷积”的革命2015年前后深度学习做图像任务的主流做法还是卷积层提取特征后接全连接层输出分类概率。要做像素级别的分割最直接的想法是对每个像素都跑一个分类但这样重复计算浪费严重。FCN的核心改动是把分类网络最后的全连接层全部换成卷积层让网络接受任意尺寸输入输出空间维度被保留的密集预测图再用转置卷积做上采样把低分辨率的特征图恢复到原图分辨率。这个改动看似简单但意义重大。我第一次复现FCN的时候最大的感触是理解了“感受野”的作用。最后一层卷积的感受野已经覆盖了足够大的范围所以输出的每个像素分类不只是看局部patch而是包含了全图上下文信息。FCN还引入了跳层结构把浅层的细节特征和深层的高层语义特征相加融合弥补上采样过程中丢失的边缘细节。它把语义分割真正变成了一个端到端的密集预测任务后续所有模型几乎都能追溯到这个框架。2.2 U-Net用跳跃连接打穿了编码解码的对称结构U-Net提出的时间比FCN晚不了多久但它的影响力在医学分割领域持续到今天。U-Net不是简单地把VGG之类的分类骨架改成全卷积而是精心设计了对称的编码器和解码器结构。编码器逐级下采样特征分辨率减半、通道数加倍解码器逐级上采样恢复分辨率每一级解码前都会把编码器对应级别的特征图拼接进来。这种“跳跃连接”让解码器同时获得高层语义和低层细节在边缘信息极其重要的医学分割任务上效果显著。U-Net能成为医学分割的基准模型背后是有道理的。医学数据集小模型太深容易过拟合U-Net参数量适中结构简单而且它的下采样压缩和上采样重建天然适配解剖结构的尺度变化。但也别神话它U-Net本身的改进空间很大后面几章我会具体展开医学方向怎么对它做改造。2.3 DeepLab系列和PSPNet用空洞卷积解决多尺度多尺度目标一直是分割难点。一张街景图里行人可能只有几十个像素卡车却能占满整幅图网络单尺度特征很难同时覆盖两类目标。空洞卷积是其中的关键工具它通过在卷积核里填零来扩大感受野不增加参数和计算量。DeepLab v2把不同膨胀率的空洞卷积并联起来组成ASPP模块每一路抓不同范围的特征最后拼接融合。PSPNet则更直接用不同大小的池化核做金字塔池化再上采样拼接得到全局上下文。我当时做城市街景分割项目时对比过这两类结构的实际效果ASPP对于中等尺度目标提升明显金字塔池化对全局场景理解更好。两者的共同思路是“在同一层特征上同时看宏观和微观”这一思想后来被Transformer里的多尺度窗口机制沿袭了。2.4 注意力机制从Non-local到自注意力传统卷积的感受野再大也是有限的而语义分割的理想状态是每个像素都能感知全图。Non-local工作第一次提出用自注意力机制计算任意两点间的响应关系让每个位置的输出依赖所有位置的特征极大增强了长距离依赖建模。之后DANet、CBAM、CCNet等在一个方向做文章有的把通道注意力和空间注意力分开做并联融合有的用稀疏图近似全图关系来降低计算量。自注意力其实就隐含了位置嵌入和全局建模Transformer架构在视觉方向兴起之后这类思想逐渐被新的范式取代。但Non-local时代的很多模块设计比如空间注意力、通道注意力、交叉注意力现在仍然出现在医学图像分割的论文里读历史工作可以帮助理解后续的混合架构。2.5 Transformer架构把分割变成了序列建模视觉Transformer在分类任务上成功后分割方向涌现了两条路线。一条是直接换骨架把编码器换成ViT或者Swin Transformer代表如SETR和Swin-UNet特征提取能力更强上下文建模更好但需要更大的数据预训练。另一条是编解码混合架构比如TransUNet用CNN作为编码器底层提取局部细节Transformer模块在中高层建模全局关系再交给CNN解码器恢复结构。Transformer对分割的真正贡献不在于替换卷积而在于打破了固定感受野的限制让模型天然具备了捕捉长距离依赖的能力。但代价也很明显——训练数据需求大、显存开销高、位置编码对输入尺寸敏感。医学分割数据量本来就不大纯Transformer架构直接训练效果往往还不如U-Net这也是后来很多工作走“混合”路线的现实原因。2.6 Mamba状态空间模型分割线最新的变量最近一两年状态空间模型SSM的代表作Mamba把分割社区又搅动了一遍。Mamba的核心是选择性扫描机制输入每个位置的隐藏状态都会根据当前内容动态决定保留和遗忘什么配合线性复杂度让长序列建模比Transfomer更高效。VM-UNet、U-Mamba这些工作把Mamba塞进U-Net式结构在长距离建模能力上想和Transformer掰手腕参数量和显存占用又比Transformer友好。不过这个方向刚起步工程上还不成熟。我复现过几版SSM分割模型发现它们对框架版本、GPU型号很敏感同一套代码换张卡可能结果差异很大。如果只是做项目不必急着换Mamba如果是水论文做创新点这个方向确实还有不少可做的位置值得持续关注。阶段代表结构核心贡献主要局限全卷积化FCN端到端密集预测上采样粗糙、边界差编解码U-Net跳跃连接融合细节感受野受限多尺度DeepLab/PSPNet空洞卷积/金字塔池化全局建模不足注意力Non-local系列长距离依赖计算复杂度高TransformerTransUNet/Swin-UNet全局自注意力数据要求高状态空间Mamba系列长序列低复杂度工程稳定性待验证3. 医学分割的专用武器从U-Net到nnU-Net通用分割的模型到了医学场景往往要经过专门改造才能发挥效果医学方向也慢慢发展出了自己的专用武器库。3.1 为什么U-Net成为医学分割事实上的标准答案不是简单的“因为效果好”而是因为U-Net的结构契合了医学图像三大痛点。第一跳跃连接在每一层都保留了解剖结构细节这对边界模糊的器官分割尤其重要深层语义可以告诉你“这是肝”浅层特征可以告诉你“肝的边界在哪”。第二U-Net对输入尺寸要求灵活医学影像设备出的图像尺寸千差万别U-Net可以裁剪成任意patch尺寸训练不像分类网络那样对输入固定不变。第三U-Net在少量训练数据下就能比较稳定地收敛这一点我在只有几十例标注数据的项目里反复验证过别的复杂模型经常不收敛U-Net调整一下学习率Dice一般能到可用水平。但是也别把U-Net当成万能药。原始U-Net的卷积层数和通道数是固定的没有针对不同器官大小做自适应配置。一个分割微小视网膜血管的模型和一个分割整个肝脏的模型需要完全不同的下采样层数和感受野。所以后续的改进工作很大一部分是在U-Net骨架上做结构搜索和自适应配置。3.2 从2D切片到3D体素V-Net与3D U-NetCT和MRI是三维体数据如果只做2D切片分割模型看不到相邻切片之间的解剖连续性。3D U-Net把编码器、解码器里的2D卷积全部换成3D卷积直接对整个体数据进行下采样和上采样。V-Net在此基础上引入了残差连接并在损失函数里首次使用了Dice系数作为优化目标。3D分割最大的工程挑战是显存。一个常见的CT体数据是512×512×200直接整块输入网络不现实。主流做法是随机裁剪成128×128×64之类的小patch配合滑动窗口推理。这样做的代价是模型看到的局部信息变多全局位置信息变少很多解剖结构是相对定位的比如胆囊一定在肝脏下方只看一个patch就丢失了这种位置线索。一些工作通过在模型头部加入位置编码或者降低第一层下采样倍率来缓解但这个问题至今没有彻底解决。3.3 nnU-Net一个把工程问题自动化的标杆如果说有哪个开源工具值得医学分割从业者无脑先跑一遍那一定是nnU-Net。它的核心思想很直接把U-Net在不同医学数据集上的最佳配置参数经验固化下来针对新数据集自动完成预处理、网络结构选择、patch尺寸、batch size、训练策略的配置不需要手工调参。我自己的经验是用nnU-Net做基线非常省心。它有三种预设模式2D、3D和3D全分辨率跑之前它会先分析数据的体素间距、图像形状、类别分布然后自动决定下采样次数、patch大小和损失函数权重。对于大多数规模适中的医学分割任务nnU-Net跑出来的结果已经超过很多手工设计的复杂模型这让医学分割的基线标准被抬高了一大截。新提出的模型如果连nnU-Net都打不过基本没有发表价值。不过nnU-Net也有局限。它高度依赖U-Net这个基础架构对于边界极其模糊或形态复杂的结构比如脑胶质瘤的浸润边界单靠U-Net式结构很难再往上突破。后续的很多医学分割创新比如基于Transformer的混合模型做成开源框架后经常拿nnU-Net来作为对比对象。3.4 多模态融合让模型同时看多种序列医学影像的分割很多时候不只看单一序列比如脑肿瘤分割通常同时使用T1、T1增强、T2和FLAIR四个序列的MRI每个序列对肿瘤不同区域的敏感度不一样。多模态融合最粗的方式是把多张图像并列拼成多个通道输入模型相当于造一个更大的输入张量。更精细的做法是在特征层面做融合编码器每个模态各走一条支路然后在某个深度把特征相加或者做注意力加权。自注意力机制天然适合多模态融合因为注意力可以学习“当前像素该更相信哪个模态”。有些工作甚至直接不区分模态通道把所有序列都塞进特征序列里让网络自己学效果反而不如显式区分模态的结构。我的建议是在数据规模有限时先用多通道输入这种简单方式能提几个点的Dice再考虑复杂融合结构因为后者对训练数据的量要求更高。3.5 小样本与半监督把未标注数据用起来医学影像标注贵未标注数据多所以半监督和自监督方向在医学分割里特别活跃。半监督的典型做法是先用少量标注数据训练一个教师模型教师模型对大量未标注数据预测伪标签再用伪标签和学生模型互相训练代表方法如Mean Teacher框架。自监督则直接不依赖标签通过对比学习或遮罩重建去学习影像的通用特征。这类方法在实际项目里的收益差异很大。如果标注数据本身已经有几十例半监督再多加几百例未标注数据提升通常有限如果标注数据只有个位数半监督带来的提升能接近一倍。自监督预训练在医学影像上的坑在于域差异太大在自然图像上预训练过的权重直接在医学数据上微调往往不如在相同模态的未标注医学数据上做自监督预训练哪怕数据量小一些。4. 损失函数与评估指标的实战选择很多论文在方法部分写清楚模型结构后损失函数往往被一笔带过仿佛只是像素交叉熵。但在医学分割里损失函数的选择几乎和模型结构同等重要直接决定模型收敛方向和最终精度。4.1 评估指标各有各的“盲区”先看评估指标因为损失函数设计通常要跟评估指标对齐。分割任务最常用的两类指标是Dice系数和IoU也叫Jaccard指数两者本质上是同一个东西的两种表达方式都是计算预测区域和真实区域的重叠程度只是Dice放大了一倍权重。它们的共同问题是两个方向都不奖励也不惩罚如果预测面积整体比真实区域大了一圈只要重叠部分不变大Dice也上不去如果病灶很小一个什么都没预测出来的模型和一个勉强圈住病灶中心的模型在Dice上的差距可能出乎意料地小。还有一个常用的是Hausdorff距离它衡量的是两个轮廓之间最远的距离差。Dice只看面积重叠不管边界形状是否吻合而Hausdorff距离对边界形状极其敏感。临床上更关注边界误差比如放疗靶区勾画需要精确到毫米级别此时光看Dice是不够的。我见过不少论文Dice刷得很高但边界的Hausdorff距离大得离谱这类模型直接临床上没有实用价值。指标衡量内容对病灶小的敏感度对边界匹配敏感度适合场景Dice/IoU面积重叠中等低通用报告像素准确率全图正确比例极低低仅作辅助Hausdorff距离最大边界误差高高放疗勾画、细分割平均表面距离平均边界偏差高高器官轮廓评估4.2 从交叉熵到Dice Loss再到组合损失交叉熵损失对每个像素独立计算损失天然适合于类别均衡的任务但医学分割里正负类比例极端失衡直接用交叉熵几乎必崩。处理失衡的第一个办法是加权交叉熵给出现次数少的类别更高权重但权重的设定很依赖人工经验和数据分布调起来非常痛苦。Dice Loss直接把Dice系数变成可微的损失函数它是区域级别的优化天然不惧类别不平衡模型不会陷入“全背景”陷阱。它的缺点是训练不稳定尤其是在刚开始训练时预测概率都很低Dice Loss的梯度过陡容易振荡。现在的通用做法是把Dice Loss和加权交叉熵组合起来前面几个epoch用较大权重监督全局分类后面逐渐让Dice Loss主导边界精修。还有一个值得一试的Boundary Loss它的思路是把分割问题建模为距离图回归优化预测边界和真实边界之间的距离。单独用不好但跟Dice Loss叠加能让分割边界更贴近真实轮廓显著降低Hausdorff距离。做放疗靶区这类对边界精度要求极高的项目时我会在组合损失里加上Boundary Loss这一项。4.3 我的组合配方与训练经验跑过大量分割实验之后我常用的配置是Dice Loss和Focal Loss按7比3的比例加权前面50个epoch用之后把Boundary Loss加进去权重设为0.3同时给不同器官类别的Dice Loss按体积倒数加权。这个配比不是从某一篇论文抄的而是针对不同任务反复调出来的未必适合你的数据但可以当作一个起点。具体的训练技巧方面有几个坑值得注意。第一医学影像数据增强一定不要用太暴力的几何变换水平翻转和随机旋转可以但不要做任意角度旋转因为解剖结构有固定的方向性肝脏不会倒着长。第二弹性形变是医学分割的经典增强方式模拟组织变形能明显提升在跨病人数据上的泛化能力。第三如果显存不够优先减小patch尺寸而不是减小batch sizepatch缩小语义信息受损严重而batch size小一点只是收敛慢效果损失相对小。5. 论文复现与训练技巧让代码跑出论文指标读论文只是第一步把论文里的方法真正跑起来又是一道坎。我复现过不下二十篇分割论文经验教训不算少这里集中讲一讲最容易出问题的几个环节。5.1 复现前的信息核对清单拿到一篇论文先别急着跑代码花二十分钟把下面几项核对清楚。第一训练数据是哪个版本训练集和验证集是否划分过如果论文用了五折交叉验证你只跑单折直接跟单模型结果对比是没意义的。第二输入图像预处理包括是否归一化、强度裁剪到哪个窗宽窗位、有没有使用类权重。第三训练时是否用了多尺度测试或翻转测试有些论文的最终结果依赖测试时增强TTA关掉之后指标会掉两三个点。第四训练使用的推理patch尺寸和滑窗步长推理时如果patch输入和训练时不一致性能也会波动。这四个信息在很多论文的正文里不会写全往往藏在补充材料或者开源代码的配置里。我的习惯是直接找代码仓库看它的默认配置文件和训练脚本宁可多花时间也不要盲跑。5.2 关于预训练权重的两难选择医学图像分割的模型初始化有两种常见方式。一是用ImageNet预训练的分类权重通用特征提取能力强但医学影像灰度分布和自然图像差异大底层特征其实用不太上。二是在同模态的未标注医学数据上做自监督预训练特征更贴合医学数据但预训练成本很高不是每个项目都有算力。我的观察是对于2D医学分割比如皮肤镜图像、眼底OCT图像用ImageNet预训练权重作为起点效果往往不错因为目标结构跟自然图像里的纹理有一定的可迁移性。对于3D CT/MRI分割ImageNet预训练权重根本用不上因为输入维度都不一样这类任务通常直接从零开始训练或者用公开模型在大规模同模态数据上预训练过的权重。做项目之前先想清楚输入数据是2D还是3D预训练策略完全不同。5.3 训练过程最常翻车的三个环节翻车点一学习率过大且没有预热。分割模型动辄几千万参数随机初始化后直接以较高的学习率训练前几百步loss不仅不降还会剧烈震荡甚至变成NaN。常见的解决方案是先用2到3个epoch做线性预热让学习率从极小值逐步升到正常值再按余弦退火方案逐步衰减。翻车点二验证指标和训练loss方向不一致。偶尔会看到训练Dice Loss稳定下降但验证Dice不升反降这是典型的过拟合信号。解决办法不是继续训练而是加强数据增强或加上早停。我一般会以验证集Dice作为监控指标连续15个epoch不刷新就保存当前最优模型并停止训练。翻车点三推理和训练时的操作不一致。最常见的是训练时做了归一化和数据增强推理时忘了套用相同的预处理pipeline或者归一化统计量用了batch统计而不是全数据集统计。找一个干净的验证样本把训练流程和推理流程的前处理输出对比一遍这种问题基本都能当场发现。5.4 把nnU-Net当作复现校准器如果手头论文的模型跑出来的指标比nnU-Net低先别怀疑论文造假先检查自己是不是哪里有疏漏。nnU-Net是我做医学分割实验的默认基线它的预处理、训练策略、推理流程全部整理成了规范模式只要数据格式按要求编排好跑出来的Dice就是当前数据集上一个相对公平的参考值。把复杂模型跟这个基线对比能暴露很多问题。比如有的模型在nnU-Net预处理过的数据上指标突然就正常了那是因为nnU-Net里的强度裁剪和归一化解决了很多模型对影像设备差异的敏感问题换了自己写的粗糙预处理就崩了。用nnU-Net的预处理管线把你的数据先期处理一遍再喂给自定义模型能大幅减少因为预处理差异导致的无效实验。6. 未来的三个方向基础模型、多模态与文本引导分割方向最近两年的变化比过去五年都大有些新趋势已经不只是论文里的概念开始逐渐进入实际项目。这里只讲我观察到的、且真正在落地的三个方向。6.1 分割基础模型的冲击以SAM为代表的提示分割模型兴起后“给我几个点或一个框就能把任意目标分割出来”已经成了现实。这类模型在自然图像上的零样本分割能力很强但直接拿医学图像测试表现并不理想。原因不复杂医学图像对比度低、边界模糊、结构相对固定而基础模型训练数据里这类样本占比很低。不过很多工作已经在做医学适配。一种思路是在医学影像数据上用指令微调的方式调整基础模型让它懂得“分割肝脏”“分割肿瘤”这样的文本指令。另一种思路是把基础模型当成一个特征提取器用它输出的嵌入特征来辅助传统分割模型在边界模糊的区域补充上下文信息。这类方法的实用价值现在还不好说因为医学分割对精度要求远高于自然图像但方向已经明确值得密切关注。6.2 多模态大模型带来的“全模态”记忆影像组学和多模态学习的趋势是把文本报告、基因组数据、病理切片和影像放在同一个模型框架里学习。这个方向在医学分割上的应用场景主要是解剖结构的语境理解。比如一个模型同时阅读MRI和对应的诊断报告报告描述“右侧额叶可见不规则强化灶”模型在后续分割时就能对位置和形态有先验预期。这类方法的工程实现难度不小最大的瓶颈是医学多模态数据的配对很难获取报告和影像标注往往来自不同的系统清洗和配准的成本很高。但一旦打通对边界模糊病灶分割的提升潜力很大是一个理论与实际都很有吸引力的方向。6.3 无监督与自监督分割真正开始实用化半监督和自监督从论文走向了工程原因很现实医学大数据里标注比例不足百分之一能自动利用未标注数据的模型就是降本增效的直接工具。目前比较实用的是两类一类是通过对比学习让模型学到不同扫描仪下同一结构的稳定表征模型对这个域差异不再敏感另一类是基于伪标签的自训练方法先在少量标注数据上训练对大量无标注数据预测并筛选高置信度样本加入训练集迭代几轮。这类方法在项目里的实施难点不在算法而在流程设计。伪标签筛选的阈值怎么定、每次新增样本量多少、怎么防止错误标签污染训练集这些都需要工程经验。我的建议是先在同一个数据源内部验证增益再考虑跨中心跨设备的场景不要一上来就挑战高难度的域泛化问题。做分割方向的论文解读本质上是在建立自己的一套坐标系。先弄懂通用分割的主线脉络再理解医学分割的特殊约束然后针对具体问题选择合适的模型结构和损失策略最后用标准化的基线工具去验证——这条路径我能走通我相信你也可以。如果刚开始建议直接从复现U-Net和nnU-Net入手把损失函数和训练流程跑熟再逐步扩展到Transformer、Mamba这些新结构脉络自然就清楚了。