news 2026/5/1 3:36:22

Python: 基于U-Net++的颈动脉超声图像分割算法研究

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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×3(RGB三通道彩色图像),存储格式为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) 中i=0层级的嵌套融合过程为例,节点由编码器输入与上采样后的融合得到,;后续节点则进一步融合了、前置节点及上采样特征,以此类推,形成一条密集的特征传递链,让每一级节点都能融合当前层级所有前置节点的特征,从而实现更充分的多尺度信息交互。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/UNetPlusPlus

U-Net++模型论文链接: UNet++: A Nested U-Net Architecture for Medical Image Segmentation

3 实验设置

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_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.double_conv(x) class UNetPlusPlus(nn.Module): def __init__(self, in_channels=3, num_classes=2): 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_factor=2, mode='bilinear', align_corners=False) self.conv3_1 = DoubleConv(256 + 128, 128) self.up2_1 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv2_1 = DoubleConv(128 + 64, 64) self.up2_2 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv2_2 = DoubleConv(128 + 64 + 64, 64) self.up1_1 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv1_1 = DoubleConv(64 + 32, 32) self.up1_2 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv1_2 = DoubleConv(64 + 32 + 32, 32) self.up1_3 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv1_3 = DoubleConv(64 + 32 + 32 + 32, 32) self.up0_1 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv0_1 = DoubleConv(32 + 16, 16) self.up0_2 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv0_2 = DoubleConv(32 + 16 + 16, 16) self.up0_3 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv0_3 = DoubleConv(32 + 16 + 16 + 16, 16) self.up0_4 = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=False) self.conv0_4 = DoubleConv(32 + 16 + 16 + 16 + 16, 16) self.out = nn.Conv2d(16, num_classes, kernel_size=1) 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, size=conv3_0.shape[2:], mode='bilinear', align_corners=False) conv3_1 = self.conv3_1(torch.cat([conv3_0, up3_1], dim=1)) up2_1 = self.up2_1(conv3_0) up2_1 = F.interpolate(up2_1, size=conv2_0.shape[2:], mode='bilinear', align_corners=False) conv2_1 = self.conv2_1(torch.cat([conv2_0, up2_1], dim=1)) up2_2 = self.up2_2(conv3_1) up2_2 = F.interpolate(up2_2, size=conv2_0.shape[2:], mode='bilinear', align_corners=False) conv2_2 = self.conv2_2(torch.cat([conv2_0, conv2_1, up2_2], dim=1)) up1_1 = self.up1_1(conv2_0) up1_1 = F.interpolate(up1_1, size=conv1_0.shape[2:], mode='bilinear', align_corners=False) conv1_1 = self.conv1_1(torch.cat([conv1_0, up1_1], dim=1)) up1_2 = self.up1_2(conv2_1) up1_2 = F.interpolate(up1_2, size=conv1_0.shape[2:], mode='bilinear', align_corners=False) conv1_2 = self.conv1_2(torch.cat([conv1_0, conv1_1, up1_2], dim=1)) up1_3 = self.up1_3(conv2_2) up1_3 = F.interpolate(up1_3, size=conv1_0.shape[2:], mode='bilinear', align_corners=False) conv1_3 = self.conv1_3(torch.cat([conv1_0, conv1_1, conv1_2, up1_3], dim=1)) up0_1 = self.up0_1(conv1_0) up0_1 = F.interpolate(up0_1, size=conv0_0.shape[2:], mode='bilinear', align_corners=False) conv0_1 = self.conv0_1(torch.cat([conv0_0, up0_1], dim=1)) up0_2 = self.up0_2(conv1_1) up0_2 = F.interpolate(up0_2, size=conv0_0.shape[2:], mode='bilinear', align_corners=False) conv0_2 = self.conv0_2(torch.cat([conv0_0, conv0_1, up0_2], dim=1)) up0_3 = self.up0_3(conv1_2) up0_3 = F.interpolate(up0_3, size=conv0_0.shape[2:], mode='bilinear', align_corners=False) conv0_3 = self.conv0_3(torch.cat([conv0_0, conv0_1, conv0_2, up0_3], dim=1)) up0_4 = self.up0_4(conv1_3) up0_4 = F.interpolate(up0_4, size=conv0_0.shape[2:], mode='bilinear', align_corners=False) conv0_4 = self.conv0_4(torch.cat([conv0_0, conv0_1, conv0_2, conv0_3, up0_4], dim=1)) out = self.out(conv0_4) return out

3.3 实验参数

U-Net++ 模型的训练批次大小为 4,共训练 50 轮,采用 AdamW 优化器,初始学习率为 1×10⁻⁴,学习率随余弦退火策略动态调整。损失函数采用交叉熵损失与 Dice 损失的混合函数,以提升目标分割效果。定义如下[6]:

其中,交叉熵损失计算公式为:

Dice损失用于缓解类别不平衡,其公式为:

其中,pred 为模型预测的分割结果集合;true 为金标准(真实标注)的分割结果集合;∣pred∩true∣ 为预测与真实区域的交集像素数;∣pred∣+∣true∣ 为预测与真实区域的总像素数之和。

评价指标包括 Dice、IoU、精确率、召回率与 F1 分数。分别定义如下[11-12]:

其中,A:模型预测的分割区域集合;B:真实标注(金标准)的分割区域集合;TP(True Positive):真正例,预测为正、实际为正的样本数;FP(False Positive):假正例,预测为正、实际为负的样本数;FN(False 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 系数与 IoU:U-Net++ 的 Dice 系数(0.9564)和 IoU(0.9172)均为三者最高,较次优的 ResU-Net 分别提升了 0.0039 和 0.0068,较 ConvNeXt-Transformer 分别提升了 0.0049 和 0.0095,说明其预测结果与真实标签的重叠度更高,分割完整性与准确性更好。
  • Precision 与 Recall:ResU-Net 的 Precision 最高(0.9732),说明其预测为正样本的结果中真实正样本占比更高;而 U-Net++ 的 Recall(0.9469)优于其他两种模型,说明其能更全面地识别出所有真实正样本,漏检率更低。U-Net++ 在 Precision(0.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)、IoU(0.9172)、Recall(0.9469)及 F1 分数(0.9564)均为三种模型中的最优值,其中 Dice 与 IoU 指标较次优的 ResU-Net 分别提升了 0.0039 与 0.0068,验证了其在分割重叠度与完整性上的优势;同时,其精确率(0.9668)与召回率的平衡效果最优,既保证了目标检出率,也有效控制了误分割。定性结果层面:可视化分割结果显示,U-Net++ 对不同形态的颈动脉区域均能实现精准分割,预测轮廓与真实标签高度吻合,边缘细节还原度高,且对超声图像中的噪声、伪影具有较强的鲁棒性。训练稳定性层面:模型的训练损失与测试损失均呈现快速下降并平稳收敛的趋势,训练后期两者差距极小,未出现明显过拟合现象,表明模型的训练过程稳定,泛化能力可靠。上述结果共同验证了 U-Net++ 嵌套结构与密集跳跃连接的有效性:该设计通过多尺度特征的高效融合,缓解了传统 U-Net 编码器与解码器间的语义鸿沟问题,让底层细节特征与高层语义特征实现更充分的交互,从而提升了分割的精度与稳定性。对比 ConvNeXt-Transformer 与 ResU-Net,U-Net++ 的性能差异主要源于其架构设计特点:相较于 ResU-Net,U-Net++ 的 Recall 指标更优,说明其对目标区域的漏检率更低,这得益于密集跳跃连接对细节特征的复用;而 ResU-Net 在 Precision 上表现突出,反映出其在减少假阳性预测上的优势,两者的性能差异也体现了不同架构在 “精准度” 与 “检出率” 上的侧重不同。相较于 ConvNeXt-Transformer,U-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博客

注:若有侵权部分,请留言将会删除。

个人观点 ,仅供参考。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:34:04

5 链表长度计算

一、链表长度计算 链表没有“length属性”,必须遍历一遍才能知道长度,标准写法如下: def get_length(head):length 0 #准备计数器cur head #从头开始while cur: #只要没走到结尾length 1 #数…

作者头像 李华
网站建设 2026/5/1 3:33:59

CertiK《2026全球数字资产监管报告》: 反洗钱执法力度升级,智能合约审计成为准入条件

CertiK《2026全球数字资产监管报告》现已发布。报告显示:截至2026年4月,美国、欧盟、中国香港、新加坡等司法辖区的数字资产监管框架已正式落地生效。随着全球数字资产市场的不断成熟,各国监管体系已从初期的探索定性阶段全面过渡到落地执行阶…

作者头像 李华
网站建设 2026/5/1 3:33:58

XSS跨站脚本攻击漏洞:从理论到实战

在网络安全渗透测试中,XSS跨站脚本攻击是非常经典的高危漏洞,也是Web安全入门必须掌握的核心漏洞之一。它不像SQL注入那样直接和数据库打交道,而是直接在用户浏览器中执行恶意脚本,能直接控制用户的会话,窃取数据甚至直…

作者头像 李华
网站建设 2026/5/1 3:32:58

MiGPT终极指南:将小爱音箱打造成你的专属AI语音助手

MiGPT终极指南:将小爱音箱打造成你的专属AI语音助手 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 你是否厌倦了小爱音箱千篇一律的…

作者头像 李华
网站建设 2026/5/1 3:32:19

Open-SWE:基于LLM的代码仓库智能理解与问答系统构建指南

1. 项目概述:当AI学会“看”代码仓库最近在AI编程辅助工具的圈子里,一个名为“Open-SWE”的项目引起了我的注意。这并非一个全新的独立应用,而是由LangChain AI团队开源的一个核心组件。简单来说,它是一套专门为大型语言模型&…

作者头像 李华
网站建设 2026/5/1 3:32:02

Android设备部署OpenClaw AI网关:无需Root的移动端AI服务器方案

1. 项目概述:在Android上运行AI网关的完整方案 如果你和我一样,是个喜欢折腾移动端开发,同时又对AI应用充满好奇的开发者,那么你肯定遇到过这样的困境:那些强大的AI模型和网关服务,比如OpenAI的API、Claud…

作者头像 李华