当前位置: 首页 > article >正文

【论文复现】智慧医疗:纹理特征VS卷积特征

在这里插入图片描述

📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述
在这里插入图片描述

❀ 智慧医疗

  • 论文概述
    • 纹理特征和深度卷积特征
  • 算法流程
    • 数据预处理方法
    • 纹理特征提取
    • 深度卷积特征提取
    • 分类网络搭建
  • 代码复现
    • BLS_Model.py文件——分类器搭建
    • pyradioextraction.py文件——纹理特征提取
    • CNNextraction.py 文件——深度卷积特征提取
    • main.py——顶层文件
  • 实验结果
  • 使用方式
    • 一键运行
    • 本地训练
  • 环境配置

论文链接:https://www.sciencedirect.com/science/article/abs/pii/S1076633223003537?__cf_chl_rt_tk=J9Aipfxyk5d.leu48P20ePFNd4B2aunaSmzVpXCg.7g-1721292386-0.0.1.1-6249

论文概述


在这里插入图片描述
今天,我们聚焦于AI应用的另一重要板块——智慧医疗,探索该领域内人工智能的最新突破。

在影像学权威期刊《Academic Radiology》上发表的题为《基于特征构建的宽泛学习系统在腰椎X光片机会性骨质疏松筛查中的开发与验证》的论文,首次对比了智慧医疗范畴内,纹理特征与卷积特征在提取医学影像信息方面的差异,并通过实验验证与指标分析提供了实证支持。

论文作者强调,“宽泛学习系统(BLS)的一大亮点在于其扁平化的简单结构,这使得特征表示的学习与数据分类变得简便易行。与那些拥有复杂架构的其他机器学习算法不同,BLS凭借其精简的设计,在特征表示学习和数据分类上表现出色。这种简洁的结构还赋予了模型处理大数据集的高效能力,且对计算资源的需求不高。BLS模型的另一优势在于,其权重通过解析方法确定,有效降低了过拟合的风险。就纹理特征(RF)驱动的BLS模型而言,其输出结果相较于深度卷积特征(DF)驱动的BLS模型,更具可解释性。原因在于RF与骨密度(BMD)高度相关,从而简化了输入特征与输出之间关系的理解。DF则擅长捕捉高级语义信息,这在某些数据场景下可能更具优势。然而,在本研究中,基于RF的BLS模型展现出了更高的分类性能,优于基于DF的BLS模型,这表明RF更适合于这项特定任务。因此,在选择输入特征时,无论是RF还是DF,都应慎重考虑,因为它们直接影响到结果的可解释性和准确性,在开发BLS模型时这一点尤为重要。”

纹理特征和深度卷积特征


在这里插入图片描述

  • 纹理特征,这一图像处理与计算机视觉领域的核心概念,专注于描绘图像中像素的局部排列与构造,为识别和区分各类物体或场景提供了有力工具。在这一范畴内,我们常见到几种关键的纹理特征类型:统计特征、频域特征、模型特征以及结构特征。
    统计特征,如灰度共生矩阵(GLCM)和局部二值模式(LBP),它们通过衡量像素间的关联概率分布和捕捉局部像素的二进制模式,来精细刻画图像的纹理细节。频域特征,则利用傅里叶变换和小波变换等手段,深入剖析图像的频率构成及多尺度细节,进而捕捉纹理的深层次信息。模型特征,如自回归模型(AR),基于一个假设:像素值能够由其邻近像素的线性组合来近似,这一方法为纹理的描述开辟了新的视角。而结构特征,则通过边缘方向直方图(HOG)和Gabor滤波器等手段,计算图像局部梯度的方向分布,并应用一系列具有不同方向和尺度的滤波器,来提取更为精细的纹理特征。
    这些纹理特征在图像处理与识别的多个领域均发挥着举足轻重的作用。例如,在医学图像分析中,它们能够精确检测和分类不同类型的组织;在遥感图像处理领域,它们则能够有效区分多样化的地表覆盖类型。

  • 深度卷积特征,作为深度卷积神经网络(CNN)的核心产物,广泛应用于图像处理和计算机视觉的各项任务之中。CNN通过精心设计的卷积层、池化层及全连接层的层叠结构,能够从原始图像数据中自动挖掘并提炼出层次分明的特征体系。在CNN的架构中,低层卷积层主要负责捕捉图像中的基础元素,如边缘、纹理及简单几何形状;随着网络层次的深入,中间层则逐渐聚焦于更为复杂的视觉模式与结构,如角点、轮廓以及图像的局部区域特征;而高层卷积层则进一步升华,能够提炼出具有语义信息的特征,诸如物体的类别、形态等高级认知。
    CNN的这种层次化特征提取机制,使其在图像分类、目标检测、图像分割等多个视觉任务中展现出卓越的性能。卷积操作,通过滤波器(亦称卷积核)在图像上的滑动应用,生成特征映射图,每个卷积核都针对性地检测特定的特征模式,如边缘或特定纹理。池化层则通过执行下采样操作,缩减特征图的尺寸,既降低了计算复杂度,又增强了模型的泛化能力。
    深度卷积特征的一大显著优势在于其能够从海量的标注数据中自动学习特征表示,摒弃了传统方法中繁琐的人工特征设计环节。这一特性使得深度学习模型在各种复杂的视觉任务中大放异彩。此外,预训练的深度卷积网络模型(例如VGG、ResNet、Inception等)在迁移学习场景中发挥着巨大作用,通过在新任务上的微调,能够迅速适应并应用于不同的实际场景。
    综上所述,深度卷积特征在现代计算机视觉领域占据举足轻重的地位,它们被广泛用于图像分类、目标检测、图像分割、图像生成等多种任务,极大地推动了这些任务性能与准确性的飞跃。

算法流程


在这里插入图片描述
下面我们来介绍一下论文中所设计的算法流程,原论文采用了两种不同方面的特征提取技术——纹理特征和深度卷积特征,并比较了他们的性能效果。对于纹理特征,论文采用了GLCM、GLRLM、GLDM、GLSZM、NGTDM和一阶形态学特征融合提取的方法来全面地提取到医学影像中的纹理信息。对于深度卷积特征,论文中使用了最经典的ResNet18和VGG11两种深度卷积网络来对医学影像进行特征提取。

下面我们将具体地讲解这篇文章所用到的数据预处理方法,纹理特征提取、深度卷积特征提取和分类网络搭建这四个步骤

数据预处理方法


首先,感兴趣区域(ROIs)在L1-L4椎体(前后视图)上手动分割,以确保诊断模型与DXA测试之间的准确对应。该操作使用开源软件ITK-SNAP (www.itk-snap.org)进行。分割由一位具有6年肌肉骨骼影像经验的放射科医生完成,并由一位具有20年肌肉骨骼影像经验的高级放射科医生验证。阅片者对患者的临床信息和DXA结果均不知情。

为了规范化,ROI图块被转换为灰度图像,并使用双线性插值方法调整为128 × 64像素。这种方法在图像处理应用中常用,因为它在计算效率和图像质量之间提供了一种折衷。使用对比度受限自适应直方图均衡化(CLAHE)对图像进行增强,以提高对比度并提供更清晰的特征细节可视化。CLAHE在增强医学图像方面具有优势,因为它不会增加噪声,并能保留大部分图像纹理细节。使用定量度量结构相似性指数(SSIM)评估CLAHE的效率。在训练集中的直方图均衡化后,SSIM方差显著降低(0.00102 vs. 0.00056,P < .0001),在测试集中也是如此(0.00196 vs. 0.00102,P < .0001)。图2展示了原始和增强的ROI图像及其灰度直方图。

为了处理数据集样本分布不均的问题,使用了合成少数过采样技术(SMOTE)。SMOTE分析少数样本,根据少数样本人工合成额外样本,并将其添加到数据集中,以防止模型学到的知识过于专门化而缺乏广泛性。

纹理特征提取


论文作者们利用PyRadiomics 3.0 从每个感兴趣区域(ROI)中提取二维形态特征和纹理特征。形态特征包括网格表面、像素表面、周长、周长与表面比、球形度、球形不对称、长轴长度、短轴长度和伸长率。纹理特征包括灰度共生矩阵(n = 24)、灰度游程长度矩阵(n = 16)、灰度尺寸区矩阵(n = 16)、相邻灰度差矩阵(n = 5)和灰度依赖矩阵(n = 14)。这些特征与多种骨骼特性有关,包括骨密度(BMD)、骨微观结构和骨组织成分。形态特征和纹理特征的计算和提取是根据图像生物标记标准化倡议(Image Biomarker Standardisation Initiative)指南进行的,以确保一致性和标准化。

深度卷积特征提取


他们使用了两种广泛应用的卷积神经网络(CNN)架构,即ResNet18和VGG11,作为任务的骨干网络。ResNet18由四个残差块组成,每个残差块包含两个卷积层,配有批量归一化和ReLU激活函数。这些层之后是一个快捷连接,将输入添加到第二个卷积层的输出中。而VGG11的特点是其架构中一致使用小的3×3卷积滤波器,这种方法确保了较大的感受野,同时保持了相对较少的参数。VGG11架构由五个堆叠的卷积层组成,称为“vggblocks”,并使用ReLU激活函数。它采用最大池化,并以几层全连接层结束。

他们利用了预训练CNN与迁移学习的强大功能,有效地从图像数据中生成并提取准确且富有表现力的特征。具体来说,他们使用了已经在ImageNet数据集上预训练的ResNet18和VGG11模型。在特征提取过程中,他们冻结了大部分卷积模块,并添加了新的展平和全连接层,以获得所需的特征维度。具体来说,对于VGG11,他们选择并冻结了五个vggblocks。随后,添加了自适应平均池化层和全连接层,以获得4096维的特征表示。对于ResNet18,他们冻结了前四层,每层包含两个Basicblock模块,并添加了自适应平均池化层,以实现512维的特征表示。

分类网络搭建


在这里插入图片描述
BLS基于随机向量功能连接神经网络和伪逆理论设计,使其能够快速、增量地学习,并且无需重新训练即可重构系统。BLS模型(如图所示)由输入层、特征和增强节点复合层以及输出层组成。在复合层中,使用不同组的随机权重从输入数据生成多个映射特征组,形成特征节点。此外,特征节点被增强为增强节点,每个增强节点使用不同的随机权重生成。输出是通过所有连接到输出层的特征节点和增强节点计算得出的。

BLS的一个显著优势是训练和输出结果所需的时间非常少。由于采用伪逆理论,输出层的权重可以通过简单的矩阵运算与上一层的数据进行快速计算和更新。RF和DF被用作BLS模型的输入,用于图像分类。

本文所涉及的所有资源的获取方式:这里

代码复现


本文的复现代码我放在了附件当中,大家可以自行下载下来进行对比实验。下面我将结合伪代码流程图对代码的逻辑进行简单地讲解

BLS_Model.py文件——分类器搭建


1. 初始化必要的库和函数
    - numpy, sklearn.preprocessing, numpy.random, scipy.linalg, time, sklearn.metrics
    - 函数: show_accuracy, tansig, sigmoid, linear, tanh, relu, pinv, shrinkage, sparse_bls

2. 定义函数 show_accuracy
    - 输入: predictLabel, Label
    - 计算正确预测的数量
    - 使用混淆矩阵计算灵敏度(Sen), 特异度(Spe), 阴性预测值(npv), 阳性预测值(ppv), AUC
    - 返回: 准确率, Sen, Spe, npv, ppv, auc, 预测标签, 实际标签

3. 定义激活函数 tansig, sigmoid, linear, tanh, relu

4. 定义函数 pinv
    - 输入: A, reg
    - 计算伪逆矩阵
    - 返回: 伪逆矩阵

5. 定义函数 shrinkage
    - 输入: a, b
    - 计算收缩结果
    - 返回: z

6. 定义函数 sparse_bls
    - 输入: A, b
    - 设置参数 lam, itrs
    - 初始化变量
    - 迭代计算稀疏BLS
    - 返回: wk

7. 定义函数 BLS_AddFeatureEnhanceNodes
    - 输入: train_x, train_y, test_x, test_y, N1, N2, N3, L, M1, s, c, M2, M3
    - 初始化变量 u, train_x, FeatureOfInputDataWithBias, OutputOfFeatureMappingLayer, Beta1OfEachWindow, distOfMaxAndMin, minOfEachWindow, train_acc, test_acc, train_time, test_time
    - 记录开始时间 time_start
    - 对每个窗口进行以下操作:
        - 生成随机权重
        - 计算窗口特征
        - 预处理特征
        - 计算稀疏BLS
        - 计算窗口输出
        - 记录最大最小值
        - 规范化窗口输出
        - 更新输出特征映射层
    - 生成增强层输入
    - 计算增强层权重
    - 计算增强层输出
    - 计算输出层输入
    - 计算输出权重
    - 记录结束时间 time_end
    - 计算训练时间 trainTime
    - 计算训练输出
    - 调用 show_accuracy 计算训练准确率等
    - 记录训练准确率和时间
    - 对测试数据进行同样的处理
    - 记录结束时间 time_end
    - 计算测试时间 testTime
    - 计算测试输出
    - 调用 show_accuracy 计算测试准确率等
    - 记录测试准确率和时间
    - 返回: testAcc, trainAcc, Sentr, Spetr, npvtr, ppvtr, auctr, Sen, Spe, npv, ppv, auc, predtt, labeltt, predtr, labeltr

在BLS_Model.py文件中,我实现了基于随机向量功能连接神经网络和伪逆理论的快速增量学习方法。代码首先导入必要的库和函数,包括用于数据预处理、矩阵运算、时间测量和模型评估的库。定义了一些辅助函数,例如激活函数(tansig、sigmoid、linear、tanh、relu),用于计算伪逆矩阵的函数(pinv),以及用于稀疏BLS计算的函数(sparse_bls)。主要的函数是BLS_AddFeatureEnhanceNodes,它实现了BLS模型的训练和测试。首先对输入数据进行预处理,将其标准化并添加偏置项。然后,在特征映射层中,使用不同组的随机权重生成多个映射特征组,形成特征节点,并通过稀疏BLS方法计算每个窗口的权重和输出。接着,在增强层中,生成增强节点,并计算其输出。在输出层中,结合特征映射层和增强层的输出,计算输出权重。训练阶段,记录训练时间,并计算训练输出,通过show_accuracy函数评估模型的训练准确率、灵敏度、特异度、阴性预测值、阳性预测值和AUC。同样地,在测试阶段,对测试数据进行同样的处理,记录测试时间,并评估模型的测试性能。最终,返回测试准确率、训练准确率及其他评估指标。整个过程旨在通过快速、增量地学习,从输入数据中提取特征,并通过简单的矩阵运算进行模型的更新和评估。

pyradioextraction.py文件——纹理特征提取


1. 导入必要的库和模块
2. 定义函数 listdirInMac:
   a. 初始化空列表 lists
   b. 遍历输入列表 list:
      i. 如果项的第一个字符是 '.',跳过该项
      ii. 否则,将该项添加到 lists
   c. 返回 lists

3. 定义函数 catch_features:
   a. 检查 imagePath 或 maskPath 是否为空:
      i. 如果为空,抛出异常
   b. 初始化 settings 字典并设置提取参数
   c. 创建 RadiomicsFeatureExtractor 实例 extractor,传入 settings
   d. 禁用所有特征
   e. 启用所需的特征类别(shape2D, glcm, glszm, glrlm, ngtdm, gldm)
   f. 执行特征提取并获取结果 result
   g. 初始化空列表 feature_names 和 feature_values
   h. 遍历 result 中的每个键值对:
      i. 如果键匹配特定的特征类别,打印键和值,将键和值添加到相应的列表
   i. 打印特征维度和特征名称
   j. 返回 feature_values 和 feature_names

4. 在 main 函数中:
   a. 定义 image_dir 和 mask_dir 的路径
   b. 获取患者列表 patient_list 并使用 listdirInMac 函数过滤
   c. 对 patient_list 进行排序
   d. 初始化空列表 all_data 和 all_name
   e. 遍历 patient_list 中的每个患者:
      i. 打印患者名称
      ii. 遍历患者文件夹中的每个文件:
         - 如果文件名是 'data.nii.gz',设置 imagePath
         - 如果文件名是 'zw.nii.gz',设置 maskPath
      iii. 调用 catch_features 函数提取特征,并保存结果到 all_data,特征名称保存到 all_name
   f. 打印所有数据和特征名称
   g. 打开 CSV 文件进行写入:
      i. 写入列名(特征名称)
      ii. 写入每行特征数据

这段代码的目的是从医学图像中提取纹理特征。首先,代码导入了一些必要的库和模块,包括用于处理图像的SimpleITK和用于特征提取的pyradiomics。定义了一个函数listdirInMac来过滤掉隐藏文件。主函数catch_features接受图像和掩码的路径,使用特定的设置来初始化一个特征提取器,并提取2D形状特征、灰度共生矩阵(GLCM)、灰度大小区域矩阵(GLSZM)、灰度运行长度矩阵(GLRLM)、灰度依赖矩阵(GLDM)和邻域灰度差矩阵(NGTDM)的特征。这些特征被保存为名称和值,并返回给主程序。

主程序首先定义了图像目录和掩码目录的路径,并获取患者列表。对于每个患者,找到相应的图像和掩码文件路径,并调用catch_features函数提取特征。所有提取的特征被保存到一个CSV文件中,方便后续分析和处理。

这个过程通过一系列的步骤和函数调用,实现了从医学图像中自动提取纹理特征并保存到文件中,便于后续的分析和研究。

CNNextraction.py 文件——深度卷积特征提取

1. 导入必要的库和模块
   - urllib
   - torch
   - matplotlib.pyplot as plt
   - torch.nn as nn
   - torchvision.models
   - torchvision.transforms
   - numpy as np
   - cv2
   - os
   - ssl
   - PIL.Image
   - scipy.io as scio
   - urllib3.util.url

2. 设置 HTTPS 上下文

3. 定义函数 listdirInMac:
   a. 初始化空列表 lists
   b. 遍历输入列表 list:
      i. 如果项的第一个字符是 '.',跳过该项
      ii. 否则,将该项添加到 lists
   c. 返回 lists

4. 定义类 FeatureExtractor (继承自 nn.Module):
   a. 初始化方法:
      i. 提取 VGG-16 特征层并将其设置为 nn.Sequential
      ii. 提取 VGG-16 的平均池化层
      iii. 转换图像为一维向量
      iv. 提取 VGG-16 全连接层的第一部分
      v. 添加新的全连接层(fc2)
   b. 前向传播方法:
      i. 通过特征层提取特征
      ii. 通过池化层提取特征
      iii. 打印特征的形状
      iv. 转换张量为 numpy 数组并重塑
      v. 使用 matplotlib 显示特征图
      vi. 返回提取的特征

5. 定义类 FeaExtractor (继承自 nn.Module):
   a. 初始化方法:
      i. 提取模型的卷积层、批量归一化层、激活函数、最大池化层和自适应平均池化层
      ii. 提取模型的各个层
      iii. 转换图像为一维向量
   b. 前向传播方法:
      i. 通过各个层提取特征
      ii. 转换张量为 numpy 数组并重塑
      iii. 使用 matplotlib 显示特征图
      iv. 返回提取的特征

6. 加载预训练的 EfficientNet 模型
7. 替换 EfficientNet 的第一个卷积层
8. 将模型移动到 GPU
9. 定义图像预处理步骤

10. 定义函数 extract:
    a. 初始化空列表 features
    b. 获取并过滤路径中的文件列表
    c. 对文件列表进行排序
    d. 遍历文件列表:
       i. 加载并预处理每个图像
       ii. 将图像合并为一个批次并添加一个维度
       iii. 将图像移动到 GPU
       iv. 禁用梯度计算并提取特征
       v. 将提取的特征转换为 numpy 数组并保存到 features 列表
    e. 将特征转换为 numpy 数组并返回

11. 如果是主程序:
    a. 设置训练数据路径

在这段代码中,我使用预训练的ResNet模型提取图像特征并保存到MAT文件中。首先,导入了必要的库,包括PyTorch、PIL、Matplotlib等,并设置了HTTPS上下文以跳过SSL验证。定义了辅助函数listdirInMac,用于过滤目录列表,去掉以’.'开头的隐藏文件或目录。定义了特征提取器类FeatureExtractor,继承自nn.Module,用于从ResNet模型中提取特征。初始化方法中提取了ResNet的特征层、平均池化层,并添加了一个新的全连接层。在前向传播方法中,通过特征层和池化层提取特征,并使用Matplotlib显示特征图。代码还定义了另一个特征提取器类FeaExtractor,未被使用,其作用类似于FeatureExtractor。

然后,代码使用torchvision.models加载预训练的ResNet模型,并将其移动到GPU,同时定义了一系列图像预处理步骤。接着,定义了特征提取函数extract,该函数初始化一个空列表用于存储特征,获取图像目录中的文件列表并进行排序,遍历文件列表,加载并预处理每张图像,将预处理后的图像合并为一个批次,移动到GPU,并使用新定义的模型提取特征,最后将提取到的特征保存到MAT文件中。

main.py——顶层文件


开始
|
|-- 函数: Texture_preparation()
|   |
|   |--"train_dataset_smote_84.mat" 加载 train_data
|   |-- 打印 train_data 的形状
|   |--"test_features.mat" 加载 test1_data
|   |-- 打印 test1_data 的形状
|   |--"train_dataset_smote_84.mat" 加载 train_label
|   |-- 打印 train_label 的形状
|   |--"test1_flag.mat" 加载 test1_label
|   |-- 删除 test1_label 中的特定行
|   |-- 打印 test1_label 的形状
|   |-- 返回 train_data, train_label, test1_data, test1_label
| 
|-- 主块
    |
    |-- 定义参数: N1, N2, N3, L, M1, s, c, M2, M3
    |
    |-- 调用 Texture_preparation() 并将返回值赋给 train_data, train_label, test1_data, test1_label
    |
    |-- 打印 test1_data
    |-- 打印 test1_label
    |
    |-- 调用 BLS_AddFeatureEnhanceNodes() 并将返回值赋给各个指标变量
    |
    |-- 打印测试和训练的准确率及其他指标
|
结束

这个文件起到了一个集成的作用,用于将不同的特征数据加载到内存环境中,并输入到BLS分类器中进行对比实验,从而分析不同特征对医学影像信息的提取性能。

实验结果


在本次实验中,由于原论文的数据涉及病人隐私无法公开,因此我使用了同样类型的医学公开数据集进行实验,链接如下:https://data.mendeley.com/datasets/fxjm8fb6mw

在这里插入图片描述
如图所示,我们按照论文步骤,将三种不同类型的特征分别输入到BLS分类器中进行性能的对比实验,可以得到与论文中一致的结果。在到达相似的训练程度时,输入纹理特征的模型相比其他两种特征模型能够在各项指标上取得更好的结果。特别是在医疗领域最为关注的曲线下面积(AUC)这一项中,该模型拉开了比较大的差距。因此我们可以推测出,在基于纹理特征(RF)的BLS模型与基于深度卷积特征(DF)的BLS模型的对比中,前者的结果更容易解释。这是因为RF与BMD高度相关,使得理解输入特征与输出结果之间的关系更加直观。尽管DF可以捕捉高级语义信息,在某些数据类型中可能更有利,但在这个特定任务中,基于RF的BLS模型的分类性能优于基于DF的BLS模型,表明RF在此任务中更为适用。

论文中结果:
在这里插入图片描述

使用方式


下面我们来介绍一下如何使用附件代码来进行运行三种不同的特征模型。文件格式如下所示:
在这里插入图片描述

一键运行


前面已经为大家介绍了各个文件的功能,这里需要注意的,为了便于理解,我将main.py文件拆分成了三个文件BLS_ResnetFeatures.py、BLS_TextureFeatures.py和BLS_VGGFeatures.py,分别代表了三种不同的特征输入BLS分类器进行实验。在这里为了方便大家一键运行,我已经将原始数据进行处理好,三种类型的特征分别存入了CNNFeatures(Resnet特征)、TextureFeatures(纹理特征)和VGGFeatures(VGG特征)文件夹中。大家进入对应的主文件中就可以一键运行实验。

本地训练


如果大家还希望能使用自己的私人数据集进行训练,可以按照我前面所说的算法步骤进行一步步地处理。使用pyradioextraction.py文件可以直接对医学影像数据进行纹理特征的提取,使用CNNextraction.py可以对转换后的医学图像进行两种深度卷积特征的提取。

提取纹理特征时注意要在pyradioextraction.py文件中修改对应的文件路径

在这里插入图片描述
提取深度卷积特征时同样要注意文件保存路径问题

在这里插入图片描述
处理结束后就可以看到在目录下会生成相应的文件,接下来输入到BLS分类器中就可以进行训练了!

环境配置


  • python版本3.6及以上;
  • 预先安装第三方库:radiomics、SimpleITK、torch、torchvision和scipy

编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

更多内容详见:这里


http://www.kler.cn/a/396958.html

相关文章:

  • 第9章 DIV+CSS布局作业
  • 大模型基础BERT——Transformers的双向编码器表示
  • .NET 9 中 IFormFile 的详细使用讲解
  • c++入门--引用与指针,const与引用,NULL与nullptr
  • 『VUE』27. 透传属性与inheritAttrs(详细图文注释)
  • flink实战 -- flink SQL 实现列转行
  • SQL笔试题笔记(1)
  • 深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
  • 深入解析生成对抗网络(GAN)
  • Vue模块化开发的理解
  • layui 表格点击编辑感觉很好用,实现方法如下
  • ZeroSSL HTTPS SSL证书ACMESSL申请3个月证书
  • unity3d————Resources卸载资源
  • 如何构建安全可靠的 HarmonyOS 应用
  • 【软件工程】一篇入门UML建模图(类图)
  • C++11标准模板(STL)- 常用数学函数 - 宏常量 - 求值得到float类型的安静NaN(NAN)
  • 硬件---4电感---基本概念与特性
  • Aria2-CVE-2023-39141漏洞分析
  • 使用 Caffeine 缓存并在业务方法上通过注解实现每3到5秒更新缓存
  • Python学习笔记(2)正则表达式
  • 《Java核心技术 卷I》用户界面AWT事件继承层次
  • 【网络】什么是交换机?switch
  • IDC机房服务器托管的费用组成
  • 【MyBatis操作数据库】XML配置
  • 自然语言处理(NLP)的开源生态系统:Hugging Face 原理和使用
  • [241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%