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

news2024/11/15 12:04:19

水表数字识别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实现水表数字识别(含训练代码和数据集)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1932207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle线上执行SQL特别慢的原因分析

一、背景: 线上反馈一张表select * from table where idxxx语句执行特别慢,超过60s超时不能处理,第一直觉是索引失效了,开始执行创建索引语句create index index_name on table() online。但是执行了超过20分钟索引还没有创建成功…

NestJs框架getRepository方法废弃解决办法,顺便介绍一下typeORM框架

报错&#xff1a; Connection "default" was not found. ... ...因为 typeorm 版本不对&#xff0c;这是旧版的 api, 可以考虑降版本到 <0.3.0 解决 介绍一下 typeORM 我们如果直接使用 Node.js 操作 mysql 提供的接口&#xff0c; 那么编写的代码就比较底层&a…

彩电上自带的推箱子游戏是什么编程语言开发的?

2000年左右的厦新彩电上&#xff0c;自带了推箱子、华容道游戏。界面如下&#xff1a; 在线版推箱子游戏&#xff0c;网址&#xff1a;https://www.tuixiangzi.cn/ BASIC&#xff0c;全称是Beginners All-purpose Symbolic Instruction Code&#xff0c;含义是初学者通用符号…

Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验

title: Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验 date: 2024/7/16 updated: 2024/7/16 author: cmdragon excerpt: 摘要&#xff1a;“Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验”介绍如何使用useHead函数…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥别名集(ArkTS)】

查询密钥别名集(ArkTS) HUKS提供了接口供应用查询密钥别名集。 开发步骤 初始化密钥属性集。用于查询指定密钥别名集TAG&#xff0c;TAG仅支持HUKS_TAG_AUTH_STORAGE_LEVEL。调用接口[listAliases]&#xff0c;查密钥别名集。 HarmonyOS与OpenHarmony鸿蒙文档籽料&#xff1…

中国星坤X0800HI系列线对板连接器:创新技术连接,引领智能家居未来!

近日&#xff0c;中国星坤推出的X0800HI系列线对板连接器&#xff0c;凭借其独特的设计和卓越的性能&#xff0c;引起了业界的广泛关注。 X0800HI系列线对板连接器在极小空间内实现了线对板的W-B连接&#xff0c;这不仅解决了传统连接方式中剥线和焊接的繁琐步骤&#xff0c;还…

【Linux 配置静态IP】Ubuntu20.04

最近学习网络编程&#xff0c;为了方便学习需要Ubuntu配置静态IP&#xff0c;网上看了好多贴子跟着试了下可以实现&#xff0c;但重启虚拟机后有时就无法连接&#xff0c;总之各种各样问题&#xff1b;相关的配置方法也比较凌乱&#xff0c;有用netplan 或者 ifupdown ,笔者简单…

【日常记录】【插件】excel.js 的使用

文章目录 1. 引言2. excel.js2.1 创建工作簿和工作表2.2 excel文件的导出2.3 excel文件的导入2.4 列2.5 行2.6 添加行2.7 单元格2.8 给总价列设置自动计算(除表头行) 3. 总结参考链接 1. 引言 前端导出excel文件常用库一般是 excel.js 和 xlsx.js xlsx.js 导出数据确实方便&…

函数定义、合约与面向对象(以太坊solidity合约)

函数定义、合约与面向对象&#xff08;以太坊solidity合约&#xff09; 1-函数定义、构造与多态2-事件日志3-面向对象特征 1-函数定义、构造与多态 创建合约就是创建类&#xff0c;部署合约就是实例化 合约的方法还支持多态 还能使用第三方的库进行开发 整个合约部署后&…

AAD Connect自定义同步用户上云

使用场景&#xff1a;我想同步本地AD域的那些用户信息、账号上云端做SSO登录和权限管控&#xff0c;但是不希望使用快速上传一股脑传上去&#xff0c;所以使用自定义同步功能上传&#xff0c;这是一篇对AAD CONNECT这个应用的详解和配置步骤推荐 AD Connect如何自定义配置&…

百分点科技签约潍坊市数据产业发展战略合作

近日&#xff0c;潍坊市数据产业发展战略合作签约仪式举行&#xff0c;潍坊市人民政府副市长张震生&#xff0c;潍坊市财政局党组书记、局长王金祥&#xff0c;潍坊市大数据局党组书记陈强出席大会并致辞。百分点科技受邀进行战略合作签约&#xff0c;共同见证潍坊市数据要素市…

Python和C++骨髓细胞进化解析数学模型

&#x1f3af;要点 &#x1f3af; 数学模型邻接矩阵及其相关的转移概率 | &#x1f3af;蒙特卡罗模拟进化动力学 | &#x1f3af;细胞进化交叉图族概率 | &#x1f3af;进化图模型及其数学因子 | &#x1f3af;混合图模式对进化概率的影响 | &#x1f3af;造血干细胞群体的空间…

【异步爬虫:利用异步协程抓取一部电影】

利用异步协程抓取一部电影 我们把目光转向wbdy. 目前该案例还是可以用的. 我们想要抓取网上的视频资源就必须要了解我们的视频网站是如何工作的. 这里我用91看剧来做举例. 其他网站的原理是一样的. 1.视频网站是如何工作的 假设, 你现在想要做一个视频网站. 也有很多的UP猪…

【数学建模】高温作业专用服装设计(2018A)隐式差分推导

为方便计算&#xff0c;对区域进行离散化处理&#xff0c;采用隐式差分格式进行离散计算。隐式差分格式如图&#xff1a; 每层材料内部 对第 j j j层材料: 其中&#xff0c; λ j \lambda_j λj​表示第 j j j层的热扩散率&#xff0c; c j c_j cj​表示第 j j j层的比热容…

IntelliJ IDEA 2024.1 最新变化 附问卷调查 AI

IntelliJ IDEA 2024.1 最新变化 问卷调查项目在线AI IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 AI AssistantAI Assistant 改进 UltimateAI Assistant 中针对 Java 和 Kotlin 的改进代码高亮显示 Ultimate…

第100+16步 ChatGPT学习:R实现Xgboost分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现Xgboost分类 &#xff08…

智能守护校园餐桌:校园阳光食堂视频AI监控智能管理方案

一、背景分析 随着科技的飞速发展&#xff0c;智能化、信息化已成为现代校园管理的重要趋势。校园食堂作为学校重要的服务设施&#xff0c;其食品安全、环境卫生和秩序管理显得尤为重要。作为校园生活中不可或缺的一部分&#xff0c;食堂的管理也急需引入先进技术&#xff0c;…

【Git】(基础篇二)—— Git操作

Git操作 在了解git理论知识之后&#xff0c;本文将结合实践操作为你讲解git的底层逻辑 Git的安装和配置 git官网下载&#xff1a;https://git-scm.com/ 下载后安装时除了选择安装地址外&#xff0c;其余都保持默认下一步即可。 安装好后鼠标右键会出现两个新的选项【Open …

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51 下面我们来讲解第一个指令&#xff0c;获取软件版本号命令-0x51. 在BootLoader中获取软件版本号的操作有多个重要的作用&#xff0c;具体如下&#xff1a; 版本管理&#xff1a; 识别当前版本&#xff1a;通过获取软…

Apache Flink 入门

零、概述 Apache Flink 是一个高性能的开源分布式流处理框架&#xff0c;专注于实时数据流的处理。 它设计用于处理无界和有界数据流&#xff0c;在内存级速度下提供高效的有状态计算。 Flink 凭借其独特的Checkpoint机制和Exactly-Once语义&#xff0c;确保数据处理的准确性…