从壹开始解读Yolov11【源码研读系列】——cfg:模型配置加载功能
目录
一、模型配置操作:cfg.__init__.py
1.cfg.cfg2dict:yaml转字典
2.cfg.get_cfg:读取覆盖配置
3.cfg全局配置参数查询表
①*基础参数配置:
②*训练参数配置:
③验证测试参数配置:
④*预测参数配置:
⑤可视化参数配置:
⑥导出部署模型参数配置:
⑦*训练超参数配置
⑧*数据增强参数配置
在之前的从零开始使用YOLO系列文章中,简单记录了训练部署YOLO模型到自己的应用场景的一般方法。ultralytics平台的代码设计,让用户可以非常便捷轻易的使用命令行或者python接口脚本使用模型。
从零开始使用YOLO系列——基础使用博文快速链接:https://blog.csdn.net/qq_58718853/article/details/140501645
在此基础上,尝试使用Pycharm自带的debug模块,通过动态运行代码查看使用其便捷接口时具体调用模块的逻辑和结构。这样检视的好处是可以了解模型运作的流程,如加载模型要么调用model类中的self._load,要么调用self._new。
从零开始使用YOLO系列——debug源码博文快速链接:https://blog.csdn.net/qq_58718853/article/details/141122605
但是debug的方法是跳跃式的,在不同文件下python文件跳转,对于一些模块只能了解其部分,而对类的整体理解审视缺失。因此,新开本系列——按源码子文件顺序,研读官方参考文档,结合源码和实验解读YOLO源码。此系列可以作为YOLO内置功能函数的查询文档,也可以搭配debug系列深度理解YOLO运行逻辑。下见所有源码子文件夹。
一、模型配置操作:cfg.__init__.py
cfg 内文件夹结构如下图。其中datasets存放了相关数据集的 yaml 配置文件,models存放从Yolov3到11的模型 yaml 配置文件。__init__.py 文件中编写了处理cfg的相关函数。
1.cfg.cfg2dict:yaml转字典
官方文档参考地址:https://docs.ultralytics.com/reference/cfg/__init__/
这是一个读取yaml配置文件并转为字典的功能函数。下例分别读取了yolo11的模型yaml配置文件和整体环境yaml配置。
输入:yaml配置环境地址
输出:具体配置参数的字典dict格式
yaml配置环境可以在克隆下载的源码内找到。详见下图。
# 测试代码
from ultralytics.cfg import cfg2dictmodel_yaml = cfg2dict('yolo11.yaml')
print(model_yaml)
config = cfg2dict('default.yaml')
print(config)
cfg2dict解析了yaml文件中的设置,并将其转为模型方便取用的dict字典格式。
2.cfg.get_cfg:读取覆盖配置
读取并修改覆盖配置参数函数。
输入:空(默认配置)或配置文件地址, override=输入修改参数的字典
输出:ultralytics.utils.IterableSimpleNamespace是ultralytics自定义的类
自定义配置文件my_cfg只修改mode为val验证模式,下述测试代码可以验证使用override覆盖后,将my_cfg改回了默认配置。
from ultralytics.cfg import get_cfgconfig1 = get_cfg('default.yaml')
config2 = get_cfg('my_cfg.yaml')
print(type(config1))
print(config1==config2)config3 = get_cfg('default.yaml', overrides={'mode':'val'})
print(config3==config2)
3.cfg全局配置参数查询表
官方参考文档地址:https://docs.ultralytics.com/usage/cfg/
①*基础参数配置:
task | 任务模式:检测(detect)、语义分割(segment)、分类(classify)、姿态检测(pose)、定向边界框(obb) |
mode | 模型模式:训练(train)、验证(val)、预测(predict)、导出部署格式模型(export)、目标追踪(track)、基准评估(benchmark) |
②*训练参数配置:
model | 模型参数地址 .pt 或 .yaml 格式(path/yolo11.yaml) |
data | 数据 .yaml 文件存放地址(path/coco8.yaml) |
epochs | 训练轮次数(100) |
time | 最长的训练时长-小时数,超出时间终止轮次epochs(10) |
patience | 验证指标没有改进下,最大容忍的训练轮次(10) |
batch | 训练一轮的批量大小——图片数量(batch = -1:自动选择) |
imgsz | 输入模型图片矩阵大小,所有输入图片都会调整为这一大小的正方形矩阵(640) |
save | 是否保存模型检查点参数——恢复训练 & 最终模型结果参数——部署模型(True) |
save_period | 保存模型参数的频率——每几个轮次保存一次 (save_period = -1:禁用此功能) |
cache | 数据加载在ram内存(True)——增加内存占用但提高训练速度 or 禁用此功能(False) |
device | 训练设备:单gpu(device=0)、多gpu(device=0,1,2,3)、cpu(device=cpu)、Apple芯片(device=mps) |
workers | 工作线程数(8),在多gpu中影响数据预处理和训练速度 |
project | 保存项目名称(my_project) |
name | 实验项目具体保存文件名称(name=train1:保存在my_project/train1) |
exist_ok | 用于迭代训练覆盖同名name文件(True)or 新增改名文件保存——my_project/train2(False) |
pretrained | 是否启用预训练模型参数(True / False),或者直接输入预训练模型参数地址(path/yolo11.yaml) |
optimizer | 训练优化器:(SGD)、(Adam)、(Adamax)、(AdamW)、(NAdam)、(RAdam)、(RMSProp)、自动(auto) |
verbose | 训练中详细打印出训练过程(True),如训练loss、精度、召回率、map等指标 |
seed | 设置训练随机种子(0) |
deterministic | 强制使用确定性算法(True),可能影响性能和速度 |
single_cls | 专注于提升预测框的精度,而不考虑框内目标分类(True) |
rect | 启用矩形训练,提高速度,降低精度(True) |
cos_lr | 启用余弦学习率调节,控制学习速度,帮助收敛(True) |
close_mosaic | 在最后几(10)个轮次里禁用马赛克数据增强,以提高模型稳定性(close_mosaic=0:禁用此功能) |
resume | 从最后的中断点开始恢复训练(True) |
amp | 启动自动混合精度训练,减少内存加快速度(True) |
fraction | 选择使用数据集的比例分数(fraction=1.0:完整数据集训练;fraction=0.5:使用数据集一半训练) |
profile | 在训练期间对ONNX和TensorRT速度进行分析,这对于优化模型部署非常有用(True) |
freeze | 冻结模型的前几层参数不参加训练,对微调和迁移学习有帮助,减少内存提高速度(2);禁用功能,完整模型训练(None) |
multi_scale | 是否启动多尺度图像训练(True),帮助模型识别远近物体关系 |
overlap_mask | 仅对分割(segment)任务有用:训练中掩码需重叠(True) |
mask_ratio | 仅对分割(segment)任务有用:掩码下采样比率(4) |
dropout | 仅对分类(classify)任务有用:使用dropout正则化(0.0) |
③验证测试参数配置:
val | 是否在训练时启用验证,验证集计算模型指标map(True) |
split | 使用数据集 yaml 文件中的 val 目录下的数据作为验证集(val) |
save_json | 使用 json 作为保存格式(True) |
save_hybrid | 保存将原始预测标签与其他模型预测相结合的标签的混合版本(True) |
conf | 设置检测的最小置信阈值。置信度低于此阈值的检测将被丢弃(conf=None:禁用此功能,将保留所有检测框) |
iou | 设置非最大抑制(NMS)的联合交叉口(IoU)阈值。有助于减少重复检测。高于阈值的重叠框将选出唯一置信度最高的(iou=0.7:高于0.7的重叠框将舍弃到唯一框) |
max_det | 一张图片中最多的检测数量(300) |
half | 启用半精度计算——FP16,减少内存(True) |
dnn | PyTorch推理的替代方法:使用OpenCV DNN模块——图像处理与模型推理的集成,进行ONNX模型推理——支持跨架构跨模型的硬件加速优化(True) |
plots | 保存模型结果的可视化图片(True) |
④*预测参数配置:
source | 指定推理的数据源。可以是图像路径、视频文件、目录、URL或设备ID(/path/xxx.img) |
vid_stride | 视频输入的帧步长。允许跳过视频中的帧,以时间分辨率为代价加快处理速度。值为1时处理每一帧,值越大则跳过帧(1) |
stream_buffer | 确定是否为视频流的传入帧排队:禁用功能旧帧将被丢弃以容纳新帧(False);启用此功能,新帧排队到缓冲区中,确保没有帧被跳过,但如果推理FPS速度低于传入流FPS,则会导致延迟(True) |
visualize | 在推理过程中激活模型特征图的可视化,提供对模型“看到”内容的洞察。可用于调试和模型解释(True) |
augment | 启用预测的测试时间增强(TTA)——图像翻转、旋转、缩放、裁剪、色彩调整等,以牺牲推理速度为代价提高检测鲁棒性(True) |
agnostic_nms | 启用类无关的非最大抑制NMS,合并不同类的重叠框(True) |
classes | 选择专注的目标类别,可以是单个类别的索引整数值(0),也可以是关注的类别索引列表([ 0,2,5 ]) |
retina_masks | 仅对分割(segment)任务有用:使用高分辨率分割掩模(True) |
embed | 返回指定层数结果的特征向量,列表形式([ 1 ]),可用于下游任务如聚类或相似性分析 |
⑤可视化参数配置:
show | 启用在窗口显示带标签检测结果的实时图片或视频(True) |
save_frames | 仅在处理视频输入时可用(True):将单个帧保存为图片 |
save_txt | 将检测结果保存在文本文件中(True),格式为[class][x_center][y_center][width][height][confidence] |
save_conf | 启用保存检测框的置信度得分(True) |
save_crop | 启用保存检测的裁剪图像结果(True)可用于数据集增强、分析或为特定对象创建聚焦数据集 |
show_labels | 启用展示当前框的框内目标类别名称(True) |
show_conf | 启用展示当前框的置信度(True) |
show_boxes | 启用展示当前框的边界框(True) |
line_width | 设置画框的线条粗细(4),默认为(None:此时根据输入图片大小自动选择) |
⑥导出部署模型参数配置:
format | 选择导出模型的目标格式(【onnx、torchscript、tensorflow...】) |
keras | 允许导出TensorFlow SavedModel的Keras格式,提供与TensorFlow服务和API的兼容性(True) |
optimize | 移动端导出设置:导出到TorchScript时,对移动设备进行优化,减小模型大小并提高性能(True) |
int8 | 边缘设备设置:使用 int8 量化,进一步压缩模型,以最小的精度损失加速推理(True) |
dynamic | 动态图片输入大小设置:允许ONNX、TensorRT和OpenVINO导出的动态输入大小,增强了处理不同图像尺寸的灵活性(True) |
simplify | 使用onnxslim简化ONNX导出的模型图(True) |
opset | 指定ONNX opset版本,以与不同的ONNX解析器和运行时兼容。如果未设置,则使用最新支持的版本(opset vision / None) |
workspace | 设置TensorRT优化的最大工作空间大小(GiB),平衡内存使用和性能(4:默认) |
nms | 在Apple生态框架CoreML导出中添加非最大抑制(NMS) |
⑦*训练超参数配置
lr0 | 初始学习率:SGD(0.01),Adam(0.001) |
lrf | 最终学习率:初始学习率 lr0*lrf = 最终学习率(0.01) |
momentum | SGD的动量因子或Adam优化器的beta1:影响更新过程中之前梯度的权重(0.937) |
weight_decay | L2正则化项增加惩罚项实现权重衰退:增大值(0.001)增加惩罚,模型权值变小——过拟合风险减少,欠拟合风险增加;减小值(0.0001)减小惩罚,模型权值变大——过拟合风险增加(0.0005:默认) |
warmup_epochs | 学习率预热的迭代次数:逐渐将学习率从较低值提高到初始学习率,以在早期稳定训练(3.0:默认) |
warmup_momentum | 学习率预热的初始势头:调大值(0.9)可以在稳定梯度方向更快收敛,适合大规模数据;调小值(0.7)可以使得更新更加平滑稳定(0.8:默认) |
warmup_bias_lr | 预热阶段偏差参数的学习率:初始阶段稳定模型训练(0.1:默认) |
box | 损失函数中框坐标损失的权重:影响对精确预测边界框坐标的重视程度,调大模型将更重视框的精确度(7.5:默认) |
cls | 损失函数中框内目标分类的权重:影响对目标正确分类预测的重视程度(0.5:默认) |
dfl | 分布焦点损失权重:box损失——预测边界框的坐标值的回归问题;dfl损失——每个坐标预测拆分为一个离散分布,预测坐标值的概率分布的分类问题(1.5:默认) |
pose | 姿态估计训练模型中姿态损失的权重:影响对准确预测姿态关键点的重视程度(12.0:默认) |
kobj | 姿态估计模型中关键点物体损失的权重:平衡检测置信度和姿态精度(1.0:默认) |
label_smoothing | 硬标签“软化”:将单一绝对值的标签如0,1转为概率分布的软标签如【0.9,0.1】,【0.15,0.85】。 硬标签“平滑化”:此参数的值大小决定标签的平滑程度,如(0.0:默认)代表使用传统硬标签【1,0】,【0,1】。取值越大越平滑,最大为(1.0:max),此时每个标签都是一个均匀分布【0.5,0.5】,【0.5,0.5】 |
nbs | 标准化损失名义批次大小:在不同批次大小下对损失值进行归一化处理,防止批次大小对梯度稳定性的影响(64:默认) |
⑧*数据增强参数配置
此处参数较为抽象,将在后续对数据增强源码解析的实验中,记录调整相关参数的数值,会对最终生成的数据增强图片造成怎样的影响。
hsv_h | 数据增强参数——图像色轮色调调整:模拟不同光照条件的图像亮度,提高模型泛化性,数值越高亮度越大(0.0-1.0:取值范围) |
hsv_s | 数据增强参数——图像饱和度:调整图像颜色强度以模拟不同环境,数值越大,颜色越强(0.0-1.0:取值范围) |
degrees | 数据增强参数——图片随机旋转:在指定范围内随机旋转图片,提高模型对不同方向目标的泛化能力。特别的,如果输入值为正数(如45:旋转范围为-45到45度),如果输入值为负数(如-45:旋转范围为-45到0度)(单值,-180-180:取值范围) |
translate | 数据增强参数——图片水平或垂直平移:数值大小代表平移距离占图片高(宽)的比例(0.1:平移图片的十分之一长度或宽度),提高模型对图片部分不可见时的泛化能力(0.0-1.0:取值范围) |
scale | 数据增强参数——图片缩放:数值代表缩放比例,模拟相机不同距离下的目标物体(>=0.0:取值范围) |
shear | 数据增强参数——图片“剪切”:根据设定度数拉伸或倾斜物体,模拟不同角度观测物体效果(-180-180:取值范围) |
perspective | 数据增强参数——图片3D透视变换:提高模型对三维物体的理解(0.0-0.001:取值范围) |
flipud | 数据增强参数——指定概率上下翻转图片:数值是随机翻转图片的概率值,越大越可能生成翻转图片(0.0-1.0:取值范围) |
fliplr | 数据增强参数——指定概率左右翻转图片:同上描述,随机左右翻转图片(0.0-1.0:取值范围) |
bgr | 数据增强参数——指定概率翻转颜色通道:以一定概率随机将图片颜色通道从RGB转为BGR,提高对不正确通道输入的鲁棒性(0.0-1.0:取值范围) |
mosaic | 数据增强参数——图像组合复杂化:将四个图片组合成一张图片,模拟不同场景对象交互形成的复杂检测环境(0.0-1.0:取值范围) |
mixup | 数据增强参数——混合图像:将两张图片及其标签信息混合,形成合成图片,模拟图片存在标签噪音和视觉变化(0.0-1.0:取值范围) |
copy_paste | 数据增强参数——混合目标:将一个图像中的目标区域剪贴到另一种图像,模拟图像中目标被其他目标遮盖的场景(0.0-1.0:取值范围) |
copy_paste_mode | 数据增强参数——混合目标模式:翻转剪贴目标(‘flip’);混合目标图像(‘mixup’) |
auto_augment | 数据增强参数——自动增强模式选择:自动应用预定义的增强策略(randaugment、autoaugment、augmix) |
erasing | 数据增强参数——随机擦除:在分类训练过程中随机擦除图像部分,模拟图像中目标特征不太明显时识别状况(0.0-0.9:取值范围) |
crop_fraction | 数据增强参数——目标小图裁剪:将目标裁剪到其边界检测框大小,以减小背景干扰,强调中心特征(0.1-1.0:取值范围) |
相关文章:

从壹开始解读Yolov11【源码研读系列】——cfg:模型配置加载功能
目录 一、模型配置操作:cfg.__init__.py 1.cfg.cfg2dict:yaml转字典 2.cfg.get_cfg:读取覆盖配置 3.cfg全局配置参数查询表 ①*基础参数配置: ②*训练参数配置: ③验证测试参数配置: ④*预测参数配置&…...

【数据库设计】逻辑结构设计
E-R实体集的转换 概念结构设计之后就是对E-R图进行逻辑结构设计:即将E-R图转化成关系的过程。逻辑结构设计主要用于数据库管理系统上,为了让数据在计算机系统中更好地表示。 此设计过程用到的数据模型有:除了前面讲过的关系模型还有层次模型…...

uni-app之旅-day07-购物车页面
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 9.1 商品列表区域9.1.1 渲染购物车商品列表的标题区域9.1.2 渲染商品列表区域的基本结构9.1.3 为 my-goods 组件封装 radio 勾选状态9.1.4 为 my-goods 组件封装 ra…...

【机器学习】并行计算(parallel computation)Part2
Asynchronous Parallel Gradient Descent Using Parameter Server 用Parameter Server实现异步并行梯度下降 Parameter Server这种编程模型可以实现异步并行梯度下降,架构采用的是Client-Server,通信方式是Message-passing,同步方式是异步的…...

AI学习指南深度学习篇-迁移学习的应用场景
AI学习指南深度学习篇 - 迁移学习的应用场景 引言 迁移学习(Transfer Learning)是一种强有力的技术,尤其在深度学习领域的应用越来越广泛。通过在一个领域学到的知识来帮助另一个领域的学习,迁移学习尤其适用于数据稀缺的场景。…...

【web前端设计】jquery图标动画特效
学习目标 学习web前端设计技术(HTML、css、JavaScript、jQuery等),综合运用技术,将其与HTML元素结合,设计样式、监听事件、添加动画等,给用户呈现出更好的视觉交互效果。本文主要学习分页按钮自动放大、元…...

Linux——用户/用户组
创建用户组groupadd groupadd 用户组 删除用户组groupdel groupdel 用户组 创建用户useradd useradd 用户名 - g 用户组 useradd 用户名 -d HOME路径 删除用户userdel userdel 用户 userdel -r 用户 (删除用户的 HOME 目录,不使用 -r ࿰…...

HDFS上传下载命令
hadoop <组件> -<操作> /path1/test.txt / path2 上传:hadoop fs -put /path1/test.txt / path2 下载:hadoop fs -get /path2/test.txt / path3 查看目录:hadoop fs -ls / 查看文件:hadoop fs -cat / path…...

Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据
本示例使用设备: https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1buHvw58&ftt&id22173428704 Javascript源码 //引用http模块创建web服务器,监听指定的端口获取以GET、POST、JSON等方式上传的数据,并回应驱动读卡…...

基于python的《C语言程序设计》课程成绩分析
作者:Svan.声明:未经本人允许,不得对本文中的任何内容、数据进行转载,本人(作者)已经对本文内容申请撰写了论文,随意转载使用本文任何内容的,要追究其法律责任!!…...

@Component 和 @Bean 的区别与联系
相同点: Component 和 Bean 是两种使用注解来定义bean的方式。 Component和Bean的目的是一样的,都是注册bean到Spring容器中。 两者都可以通过Autowired装配 不同点: Component 和 它的子类型(Controller, Service and Reposit…...

高手炒现货黄金短线的方法
现货黄金短线交易的精髓在于“计划你的交易”。短线交易不是临时起意的赌博,也不是盘口随意的追涨杀跌,而是所有因素分析以后的结果。新手进行短线操作容易流为频繁的随意操作,导致成功率不高。但当投资者有了准备,短线交易就再也…...

后端:唯一ID有哪些生成方式
文章目录 在后端开发中的ID生成策略1. 数字型 ID特点:优点:缺点:例子:常见用法: 2. UUID(通用唯一标识符)特点:优点:缺点:例子:常见用法ÿ…...

LabVIEW提高开发效率技巧----高精度延时
在LabVIEW开发中,时间控制是许多应用中的关键环节,尤其是高精度应用中,时钟漂移会严重影响程序的准确性。为此,使用Wait Until Next ms Multiple来代替简单的Wait (ms),可以显著减少时钟漂移,确保高精度延时…...

<Link><Link> 和 <a> </a>标签的区别
1. Link (React Router): 作用: Link 是 react-router-dom 提供的组件,用于在 React 应用中创建前端路由跳转。它不会导致页面重新加载。优点: 无刷新跳转: 使用 Link 进行导航时,React 的路由器会捕获并处理链接,避免浏览器的全…...

靶场战神为何会陨落?
我从第一个SQL注入漏洞原理学起,从sql-libas到DVWA,到pikachu再到breach系列,DC系列靶场,再到实战挖洞,发现靶场与实战的区别是极其大的。 我个人觉得在这种web环境下,难的不是怎么测一个漏洞点,而是怎么找一个漏洞点。靶场与实战最大的区别在于你不知道这个地方到底有没有漏洞…...

rpm 命令
rpm(Red Hat Package Manager)是 Red Hat Linux 及其衍生发行版(如 CentOS、Fedora)中用于管理软件包的系统。它允许用户安装、卸载、升级、查询和验证软件包。 一、安装软件包 (1)安装一个 RPM 软件包&a…...

录微课专用提词器,不会被录进视频中的提词器,还能显示PPT中备注的内容
不坑提词器,全称:不坑隐形提词器。是一款能够在截图、录屏、直播过程中隐藏界面的提词器软件。 系统要求:Win10 1024 以上(特别提醒:Win7状态下不可隐身) ⏬下载 提词器默认放在不坑盒子的安装目录下&…...

Ansible概述
目录 一、ansible简介 二、absible的特点 三、ansible的工作原理以及流程 四、ansible环境安装部署 五、ansible命令行模块 六、inventory 主机清单 一、ansible简介 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。…...

NTC 温度电阻计算方式
100K温度值列表 https://wenku.baidu.com/view/59565cba1a37f111f1855b38?aggId989bc39968d97f192279168884868762cbaebb44&frcatalogMain_text_ernie_recall_feed_index%3Awk_recommend_main1&wkts1729568234531&bdQuery100K%E6%B8%A9%E5%BA%A6%E7%94%B5%E9%98%B…...

Qt中自定义qDebug打印信息的宏(文件名,行数,函数名,日期,时间等前缀)并取消打印
使用qDebug()打印信息时,默认打印"<<"符号后面的信息。 通过自定义宏,可以额外打印文件名,行数,函数,日期、时间等前缀,方便快速定位调式信息的位置。 同时,可以定义宏取消打…...

【基于docker的深度学习训练环境】关键步骤记录
最近给公司搭建了一个小型的深度学习环境,实现了多人通过SSH对GPU资源的利用,下面对一些关键架构和易用性部分进行记录。 一、整体软硬件框架 1、硬件配置,采用的双GPU的方案,两块消费级显卡。 2、应用层架构 宿主机系统为ubunt…...

管理、情商、格局-冯唐讲资质通鉴-笔记
一、CEO职责 制定制度、维护制度,制度即礼,礼崩乐坏,万万不能制定战略找钱、找人 二、汇报线 不能向上越级汇报不能向上越级管理 三、领导 领导出错的情况,依然要服从领导的安排,领导的错轮不到我们来处理干预&am…...

摇人摇人, JD内推岗位(社招+校招)
摇人摇人, 有找工作的家人们看过来啊~ 虚位以待, 快到碗里来 算法开发工程师岗 京东云 北京|T7, 5-10年 岗位职责: 参与基于RAG知识库平台和ChatBI产品打造和商业化落地,进行相关技术:包括OCR、文档拆分、意图理解、多轮对话、NL2SQL、Embed…...

振弦式传感器在高边坡监测中发挥哪些优势?
振弦式传感器在高边坡监测中发挥哪些优势?在工程建设与地质灾害防治领域,高边坡监测至关重要。高边坡的稳定性直接关系到工程的安全以及周边环境和人员的生命财产安全。为了实现对高边坡的有效监测,各种先进的传感器技术被广泛应用,其中振弦…...

计算机网络基础进阶
三次握手四次挥手 三次握手 1------建立连接----------------------2 ACK1,seq0 2------传输数据,建立连接---------1 1------传输数据,建立连接---------2 三次握手用于建立TCP连接,确保通信双方都准备好进行数据传输。整个…...

什么是“钻石继承问题”
钻石继承问题(Diamond Inheritance Problem) 主要是指在多重继承中,由于继承关系的复杂性,子类可能通过多个路径继承到相同的基类,从而导致成员的多份副本或者方法调用的二义性。 C 通过 虚拟继承 来解决这个问题&…...

iOS 回到主线程刷新UI
在iOS 里面,项目打开就会运行一个主线程,所有的UI都在主线程里进行.其他网络请求或者耗时操作理论上也可以在主线程运行,但是如果太耗时,那么就会影响主线程其他UI.所以需要开字线程来进行耗时操作,子线程进行完耗时操作之后,如果项目需求有需要刷新UI,或者改变UI,一定得回到主…...

Spring Data 技术详解与最佳实践
引言 Spring Data 是 Spring 框架的一个模块,旨在简化数据访问层的开发。它提供了一种通用的方法来访问各种数据存储,包括关系型数据库、NoSQL 数据库、搜索引擎等。Spring Data 不仅简化了数据访问代码的编写,还提供了一系列强大的特性&…...

ubuntu下安装图片编辑工具shutter
ubuntu自带的截屏工具能够截图指定区域的图片,但是通常情况下,我们还需要对图片做一些编辑例如,下划线,方框标识,添加文本描述等,这时就需要强大的shutter软件了。 有人说直接在终端直接执行命令安装即可&…...