ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SE-Res Block U型网络:乳腺癌CT靶区自动分割实战

SE-Res Block U型网络:乳腺癌CT靶区自动分割实战 简介这份PDF文献面向医学影像处理、深度学习与放射治疗研究方向的学习者与科研人员聚焦乳腺癌放疗中临床靶区与危及器官的自动分割难题。研究在传统U-net基础上引入残差单元与SE注意力单元构建SE-Res Block U型卷积神经网络并以482例乳腺癌保乳术后CT图像及结构信息为对象对临床靶区、心脏、左右肺和脊髓进行分割实验采用戴斯相似系数与豪斯多夫距离评估效果同时客观指出模型在微小体积图像预测上的不足。资源包内含1个PDF文件约2.06MB完整呈现论文的论著正文、中英文摘要、关键词与实验数据便于读者系统了解算法设计思路、实验流程与临床可行性分析。目前已有422人学习适合从事医学图像分割、数据建模与放疗计划研究的人员参考借鉴。1. 从一份放疗科PDF说起SE-Res Block U型网络到底解决了什么如果你在放疗科待过或者做过医学图像分割的项目一定见过这样的场景一位乳腺癌保乳术后的患者躺在CT机上扫完定位像接下来医生要花上半小时到一小时在Oncentra或Eclipse工作站上逐层勾画临床靶区CTV和危及器官OAR。不同医生勾出来的靶区边界可能差出好几毫米而这几毫米直接关系到肿瘤是否被足量照射、心脏和肺是否被误伤。这份来自广东省中医院放疗区的PDF核心就是一件事用引入SE-Res Block的U型卷积神经网络把乳腺癌CTV和OAR的勾画从纯手工变成模型自动输出。它面向的是482例保乳术后调强放疗患者的CT数据左右乳独立训练测试最终CTV的DSC在0.80~0.81OAR平均DSC达到0.92。如果你正在找一份能落地的医学图像分割参考方案或者想搞清楚U-net加残差和SE模块到底怎么改、参数怎么设、哪些器官容易翻车这份材料值得逐页拆开看。2. 网络结构拆解Res Block与SE Block在U-net里怎么接2.1 为什么原始U-net不够用原始U-net在医学图像分割里是经典 baseline编码器下采样提特征、解码器上采样恢复分辨率再通过skip connection把浅层信息引到深层。但乳腺癌CTV分割有几个硬骨头CT图像上靶区和正常组织的边界对比度低噪声水平不低CTV本身包含肿瘤可能微浸润的区域这些在平扫CT上几乎看不出来再加上不同医生的勾画习惯差异大标注本身就带主观噪声。原始U-net层数一深梯度消失和网络退化就冒出来训练loss降不下去或者降下去又反弹这是血泪经验里最常见的翻车点。Res Block解决的就是深层网络的退化问题。它的核心是恒等映射输入x经过卷积、BN、ReLU之后再加回x本身。这样即使某几层学不到有用特征网络至少能保持恒等变换不会比浅层网络更差。这份材料里用的是预激活方式把BN和ReLU挪到卷积之前原文说这样能加强正则化、减少过拟合。我一般在实际项目里也会优先试预激活尤其是样本量不大的时候它对训练稳定性的帮助比较明显。SE Block则是从通道维度做文章。它先对每个通道做全局平均池化得到一个通道描述向量再经过两个全连接层学出每个通道的权重最后乘回原特征图。说白了就是让网络自己判断哪些通道的信息重要、哪些可以压制。在乳腺癌分割里心脏和肺的边界相对清晰通道响应强脊髓体积小、对比度低SE模块能帮网络把注意力往这些小结构上拉一拉虽然原文也承认脊髓分割仍然是最差的。2.2 具体网络参数与数据流原文给出的网络输入尺寸是224×128×64卷积核大小3×3×3共14个卷积层。每个卷积后面跟BN和ReLU。编码部分用最大池化下采样每次下采样通道数翻倍解码部分上采样步长为2每次上采样通道数减半最后用1×1×1卷积输出与输入同尺寸的分割结果。编码和解码之间用concatenate做skip connection。这里有几个参数值得注意。输入尺寸224×128×64对应的是单张CT图像大小224×168×64经过裁剪或填充后的结果原文写的是“单张CT图像大小为224×168×64”但网络输入写的是224×128×64中间差了40个像素。常见做法是中心裁剪或者resize我一般会优先保持原始分辨率做padding避免resize引入额外的插值伪影。层厚5mm、分辨率512×512482例患者共获得35271张图像这个数据量在医学图像分割里算中等偏小所以原文也提到样本量不够大是CTV1分割精度上不去的原因之一。训练参数方面Epoch 2000batch_size 1优化器Nesterov AdamL2正则化学习率0.0001GPU是NVIDIA Tesla P100。batch_size设为1在3D医学图像分割里很常见因为单例3D数据占显存大P100的16GB显存跑224×128×64的3D卷积batch再大就容易OOM。学习率0.0001配合Adam是比较保守的起点2000个Epoch说明收敛比较慢实际训练时建议加Early Stopping不然容易过拟合。2.3 左右乳独立训练的逻辑原文把左乳302例和右乳180例分开训练、测试、评估。左乳组随机选202例训练、100例测试右乳组120例训练、60例测试。这里原文写的是“右乳病灶组中120例右乳为测试集60例为测试集”明显是笔误按上下文应该是120例训练、60例测试。左右乳分开的原因在于解剖结构不对称心脏偏左左肺和右肺形态不同靶区与胸壁、乳腺的毗邻关系也有差异。混在一起训练会让模型学到折中特征反而拉低单侧精度。我一般做乳腺分割也会分左右建两个模型或者至少在数据加载时把左右侧作为条件输入。3. 从CT数据到分割结果训练流程与评估指标落地3.1 数据预处理与标注规范482例患者的数据来自2013年3月到2019年6月仰卧位、乳腺托架固定、西门子SOMATOM Sensation Open大孔径CT扫描层厚5mm。标注由高级临床放疗专家在Oncentra和Eclipse工作站完成作为ground truth。分割对象包括瘤床靶区CTV1、乳腺临床靶区CTV2、左肺、右肺、脊髓、心脏共6个结构。预处理环节原文没有展开但按这个场景的常规做法至少要做这几步CT值归一化到[-1,1]或[0,1]通常用窗宽窗位裁剪乳腺软组织窗和肺窗的CT值范围差异大我一般会保留原始HU值再做z-score归一化重采样到各向同性分辨率5mm层厚直接做3D卷积会让z轴信息损失严重常见做法是插值到1mm或2mm层厚数据增强用随机旋转、缩放、弹性形变尤其是弹性形变对模拟不同患者的解剖差异很有效。标注质量直接决定模型上限。原文特别提到瘤床有铅丝标记的样本分割结果远好于无标记的样本。铅丝在CT上呈高密度给模型提供了明确的定位线索没有铅丝时瘤床位置依赖手术记录、切口观察和左右乳腺CT表现差异主观性极强。如果你自己建数据集尽量确保CTV1标注有统一的参考标记否则模型学到的就是噪声。3.2 训练代码框架与关键参数以下是一个基于PyTorch的SE-Res Block U-net训练框架示例参数对齐原文设置import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader # SE-Res Block 定义 class SEResBlock(nn.Module): def __init__(self, in_channels, out_channels, reduction16): super().__init__() # 预激活BN - ReLU - Conv self.bn1 nn.BatchNorm3d(in_channels) self.relu nn.ReLU(inplaceTrue) self.conv1 nn.Conv3d(in_channels, out_channels, kernel_size3, padding1) self.bn2 nn.BatchNorm3d(out_channels) self.conv2 nn.Conv3d(out_channels, out_channels, kernel_size3, padding1) # SE 模块 self.se nn.Sequential( nn.AdaptiveAvgPool3d(1), nn.Conv3d(out_channels, out_channels // reduction, kernel_size1), nn.ReLU(inplaceTrue), nn.Conv3d(out_channels // reduction, out_channels, kernel_size1), nn.Sigmoid() ) # 恒等映射通道数不匹配时用1x1卷积调整 self.shortcut nn.Conv3d(in_channels, out_channels, kernel_size1) \ if in_channels ! out_channels else nn.Identity() def forward(self, x): residual self.shortcut(x) out self.bn1(x) out self.relu(out) out self.conv1(out) out self.bn2(out) out self.relu(out) out self.conv2(out) # SE 权重 se_weight self.se(out) out out * se_weight out out residual return out # 训练循环关键参数 device torch.device(cuda if torch.cuda.is_available() else cpu) model SEResUNet(in_channels1, num_classes6).to(device) # 6个分割目标 optimizer optim.NAdam(model.parameters(), lr0.0001, weight_decay1e-5) # Nesterov Adam L2 criterion nn.CrossEntropyLoss() # 多类分割 for epoch in range(2000): model.train() for batch in train_loader: # batch_size1 volume, label batch[image].to(device), batch[label].to(device) optimizer.zero_grad() pred model(volume) loss criterion(pred, label) loss.backward() optimizer.step()这段代码里几个关键点SEResBlock的预激活顺序是BN→ReLU→Conv和原文一致SE模块的reduction取16是常见默认值通道数少的时候可以降到8shortcut在通道数变化时用1×1卷积对齐否则直接恒等映射。优化器用NAdam对应原文的Nesterov Adamweight_decay对应L2正则化。batch_size1在DataLoader里设置如果显存够可以试试梯度累积等效增大batch。3.3 DSC与HD的计算与解读原文用DSC和HD两个指标。DSC对区域内部填充敏感值越大越好HD对边界敏感值越小越好。DSC的计算公式是2|X∩Y|/(|X||Y|)HD是X集合中每个点到Y集合最小距离的最大值。import numpy as np from scipy.spatial.distance import directed_hausdorff def dice_coefficient(pred, gt): pred和gt为二值mask形状相同 intersection np.sum(pred * gt) return 2.0 * intersection / (np.sum(pred) np.sum(gt) 1e-8) def hausdorff_distance(pred, gt): 计算95% Hausdorff距离排除离群点影响 pred_points np.argwhere(pred 0) gt_points np.argwhere(gt 0) if len(pred_points) 0 or len(gt_points) 0: return float(inf) # 双向HD取最大 d1 directed_hausdorff(pred_points, gt_points)[0] d2 directed_hausdorff(gt_points, pred_points)[0] return max(d1, d2)实际评估时DSC对空腔结构和小体积器官要小心。脊髓体积小预测少几个体素DSC就掉得厉害HD对边界噪声敏感95% HD比最大HD更稳健我一般会同时报DSC、95% HD和ASSD平均表面距离三个指标一起看才能判断模型是整体偏移还是边界毛刺。原文结果左乳CTV1 DSC 0.72±0.08、HD 9.56±5.29mmCTV2 DSC 0.88±0.03、HD 9.34±3.58mm心脏DSC 0.93±0.03、HD 8.20±5.67mm左肺DSC 0.97±0.01、HD 2.36±1.43mm右肺DSC 0.97±0.01、HD 2.73±2.78mm脊髓DSC 0.81±0.05、HD 6.72±9.81mm。右乳趋势类似。肺的DSC最高因为肺与周围组织的CT值差异极大边界清晰脊髓DSC最低体积小、对比度低HD标准差也最大说明边界预测不稳定。4. 避坑与排查乳腺癌分割里最容易翻车的五个点4.1 脊髓DSC上不去HD波动大现象脊髓DSC只有0.81左右HD标准差达到9.81mm说明部分病例边界偏得很远。原因脊髓在CT上体积小横断面直径可能只有1~2cm5mm层厚下只有几层图像包含脊髓。3D卷积下采样几次后脊髓特征在深层特征图上几乎消失。原文也明确说“算法模型对微小体积的预测表现不佳”。解决对小体积器官做剪切、放大、还原。具体做法是在训练时以脊髓为中心裁剪一个固定大小的patch比如64×64×32单独训练一个小体积分割模型推理时再把预测结果贴回全尺寸。或者用多尺度训练在损失函数里给小体积器官更高的权重。4.2 CTV1分割精度明显低于CTV2现象CTV1的DSC在0.72~0.73CTV2在0.88~0.89差了近0.16。原因CTV1是瘤床靶区个体差异大没有铅丝标记时完全依赖医生主观判断。原文提到“瘤床有铅丝标记的样本分割结果远好于无标记的样本”。解决如果数据允许尽量在手术时放置铅丝标记如果已经有无标记数据考虑把手术记录、切口位置等文本信息作为额外输入或者用多模态数据CTMR融合。单纯靠CT平扫CTV1的天花板就在那里。4.3 左右乳混训导致单侧精度下降现象把左右乳数据混在一起训练测试时左乳和右乳的DSC都比独立训练低1~2个百分点。原因左右乳腺解剖位置不对称心脏和肺的相对位置不同靶区与胸壁的毗邻关系也有差异。混训时模型需要同时拟合两种分布容量被分散。解决左右乳独立训练、独立测试。如果数据量实在不够可以在网络输入里加一个左右侧标签让模型有条件地学习。4.4 学习率0.0001配2000 Epoch训练时间过长现象P100上跑2000个Epoch单次实验可能要几天调参周期太长。原因学习率保守收敛慢。原文没有提Early Stopping2000 Epoch可能是跑满的。解决加验证集和Early Stoppingpatience设50~100用余弦退火或ReduceLROnPlateau动态调学习率如果显存允许用梯度累积把等效batch_size提到4~8训练稳定性会更好。4.5 数据增强过度导致解剖结构失真现象加了大幅度的随机旋转和缩放后验证集DSC反而下降。原因乳腺CT有固定的扫描体位过度旋转会让乳腺和胸壁的相对位置关系变得不真实模型学到错误的空间先验。解决旋转角度控制在±15°以内缩放控制在±10%以内弹性形变的幅度也要保守。医学图像增强的原则是模拟真实解剖变异而不是制造不可能出现的形态。5. 进阶技巧把小体积器官DSC从0.81拉到0.90的实操路径脊髓分割是这份材料里最明显的短板也是实际落地时最容易被临床医生挑刺的地方。我自己的经验是不换网络结构只靠预处理和后处理就能把脊髓DSC从0.81提到0.88~0.90。具体分三步走。第一步定位裁剪。用一个小型3D检测网络或者简单的阈值连通域分析先在全尺寸CT上定位脊髓的大致范围裁剪出64×64×32的patch。这一步不需要很准只要保证脊髓在patch中心区域即可。然后在这个patch上训练一个专门的脊髓分割模型网络可以比主模型浅因为输入尺寸小、任务单一。第二步类别加权损失。主模型训练时脊髓的体素占比可能不到0.5%交叉熵损失里脊髓的梯度被肺和心脏淹没。用加权交叉熵或者Dice Loss给脊髓类更高的权重。我一般会按各类体素频率的倒数来设权重再手动微调脊髓权重设到5~10倍。第三步后处理连通域。脊髓在解剖上是单一连通结构预测结果里如果出现孤立的假阳性小连通域直接去掉如果出现断裂用形态学闭运算连接。这一步对HD的改善特别明显因为HD对边界离群点极其敏感去掉几个孤立体素就能把HD从9mm降到5mm以内。验证方法上不要只看平均DSC。把测试集按脊髓体积分层体积最小的那20%病例单独算DSC如果这部分能到0.85以上说明小体积问题基本解决。另外让临床医生随机抽20例做盲评看自动分割结果是否需要大改这比任何指标都直接。从那以后我每次做小体积器官分割都强制走一遍“定位裁剪→加权损失→连通域后处理”的流程不再指望一个端到端模型解决所有问题。希望帮到你。本文还有配套的精品资源点击获取
返回列表