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

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)


目录

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

1.前言

2. 水表数字识别的方法

3. 水表数字识别数据集

4. 水表数字分割模型训练

(1)项目安装

(2)构建Train和Test水表数据集

(3)构建模型

(4)修改配置文件:configs/config_labelme_db.yaml

(5)开始训练

(6)可视化训练过程

5. 水表数字识别模型训练

6. 水表数字检测效果(Python版本)

7. 水表数字检测效果(Android版本)

8. 水表数字分割项目源码下载

(1)水表数字分割(推理版本)

(2)水表数字分割(训练版本)


1.前言

本项目将实现水表数字识别,整套方案采用二阶段方法实现,即首先使用文本(数字)检测模型DBNet定位水表数字的区域,然后进行校正并裁剪水表数字区域,再使用CRNN模型对水表数字的区域进行文本(数字)识别。

整套项目分为:数据集说明,DBNet文本(数字)检测模型训练、CRNN文本(数字)识别模型训练,以及水表数字识别边缘侧部署C++/Android等多个章节,本篇是项目《​​​​水表数字识别》系列文章之Pytorch DBNet实现水表数字检测;为了方便后续模型工程化和Android平台部署,项目对文字检测模型和文字识别模型进行轻量化,并提供Python/C++/Android多个版本;

项目提供两个版本的水表数字分割模型DBNetFast-SCNN模型,其中DBNet参数量比较大,计算量也大,检测精度较高;Fast-SCNN是轻量化模型,参数量较小,计算量也小,但精度较小;下表格给出文本(数字)检测模型DBNet和Fast-SCNN的计算量和参数量,以及其预测结果的均方误差MSE:

模型input-sizeparams(M)GFLOPsMSEmIOU

DBNet

320×320

9722.27M

12.22M

0.1508

0.9333

Fast-SCNN

320×320

1.24M

939.01M

0.1997

0.9531

水表数字检测效果展示:

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/139998754


 更多项目《水表数字识别》系列文章请参考:

  • 水表数字识别1:水表数字数据集说明(含下载链接) 
  • 水表数字识别2:Pytorch  DBNet实现水表数字检测(含训练代码和数据集)
  • 水表数字识别3:Pytorch  CRNN实现水表数字识别(含训练代码和数据集)
  • 水表数字识别4:C++实现水表数字识别(含源码 可实时检测)
  • 水表数字识别5:Android实现水表数字识别(含源码 可实时检测)

       


2. 水表数字识别的方法

传统的水表数字识别的方法主要采用字符分割的方法实现字符识别,即先将水表的图像按照预定的规则将字符一个一个切割,并按照模式匹配的方法识别字符;显然该方法效率低,准确率也不高。在深度学习算法中,实质上,水表数字识别也可以看成是OCR识别的技术范畴,其实现流程可先进行文本检测,然后再进行文本识别:

(1)水表(文本)数字检测:主要实现水表数字区域的定位,可以采用目标检测方案,如使用SSD、YOLO等目标模型进行水表检测,但精度较差;也可以采用分割方法,如本文使用的DBNet,Fast-SCNN等方法。Fast-SCNN是轻量化分割模型,可以部署到Android平台或者开发板上,在多线程或者GPU下,可以达到实时检测效果

(2)水表(文本)数字识别:主要实现水表数字识别,项目支持CRNN或LPRNet文本识别算法;为方便后续工程化,项目对CRNN模型进行魔改,提出一个PlateNet模型,用于支持部署到Android平台或者开发板上


3. 水表数字识别数据集

目前收集了2个水表数字的检查数据集:Water-Meter-Det1和Water-Meter-Det2,总数约6000+张图片,主要用于水表数字检测模型或分割模型训练和开发;

具体介绍,请参考:《水表数字识别1:水表数字数据集说明(含下载链接)》


4. 水表数字分割模型训练

(1)项目安装

.
├── configs             # 项目配置文件
├── segment             # 分割模型代码
├── data                # 项目相关数据
├── docs                # 一些说明文档
├── libs                # 第三方依赖库
├── output              # 运行输出结果
├── README.md           # 项目说明文档
├── demo.py             # 项目Demo测试文档
├── demo.sh             # 项目Demo测试脚本
├── train.py            # 项目训练文件
└── train.sh            # 项目训练脚本

推荐使用Python3.8或Python3.7,更低版本可能存在版本差异问题,Python依赖环境,使用pip安装即可,项目代码都在Ubuntu系统和Windows系统验证正常运行,请放心使用;若出现异常,大概率是相关依赖包版本没有完全对应

##
Cython==3.0.2
easydict==1.10
editdistance==0.6.2
efficientnet-pytorch==0.7.1
imageio==2.31.1
imgaug==0.4.0
imgviz==1.7.5
matplotlib==3.3.4
numpy==1.24.4
onnx==1.13.1
onnx-simplifier==0.4.33
onnxruntime==1.14.1
onnxruntime-gpu==1.15.1
onnxsim==0.4.33
opencv-contrib-python==4.8.1.78
opencv-python==4.8.0.76
Pillow==9.5.0
pyclipper==1.3.0.post5
pycocotools==2.0.6
PyQt5==5.13.2
PyQt5-Qt5==5.15.2
PyQt5-sip==12.13.0
PySocks==1.7.1
PythonWebHDFS==0.2.3
pytools==2023.1.1
PyYAML==6.0
QtPy==2.3.1
scikit-image==0.21.0
scikit-learn==1.2.2
scipy==1.10.1
seaborn==0.12.2
segmentation-models-pytorch==0.3.3
semantic-version==2.10.0
sentencepiece==0.1.99
stack-data==0.6.2
starlette==0.27.0
tensorboard==2.13.0
tensorboard-data-server==0.7.1
tensorboardX==2.6.1
timm==0.9.2
toolz==0.12.0
torch==1.13.1+cu117
torchaudio==0.13.1+cu117
torchinfo==1.8.0
torchstat==0.0.7
torchsummary==1.5.1
torchvision==0.14.1+cu117
tqdm==4.65.0
typing_extensions==4.6.3
transformers==4.31.0
Werkzeug==2.3.6
urllib3==1.26.16
xmltodict==0.13.0
basetrainer==0.8.4
pybaseutils==2.0.0

 项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):

  • 项目开发使用教程和常见问题和解决方法
  • 视频教程:1 手把手教你安装CUDA和cuDNN(1)
  • 视频教程:2 手把手教你安装CUDA和cuDNN(2)
  • 视频教程:3 如何用Anaconda创建pycharm环境
  • 视频教程:4 如何在pycharm中使用Anaconda创建的python环境
  • 推荐使用Python3.8或Python3.7,更高版本可能存在版本差异问题

(2)构建Train和Test水表数据集

下载水表检测数据集:Water-Meter-Det1和Water-Meter-Det2,具体介绍,请参考:《水表数字识别1:水表数字数据集说明(含下载链接)》,项目支持在该数据集直接训练,无须进行格式转换。

(3)构建模型

项目提供两个版本的水表数字分割模型DBNet和Fast-SCNN模型;DBNet属于高精度版本,参数量和计算量较大,检测精度较高,但比较耗时;Fast-SCNN模型属于轻量化版本,参数量和计算量较小,检测精度一般,速度较快,适合移动端部署。下表给出计算量和参数量:

模型input-sizeparams(M)GFLOPs

DBNet

320×320

9722.27M

12.22M

Fast-SCNN

320×320

1.24M

939.01M

  • DBNet: 是一种基于分割的文本检测算法,其核心思路是引入一个可微分二值化模块(Differentiable Binarization),生成一个的阈值图,使得模型分割能够自适应进行二值化GitHub - WenmuZhou/DBNet.pytorch: A pytorch re-implementation of Real-time Scene Text Detection with Differentiable Binarization

  • Fast-SCNN:是一种快速分割卷积神经网络(Fast-SCNN),是针对高分辨率图像数据的实时语义分割模型,适用于低内存嵌入式设备上的高效计算​​​​​​。https://github.com/Tramac/Fast-SCNN-pytorch

(4)修改配置文件:configs/config_labelme_db.yaml

准备好数据好,下一步是修改配置文件configs/config_labelme_db.yaml的数据路径,其他参数默认即可:

  • 修改train_data和test_data为你自己的数据路径
  • 其他参数保持默认即可
train_data:- "/home/Pan/WaterMeter/Water-Meter-Det1/train/json"- "/home/Pan/WaterMeter/Water-Meter-Det2/train/json"
test_data: '/home/Pan/WaterMeter/Water-Meter-Det1/val/json'class_name: [ "BACKGROUND", "unique" ]
use_rgb: False
train_transform: "db_train"
test_transform: "db_test"
data_type: "labelme_db"
target: "regress" # matting,segment
padding: False
resample: False
work_dir: "work_space/WaterMeter_regress"
net_type: "dbnet_resnet18" # dbnet_MobileNetV3,dbnet_resnet18
loss_type: "DBLoss"  # FocalLoss,CrossEntropyLoss,LabelSmoothing,MODLoss,PaddleMODLoss,SmoothL1Loss
width_mult: 1.0
flag: "sr09"
input_size: [ 320, 320 ]
rgb_mean: [ 0.5, 0.5, 0.5 ]  # for normalize inputs to [-1, 1],Sequence of means for each channel.
rgb_std: [ 0.5, 0.5, 0.5 ]   # for normalize,Sequence of standard deviations for each channel.
batch_size: 32
lr: 0.01
optim_type: "SGD"             # SGD,Adam
momentum: 0.9              # SGD momentum
num_epochs: 200
num_warn_up: 3
num_workers: 8
scheduler: "multi-step"
milestones: [ 60,130,160 ]
weight_decay: 0.0005 #5e-4
gpu_id: [ 0 ]
start_save: -1
log_freq: 10
progress: True
check: False
pretrained: False
finetune: ""

配置文件每个参数含义如下: 

参数类型参考值说明
train_datastr, list-训练数据文件,可支持多个文件
test_datastr, list-测试数据文件,可支持多个文件
data_typestrlabelme_db数据类型
class_namestr,list-类别文件
train_transformstrtrain训练数据数据处理方法
test_transformstrtest测试数据数据处理方法
work_dirstrwork_space训练输出工作空间
targetstrregress任务,regress表示回归任务,segment是分类任务
net_typestrdbnet_resnet18骨干网络,支持dbnet_resnet18
和fast_scnn_reg等模型
intput_sizelist[320,320]模型输入大小
rgb_meanlist[0.5,0.5,0.5]图像归一化均值
rgb_stdlist[0.5,0.5,0.5]图像归一化方差
batch_sizeint64批训练大小
lrfloat0.001初始学习率大小
optim_typestrAdam优化器,{SGD,Adam}
milestoneslist[30,80,100]降低学习率的节点
momentumfloat0.9SGD动量因子
num_epochsint200循环训练的次数
num_workersint8DataLoader开启线程数
weight_decayfloat5e-4权重衰减系数
gpu_idlist[ 0 ]指定训练的GPU卡号,可指定多个
log_freqint10显示LOG信息的频率
pretrainedstrmodel.pthpretrained的模型

(5)开始训练

整套训练代码非常简单操作,项目源码已经给出DBNet和Fast-SCNN模型配置文件;用户配置好Python环境,只需要修改好配置文件的的数据路径,即可开始训练了。

  • 训练DBNet模型
python train.py -c  configs/config_labelme_db.yaml
  • 训练Fast-SCNN模型
python train.py -c  configs/config_labelme_reg.yaml

(6)可视化训练过程

训练过程可视化工具是使用Tensorboard,使用方法:

# 基本方法
tensorboard --logdir=path/to/log/
# 例如(请修改自己的训练的模型路径)
tensorboard --logdir work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/log

Tensorboard的使用方法可以参考这里:项目开发使用教程和常见问题和解决方法_pip安装tensorboard-CSDN博客 

训练完成后,DBNet模型的测评指标均方误差MSE约0.1508左右;轻量化模型Fast-SCNN的均方误差MSE约0.1997左右;下表格给出水表数字检测模型DBNet和Fast-SCNN的计算量和参数量,以及其预测结果的均方误差MSE和mIOU:

指标说明:DBNet训练时,数据处理需要生成缩小轮廓的概率图增大轮廓的阈值图,导致与真实的轮廓有差异,从而导致最终的测评指标mIOU的结果偏低,但从指标均方误差MSE看,DBNet明显比Fast-SCNN效果好的

模型input-sizeparams(M)GFLOPsMSEmIOU

DBNet

320×320

9722.27M

12.22M

0.1508

0.9333

Fast-SCNN

320×320

1.24M

939.01M

0.1997

0.9531

5. 水表数字识别模型训练

本篇主要介绍水表数字分割模型训练,关于水表数字识别模型训练,请参考《

水表数字识别3:Pytorch  CRNN实现水表数字识别(含训练代码和数据集)》


6. 水表数字检测效果(Python版本)

demo.py文件用于推理和测试模型的效果,填写好模型文件以及测试图片即可运行测试了

demo.py源码:

  • 测试图片
python demo.py --config_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/config_labelme_db.yaml --model_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/model/latest_model_199_0.9334.pth --image_dir data/test_image
  • 测试视频文件(video_file填写视频文件路径,如data/test-video.mp4)
python demo.py --config_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/config_labelme_db.yaml --model_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/model/latest_model_199_0.9334.pth --video_file data/test-video.mp4
  • 测试摄像头(video_file填写摄像头USB ID号,一般是0,1,2)
python demo.py --config_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/config_labelme_db.yaml --model_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/model/latest_model_199_0.9334.pth --video_file 0

 水表数字分割Demo效果展示(左是原图输入,中是模型输出分割效果,右是透视矫正后的效果):


7. 水表数字检测效果(Android版本)

已经完成Android版本水表数字检测分割和识别算法开发,APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约40ms左右,GPU约30ms左右 ,基本满足业务的性能需求。详细说明请查看:水表数字识别5:Android实现水表数字识别(含源码 可实时检测)

Android Demo体验:https://download.csdn.net/download/guyuealian/89537381

  

8. 水表数字分割项目源码下载

整套项目源码分为训练版本和推理版本,推理版本只提供推理代码和推理模型,不包含数据和训练代码;训练版本提供推理代码和推理模型,并提供训练数据和训练相关的整套代码。

(1)水表数字分割(推理版本)

下载地址:Pytorch DBNet实现水表数字检测(Python推理版本)

  • 提供水表数字分割模型的推理和测试代码,不含水表数字识别模型
  • 提供高精度版本DBNe模型,参数量和计算量较大,检测精度较高,比较耗时;
  • 提供轻量化版本Fast-SCNN模型,参数量和计算量较小,检测精度一般,速度较快;
  • 提供DBNe和Fast-SCNN模型训练好的模型权重文件,可以直接使用,配置好环境,可直接运行demo.py
  • 提供推理测试文件demo.py,支持图片,视频和摄像头测试

(2)水表数字分割(训练版本)

下载地址:资源整理中。。。

水表数字数据集+水表数字分割训练代码和测试代码(Pytorch)

  • 提供整套项目水表数字分割模型推理和训练的完整代码,支持模型训练和测试,不含水表数字识别模型
  • 提供高精度版本DBNe模型,参数量和计算量较大,检测精度较高,比较耗时;
  • 提供轻量化版本Fast-SCNN模型,参数量和计算量较小,检测精度一般,速度较快;
  • 提供DBNe和Fast-SCNN模型训练好的模型权重文件,可以直接使用,配置好环境,可直接运行demo.py
  • 提供推理测试文件demo.py,支持图片,视频和摄像头测试
  • 提供水表数字数据集:Water-Meter-Det1和Water-Meter-Det2,总数约6000+张图片,主要用于水表数字检测模型或分割模型训练和开发;Water-Meter-Rec1和Water-Meter-Rec2,总数约12000+张图片,主要用于水表数字识别模型训练和开发

本篇是水表数字分割内容,如果需要实现水表数字识别,请参考第三篇文章:

水表数字识别3:Pytorch  CRNN实现水表数字识别(含训练代码和数据集)

相关文章:

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 (1&#x…...

Windows 点云生成二维栅格图 [附C++完整代码实现]

点云压缩-2D栅格图 一、点云压缩(二维栅格图)二、算法流程三、代码实现四、结果可视化一、点云压缩(二维栅格图) 点云压缩:点云是海量点的集合,其数据量通常非常庞大。直接存储这些未经压缩的点云数据会消耗大量的存储空间,特别是在处理大规模的点云数据时,这个问题变得…...

SpringBoot结合ip2region实现博客评论显示IP属地

你好呀,我是小邹。 在现代的Web应用中,特别是博客和论坛类网站,为用户提供地理定位服务(如显示用户所在地理位置)可以极大地增强用户体验。本文将详细探讨如何使用Java和相关技术栈来实现在博客评论中显示用户的地址信…...

设计模式使用场景实现示例及优缺点(行为型模式——策略模式)

在遥远的王国里,有三个重要的角色:国王策略模式、他的皇家顾问算法家族,以及年轻的骑士接口。国王策略模式统治着整个王国,他的职责是确保每一个编程问题都能找到最合适的解决方案。 有一天,王国遇到了一场危机。编程王…...

ReactRouter v6升级的步骤

React Router v6 引入了一个 Routes 组件&#xff0c;它有点像 Switch &#xff0c;但功能要强大得多。与 Switch 相比&#xff0c; Routes 的主要优势在于&#xff1a; <Routes> 中的所有 <Route> 和 <Link> 都是相对的。这导致在 <Route path> 和 &…...

【JVM实战篇】内存调优:内存问题诊断+案例实战

文章目录 诊断内存快照在内存溢出时生成内存快照MAT分析内存快照MAT内存泄漏检测的原理支配树介绍如何在不内存溢出情况下生成堆内存快照&#xff1f;MAT查看支配树MAT如何根据支配树发现内存泄漏 运行程序的内存快照导出和分析快照**大文件的处理** 案例实战案例1&#xff1a;…...

专业条码二维码扫描设备和手机二维码扫描软件的区别?

条码二维码技术已广泛应用于我们的日常生活中&#xff0c;从超市结账到公交出行&#xff0c;再到各类活动的入场验证&#xff0c;条码二维码的便捷性不言而喻&#xff0c;而在条码二维码的扫描识别读取过程中&#xff0c;专业扫描读取设备和手机二维码扫描软件成为了两大主要工…...

基于嵌入式Linux的高性能车载娱乐系统设计与实现 —— 融合Qt、FFmpeg和CAN总线技术

随着汽车智能化的发展&#xff0c;车载娱乐系统已成为现代汽车的标配。本文介绍了一个基于Linux的车载娱乐系统的设计与实现过程。该系统集成了音视频娱乐、导航、车辆信息显示等功能&#xff0c;旨在提供安全、便捷、丰富的驾驶体验。 1. 项目概述 随着汽车智能化的发展&…...

探索IP形象设计:快速掌握设计要点

随着市场竞争的加剧&#xff0c;越来越多的企业开始关注品牌形象的塑造和推广。在品牌形象中&#xff0c;知识产权形象设计是非常重要的方面。在智能和互联网的趋势下&#xff0c;未来的知识产权形象设计可能会更加关注数字和社交网络。通过数字技术和社交媒体平台&#xff0c;…...

泛微Ecology8明细表对主表赋值

文章目录 [toc]1.需求及效果1.1 需求1.2 效果2.思路与实现3.结语 1.需求及效果 1.1 需求 在明细表中的项目经理&#xff0c;可以将值赋值给主表中的项目经理来作为审批人员 1.2 效果 在申请人保存或者提交后将明细表中的人名赋值给主表中对应的值2.思路与实现 在通过js测…...

opencv—常用函数学习_“干货“_5

目录 十五、图像分割 简单阈值分割 (threshold) 自适应阈值分割 (adaptiveThreshold) 颜色范围分割 (inRange) 分水岭算法 (watershed) 泛洪填充 (floodFill) GrabCut算法 (grabCut) 距离变换 (distanceTransform) 最大稳定极值区域检测 (MSER) 均值漂移滤波 (pyrMean…...

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1&#xff08;CMD、JDK、环境变量、变量和键盘键入、IDEA&#xff09; CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…...

Redis的安装配置及IDEA中使用

目录 一、安装redis&#xff0c;配置redis.conf 1.安装gcc 2.将redis的压缩包放到指定位置解压 [如下面放在 /opt 目录下] 3.编译安装 4.配置redis.conf文件 5.开机自启 二、解决虚拟机本地可以连接redis但是主机不能连接redis 1.虚拟机网络适配器网络连接设置为桥接模式…...

ubuntu 物理内存爆炸而不使用虚拟内存的问题

ubuntu 物理内存不足时有时候会不去使用虚拟内存&#xff0c;让虚拟内存空闲&#xff0c;而直接关闭占用内存的进程&#xff0c;如果在进行模型测试或训练时&#xff0c;就会导致训练或测试进程被杀死。 1. 修改 swappiness&#xff1a; cat /proc/sys/vm/swappiness sudo sysc…...

Python实现音频均衡和降噪

使用librosa库来读取音频文件&#xff0c;音频处理是一个复杂过程&#xff0c;这里只是简单的进行降噪和均衡。 import librosa import soundfile as sf def improve_audio_quality(input_file, output_file): # 读取音频文件 audio, sample_rate librosa.load(input_…...

【JavaScript 算法】贪心算法:局部最优解的构建

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、贪心算法的基本概念贪心算法的适用场景 二、经典问题及其 JavaScript 实现1. 零钱兑换问题2. 活动选择问题3. 分配问题 三、贪心算法的应用四、总结 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种逐步构建解…...

Azcopy Sync同步Azure文件共享

文章目录 Azcopy Sync同步文件共享一、工作原理二、安装 AzCopy在 Windows 上在 Linux 上 三、资源准备1. 创建源和目标 Azure 存储账户2. 创建源和目标文件共享3. 确定路径4. 生成源和目的存储账户的共享访问签名&#xff08;SAS&#xff09;令牌配置权限示例生成的 URL 四、A…...

单例模式 饿汉式和懒汉式的区别

单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中最简单、最常见、最容易实现的一种模式。它确保一个类仅有一个实例&#xff0c;并提供一个全局访问点。单例模式主要有两种实现方式&#xff1a;饿汉式&#xff08;Eager Initialization&#xff09;和懒汉式&am…...

Python中的模块和包的定义以及如何在Python中导入和使用它们

在Python中&#xff0c;模块&#xff08;Module&#xff09;和包&#xff08;Package&#xff09;是组织代码以便重用和共享的基本单元。它们使得Python代码更加模块化&#xff0c;易于管理和维护。 模块&#xff08;Module&#xff09; 模块是一个包含Python代码的文件&…...

设计模式使用场景实现示例及优缺点(结构型模式——组合模式)

结构型模式 组合模式&#xff08;Composite Pattern&#xff09; 组合模式使得用户对单个对象和组合对象的使用具有一致性。 有时候又叫做部分-整体模式&#xff0c;它使我们树型结构的问题中&#xff0c;模糊了简单元素和复杂元素的概念&#xff0c;客户程序可以像处理简单元…...

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-06-云计算(Cloud Computing) 技术概述

文章目录 1. 相关概念2. 云计算的服务方式2.1 软件即服务 (SaaS)2.2 平台即服务 (PaaS)2.3 基础设施即服务 (IaaS)2.4 三种服务方式的分析2.4.1 在灵活性2.4.2 方便性方 3. 云计算的部署模式3.1 公有云3.2 社区云3.3 私有云3.4 混合云 4. 云计算的发展历程4.1 虚拟化技术4.2 分…...

网络安全工作者如何解决网络拥堵

网络如同现代社会的血管&#xff0c;承载着信息的血液流动。然而&#xff0c;随着数据流量的激增&#xff0c;网络拥堵已成为不容忽视的问题&#xff0c;它像是一场数字世界的交通堵塞&#xff0c;减缓了信息传递的速度&#xff0c;扰乱了网络空间的秩序。作为网络安全的守护者…...

电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法

mfc140u.dll是什么&#xff1f;为什么电脑会出现mfc140u.dll丢失&#xff1f;那么mfc140u.dll丢失会给电脑带来什么影响&#xff1f;mfc140u.dll丢失怎么办&#xff1f;今天详细给大家一一探讨一下mfc140u.dll文件与mfc140u.dll丢失的多种不同解决方法分享&#xff01; 一、mfc…...

ospf的MGRE实验

第一步&#xff1a;配IP [R1-GigabitEthernet0/0/0]ip address 12.0.0.1 24 [R1-GigabitEthernet0/0/1]ip address 21.0.0.1 24 [R1-LoopBack0]ip address 192.168.1.1 24 [ISP-GigabitEthernet0/0/0]ip address 12.0.0.2 24 [ISP-GigabitEthernet0/0/1]ip address 21.0.0.2 24…...

开发指南047-前端模块版本

平台前端框架内置了一个文件version.vue <template> <div> <br> 应用名称: {{name}} <br> 当前版本&#xff1a;{{version}} <br> 服务网关: {{gateway}} </div> </template> <scrip…...

c#中的字符串方法

Concat() String.Concat(字符串1 字符串n) 字符串拼接 Contains () 字符串1.Contains(字符串2) 字符串1是否包含字符串2返回布尔值 CopyTo() 字符串1.CopyTo(0,空数组,0,5); 从哪开始 复制到哪里 从哪开始存 存储的个数 tartsWith 字符串1.StartsWith("字符串") 以…...

成像光谱遥感技术中的AI革命:ChatGPT

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力&#xff0c;ChatGPT在遥感中的应用&#xff0c;人工智能在…...

学习分布式事务遇到的小bug

一、介绍Seata 在处理分布式事务时我用到是Seata&#xff0c;Seata的事务管理中有三个重要的角色&#xff1a; TC (Transaction Coordinator) - 事务协调者&#xff1a;维护全局和分支事务的状态&#xff0c;协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器…...

ElasticSearch学习之路

前言 为什么学ElasticSearch&#xff1f; 数据一般有如下三种类型&#xff1a; 结构化数据&#xff0c;如&#xff1a;MySQL的表&#xff0c;一般通过索引提高查询效率非结构化数据&#xff0c;如&#xff1a;图片、音频等不能用表结构表示的数据&#xff0c;一般保存到mong…...

(C++二叉树02) 翻转二叉树 对称二叉树 二叉树的深度

226、翻转二叉树 递归法&#xff1a; 交换两个结点可以用swap()方法 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(root NULL) return NULL;TreeNode* tem root->left;root->left root->right;root->right tem;invertTree(root->l…...