Python: 基于U-Net++的颈动脉超声图像分割算法研究
0 引言心血管疾病是全球范围内导致死亡和残疾的主要原因之一[1]。颈动脉作为连接心脏与大脑的关键血管其健康状况直接反映了全身动脉粥样硬化的程度[2]。通过颈动脉超声图像评估颈动脉内中膜厚度Intima-Media Thickness, IMT及斑块负荷是临床早期诊断脑卒中风险、冠心病风险以及评估治疗效果的重要手段[3-4]。然而准确地将颈动脉结构从超声图像中分割出来是进行上述量化分析的前提与步骤。近年来以深度学习为代表的卷积神经网络Convolutional Neural Network, CNN技术在医学图像分割领域取得了突破性进展[5-6]。其中U-Net及其变体凭借其对称的编码器-解码器结构和跳跃连接成为医学图像分割的主流框架[7]。然而标准U-Net在处理复杂超声图像时仍面临挑战随着网络深度增加容易出现梯度消失或退化问题导致网络难以充分提取颈动脉超声图像中微妙的边界特征和细节信息。此外单一尺度的跳跃连接难以有效融合深层语义信息与浅层细节特征限制了分割精度的进一步提升。为解决上述问题本文提出了一种基于U-Net架构的颈动脉超声图像分割算法。U-Net通过引入嵌套的跳跃路径和密集的卷积块对不同尺度的特征图进行多层级、多分辨率的特征重新提取与融合从而增强了网络对颈动脉边界识别能力。实验结果表明本文所提算法相较于前面工作[8]能够实现更精确、稳定的颈动脉区域分割为后续的临床定量分析与自动化诊断提供了可靠的技术支持。目录0 引言1 数据2 U-Net 模型3 实验设置3.1 数据预处理3.2网络架构3.3 实验参数4 实验结果与讨论4.1 训练损失曲线4.2 定量分析结果4.3 可视化结果4.4 总结与讨论参考1 数据本文实验所用颈动脉超声图像均来源于Kaggle公开平台该数据集共包含2200张高质量超声图像数据采集自11名不同受试者每名受试者均完成至少双侧颈部左右两个部位的超声检查数据集整体分为两个文件夹其中超声图像文件夹包含1100张图像每名受试者对应采集100张颈动脉超声图像为分割任务提供原始输入数据专家标注掩码文件夹包含1100张掩码图像该类掩码由专业技术人员制作并经临床专家审核验证可作为颈动脉分割任务的标准参考标签为模型训练与性能评估提供依据所有超声图像均采用Mindary UMT-500Plus超声机搭配L13-3s线性探针拍摄采集在11名受试者中2人采用血管法进行超声检查8人采用颈动脉法完成检查原始采集的时间序列DICOM格式图像经预处理转换为PNG格式该数据集图像基本特征为分辨率709×749×3RGB三通道彩色图像存储格式为PNG数据量总计2200张含1100张原始超声图像、1100张专家标注掩码。如图1和图2所示一名受试者的原始超声图像和对应的掩码。数据连接Carotid Ultrasound Images图1 原始图像图2 掩码图像2 U-Net 模型U-Net模型由 Zhou 等人[9]在 2018 年提出是对经典 U-Net 的改进主要在增强特征传递和多尺度特征融合方面进行了优化。原始 U-Net 的跳跃连接是直接将编码器的特征图与解码器的特征图拼接但两者之间语义差异较大编码器特征偏向底层细节解码器特征偏向高层语义直接拼接会导致融合效果不佳。U-Net 的核心改进就是通过嵌套的 U 形结构 密集跳跃连接缩小这种语义差距。如图3所示U-Net 以经典的 U-Net 编码器 - 解码器架构为基础左侧的→→→构成下采样 Backbone通过卷积与池化操作逐步提取多尺度特征。与原始 U-Net 不同其解码器路径不再是简单的上采样与直接拼接而是在每一级特征图上构建了多个嵌套的子 U-Net 结构如图 (a) 中绿色节点,, ...,并通过密集跳跃连接虚线箭头将这些子网络的输出传递至后续同层级节点。具体而言下采样↓、上采样↑与密集跳跃连接---共同构成了跨层特征传递路径实现了不同层级特征的高效复用。以图 (b) 中i0层级的嵌套融合过程为例节点由编码器输入与上采样后的融合得到后续节点则进一步融合了、前置节点及上采样特征以此类推形成一条密集的特征传递链让每一级节点都能融合当前层级所有前置节点的特征从而实现更充分的多尺度信息交互。U-Net 中每个节点的输出由上一层下采样特征和当前层之前所有节点的特征共同融合得到其中第 i 层下采样深度第 j 个嵌套层级节点的输出特征来自上一层编码器下采样的特征当前层前面所有嵌套节点的特征实现了 密集”的跨节点传递。激活函数如 ReLU是可学习的参数。U-Net 解决了原始 U-Net 跳跃连接中语义不匹配的问题从而在不显著增加计算量的前提下提升了医学图像分割等任务的性能。因此U-Net 通过合理设计控制参数量保持了高效率和良好的性能适用于医学图像等复杂场景[10]。图3 U-Net模型结构图注图来自于 U-Net原理与实现(含Pytorch和TensorFlow源码) - 技术栈注U-Net模型代码链接https://github.com/MrGiovanni/UNetPlusPlusU-Net模型论文链接 UNet: A Nested U-Net Architecture for Medical Image Segmentation3 实验设置3.1 数据预处理实验采用颈动脉超声图像数据集第1节所叙述包含超声原图与标注的掩码。图像与标签按文件名一一对应数据总量为1100名受试者。按照 8:2 比例随机划分为训练集与测试集保证数据分布一致。数据预处理流程如下1读取超声图像将像素值归一化至 [0,1]2分割标签采用灰度图读取将前景像素值 255 映射为 1背景为 0构建二分类标签3将图像与标签转换为张量格式并调整通道顺序以适配 PyTorch 输入格式。3.2网络架构本实验采用U-Net 模型以经典 U-Net 为基础架构通过引入嵌套子网络结构与密集跳跃连接实现特征高效融合。网络包含编码器、嵌套解码器与密集跳跃连接三部分。编码器通过 4 次下采样逐步提取多尺度深层特征解码器采用嵌套式结构通过多次上采样与密集特征融合逐步恢复分辨率并在每一级编码器与解码器之间、各子 U-Net 结构内部构建密集跳跃连接实现底层细节特征与高层语义特征的充分传递与利用。网络结构详见图 3。核心密集融合块遵循卷积→批量归一化→激活的双卷积结构并通过多源特征拼接实现密集交互有效缩小编码器与解码器间的语义鸿沟提升网络特征利用效率与分割精度实现颈动脉超声图像分割任务。基于U-Net 原理本文的网络的架构代码如下class DoubleConv(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.double_conv nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size3, padding1), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue), nn.Conv2d(out_channels, out_channels, kernel_size3, padding1), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue) ) def forward(self, x): return self.double_conv(x) class UNetPlusPlus(nn.Module): def __init__(self, in_channels3, num_classes2): super().__init__() self.conv0_0 DoubleConv(in_channels, 16) self.pool1 nn.MaxPool2d(2) self.conv1_0 DoubleConv(16, 32) self.pool2 nn.MaxPool2d(2) self.conv2_0 DoubleConv(32, 64) self.pool3 nn.MaxPool2d(2) self.conv3_0 DoubleConv(64, 128) self.pool4 nn.MaxPool2d(2) self.conv4_0 DoubleConv(128, 256) # Decoder self.up3_1 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv3_1 DoubleConv(256 128, 128) self.up2_1 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv2_1 DoubleConv(128 64, 64) self.up2_2 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv2_2 DoubleConv(128 64 64, 64) self.up1_1 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv1_1 DoubleConv(64 32, 32) self.up1_2 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv1_2 DoubleConv(64 32 32, 32) self.up1_3 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv1_3 DoubleConv(64 32 32 32, 32) self.up0_1 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv0_1 DoubleConv(32 16, 16) self.up0_2 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv0_2 DoubleConv(32 16 16, 16) self.up0_3 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv0_3 DoubleConv(32 16 16 16, 16) self.up0_4 nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) self.conv0_4 DoubleConv(32 16 16 16 16, 16) self.out nn.Conv2d(16, num_classes, kernel_size1) def forward(self, x): conv0_0 self.conv0_0(x) conv1_0 self.conv1_0(self.pool1(conv0_0)) conv2_0 self.conv2_0(self.pool2(conv1_0)) conv3_0 self.conv3_0(self.pool3(conv2_0)) conv4_0 self.conv4_0(self.pool4(conv3_0)) up3_1 self.up3_1(conv4_0) up3_1 F.interpolate(up3_1, sizeconv3_0.shape[2:], modebilinear, align_cornersFalse) conv3_1 self.conv3_1(torch.cat([conv3_0, up3_1], dim1)) up2_1 self.up2_1(conv3_0) up2_1 F.interpolate(up2_1, sizeconv2_0.shape[2:], modebilinear, align_cornersFalse) conv2_1 self.conv2_1(torch.cat([conv2_0, up2_1], dim1)) up2_2 self.up2_2(conv3_1) up2_2 F.interpolate(up2_2, sizeconv2_0.shape[2:], modebilinear, align_cornersFalse) conv2_2 self.conv2_2(torch.cat([conv2_0, conv2_1, up2_2], dim1)) up1_1 self.up1_1(conv2_0) up1_1 F.interpolate(up1_1, sizeconv1_0.shape[2:], modebilinear, align_cornersFalse) conv1_1 self.conv1_1(torch.cat([conv1_0, up1_1], dim1)) up1_2 self.up1_2(conv2_1) up1_2 F.interpolate(up1_2, sizeconv1_0.shape[2:], modebilinear, align_cornersFalse) conv1_2 self.conv1_2(torch.cat([conv1_0, conv1_1, up1_2], dim1)) up1_3 self.up1_3(conv2_2) up1_3 F.interpolate(up1_3, sizeconv1_0.shape[2:], modebilinear, align_cornersFalse) conv1_3 self.conv1_3(torch.cat([conv1_0, conv1_1, conv1_2, up1_3], dim1)) up0_1 self.up0_1(conv1_0) up0_1 F.interpolate(up0_1, sizeconv0_0.shape[2:], modebilinear, align_cornersFalse) conv0_1 self.conv0_1(torch.cat([conv0_0, up0_1], dim1)) up0_2 self.up0_2(conv1_1) up0_2 F.interpolate(up0_2, sizeconv0_0.shape[2:], modebilinear, align_cornersFalse) conv0_2 self.conv0_2(torch.cat([conv0_0, conv0_1, up0_2], dim1)) up0_3 self.up0_3(conv1_2) up0_3 F.interpolate(up0_3, sizeconv0_0.shape[2:], modebilinear, align_cornersFalse) conv0_3 self.conv0_3(torch.cat([conv0_0, conv0_1, conv0_2, up0_3], dim1)) up0_4 self.up0_4(conv1_3) up0_4 F.interpolate(up0_4, sizeconv0_0.shape[2:], modebilinear, align_cornersFalse) conv0_4 self.conv0_4(torch.cat([conv0_0, conv0_1, conv0_2, conv0_3, up0_4], dim1)) out self.out(conv0_4) return out3.3 实验参数U-Net 模型的训练批次大小为 4共训练 50 轮采用 AdamW 优化器初始学习率为 1×10⁻⁴学习率随余弦退火策略动态调整。损失函数采用交叉熵损失与 Dice 损失的混合函数以提升目标分割效果。定义如下[6]其中交叉熵损失计算公式为Dice损失用于缓解类别不平衡其公式为其中pred 为模型预测的分割结果集合true 为金标准真实标注的分割结果集合∣pred∩true∣ 为预测与真实区域的交集像素数∣pred∣∣true∣ 为预测与真实区域的总像素数之和。评价指标包括 Dice、IoU、精确率、召回率与 F1 分数。分别定义如下[11-12]其中A模型预测的分割区域集合B真实标注金标准的分割区域集合TPTrue Positive真正例预测为正、实际为正的样本数FPFalse Positive假正例预测为正、实际为负的样本数FNFalse Negative假负例预测为负、实际为正的样本数。4 实验结果与讨论4.1 训练损失曲线图4为 U-Net 模型在训练集与测试集上的损失变化曲线。从整体趋势来看模型的训练损失与测试损失均随训练轮数Epoch增加呈现快速下降并逐步收敛的态势表明模型在训练过程中持续学习并有效降低了预测误差。训练初期前 10 个 Epoch训练损失与测试损失均出现显著下降训练损失从约 0.78 快速降至 0.1 以下测试损失也从约 0.65 同步下降至 0.1 附近说明模型此时处于快速拟合阶段能够有效学习数据中的基础特征。随着训练推进至 20 个 Epoch 后两条曲线的下降趋势明显放缓并逐渐趋于平稳在训练后期30 个 Epoch 之后训练损失与测试损失均稳定在 0.02 以下且两者之间的差距极小未出现测试损失明显反弹或持续高于训练损失的现象表明模型未发生明显过拟合泛化能力表现良好。整体而言该损失曲线表明 U-Net 模型在本实验设置下训练过程稳定能够有效收敛并同时在训练集与测试集上取得较低的损失值验证了模型在颈动脉超声图像分割任务中的训练有效性与泛化可靠性。图4 U-Net 模型在训练集与测试集上的损失变化曲线4.2 定量分析结果基于表1中三种模型在颈动脉超声图像分割任务上的性能指标从整体性能来看U-Net 模型在各项核心指标上均表现最优展现出更强的综合分割能力。Dice 系数与 IoUU-Net 的 Dice 系数0.9564和 IoU0.9172均为三者最高较次优的 ResU-Net 分别提升了 0.0039 和 0.0068较 ConvNeXt-Transformer 分别提升了 0.0049 和 0.0095说明其预测结果与真实标签的重叠度更高分割完整性与准确性更好。Precision 与 RecallResU-Net 的 Precision 最高0.9732说明其预测为正样本的结果中真实正样本占比更高而 U-Net 的 Recall0.9469优于其他两种模型说明其能更全面地识别出所有真实正样本漏检率更低。U-Net 在 Precision0.9668与 Recall 之间实现了良好平衡既保证了预测的精准度也提升了目标的检出率。F1 分数U-Net 的 F1 分数0.9564为三者最高进一步验证了其在精确率与召回率之间的综合表现最优模型的整体分割性能更均衡、更可靠。对比其他模型ResU-Net 虽然在 Precision 上表现突出但 Recall 略低于 U-Net说明其在降低误检率的同时牺牲了一定的目标检出能力ConvNeXt-Transformer 的各项指标均略低于前两者整体性能稍逊。综合来看U-Net 凭借嵌套的 U 形结构与密集跳跃连接有效缓解了编码器与解码器间的语义鸿沟实现了多尺度特征的高效融合在颈动脉超声图像分割任务中展现出更优的分割精度与泛化能力。表1 三种模型在颈动脉超声图像分割任务上的性能指标4.3 可视化结果由图5所示从可视化分割结果来看U-Net 模型在颈动脉超声图像分割任务中展现出了优异的性能预测结果与真实标签Ground Truth高度吻合1整体一致性高在所有 10 组样本中模型预测的目标轮廓、位置和大小均与真实标签高度匹配能够准确识别出颈动脉血管区域验证了模型在不同超声成像条件下的鲁棒性。2边缘细节拟合良好对于血管壁等关键边缘结构模型的预测结果能够较好地还原真实轮廓分割边界平滑且误差极小有效捕捉了目标的形态特征说明嵌套结构与密集跳跃连接带来的多尺度特征融合对细节信息的保留能力较强。3伪影与噪声抑制有效即使在图像对比度较低、存在超声伪影的区域如 Image 4 中血管周围的复杂组织背景模型也未出现明显的误分割或假阳性预测仅存在极少量噪声点整体抗干扰能力较强。综合来看U-Net 能够稳定、准确地完成颈动脉超声图像的分割任务具备良好的临床应用潜力。图5 U-Net 模型分割结果4.4 总结与讨论本文以颈动脉超声图像分割为目标构建了基于 U-Net 的分割模型并通过定量指标与定性可视化结果对其性能进行了全面验证同时与 ConvNeXt-Transformer、ResU-Net 模型进行了对比分析。实验结果表明U-Net 在本任务中展现出了显著的性能优势定量指标层面U-Net 的 Dice 系数0.9564、IoU0.9172、Recall0.9469及 F1 分数0.9564均为三种模型中的最优值其中 Dice 与 IoU 指标较次优的 ResU-Net 分别提升了 0.0039 与 0.0068验证了其在分割重叠度与完整性上的优势同时其精确率0.9668与召回率的平衡效果最优既保证了目标检出率也有效控制了误分割。定性结果层面可视化分割结果显示U-Net 对不同形态的颈动脉区域均能实现精准分割预测轮廓与真实标签高度吻合边缘细节还原度高且对超声图像中的噪声、伪影具有较强的鲁棒性。训练稳定性层面模型的训练损失与测试损失均呈现快速下降并平稳收敛的趋势训练后期两者差距极小未出现明显过拟合现象表明模型的训练过程稳定泛化能力可靠。上述结果共同验证了 U-Net 嵌套结构与密集跳跃连接的有效性该设计通过多尺度特征的高效融合缓解了传统 U-Net 编码器与解码器间的语义鸿沟问题让底层细节特征与高层语义特征实现更充分的交互从而提升了分割的精度与稳定性。对比 ConvNeXt-Transformer 与 ResU-NetU-Net 的性能差异主要源于其架构设计特点相较于 ResU-NetU-Net 的 Recall 指标更优说明其对目标区域的漏检率更低这得益于密集跳跃连接对细节特征的复用而 ResU-Net 在 Precision 上表现突出反映出其在减少假阳性预测上的优势两者的性能差异也体现了不同架构在 “精准度” 与 “检出率” 上的侧重不同。相较于 ConvNeXt-TransformerU-Net 在各项指标上均更具优势这表明在颈动脉超声这类纹理复杂、边缘模糊的医学图像分割任务中基于 U 形架构的嵌套特征融合机制比混合卷积 - Transformer 架构更能适配任务需求同时也具备更低的计算复杂度与训练成本。尽管 U-Net 在本研究中表现优异但仍存在一定局限性首先在部分对比度极低、血管边界被周围组织严重遮挡的样本中模型仍存在少量边缘误分割现象后续可结合注意力机制如通道注意力、空间注意力进一步强化目标区域的特征响应提升复杂场景下的分割鲁棒性。其次本研究的数据集规模有限未来可引入更多多中心、多设备采集的超声数据进行训练以提升模型在不同临床场景下的泛化能力。此外可进一步探索模型轻量化改造在保证分割精度的前提下降低参数量推动模型向实时临床辅助诊断场景落地。颈动脉超声图像分割是动脉粥样硬化风险评估、血管形态分析的基础环节研究中 U-Net 模型的优异表现为颈动脉超声图像的自动分割提供了一种新的可靠的解决方案具备良好的临床应用前景。参考[1] Ibrahim B, Jafari R. Cuffless blood pressure monitoring from an array of wrist bio-impedance sensors using subject-specific regression models: Proof of concept[J]. IEEE transactions on biomedical circuits and systems, 2019, 13(6): 1723-1735.[2] 马祎欣,杨雅博,徐胜军,等.基于超声超高帧率时空滤波图像的颈动脉血管壁运动追踪[J].生物医学工程研究,2021,40(04):366-372.[3] 基于 Savitzky-Golay滤波器的超声图像运动分析方法-CSDN博客[4] 王琨.基于超声图像的人体颈动脉管壁内中膜分割及其运动估计研究[D].云南大学,2022.[5] 曹步勇.基于卷积神经网络与活动轮廓模型的脑组织影像分割方法研究[D].齐鲁工业大学,2025.[6] 基于 ConvNeXt-Transformer 的颈动脉超声图像分割算法研究-CSDN博客[7] 孙超.基于改进U-Net的医学图像分割方法研究[D].南京信息工程大学,2025.[8] Python: 基于ResU-Net的颈动脉超声图像分割算法研究-CSDN博客.[9] Zhou Z, Rahman Siddiquee M M, Tajbakhsh N, et al. Unet: A nested u-net architecture for medical image segmentation[C]//International workshop on deep learning in medical image analysis. Cham: Springer International Publishing, 2018: 3-11.[10] U-Net原理与实现(含Pytorch和TensorFlow源码) - 技术栈[11] 论文中常用的图像分割评价指标-附完整代码 - 知乎[12] 基于EEGNet网络的脑电信号对阿尔茨海默与额颞叶痴呆的辅助诊断研究-CSDN博客注若有侵权部分请留言将会删除。个人观点 仅供参考。