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

基于深度学习的甲状腺结节影像自动化诊断系统(PyQt5界面+数据集+训练代码)

随着医学影像技术的发展,计算机辅助诊断在甲状腺结节的早期筛查中发挥着重要作用。甲状腺结节的良恶性鉴别对临床治疗具有重要意义,但传统的诊断方法依赖于医生的经验和影像学特征,存在一定的主观性和局限性。为了解决这一问题,本文提出了一种基于深度学习的自动化甲状腺结节良恶性分类方法。

本研究使用了VGG16和ResNet50两种经典卷积神经网络(CNN)模型,对甲状腺结节图像进行分类。首先,我们收集了包含良性和恶性甲状腺结节的医学影像数据集,并进行了数据预处理和增强。然后,利用PyTorch框架对VGG16和ResNet50模型进行训练,并评估其在甲状腺结节良恶性分类中的性能。通过实验结果,表明ResNet50在该任务中表现出较高的准确率和更强的泛化能力。

开发了一个基于PyQt5的图形用户界面(GUI),该系统支持图像上传、分类检测、结果显示和保存等功能,为临床医生提供了便捷的辅助诊断工具。最终,通过对比实验和性能分析,我们验证了深度学习模型在甲状腺结节分类中的有效性,并探讨了模型优化和实际应用的可能性。

本文的研究为甲状腺结节的自动化诊断提供了一种高效的辅助方法,具有较高的临床应用价值,为医生在甲状腺疾病的诊断中提供了有力的支持。

算法流程

项目数据

传统的机器学习算法对图像进行识别等研究工作时,只需要很少的图像数据就可以开展工作。而在使用卷积神经网络解决研究的甲状腺结节识别问题的关键其一在于搭建合适的神经网络,其二更需要具备大量优质的训练数据集,在大量的有标签数据不断反复对模型进行训练下,神经网络才具备我们所需要的分类能力,达到理想的分类效果。因此有一个质量较好的图像数据集至关重要。

数据集介绍:
本研究使用的甲状腺结节图像数据集是专门为甲状腺结节诊断任务设计的,包含了良性(benign)和恶性(malignant)甲状腺结节的组织切片图像。数据集中的图像是从临床病人样本中获取,经过专业的病理学家标注,确保数据的准确性和可靠性。每一张图像代表了甲状腺结节的不同病理特征,包括细胞密度、结节大小、形状不规则性等,能够为深度学习模型提供丰富的特征信息。

数据集已被预先标注,每个类别的图像数量基本均衡,为训练和验证提供了稳定的基准。数据集被划分为训练集和测试集,其中每类生肖图像的数量分别如下:
(1)训练集:良性类2626张图像,恶性类3205张图像,共5831张图像。

(2)测试集:良性类653张图像,恶性类798张图像,共1451张图像。

这种划分方式保证了数据的多样性和代表性,同时通过验证集和测试集的独立性,能够有效评估模型的泛化能力。

数据预处理
为了提高模型的泛化能力并防止过拟合,我们对数据集进行了数据预处理。具体步骤如下:
(1)尺寸标准化:所有图像被调整为统一的224×224像素,以适配VGG16和ResNet50等模型的输入要求。
(2)归一化:对图像进行归一化处理,标准化RGB通道的像素值,使其均值为[0.485, 0.456, 0.406],标准差为[0.229, 0.224, 0.225]。这些参数是基于ImageNet数据集计算得出的,适用于VGG16和ResNet50的预训练模型。

数据增强
1.训练集增强:
(1)随机裁剪:随机裁剪图像并调整为224×224的尺寸,增加数据的多样性,帮助模型更好地学习到不同的尺度和视角。
(2)随机水平翻转:随机对训练图像进行水平翻转,进一步增加数据集的变异性,提高模型的鲁棒性。

2.验证集增强:
(1)Resize和CenterCrop:将验证图像的长边调整为256像素,然后从中心裁剪224×224区域,确保数据统一性。

通过数据增强和标准化处理,能有效提高模型对各种变换的适应能力,从而提升其在不同场景下的分类效果。

数据集划分
数据集已预先划分为两个部分:训练集和测试集,具体如下:
(1)训练集:良性类2626张图像,恶性类3205张图像,共5831张图像,用于模型训练,通过最小化损失函数优化参数。
(2)测试集:良性类653张图像,恶性类798张图像,共1451张图像,用于评估模型在未见数据上的表现

这种数据集划分方式有助于保证模型训练和评估的可靠性,确保各数据集独立,避免数据泄露和过拟合。

实验硬件
本实验的硬件环境设置如下:
(1)计算平台:NNVIDIA GeForce RTX 3070 Ti。(8GB显存),支持CUDA加速
(2)CPU:12th Gen Intel(R) Core(TM) i9-12900H 2.50 GHz 14核处理器
(3)内存:32GB RAM
(4)存储:1TB SSD,用于存储数据集和模型权重

该硬件环境提供了足够的计算资源,能够支持大规模图像数据的训练和高效计算,尤其在使用GPU进行加速时,训练时间得到了显著缩短。

实验超参数设置
本实验中的主要超参数设置如下:
(1)学习率:0.0001,使用Adam优化器,能够自适应调整学习率,表现较好。
(2)批次大小:训练时为32,验证时为64,较小的批次大小有助于稳定训练并提高计算效率。
(3)优化器:使用Adam优化器,适用于稀疏数据和非凸问题。
(4)损失函数:采用交叉熵损失函数(CrossEntropyLoss),适用于多分类任务。
(5)训练轮数:设定为15轮,帮助模型逐渐收敛。
(6)权重初始化:使用预训练的VGG16和ResNet50权重进行迁移学习,加速收敛并提高分类性能。

这些超参数设置经过反复调试,以确保模型在验证集上表现良好。

实验过程与结果分析

Tipps:分析VGG16和ResNet50两种模型在甲状腺结节分类任务中的实验结果。包括训练过程中的损失与准确率变化、模型性能对比、混淆矩阵(热力图)分析、过拟合与欠拟合的讨论,以及计算效率的分析。

训练过程中的损失与准确率变化
为了评估模型在训练过程中的表现,我们记录了每个epoch的训练损失、训练准确率以及验证损失、验证准确率。通过这些指标,我们可以观察到模型是否能够有效收敛,以及是否存在过拟合或欠拟合的情况。

1.1 VGG16模型训练过程
VGG16模型在训练过程中的损失和准确率曲线如下所示:
 


(1)训练损失:这种下降趋势表明,模型在训练过程中逐渐减少了预测误差,学习到了更多有效的特征。随着训练进行,损失值的下降趋于平稳,这通常意味着模型已经较好地拟合了训练数据。
(2)训练准确率:这种上升趋势表明,模型成功地学习到了训练集中的模式,并且能够正确分类大部分训练样本。随着训练轮次的增加,训练准确率逐渐趋近于高值,表明模型在训练数据上的表现良好。
(3)验证损失与验证准确率:波动则可能是过拟合的信号,表明模型在训练集上表现较好,但在验证集上可能存在泛化能力不足的问题。

1.2 ResNet50模型训练过程
ResNet50模型在训练过程中的损失和准确率曲线如下所示:
 


(1)训练损失:训练损失的下降表明模型在训练过程中逐渐减少了预测误差,并且在训练数据上得到了很好的拟合。损失值的持续下降显示出模型在训练数据上的有效学习。
(2)训练准确率:训练准确率从约0.65开始,在初期几个epoch中迅速上升。接着,随着训练的进行,准确率的上升速度减缓,但总体上仍稳步增加,最终在50个epoch时接近0.9。
(3)验证损失与验证准确率:验证准确率在训练过程中初期与训练准确率相似,但随着训练的进行,验证准确率开始出现波动并趋于稳定,最终稳定在0.85左右。验证损失的变化则表现出波动,且下降速度较训练损失慢。在后期,验证损失甚至出现上升的趋势,表明模型在验证数据上的表现不如在训练数据上稳定,进一步反映了过拟合的迹象。

从损失和准确率的曲线来看,ResNet50在训练过程中的收敛速度和稳定性都优于VGG16,表明其更适合处理复杂的分类任务。

模型性能对比
1.VGG16与ResNet50的准确率比较
在训练和验证过程中,ResNet50模型表现出了更高的准确率,尤其是在验证集上的表现更为突出。VGG16的最终训练准确率为0.862,验证准确率为0.862,而ResNet50的训练准确率为0.924,验证准确率为0.924。
(1)训练准确率:ResNet50的训练准确率更稳定,并且在处理复杂任务时具有更强的学习能力和稳定性,而VGG16的表现则相对较为波动。
(2)验证准确率:ResNet50在验证准确率上的稳定性和最终表现优于VGG16,其更能有效地避免过拟合,并展现出较强的泛化能力,适合处理复杂的分类任务。

如果数据集较复杂且计算资源充足,推荐使用 ResNet50,它能提供更好的准确率和泛化能力。如果是较简单的任务,VGG16 可以作为一个快速、有效的选择。

2.损失函数与准确率曲线分析
(1)ResNet50 在损失函数和准确率曲线的稳定性上表现更好,泛化能力较强,且避免了过拟合,验证准确率和训练准确率接近,说明模型能够很好地适应不同数据集。
(2)VGG16 尽管最终的训练和验证准确率与ResNet50相似,但在训练过程中,验证损失和准确率的波动较大,可能是由于其网络结构较简单,导致其泛化能力不如ResNet50。

混淆矩阵分析(热力图)
为了更全面地分析模型的分类性能,我们生成了混淆矩阵并将其可视化为热力图,帮助我们直观地了解模型在哪些类别上表现较好,在哪些类别上存在误分类。

1.VGG16的热力图:VGG16在恶性样本的预测上表现非常优秀,但在良性样本的分类上仍有改进空间。通过调整模型阈值、处理数据不平衡、优化特征工程和进行模型调优等方法,可以进一步提升模型在良性样本的识别准确度。

2.ResNet50的热力图:ResNet50 在分类任务中表现优异,尤其是在恶性类别的预测上具有很高的准确性。尽管在良性类别的预测中有少量的假阴性误差,但整体模型性能非常稳健,适用于实际应用中的肿瘤分类任务。

通过混淆矩阵的分析,ResNet50在分类任务上表现得非常出色,尤其是在恶性样本的预测上。通过进一步的优化,数据增强、特征工程、超参数调优等方法,可以进一步提升良性样本的预测性能,减少假阴性率,从而使模型在实际应用中更加稳定和可靠。

过拟合与欠拟合分析
(1)过拟合:ResNet50更能避免过拟合,其验证准确率和训练准确率的差距较小,泛化能力强,尽管在最后阶段存在轻微的过拟合,但整体表现稳定。
(2)欠拟合:ResNet50在训练过程中没有表现出欠拟合的现象,训练和验证准确率的提升表明模型成功地学习到了数据特征,并在泛化方面表现良好。

ResNet50的性能优于VGG16,特别是在处理较复杂任务时具有更好的泛化能力和稳定性,而VGG16需要进一步优化,尤其是在正则化和数据增强方面,以提升其泛化能力。

计算效率分析
(1)ResNet50 在计算效率方面明显优于 VGG16。ResNet50 的参数量较小,计算资源需求更低,训练和推理速度更快。特别是在深层网络的训练中,ResNet50 更能够高效地进行学习。
(2)VGG16 的计算效率较低,主要是由于其庞大的参数量和复杂的全连接层,导致训练和推理时的时间和内存消耗较大。

如果计算效率是项目的关键考虑因素,ResNet50 更适合用于大规模训练任务,尤其是在时间有限的情况下。

运行效果

– 运行 MainProgram.py
1.ResNet50模型运行:
(1)主界面

(2)甲状腺结节良性

(3)甲状腺结节恶性

2.VGG16模型运行:
(1)主界面

(2)甲状腺结节良性

(3)甲状腺结节恶性

3.检测结果保存

点击保存按钮后,会将当前选择的图检测结果进行保存。
检测的结果会存储在save_data目录下。

图片文件保存的csv文件内容如下:

– 运行 train_resnet50.py
这段代码的主要目的是在直接运行该脚本时,加载指定路径下的训练集和测试集,初始化一个 MainProcess 实例并训练模型(ResNet50),设置训练的轮数为 15 轮。

数据集路径设置:
(1)train_dir = r”D:\Dataset\train”:设置训练集数据的路径。
(2)test_dir = r”D:\Dataset\test”:设置测试集数据的路径。

模型路径设置:
(1)model_name0 = r”models/resnet50.pth”:指定训练模型的文件路径,这里是 resnet50.pth 模型的路径,用于加载预训练的 ResNet50 权重或保存训练后的模型。

实例化MainProcess类:
(1)cnn = MainProcess(train_dir, test_dir, model_name0):通过传入训练集路径、测试集路径和模型路径,创建 MainProcess 类的实例 cnn,这个类负责数据加载、模型训练、验证等操作。

调用主函数main进行训练:
(1)cnn.main(epochs=50):调用 cnn 对象的 main 方法,开始训练模型。epochs=50 表示模型训练将进行50轮(每轮遍历整个训练集一次)。该方法将包括模型的训练过程、损失计算、验证等步骤

训练日志结果
ResNet50日志结果

这张图展示了使用ResNet50进行模型训练的详细过程和结果。

配置信息:
(1)模型在训练了50轮后,总共耗时61分钟。
(2)本次训练使用了GPU设备,具体是CUDA设备0。

训练过程:
训练过程记录了50个 epoch,每个 epoch 的训练损失和验证准确率都有输出:
(1)训练损失(train_loss)逐渐下降,意味着模型正在学习,并优化其预测能力。
(2)验证准确率(val_accuracy)在最初几轮相对较低,但随后迅速提升并稳定在较高的水平,最终达到92.4%,这表明模型具有较好的泛化能力。

训练速度:
训练的速度在2.8it/s到4.1it/s之间,表示每秒钟处理大约2.8到4.18个批次。
(1)每个epoch的训练时间约为50秒到60秒左右。
(2)每个验证批次的处理时间大约是20秒到24秒。

完成信息:
(1)Process finished with exit code 0:表示整个验证过程顺利完成,没有报错。

总结:
ResNet50在训练过程中通常表现出较好的平稳性和较快的收敛速度。通过调整超参数、应用正则化方法和确保充足的计算资源,能够进一步提升其训练和验证性能。

– 运行 train_vgg16.py
这段代码的主要目的是在直接运行该脚本时,加载指定路径下的训练集和测试集,初始化一个 MainProcess 实例并训练模型(VGG16),设置训练的轮数为 15 轮。

数据集路径设置:
(1)train_dir = r”D:\ZodiacDataset\train”:设置训练集数据的路径。
(2)test_dir = r”D:\ZodiacDataset\test”:设置测试集数据的路径。

模型路径设置:
(1)model_name0 = r”models/vgg16.pth”:指定训练模型的文件路径,这里是 vgg16.pth 模型的路径,用于加载预训练的 VGG16 权重或保存训练后的模型。

实例化 MainProcess 类:
(1)cnn = MainProcess(train_dir, test_dir, model_name0):通过传入训练集路径、测试集路径和模型路径,创建 MainProcess 类的实例 cnn,这个类负责数据加载、模型训练、验证等操作。

调用主函数main进行训练:
(1)cnn.main(epochs=15):调用 cnn 对象的 main 方法,开始训练模型。epochs=50 表示模型训练将进行50轮(每轮遍历整个训练集一次)。该方法将包括模型的训练过程、损失计算、验证等步骤

训练日志结果
VGG16日志结果

这张图展示了使用VGG16进行模型训练的详细过程和结果。

配置信息:
(1)模型在训练了50轮后,总共耗时78分钟。
(2)本次训练使用了GPU设备,具体是CUDA设备0。

训练过程:
训练过程记录了15个epoch,每个epoch的训练损失和验证准确率都有输出:
(1)训练损失(train_loss)在每个epoch结束时有所下降(从0.811下降到0.225)。
(2)验证准确率(val_accuracy)从0.638提升到0.862,说明模型的性能在不断提高。

训练速度:
训练的速度在2.5it/s之间,表示每秒钟处理大约2.5个批次。
(1)每个epoch的训练时间约为 1分10秒到1分20秒。
(2)每个验证批次的处理时间大约是23秒到24秒。

完成信息:
(1)Process finished with exit code 0:表示整个验证过程顺利完成,没有报错。

总结:
VGG16模型在50个训练周期中表现出良好的学习能力和逐步提升的验证准确率,尽管初期存在一定的波动,但通过训练能够有效提高性能。

相关文章:

基于深度学习的甲状腺结节影像自动化诊断系统(PyQt5界面+数据集+训练代码)

随着医学影像技术的发展,计算机辅助诊断在甲状腺结节的早期筛查中发挥着重要作用。甲状腺结节的良恶性鉴别对临床治疗具有重要意义,但传统的诊断方法依赖于医生的经验和影像学特征,存在一定的主观性和局限性。为了解决这一问题,本…...

docker常用操作命令

Docker 常用命令 列出所有容器 ID docker ps -aq停止所有容器 docker stop $(docker ps -aq)删除所有容器 docker rm $(docker ps -aq)删除所有镜像 docker rmi $(docker images -q)复制文件 docker cp mycontainer:/opt/file.txt /opt/local/ docker cp /opt/local/file…...

Android:生成Excel表格并保存到本地

提醒 本文实例是使用Kotlin进行开发演示的。 一、技术方案 org.apache.poi:poiorg.apache.poi:poi-ooxml 二、添加依赖 [versions]poi "5.2.3" log4j "2.24.2"[libraries]#https://mvnrepository.com/artifact/org.apache.poi/poi apache-poi { module…...

JVM-程序计数器与栈

目录 程序计数器1:作用:2:特点:1:线程私有2:内存不会溢出 栈1:介绍:2:问题辨析: 程序计数器 1:作用: 程序计数器的作用就是记录下一条…...

【kotlin 】内联类(value class / inline class)

官方文档:https://kotlinlang.org/docs/inline-classes.html 注:inline class 关键字已经被废弃,取而代之的是value class。现在使用内联类需要定义类为value class,并使用JvmInline注解进行标注。 一、使用场景 有时候&#xff…...

【SpringBoot】使用IDEA创建SpringBoot项目

1、使用SpringBoot脚手架创建 我们使用SpringBoot的脚手架Spring Initializr创建,如图所示: 2、选择SpringBoot版本 最开始做项目时候,组长说创建一个 springboot 2.5.4 的项目,mysql使用 5.6.X ,maven使用是3.6.X…...

C++设计模式(原型、代理、适配器、组合)

一、原型模式 1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式允许通过复制现有的对象来创建新对象,而不是通过实例化类来创建。这种方式可以避免创建重复的对象,从而提高性能和降低内存消耗。 2.组成 …...

如何在CentOS 7上使用FreeIPA设置集中式Linux身份验证

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 FreeIPA 是一个针对 Linux 的开源安全解决方案,提供帐户管理和集中式身份验证,类似于微软的 Active Direc…...

vue2播放视频和预览文件的组件以及使用方法

##文件预览组件 按照组件 解决展示pdf的问题 npm install pdfh5 npm install canvas2.8.0 --ignore-scripts npm install --save dommatrix npm install --save web-streams-polyfill解决excel和docx预览的问题 npm install vue-office/docx vue-demi0.14.6 npm inst…...

性能之巅:Go语言优化深度探索

引言 在Go语言中进行性能优化是一个涉及多方面的工作,它涵盖代码编写、编译器优化、运行时系统调优以及对应用程序的深入理解。以下是一些关键点,包括性能分析工具、内存管理、并发优化等方面的内容,并附带了简单案例源代码。 性能分析工具…...

react + antd desgin 使用form功能时upload,radio,checkbox不能回显的问题

最近使用react开发 遇到form回显的问题 ,处理upload回显的问题,提示 react-refresh:160 Warning: [antd: Upload] value is not a valid prop, do you mean fileList? 查看文档后,在form.item 组件下有一个特殊属性 valuePropName 子节点的值…...

【08】MySQL复杂查询:子查询语句详解与示例

文章目录 一、子查询的基本概念子查询的基本结构子查询的类型 二、标量子查询示例 1:标量子查询示例 2:标量子查询与IN组合 三、多行子查询示例 1:多行子查询与IN示例 2:多行子查询与ANY 四、多列子查询示例 1:多列子查…...

Unity 相机旋转及角度限制

前言 由于欧拉角具有直观的可读性,做相机旋转时选择修改eulerAngles 来实现旋转,但实际效果与预期稍有不同,这是因为欧拉角受到万向锁(Gimbal Lock)的影响,在赋值时需要对输入的角度进行调整。 if (value…...

error=‘null‘], commandType=io.lettuce.core.RedisPublisher$SubscriptionCommand]

问题 查看java应用启动日志输出下面错误: errornull], commandTypeio.lettuce.core.RedisPublisher$SubscriptionCommand] Completing command LatencyMeteredCommand [typeINFO, outputStatusOutput [output# Server redis_version:4.0.14 redis_git_sha1:000…...

Golang 字符串字面量表示方法

文章目录 1.普通字符串字面量(Double-Quoted String Literals)2.原始字符串字面量(Raw String Literals)3.字节字符串字面量(Byte Slice Literals)4.码值表示字符串字面量Unicode 转义序列UTF8 转义序列十六…...

03_Webpack模块打包工具

03_Webpack模块打包工具 目录 知识点自测 以下哪个选项是 ECMAScript 默认导出和导入的语法? A:export 和 require B:module.exports {} 和 import 变量名 C:export default 和 import 变量名 D:export 和 import {…...

【目标跟踪】AntiUAV600数据集详细介绍

AntiUAV600数据集的提出是为了适应真实场景,即无人机可能会随时随地出现和消失。目前提出的Anti-UAV任务都只是将其看做与跟踪其他目标一样的任务,没有结合现实情况考虑。 论文链接:https://arxiv.org/pdf/2306.15767https://arxiv.org/pdf/…...

十、JavaScript的应用的习题

题目一 在网页中显示一个工作中的 “ 数字时钟 ”&#xff0c;如图所示 运行效果 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>动态时钟</title><style>.all{width: 660px;height: 350px;margin: 60p…...

【Spring】AOP

AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;用来帮助开发者更好地组织程序结构。它的主要作用是为现有功能添加增强&#xff0c;而不需要修改原始代码。这与 Spring 框架提倡的“无侵入式编程”相符&#xff0…...

三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)

绘图工具 三维地图&#xff1a;Cesiumjs 建模方式&#xff1a;激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模 建模工具&#xff1a;C4D Blender GeoBuilding ArcGIS Cesiumjs <!DOCTYPE html> <html lang"en"> <head><meta …...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...