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

yolov7算法及其改进

yolov7算法及其改进

  • 1、YOLOV7简介
  • 2、ELAN架构设计
    • 2.1、Partial Residual Networks
      • 2.1.1、Masked Residual Layer
      • 2.1.2、Asymmetric Residual Layer
    • 2.2、Cross Stage Partial Networks
      • 2.2.1、Cross stage partial operation
      • 2.2.2、Gradient flow truncate operation
    • 2.3、Efficient Layer Aggregation Networks
  • 3、yolov7改进
    • 3.1、backbone
    • 3.2、neck
    • 3.3、Head
  • 4、正负样本匹配与损失函数

1、YOLOV7简介

在这里插入图片描述
1、模型层面:

  • 提出了扩展高效的层聚合网络(E-ELAN)
  • 基于级联的模型缩放方法
  • 基于MP的降维组件

2、训练Trick:

  • 卷积重参化
  • Batch normalization
  • YOLOR中的隐式知识结合卷积特征映射和乘法方式

3、标签分配:

  • 无辅助头:同YOLOv5
  • 有辅助头:辅助头匹配进行正样本的扩充

2、ELAN架构设计

当今主流的网络设计策略大多基于数据路径设计网络架构。ELAN设计了基于梯度路径的网络设计策略。提出了Layer-level、Stage-level和Network-level的梯度路径设计策略,
1、Layer-level:在这个层次上设计了梯度分流策略。调整层数并计算残差连接的通道比率,然后设计Partial Residual Network(PRN)。
2、Stage-level:添加硬件特征以加快网络推理。最大化梯度组合,同时最小化硬件计算成本,因此设计了Cross Stage Partial Network(CSPNet)。
3、Network-level:增加了梯度传播效率的考虑,以平衡网络的学习能力。还考虑了整个网络的梯度传播路径长度,因此设计了Efficient Layer Aggregation Network(ELAN)。

在这里插入图片描述
1、数据路径设计策略:主要侧重于设计特征提取、特征选择和特征融合操作,以提取具有特定属性的特征。这些特征可以帮助后续层使用这些特征进一步获得更好的属性,以便进行更高级的分析。

2、梯度路径设计策略:目的是分析梯度的来源和组成,以及如何通过驱动参数更新梯度。然后,可以使用上述分析的结果来设计网络架构。设计理念是希望最终的参数利用率更高,从而达到最佳的学习效果。

2.1、Partial Residual Networks

Partial Residual Networks(PRN)其设计理念属于Layer-level设计策略。在PRN的设计中,主要概念是最大化用于更新每层的权重的梯度组合。

影响梯度组合的主要因素有2个:

  • 第一个是梯度的源层。源层由连接到梯度路径的不相交边缘的节点组成;
  • 第二个因素是梯度流通过链式法则的操作从损失层到达特定层所需的时间。

需要注意的一点是,当梯度在链规则更新过程中发生变化时,其覆盖的丢失信息量将随着链的增长而逐渐减少,有以下2种结构来改进ResNet:

2.1.1、Masked Residual Layer

在ResNet的设计中,将每个计算块的输出与identity连接一起添加,这样的结构称为残差层。在PRN中,将identity连接乘以二进制Mask,并且只允许将某些通道的特征映射添加到计算块的输出中。
使用Masked residual layer的机制允许将特征图分为两部分,其中与被Mask的通道相对应的权重和与具有identity连接的通道相对的权重,
在这里插入图片描述

2.1.2、Asymmetric Residual Layer

在PRN架构下,提出的Masked residual layer可以将通道数量的不一致性视为某些通道被阻塞,从而允许具有不同通道数量的特征图执行Masked residual操作。

将以上述方式操作的层称为Asymmetric residual layer。Asymmetric residual layer以这样的方式设计,即网络架构更灵活,并且更能够保持基于梯度路径的模型的属性。

例如,当进行特征融合时,一般方法需要额外的过渡层来将不同的特征映射投影到同一维度,然后执行ADD操作。然而,上述操作将增加大量参数和计算量,并且还将使梯度路径更长,从而影响网络的收敛。引入Asymmetric Residual Layer可以完美地解决类似问题。
在这里插入图片描述

2.2、Cross Stage Partial Networks

CSPNet于2019年提出,它是一个基于Stage-level梯度路径的网络。与PRN一样,CSPNet基于最大化梯度组合的概念。
CSPNet和PRN的区别在于,后者侧重于从理论角度确认梯度组合对网络学习能力的改善,而前者则是为了进一步优化硬件推理速度而额外设计的。
因此,在设计CSPNet时,将架构从Layer-level扩展到Stage-level,并优化整体架构。

CSPNet主要有以下2种结构:

2.2.1、Cross stage partial operation

首先将输入特征图分成两部分,其中一部分通过计算块,该计算块可以是任何计算块,如Res Block、ResX Block或Dense Block。至于另一部分,它直接跨越整个Stage,然后与经过计算块的部分集成。由于只有部分特征图进入计算区进行操作,这种设计可以有效地减少参数量、操作、内存流量和内存峰值,从而使系统实现更快的推理速度。
在这里插入图片描述

2.2.2、Gradient flow truncate operation

由于计算块中经常使用shortcut连接,提供2条路径的梯度源必然会重叠很多。当特征图通过kernel函数时,它相当于空间投影。通常可以在两条路径的末端插入过渡层,以截断复制的梯度流。通过以上步骤可以使从2条路径和相邻Stage学习到的信息具有更明显的多样性。作者设计了3种不同的重复梯度流截断操作组合,如图所示。这些操作可以与不同的架构相匹配,例如计算块和下采样块,以获得更好的结果。

在这里插入图片描述

2.3、Efficient Layer Aggregation Networks

在Network层面,它属于梯度路径设计Network的范畴。设计ELAN的主要目的是解决在执行模型缩放时深度模型的收敛性会逐渐恶化的问题。
作者分析了通过整个网络中每个层的最短梯度路径和最长梯度路径,从而设计了具有有效梯度传播路径的层聚合架构。ELAN主要由VoVNet和CSPNet组成,并利用计算块中的堆栈结构优化了整个网络的梯度长度。
在接下来的内容中将详细说明计算块中的堆栈是如何工作的。
在这里插入图片描述

当在做模型缩放时会出现一种现象,即当网络达到一定深度时,如果继续堆叠计算块,精度增益将越来越小。当网络达到某个临界深度时,其收敛性开始恶化导致总体精度比浅层网络差。

3、yolov7改进

3.1、backbone

在这里插入图片描述

在进入Backbone中的第一个 ELAN 块之前,输入图像将通过 Stem 块。
在这里插入图片描述
在YOLOv7-p5、YOLOv7-p6架构中主要是使用ELAN作为Backbone的主要模块。
ELAN 由 3 部分组成:
1、Cross Stage Partial
2、Computation Block
3、PointWise-Conv
在这里插入图片描述
在YOLOv7-E6E架构中提出了基于ELAN的扩展版本E-ELAN,其主要架构如右图所示。
在大规模ELAN中,无论梯度路径长度和计算模块数量都达到了稳定的状态。但如果更多计算模块被无限地堆叠,这种稳定状态可能会被破坏,参数利用率也会降低。
YOLOv7提出的E-ELAN采用Expand cardinality、Shuffle cardinality、Merge cardinality结构在不破坏原始梯度路径的情况下,提高网络的学习能力。在体系结构方面,E-ELAN只改变了计算模块中的结构,而过渡层的结构则完全不变。

YOLOv7作者的策略是利用分组卷积来扩展计算模块的通道和基数,将相同的Group parameter和Channel multiplier用于计算每一层中的所有模块。然后,将每个模块计算出的特征图根据设置的分组数打乱成G组,最后将它们拼接在一起。此时,每一组特征图中的通道数将与原始体系结构中的通道数相同。
最后,作者添加了G组特征来Merge cardinality。除了维护原始的ELAN设计架构外,E-ELAN还可以指导不同的分组模块来学习更多样化的特征。

在这里插入图片描述
这种架构扩展不仅适用于骨干网中的 ELAN,也适用于 Neck 中的 CSP-OSA。当然,YOLOv7-E6E也像YOLOv7-p6家族一样应用了Auxiliary Head
在这里插入图片描述
ELAN 块通过过渡块相互连接。每个 Transition Block 都是将特征图的大小缩小 2 倍。
在这里插入图片描述
YOLOv7 的完整主干是 ELAN Blocks 和 Transition blocks 的集合,如图 所示。

在这里插入图片描述

SPP最早应用在YOLOv4中,在YOLOv5中改进为SPPF,YOLOv6中改进为SimSPPF,在YOLOv7中,SPP继续被优化和改进,也就是CSP思想的加入,名为SPPCSPC。
SPPCSPC 的奇怪之处在于,两条分支的通道数与原始特征图中的通道数相同,而不是像常规 CSP 那样的一半。但是速度和参数量还是比较大的。

在这里插入图片描述

3.2、neck

在这里插入图片描述
在 YOLOv7 中,用于组合来自 2 个尺度的 2 个特征图的加法运算符已被连接运算符取代。
此外,在与来自上述尺度的特征图结合后,生成一个中间特征图,该特征图继续由 CSP-OSA 模块处理,而不是与来自尺度的特征图连续结合。
在一个典型的 PANet Top Down 路径(左上)中,它只是一个 FPN,来自上层特征图直接与下层结合,没有任何进一步处理。
在YOLOv7的Top Down路径中,16倍下采样的特征进行上采样后与8倍下采样的特征图融合,然后通过CSP-OSA模块进一步处理,然后与8倍下采样的特征图结合。
在 YOLOv7 的 Bottom Up 路径上,来自底部尺度的特征图将通过 CSP-OSA 进行处理,并通过上面提到的主干上的 Transition Block 进行下采样,而不是像 PANet 那样通过 PANet 进行 3×3卷积。

在这里插入图片描述

CSP-OSA 是一个自取的名字,因为我把它看成是一个 CSPized OSA 模块。OSA 模块源自VoVNet,是一个极快且省电的模块。
CSP-OSA 模块的架构如图所示。上图是 VoVNet 中的普通 OSA 模块,上图是 YOLOv7 Neck使用的 CSP-OSA 模块

重参化技术是模型在推理时将多个模块合并成一个模块的方法,其实就是一种集成技术。常见的重参化技术有:
1、一种是用不同的训练数据训练多个相同的模型,然后对多个训练模型的权重进行平均。
2、一种是对不同迭代次数下模型权重进行加权平均。
虽然RepConv在VGG上取得了很不错的效果,但将它直接应用于ResNet和DenseNet或其他骨干网络时,它的精度却下降得很厉害。
作者就是用梯度传播路径的方法来分析,因为RepConv结合了3×3卷积,1×1卷积,和在一个卷积层中的identity连接,可是identity破坏了ResNet的残差连接以及DenseNet的跨层连接,为不同的特征图提供了更多的梯度多样性。
因此,作者认为,在同时使用重参化卷积和残差连接或者跨层连接时,不应该存在identity连接,而且作者还分析重参化卷积应该如何与不同的网络结构相结合,并设计了不同的重参化卷积。
在这里插入图片描述
CSP-OSA 是一个自取的名字,因为我把它看成是一个 CSPized OSA 模块。OSA 模块源自VoVNet,是一个极快且省电的模块。
在这里插入图片描述

3.3、Head

在网络的训练中,标签分配通常是指GT,这个是硬标签,但近年来,需要研究者会利用网络的推理结果来结合GT,去生成一些软标签,如IOU。

在YOLOv7中,有辅助头也有引导头,在训练时,它们二者都需要得到监督。因此,需要考虑如何为辅助头和引导头进行标签分配。因此在这里,作者提出了一种新的标签分配方法,是以引导头为主,通过引导头的推理来指引辅助头和自身的学习。
在这里插入图片描述

4、正负样本匹配与损失函数

在过去,在深度网络的训练中,标签分配通常直接指的是GT本身,并根据给定的规则生成hard label(未经过softmax)。然而近年来,以目标检测为例,研究者经常利用网络预测的质量分布来结合GT,使用一些计算和优化方法来生成可靠的软标签(soft label)。
例如,YOLO使用bbox预测和GT的IoU作为软标签。在本文中,YOLOv7将网络预测结果与GT一起考虑后再分配软标签的机制称为“标签分配器”。无论辅助头或引导头,都需要对目标进行深度监督。那么,如何为辅助头和引导头合理分配软标签?这是作者需要考虑的问题。
目前最常用的方法如上图©所示,即将辅助头和引导头分离,然后利用它们各自的预测结果和GT执行标签分配。本文提出的方法是一种新的标签分配方法,通过引导头的预测来引导辅助头以及自身。换句话说,首先使用引导头的prediction作为指导,生成从粗到细的层次标签,分别用于辅助头和引导头的学习,具体可看图(d)和(e)。
在这里插入图片描述
首先使用引导头的推理结果作为指导,生成从粗到细的层次标签,分别用于辅助头和引导头的学习。

1、Lead head guided label assigner:引导头引导标签分配是根据引导头的预测结果和GT进行一系列优化计算来生成软标签,然后软标签作为辅助头和引导头的优化方向来训练模型。

这样是由于引导头本身具备比较强的学习能力,因此由此产生的软标签应该更能代表源数据与目标之间的分布和相关性,而且还可以将这种方式当作是一种广义上的余量学习。通过让较浅的辅助头直接学习引导头已经学习到的信息,然后引导头就更能专注于学习到它还没有学习到的剩余信息。

2、Coarse-to-fine lead head guided label assigner:从粗到细的引导头引导标签分配 Coarse-to-fine引导头使用到了自身引导头的推理结果GT来生成软标签,进而引导标签进行分配。然而,在这个过程中会生成两组不同的软标签,即粗标签和细标签, 其中细标签与引导头在标签分配器上生成的软标签是一样的,粗标签是通过允许更多的网格作为正目标,不单单只把GT中心点所在的网格当成候选目标,还把附近的3个也加进来了,增加正样本候选框的数量,以降低正样本分配的约束。
因为辅助头的学习能力没有引导头强,所以为了避免丢失需要学习的信息,就提高辅助头的召回率,对于引导头的输出,可以从查准率中过滤出高精度值的结果作为最终输出。

在这里插入图片描述
YOLOX中直接将中心临近的3×3区域分配为正样本,这样便增加了样本采样的数量,进而可以加快模型训练过程的收敛,同时也一定程度上缓解了正负样本采样极度不均衡的问题,这个过程也就是论文中所说的Multi positives。

在这里插入图片描述
在这里插入图片描述
YOLOv7的样本匹配主要是将simOTA中的第1步使用中心先验替换成YOLOv5的策略。
YOLOv5策略与YOLOX中simOTA策略的融合,相较于只使用YOLOv5策略,加入了Loss Cost Aware,利用当前模型的表现,能够再进行一次精筛。而融合策略相较于只使用YOLOX中simOTA,能够提供更精确的先验知识。
Lead head中每个网格与GT如果匹配上,附加周边两个网格,而Aux head附加4个网格。
Lead head中将Top10个样本IOU求和取整,而Aux head中取Top20。
Aux head更关注于Recall,而Lead head从Aux head中精准筛选出样本。

训练时的其它策略

  • Batch Normalization:即将Batch Normalization层直接连接到卷积层中。这样可以在推理时将Batch Normalization的均值和方差直接融合到卷积层的偏差和权重中。
  • YOLOR中结合隐性知识和卷积特征图的加法和乘法方法:在YOLOR中,它认为隐式知识可以在推理时通过预计算步骤被简化为向量。然后再把这个向量和前一个或后一个卷积层的偏差和权重融合在一起。
  • EMA:EMA是一种在mean teacher中使用的技术,在系统中使用EMA模型纯粹作为最终的推理模型。EMA可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关,这里可以取得平滑的作用。如果取n步的平均,就能使得模型更加得鲁棒。

相关文章:

yolov7算法及其改进

yolov7算法及其改进 1、YOLOV7简介2、ELAN架构设计2.1、Partial Residual Networks2.1.1、Masked Residual Layer2.1.2、Asymmetric Residual Layer 2.2、Cross Stage Partial Networks2.2.1、Cross stage partial operation2.2.2、Gradient flow truncate operation 2.3、Effi…...

spring cloud微服务-OpenFeign的使用

OpenFeign的使用 openFeign的作用是服务间的远程调用 ,比如通过OpenFeign可以实现调用远程服务。 已经有了LoadBalancer为什么还要用openFeign? 在微服务架构中,LoadBalancer和OpenFeign虽然都提供了服务间调用的能力,但它们的设计目的和…...

【汇编】关于函数调用过程的若干问题

1. 为什么需要bp指针? 因为bp是栈帧的起始地址,函数内的局部栈变量,采用相对bp的内存寻址。不能相对于sp,sp是一直在变的。 2. 函数调用过程? 函数开始,先压栈bp,保存父函数栈底指针bp&#…...

针对Kali 系统进行分区设置

手动设置分区 Kali 安装之腾讯云经验遇到坑_腾讯云安装kali-CSDN博客 安装过程中的几处关键点,文字总结如下: ①分区--手动 ②是否创建空的分区表 ---yes ③选择---创建一个新的分区 ④大小--默认-----主分区 ⑤分区类型----系统)一个逻辑分区 ⑥是否…...

C语言简单测试总结

前言 在学C语言之前回顾一下C中的一些知识.选用的是中国大学MOOC中C程序设计(面向对象进阶)中的C语言水平评估测试题. 题目 ​The keyword "unsigned" can modify the keyword [ B ] A.signed B.long C.long double D.float题解:unsigned是无符号的意识,通常在…...

Android OpenGl(二) Shader

一、Shader 1、什么是Shader,为什么要使用Shder (1)shader运行在gpu上的小程序 (2)以前使用固定管线,但缺点是灵活度不够,无法满足复杂需求,为了解决固定管线的缺点,出…...

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1) 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点,并基于Argo搭建一套完整的DevOps CI/CD服务平台,包括Argo CD…...

【已解决】“Content-Security-Policy”头缺失

1、作用 简称CSP,意为内容安全策略,通过设置约束指定可信的内容来源,降低异源文件攻击,例如:js/css/image等 2、相关设置值 指令名 demo 说明 default-src self cdn.example.com 默认策略,可以应用于js文件/图片…...

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads,根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放,我选择直接屏蔽了 B站设置...

快速理解24种设计模式

简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…...

为什么深度学习和神经网络要使用 GPU?

为什么深度学习和神经网络要使用 GPU? 本篇文章的目标是帮助初学者了解 CUDA 是什么,以及它如何与 PyTorch 配合使用,更重要的是,我们为何在神经网络编程中使用 GPU。 图形处理单元 (GPU) 要了解 CUDA,我们需要对图…...

Yocto 项目中的交叉编译:原理与实例

Yocto 项目是一个强大的工具集,它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色,它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…...

Python入门:7.Pythond的内置容器

引言 Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器&…...

sqlserver镜像设置

本案例是双机热备,只设置主体服务器(主)和镜像服务器(从),不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC (1)打开SQL Server配置管理器…...

Pandas04

Pandas01 Pandas02 Pandas03 文章目录 内容回顾1 数据的合并和变形1.1 df.append (了解)1.2 pd.concat1.3 merge 连接 类似于SQL的join1.4 join (了解) 2 变形2.1 转置2.2 透视表 3 MatPlotLib数据可视化3.1 MatPlotLib API 套路 &为什么要可视化3.2 单变量可视化3.3 双变量…...

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序(升级版)

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版 调整的功能 上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期&#xff0…...

c语言中void关键字的含义和用法

在 C 语言中&#xff0c;void 是一个特殊的关键字&#xff0c;主要有以下几个用途&#xff1a; 1. 表示函数没有返回值 当一个函数不需要返回任何值时&#xff0c;可以将其返回类型声明为 void。 #include <stdio.h>void printMessage() {printf("Hello, World!\…...

安卓音频之dumpsys audio

目录 概述 详述 dumpsys audio 1、音频服务生命周期的事件日志 2、音频焦点事件日志 3、音频流音量信息 4、音量组和设备的相关信息 5、铃声模式 6、音频路由 7、其他状态信息 8、播放活动监控信息 9、录音活动记录 10、AudioDeviceBroker 的记录 11、音效&#…...

玩客云v1.0 刷机时无法识别USB

v1.0刷机时公对公插头掉了&#xff0c;刷机失败&#xff0c;再次刷机&#xff0c;一直提示无法识别的USB设备&#xff0c;此时LED一直不亮&#xff0c;就像是刷成砖了一样&#xff0c;查了好多文章最后发现正面还有一个地方需要短接。 背面的短接点 【免费】玩客云刷机包s805-…...

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

MySQL 8.0 OCP 英文题库解析(十三)

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

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...