智慧医疗:纹理特征VS卷积特征
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。
我是Srlua小谢,在这里我会分享我的知识和经验。🎥
希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮
记得先点赞👍后阅读哦~ 👏👏
📘📚 所属专栏:传知代码论文复现
欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙
目录
论文概述
纹理特征和深度卷积特征
算法流程
数据预处理方法
纹理特征提取
深度卷积特征提取
分类网络搭建
代码复现
BLS_Model.py文件——分类器搭建
pyradioextraction.py文件——纹理特征提取
CNNextraction.py 文件——深度卷积特征提取
main.py——顶层文件
实验结果
论文中结果:
环境配置
需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址
论文概述
-
今天我们把视线转回到AI应用的另外一个大领域——智慧医疗,来看看目前人工智能在这一领域的最新进展。
发表在影像学经典期刊《Academic Radiology》上的论文《Development and Validation of a Feature-Based Broad-Learning System for Opportunistic Osteoporosis Screening Using Lumbar Spine Radiographs》第一次阐述了在智慧医疗领域,纹理特征和卷积特征对于医学影像信息的抽取功能有什么差异,并给出了具体实验验证和指标分析。
作者指出,“宽度学习系统(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维的特征表示。
分类网络搭建
-
LS基于随机向量功能连接神经网络和伪逆理论设计,使其能够快速、增量地学习,并且无需重新训练即可重构系统。BLS模型(如图所示)由输入层、特征和增强节点复合层以及输出层组成。在复合层中,使用不同组的随机权重从输入数据生成多个映射特征组,形成特征节点。此外,特征节点被增强为增强节点,每个增强节点使用不同的随机权重生成。输出是通过所有连接到输出层的特征节点和增强节点计算得出的。
-
BLS的一个显著优势是训练和输出结果所需的时间非常少。由于采用伪逆理论,输出层的权重可以通过简单的矩阵运算与上一层的数据进行快速计算和更新。RF和DF被用作BLS模型的输入,用于图像分类。
代码复现
本文的复现代码我放在了附件当中,大家可以自行下载下来进行对比实验。下面我将结合伪代码流程图对代码的逻辑进行简单地讲解
BLS_Model.py文件——分类器搭建
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#116644">1.</span> <span style="color:#000000">初始化必要的库和函数</span><span style="color:#981a1a">-</span> <span style="color:#000000">numpy</span>, <span style="color:#000000">sklearn</span>.<span style="color:#000000">preprocessing</span>, <span style="color:#000000">numpy</span>.<span style="color:#000000">random</span>, <span style="color:#000000">scipy</span>.<span style="color:#000000">linalg</span>, <span style="color:#000000">time</span>, <span style="color:#000000">sklearn</span>.<span style="color:#000000">metrics</span><span style="color:#981a1a">-</span> <span style="color:#000000">函数</span>: <span style="color:#000000">show_accuracy</span>, <span style="color:#000000">tansig</span>, <span style="color:#000000">sigmoid</span>, <span style="color:#000000">linear</span>, <span style="color:#000000">tanh</span>, <span style="color:#000000">relu</span>, <span style="color:#000000">pinv</span>, <span style="color:#000000">shrinkage</span>, <span style="color:#000000">sparse_bls</span>
<span style="color:#116644">2.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">show_accuracy</span><span style="color:#981a1a">-</span> <span style="color:#000000">输入</span>: <span style="color:#000000">predictLabel</span>, <span style="color:#000000">Label</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算正确预测的数量</span><span style="color:#981a1a">-</span> <span style="color:#000000">使用混淆矩阵计算灵敏度</span>(<span style="color:#000000">Sen</span>), <span style="color:#000000">特异度</span>(<span style="color:#000000">Spe</span>), <span style="color:#000000">阴性预测值</span>(<span style="color:#000000">npv</span>), <span style="color:#000000">阳性预测值</span>(<span style="color:#000000">ppv</span>), <span style="color:#000000">AUC</span><span style="color:#981a1a">-</span> <span style="color:#000000">返回</span>: <span style="color:#000000">准确率</span>, <span style="color:#000000">Sen</span>, <span style="color:#000000">Spe</span>, <span style="color:#000000">npv</span>, <span style="color:#000000">ppv</span>, <span style="color:#000000">auc</span>, <span style="color:#000000">预测标签</span>, <span style="color:#000000">实际标签</span>
<span style="color:#116644">3.</span> <span style="color:#000000">定义激活函数</span> <span style="color:#000000">tansig</span>, <span style="color:#000000">sigmoid</span>, <span style="color:#000000">linear</span>, <span style="color:#000000">tanh</span>, <span style="color:#000000">relu</span>
<span style="color:#116644">4.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">pinv</span><span style="color:#981a1a">-</span> <span style="color:#000000">输入</span>: <span style="color:#000000">A</span>, <span style="color:#000000">reg</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算伪逆矩阵</span><span style="color:#981a1a">-</span> <span style="color:#000000">返回</span>: <span style="color:#000000">伪逆矩阵</span>
<span style="color:#116644">5.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">shrinkage</span><span style="color:#981a1a">-</span> <span style="color:#000000">输入</span>: <span style="color:#000000">a</span>, <span style="color:#000000">b</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算收缩结果</span><span style="color:#981a1a">-</span> <span style="color:#000000">返回</span>: <span style="color:#000000">z</span>
<span style="color:#116644">6.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">sparse_bls</span><span style="color:#981a1a">-</span> <span style="color:#000000">输入</span>: <span style="color:#000000">A</span>, <span style="color:#000000">b</span><span style="color:#981a1a">-</span> <span style="color:#000000">设置参数</span> <span style="color:#000000">lam</span>, <span style="color:#000000">itrs</span><span style="color:#981a1a">-</span> <span style="color:#000000">初始化变量</span><span style="color:#981a1a">-</span> <span style="color:#000000">迭代计算稀疏BLS</span><span style="color:#981a1a">-</span> <span style="color:#000000">返回</span>: <span style="color:#000000">wk</span>
<span style="color:#116644">7.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">BLS_AddFeatureEnhanceNodes</span><span style="color:#981a1a">-</span> <span style="color:#000000">输入</span>: <span style="color:#000000">train_x</span>, <span style="color:#000000">train_y</span>, <span style="color:#000000">test_x</span>, <span style="color:#000000">test_y</span>, <span style="color:#000000">N1</span>, <span style="color:#000000">N2</span>, <span style="color:#000000">N3</span>, <span style="color:#000000">L</span>, <span style="color:#000000">M1</span>, <span style="color:#000000">s</span>, <span style="color:#000000">c</span>, <span style="color:#000000">M2</span>, <span style="color:#000000">M3</span><span style="color:#981a1a">-</span> <span style="color:#000000">初始化变量</span> <span style="color:#000000">u</span>, <span style="color:#000000">train_x</span>, <span style="color:#000000">FeatureOfInputDataWithBias</span>, <span style="color:#000000">OutputOfFeatureMappingLayer</span>, <span style="color:#000000">Beta1OfEachWindow</span>, <span style="color:#000000">distOfMaxAndMin</span>, <span style="color:#000000">minOfEachWindow</span>, <span style="color:#000000">train_acc</span>, <span style="color:#000000">test_acc</span>, <span style="color:#000000">train_time</span>, <span style="color:#000000">test_time</span><span style="color:#981a1a">-</span> <span style="color:#000000">记录开始时间</span> <span style="color:#000000">time_start</span><span style="color:#981a1a">-</span> <span style="color:#000000">对每个窗口进行以下操作</span>:<span style="color:#981a1a">-</span> <span style="color:#000000">生成随机权重</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算窗口特征</span><span style="color:#981a1a">-</span> <span style="color:#000000">预处理特征</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算稀疏BLS</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算窗口输出</span><span style="color:#981a1a">-</span> <span style="color:#000000">记录最大最小值</span><span style="color:#981a1a">-</span> <span style="color:#000000">规范化窗口输出</span><span style="color:#981a1a">-</span> <span style="color:#000000">更新输出特征映射层</span><span style="color:#981a1a">-</span> <span style="color:#000000">生成增强层输入</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算增强层权重</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算增强层输出</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算输出层输入</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算输出权重</span><span style="color:#981a1a">-</span> <span style="color:#000000">记录结束时间</span> <span style="color:#000000">time_end</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算训练时间</span> <span style="color:#000000">trainTime</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算训练输出</span><span style="color:#981a1a">-</span> <span style="color:#000000">调用</span> <span style="color:#000000">show_accuracy</span> <span style="color:#000000">计算训练准确率等</span><span style="color:#981a1a">-</span> <span style="color:#000000">记录训练准确率和时间</span><span style="color:#981a1a">-</span> <span style="color:#000000">对测试数据进行同样的处理</span><span style="color:#981a1a">-</span> <span style="color:#000000">记录结束时间</span> <span style="color:#000000">time_end</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算测试时间</span> <span style="color:#000000">testTime</span><span style="color:#981a1a">-</span> <span style="color:#000000">计算测试输出</span><span style="color:#981a1a">-</span> <span style="color:#000000">调用</span> <span style="color:#000000">show_accuracy</span> <span style="color:#000000">计算测试准确率等</span><span style="color:#981a1a">-</span> <span style="color:#000000">记录测试准确率和时间</span><span style="color:#981a1a">-</span> <span style="color:#000000">返回</span>: <span style="color:#000000">testAcc</span>, <span style="color:#000000">trainAcc</span>, <span style="color:#000000">Sentr</span>, <span style="color:#000000">Spetr</span>, <span style="color:#000000">npvtr</span>, <span style="color:#000000">ppvtr</span>, <span style="color:#000000">auctr</span>, <span style="color:#000000">Sen</span>, <span style="color:#000000">Spe</span>, <span style="color:#000000">npv</span>, <span style="color:#000000">ppv</span>, <span style="color:#000000">auc</span>, <span style="color:#000000">predtt</span>, <span style="color:#000000">labeltt</span>, <span style="color:#000000">predtr</span>, <span style="color:#000000">labeltr</span></span></span>
在BLS_Model.py文件中,我实现了基于随机向量功能连接神经网络和伪逆理论的快速增量学习方法。代码首先导入必要的库和函数,包括用于数据预处理、矩阵运算、时间测量和模型评估的库。定义了一些辅助函数,例如激活函数(tansig、sigmoid、linear、tanh、relu),用于计算伪逆矩阵的函数(pinv),以及用于稀疏BLS计算的函数(sparse_bls)。主要的函数是BLS_AddFeatureEnhanceNodes,它实现了BLS模型的训练和测试。首先对输入数据进行预处理,将其标准化并添加偏置项。然后,在特征映射层中,使用不同组的随机权重生成多个映射特征组,形成特征节点,并通过稀疏BLS方法计算每个窗口的权重和输出。接着,在增强层中,生成增强节点,并计算其输出。在输出层中,结合特征映射层和增强层的输出,计算输出权重。训练阶段,记录训练时间,并计算训练输出,通过show_accuracy函数评估模型的训练准确率、灵敏度、特异度、阴性预测值、阳性预测值和AUC。同样地,在测试阶段,对测试数据进行同样的处理,记录测试时间,并评估模型的测试性能。最终,返回测试准确率、训练准确率及其他评估指标。整个过程旨在通过快速、增量地学习,从输入数据中提取特征,并通过简单的矩阵运算进行模型的更新和评估。
pyradioextraction.py文件——纹理特征提取
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#116644">1.</span> <span style="color:#000000">导入必要的库和模块</span>
<span style="color:#116644">2.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">listdirInMac</span>:<span style="color:#000000">a</span>. <span style="color:#000000">初始化空列表</span> <span style="color:#000000">lists</span><span style="color:#000000">b</span>. <span style="color:#000000">遍历输入列表</span> <span style="color:#3300aa">list</span>:<span style="color:#000000">i</span>. <span style="color:#000000">如果项的第一个字符是</span> <span style="color:#aa1111">'.'</span><span style="color:#000000">,跳过该项</span><span style="color:#000000">ii</span>. <span style="color:#000000">否则,将该项添加到</span> <span style="color:#000000">lists</span><span style="color:#000000">c</span>. <span style="color:#000000">返回</span> <span style="color:#000000">lists</span>
<span style="color:#116644">3.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">catch_features</span>:<span style="color:#000000">a</span>. <span style="color:#000000">检查</span> <span style="color:#000000">imagePath</span> <span style="color:#000000">或</span> <span style="color:#000000">maskPath</span> <span style="color:#000000">是否为空</span>:<span style="color:#000000">i</span>. <span style="color:#000000">如果为空,抛出异常</span><span style="color:#000000">b</span>. <span style="color:#000000">初始化</span> <span style="color:#000000">settings</span> <span style="color:#000000">字典并设置提取参数</span><span style="color:#000000">c</span>. <span style="color:#000000">创建</span> <span style="color:#000000">RadiomicsFeatureExtractor</span> <span style="color:#000000">实例</span> <span style="color:#000000">extractor,传入</span> <span style="color:#000000">settings</span><span style="color:#000000">d</span>. <span style="color:#000000">禁用所有特征</span><span style="color:#000000">e</span>. <span style="color:#000000">启用所需的特征类别(shape2D</span>, <span style="color:#000000">glcm</span>, <span style="color:#000000">glszm</span>, <span style="color:#000000">glrlm</span>, <span style="color:#000000">ngtdm</span>, <span style="color:#000000">gldm)</span><span style="color:#000000">f</span>. <span style="color:#000000">执行特征提取并获取结果</span> <span style="color:#000000">result</span><span style="color:#000000">g</span>. <span style="color:#000000">初始化空列表</span> <span style="color:#000000">feature_names</span> <span style="color:#000000">和</span> <span style="color:#000000">feature_values</span><span style="color:#000000">h</span>. <span style="color:#000000">遍历</span> <span style="color:#000000">result</span> <span style="color:#000000">中的每个键值对</span>:<span style="color:#000000">i</span>. <span style="color:#000000">如果键匹配特定的特征类别,打印键和值,将键和值添加到相应的列表</span><span style="color:#000000">i</span>. <span style="color:#000000">打印特征维度和特征名称</span><span style="color:#000000">j</span>. <span style="color:#000000">返回</span> <span style="color:#000000">feature_values</span> <span style="color:#000000">和</span> <span style="color:#000000">feature_names</span>
<span style="color:#116644">4.</span> <span style="color:#000000">在</span> <span style="color:#000000">main</span> <span style="color:#000000">函数中</span>:<span style="color:#000000">a</span>. <span style="color:#000000">定义</span> <span style="color:#000000">image_dir</span> <span style="color:#000000">和</span> <span style="color:#000000">mask_dir</span> <span style="color:#000000">的路径</span><span style="color:#000000">b</span>. <span style="color:#000000">获取患者列表</span> <span style="color:#000000">patient_list</span> <span style="color:#000000">并使用</span> <span style="color:#000000">listdirInMac</span> <span style="color:#000000">函数过滤</span><span style="color:#000000">c</span>. <span style="color:#000000">对</span> <span style="color:#000000">patient_list</span> <span style="color:#000000">进行排序</span><span style="color:#000000">d</span>. <span style="color:#000000">初始化空列表</span> <span style="color:#000000">all_data</span> <span style="color:#000000">和</span> <span style="color:#000000">all_name</span><span style="color:#000000">e</span>. <span style="color:#000000">遍历</span> <span style="color:#000000">patient_list</span> <span style="color:#000000">中的每个患者</span>:<span style="color:#000000">i</span>. <span style="color:#000000">打印患者名称</span><span style="color:#000000">ii</span>. <span style="color:#000000">遍历患者文件夹中的每个文件</span>:<span style="color:#981a1a">-</span> <span style="color:#000000">如果文件名是</span> <span style="color:#aa1111">'data.nii.gz'</span><span style="color:#000000">,设置</span> <span style="color:#000000">imagePath</span><span style="color:#981a1a">-</span> <span style="color:#000000">如果文件名是</span> <span style="color:#aa1111">'zw.nii.gz'</span><span style="color:#000000">,设置</span> <span style="color:#000000">maskPath</span><span style="color:#000000">iii</span>. <span style="color:#000000">调用</span> <span style="color:#000000">catch_features</span> <span style="color:#000000">函数提取特征,并保存结果到</span> <span style="color:#000000">all_data,特征名称保存到</span> <span style="color:#000000">all_name</span><span style="color:#000000">f</span>. <span style="color:#000000">打印所有数据和特征名称</span><span style="color:#000000">g</span>. <span style="color:#000000">打开</span> <span style="color:#000000">CSV</span> <span style="color:#000000">文件进行写入</span>:<span style="color:#000000">i</span>. <span style="color:#000000">写入列名(特征名称)</span><span style="color:#000000">ii</span>. <span style="color:#000000">写入每行特征数据</span></span></span>
CNNextraction.py 文件——深度卷积特征提取
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#116644">1.</span> <span style="color:#000000">导入必要的库和模块</span><span style="color:#981a1a">-</span> <span style="color:#000000">urllib</span><span style="color:#981a1a">-</span> <span style="color:#000000">torch</span><span style="color:#981a1a">-</span> <span style="color:#000000">matplotlib</span>.<span style="color:#000000">pyplot</span> <span style="color:#770088">as</span> <span style="color:#000000">plt</span><span style="color:#981a1a">-</span> <span style="color:#000000">torch</span>.<span style="color:#000000">nn</span> <span style="color:#770088">as</span> <span style="color:#000000">nn</span><span style="color:#981a1a">-</span> <span style="color:#000000">torchvision</span>.<span style="color:#000000">models</span><span style="color:#981a1a">-</span> <span style="color:#000000">torchvision</span>.<span style="color:#000000">transforms</span><span style="color:#981a1a">-</span> <span style="color:#000000">numpy</span> <span style="color:#770088">as</span> <span style="color:#000000">np</span><span style="color:#981a1a">-</span> <span style="color:#000000">cv2</span><span style="color:#981a1a">-</span> <span style="color:#000000">os</span><span style="color:#981a1a">-</span> <span style="color:#000000">ssl</span><span style="color:#981a1a">-</span> <span style="color:#000000">PIL</span>.<span style="color:#000000">Image</span><span style="color:#981a1a">-</span> <span style="color:#000000">scipy</span>.<span style="color:#000000">io</span> <span style="color:#770088">as</span> <span style="color:#000000">scio</span><span style="color:#981a1a">-</span> <span style="color:#000000">urllib3</span>.<span style="color:#000000">util</span>.<span style="color:#000000">url</span>
<span style="color:#116644">2.</span> <span style="color:#000000">设置</span> <span style="color:#000000">HTTPS</span> <span style="color:#000000">上下文</span>
<span style="color:#116644">3.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">listdirInMac</span>:<span style="color:#000000">a</span>. <span style="color:#000000">初始化空列表</span> <span style="color:#000000">lists</span><span style="color:#000000">b</span>. <span style="color:#000000">遍历输入列表</span> <span style="color:#3300aa">list</span>:<span style="color:#000000">i</span>. <span style="color:#000000">如果项的第一个字符是</span> <span style="color:#aa1111">'.'</span><span style="color:#000000">,跳过该项</span><span style="color:#000000">ii</span>. <span style="color:#000000">否则,将该项添加到</span> <span style="color:#000000">lists</span><span style="color:#000000">c</span>. <span style="color:#000000">返回</span> <span style="color:#000000">lists</span>
<span style="color:#116644">4.</span> <span style="color:#000000">定义类</span> <span style="color:#000000">FeatureExtractor</span> (<span style="color:#000000">继承自</span> <span style="color:#000000">nn</span>.<span style="color:#000000">Module</span>):<span style="color:#000000">a</span>. <span style="color:#000000">初始化方法</span>:<span style="color:#000000">i</span>. <span style="color:#000000">提取</span> <span style="color:#000000">VGG</span><span style="color:#981a1a">-</span><span style="color:#116644">16</span> <span style="color:#000000">特征层并将其设置为</span> <span style="color:#000000">nn</span>.<span style="color:#000000">Sequential</span><span style="color:#000000">ii</span>. <span style="color:#000000">提取</span> <span style="color:#000000">VGG</span><span style="color:#981a1a">-</span><span style="color:#116644">16</span> <span style="color:#000000">的平均池化层</span><span style="color:#000000">iii</span>. <span style="color:#000000">转换图像为一维向量</span><span style="color:#000000">iv</span>. <span style="color:#000000">提取</span> <span style="color:#000000">VGG</span><span style="color:#981a1a">-</span><span style="color:#116644">16</span> <span style="color:#000000">全连接层的第一部分</span><span style="color:#000000">v</span>. <span style="color:#000000">添加新的全连接层(fc2)</span><span style="color:#000000">b</span>. <span style="color:#000000">前向传播方法</span>:<span style="color:#000000">i</span>. <span style="color:#000000">通过特征层提取特征</span><span style="color:#000000">ii</span>. <span style="color:#000000">通过池化层提取特征</span><span style="color:#000000">iii</span>. <span style="color:#000000">打印特征的形状</span><span style="color:#000000">iv</span>. <span style="color:#000000">转换张量为</span> <span style="color:#000000">numpy</span> <span style="color:#000000">数组并重塑</span><span style="color:#000000">v</span>. <span style="color:#000000">使用</span> <span style="color:#000000">matplotlib</span> <span style="color:#000000">显示特征图</span><span style="color:#000000">vi</span>. <span style="color:#000000">返回提取的特征</span>
<span style="color:#116644">5.</span> <span style="color:#000000">定义类</span> <span style="color:#000000">FeaExtractor</span> (<span style="color:#000000">继承自</span> <span style="color:#000000">nn</span>.<span style="color:#000000">Module</span>):<span style="color:#000000">a</span>. <span style="color:#000000">初始化方法</span>:<span style="color:#000000">i</span>. <span style="color:#000000">提取模型的卷积层、批量归一化层、激活函数、最大池化层和自适应平均池化层</span><span style="color:#000000">ii</span>. <span style="color:#000000">提取模型的各个层</span><span style="color:#000000">iii</span>. <span style="color:#000000">转换图像为一维向量</span><span style="color:#000000">b</span>. <span style="color:#000000">前向传播方法</span>:<span style="color:#000000">i</span>. <span style="color:#000000">通过各个层提取特征</span><span style="color:#000000">ii</span>. <span style="color:#000000">转换张量为</span> <span style="color:#000000">numpy</span> <span style="color:#000000">数组并重塑</span><span style="color:#000000">iii</span>. <span style="color:#000000">使用</span> <span style="color:#000000">matplotlib</span> <span style="color:#000000">显示特征图</span><span style="color:#000000">iv</span>. <span style="color:#000000">返回提取的特征</span>
<span style="color:#116644">6.</span> <span style="color:#000000">加载预训练的</span> <span style="color:#000000">EfficientNet</span> <span style="color:#000000">模型</span>
<span style="color:#116644">7.</span> <span style="color:#000000">替换</span> <span style="color:#000000">EfficientNet</span> <span style="color:#000000">的第一个卷积层</span>
<span style="color:#116644">8.</span> <span style="color:#000000">将模型移动到</span> <span style="color:#000000">GPU</span>
<span style="color:#116644">9.</span> <span style="color:#000000">定义图像预处理步骤</span>
<span style="color:#116644">10.</span> <span style="color:#000000">定义函数</span> <span style="color:#000000">extract</span>:<span style="color:#000000">a</span>. <span style="color:#000000">初始化空列表</span> <span style="color:#000000">features</span><span style="color:#000000">b</span>. <span style="color:#000000">获取并过滤路径中的文件列表</span><span style="color:#000000">c</span>. <span style="color:#000000">对文件列表进行排序</span><span style="color:#000000">d</span>. <span style="color:#000000">遍历文件列表</span>:<span style="color:#000000">i</span>. <span style="color:#000000">加载并预处理每个图像</span><span style="color:#000000">ii</span>. <span style="color:#000000">将图像合并为一个批次并添加一个维度</span><span style="color:#000000">iii</span>. <span style="color:#000000">将图像移动到</span> <span style="color:#000000">GPU</span><span style="color:#000000">iv</span>. <span style="color:#000000">禁用梯度计算并提取特征</span><span style="color:#000000">v</span>. <span style="color:#000000">将提取的特征转换为</span> <span style="color:#000000">numpy</span> <span style="color:#000000">数组并保存到</span> <span style="color:#000000">features</span> <span style="color:#000000">列表</span><span style="color:#000000">e</span>. <span style="color:#000000">将特征转换为</span> <span style="color:#000000">numpy</span> <span style="color:#000000">数组并返回</span>
<span style="color:#116644">11.</span> <span style="color:#000000">如果是主程序</span>:<span style="color:#000000">a</span>. <span style="color:#000000">设置训练数据路径</span></span></span>
在这段代码中,我使用预训练的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——顶层文件
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">开始</span>
<span style="color:#981a1a">|</span>
<span style="color:#981a1a">|--</span> <span style="color:#000000">函数</span>: <span style="color:#000000">Texture_preparation</span>()
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">从</span> <span style="color:#aa1111">"train_dataset_smote_84.mat"</span> <span style="color:#000000">加载</span> <span style="color:#000000">train_data</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">打印</span> <span style="color:#000000">train_data</span> <span style="color:#000000">的形状</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">从</span> <span style="color:#aa1111">"test_features.mat"</span> <span style="color:#000000">加载</span> <span style="color:#000000">test1_data</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">打印</span> <span style="color:#000000">test1_data</span> <span style="color:#000000">的形状</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">从</span> <span style="color:#aa1111">"train_dataset_smote_84.mat"</span> <span style="color:#000000">加载</span> <span style="color:#000000">train_label</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">打印</span> <span style="color:#000000">train_label</span> <span style="color:#000000">的形状</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">从</span> <span style="color:#aa1111">"test1_flag.mat"</span> <span style="color:#000000">加载</span> <span style="color:#000000">test1_label</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">删除</span> <span style="color:#000000">test1_label</span> <span style="color:#000000">中的特定行</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">打印</span> <span style="color:#000000">test1_label</span> <span style="color:#000000">的形状</span>
<span style="color:#981a1a">|</span> <span style="color:#981a1a">|--</span> <span style="color:#000000">返回</span> <span style="color:#000000">train_data</span>, <span style="color:#000000">train_label</span>, <span style="color:#000000">test1_data</span>, <span style="color:#000000">test1_label</span>
<span style="color:#981a1a">|</span>
<span style="color:#981a1a">|--</span> <span style="color:#000000">主块</span><span style="color:#981a1a">|</span><span style="color:#981a1a">|--</span> <span style="color:#000000">定义参数</span>: <span style="color:#000000">N1</span>, <span style="color:#000000">N2</span>, <span style="color:#000000">N3</span>, <span style="color:#000000">L</span>, <span style="color:#000000">M1</span>, <span style="color:#000000">s</span>, <span style="color:#000000">c</span>, <span style="color:#000000">M2</span>, <span style="color:#000000">M3</span><span style="color:#981a1a">|</span><span style="color:#981a1a">|--</span> <span style="color:#000000">调用</span> <span style="color:#000000">Texture_preparation</span>() <span style="color:#000000">并将返回值赋给</span> <span style="color:#000000">train_data</span>, <span style="color:#000000">train_label</span>, <span style="color:#000000">test1_data</span>, <span style="color:#000000">test1_label</span><span style="color:#981a1a">|</span><span style="color:#981a1a">|--</span> <span style="color:#000000">打印</span> <span style="color:#000000">test1_data</span><span style="color:#981a1a">|--</span> <span style="color:#000000">打印</span> <span style="color:#000000">test1_label</span><span style="color:#981a1a">|</span><span style="color:#981a1a">|--</span> <span style="color:#000000">调用</span> <span style="color:#000000">BLS_AddFeatureEnhanceNodes</span>() <span style="color:#000000">并将返回值赋给各个指标变量</span><span style="color:#981a1a">|</span><span style="color:#981a1a">|--</span> <span style="color:#000000">打印测试和训练的准确率及其他指标</span>
<span style="color:#981a1a">|</span>
<span style="color:#000000">结束</span></span></span>
这个文件起到了一个集成的作用,用于将不同的特征数据加载到内存环境中,并输入到BLS分类器中进行对比实验,从而分析不同特征对医学影像信息的提取性能。
实验结果
在本次实验中,由于原论文的数据涉及病人隐私无法公开,因此我使用了同样类型的医学公开数据集进行实验,链接如下:Knee X-ray Osteoporosis Database - Mendeley Data
如图所示,我们按照论文步骤,将三种不同类型的特征分别输入到BLS分类器中进行性能的对比实验,可以得到与论文中一致的结果。在到达相似的训练程度时,输入纹理特征的模型相比其他两种特征模型能够在各项指标上取得更好的结果。特别是在医疗领域最为关注的曲线下面积(AUC)这一项中,该模型拉开了比较大的差距。因此我们可以推测出,在基于纹理特征(RF)的BLS模型与基于深度卷积特征(DF)的BLS模型的对比中,前者的结果更容易解释。这是因为RF与BMD高度相关,使得理解输入特征与输出结果之间的关系更加直观。尽管DF可以捕捉高级语义信息,在某些数据类型中可能更有利,但在这个特定任务中,基于RF的BLS模型的分类性能优于基于DF的BLS模型,表明RF在此任务中更为适用。
论文中结果:
环境配置
-
python版本3.6及以上;
-
预先安装第三方库:radiomics、SimpleITK、torch、torchvision和scipy
-
需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址
希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!
相关文章:

智慧医疗:纹理特征VS卷积特征
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

OPC学习笔记
一. 解决使用milo读取OPC设备字符串类型时,出现中文和特殊符号乱码的情况 解决前,读取字符串:你好 2. 解决后,读取字符串:你好 3. 解决前,读取字符串:165℃ 解决后,读取字符串&am…...

数据结构的时间复杂度和空间复杂度
目录 时间复杂度 空间复杂度 时间复杂度 基本操作的执行次数,为时间复杂度。 我们使用大O的渐进表示法来表示时间复杂度。 怎么使用? 先看例子: 在这个例子中, 基本操作为变量 count 的 加加 操作,并且,执行…...

HBase理论_背景特点及数据单元及与Hive对比
本文结合了个人的笔记以及工作中实践经验以及参考HBase官网,我尽可能把自己的知识点呈现出来,如果有误,还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随机读写操作,HBase正是为此而出现。…...
生产模式打包
在生产模式下打包 Node.js 和前端(例如 Vue 或 React)应用时,通常需要对代码进行优化,使其在生产环境中运行更高效。以下是如何在生产模式下配置和打包项目的步骤: 1. Node.js 生产模式打包 Node.js 本身不需要像前端…...

Vue的路由
Vue的路由 出发点:遇到多页面网页的反复跳转,有些繁琐,可以通过Vue的路由实现单页面中数据的变化 实现单页面中数据的变化(通过Vue-router来进行操作的,数据的请求获取也需要ajax异步交互),具…...
Spring框架之策略模式 (Strategy Pattern)
策略模式(Strategy Pattern)详解 策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列算法,并将每种算法封装到独立的策略类中,使它们可以相互替换,从而使算法的变化独…...
探索Google Earth Engine:利用MODIS数据和R语言进行2000-2021年遥感生态指数(RSEI)的时空趋势分析
前段时间,小编学习了在GEE上进行遥感生态指数(RSEI)的评估,非常头疼,但是实验了两周后,亲测有效,主要采用的是MODIS数据分析了2000-2021年中国内蒙古某地的RSEI时间序列分布状况,现在把学习的代码分享给大家。 1 GEE计算RSEI 1.1研究区域导入与初步定义 var sa = ee…...

多商户中英双语电商系统设计与开发 PHP+mysql
随着全球电商市场的扩展,多商户平台成为了越来越多商家参与全球贸易的重要方式。为了适应不同语言用户的需求,尤其是中英双语用户的需求,设计一个支持中英双语的电商系统显得尤为重要。本文将重点探讨如何设计一个多商户中英双语电商系统&…...

牵手App红娘专属1V1服务,打造贴心交友指导
对于年轻一代而言,婚恋方式已明显区别于传统,他们更倾向于直接、活泼的交流方式,享受着在轻松愉快的氛围中边玩边交友的乐趣。线上社交平台,尤其是那些基于兴趣构建的交友模式,正逐渐成为他们探索爱情、寻找共鸣的新舞…...
论文解析:边缘计算网络中资源共享的分布式协议(2区)
目录 论文解析:边缘计算网络中资源共享的分布式协议(2区) 核心内容: 核心创新点的原理与理论: 多跳边缘计算场景 一、边缘计算的基本概念 二、多跳边缘计算场景的含义 三、多跳边缘计算场景的应用 四、多跳边缘计算场景的优势 论文解析:协作边缘计算网络中资源共…...

Android Osmdroid + 天地图 (一)
Osmdroid 天地图 前言正文一、配置build.gradle二、配置AndroidManifest.xml三、获取天地图的API Key① 获取开发版SHA1② 获取发布版SHA1 四、请求权限五、显示地图六、源码 前言 Osmdroid是一款完全开源的地图基本操作SDK,我们可以通过这个SDK去加一些地图API&am…...

浅谈:基于三维场景的视频融合方法
视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 , 现实的漫游效果不是从摄像机的角度来看 , 但其仍然存在很多困难 。基于三维场景的视频融合 , 因其直观等特效在视频监控等相关领域有着…...
PostgreSQL序列:创建、管理与高效应用指南
一、引言 在PostgreSQL中,序列(Sequence)是一种用于生成唯一标识符的数据库对象。它们常常被用于为主键字段提供连续且唯一的值,特别是在创建新记录时。序列提供了一种机制,能够确保每次调用都能返回一个唯一的值&…...
部署安装jdk8\redis\mysql8\nginx
安装jdk8 linux安装jdk8详细步骤_linux jdk8安装-CSDN博客 安装redis 安装redis 后台启动命令 cd /ra/redis-6.0.0/src ./redis-server --daemonize yes安装mysql8.0(自定义目录安装) 1、创建自己的mysql-8.0,解压mysql安装包 tar -zxv…...
重要通知:Sedex 旧平台即将关闭
我们正在对 Sedex 平台进行一些重要更新,这些更新将更好地提升您的用户体验。 作为更新计划的⼀部分,我们将在 2025 年 2 ⽉关闭 Sedex Advance 平台(即,Sedex 旧平台)。旧平台的⼀些功能将转移到当前的平台上。这些改…...

Windows配置NTP时间同步
Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具:w32tm3.2 控制面板中的设置 4. 高级设置(Windows Server 环境)5.调整时间同步的间隔5.1 通过组策略调整时…...

学Linux的第八天
目录 管理进程 概念 程序、进程、线程 进程分类 进程前后台调用 查看进程 ps命令 unix 风格 bsd风格 GNU风格 top命令 格式 统计信息区 进程信息区:显示了每个进程的运行状态 kill命令 作用 格式 管理进程 概念 程序、进程、线程 程序&#x…...

2024IJCAI | MetalISP: 仅用1M参数的RAW到RGB高效映射模型
文章标题是:《MetaISP:Effcient RAW-to-sRGB Mappings with Merely 1M Parameters》 MetaISP收录于2024IJCAI,是新加坡国立大学(Xinchao Wang为通讯作者)和华为联合研发的新型ai-isp。 原文链接:MetaISP 【1】论文的…...
aws-athena查询语句总结
完全归于本人mysql语句小白,是一点也写不出来,故汇总到此 1. cloudtrail ## 查询事件排序 SELECT eventname,eventtime,count(eventname) as num FROM your_athena_tablename where eventtime between 2024-11-10 and 2024-11-11 group by eventname…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...