目标检测模型设计准则 | YOLOv7参考的ELAN模型解读,YOLO系列模型思想的设计源头

news2024/11/28 2:37:50
转载: https://mp.weixin.qq.com/s/5SjQvRqRct6ClpE2eEcdkw
设计高效、高质量的表达性网络架构一直是深度学习领域最重要的研究课题。当今的大多数网络设计策略都集中于如何集成从不同层提取的特征,以及如何设计计算单元来有效地提取这些特征,从而增强网络的表现力。
本文提出了一种新的网络设计策略,即基于梯度路径分析来设计网络结构。总体而言,当今主流的网络设计策略大多基于前馈路径,即基于数据路径设计网络架构。在本文中希望通过提高网络学习能力来增强训练模型的表达能力。由于驱动网络参数学习的机制是反向传播算法,本文设计了基于反向传播路径的网络设计策略。提出了layer-level、stage-level和network-level的梯度路径设计策略,并通过理论分析证明了设计策略的优越性和可行性和实验。

1、简介

深度神经网络(DNN)现在广泛用于各种设备,以解决不同类型的任务。数百万科学家、工程师和研究人员参与了深度学习相关的工作。他们都期待着设计出能够满足他们需求的高效、准确、低成本的解决方案。因此,如何设计适合其产品的网络架构变得尤为重要。

自2014年以来,许多DNN在各种任务上取得了接近人类或优于人类的性能。例如,谷歌的GoogLeNet和微软的PReLUNet在图像分类方面,Facebook的Deepface在人脸识别方面,DeepMind的AlphaGo在围棋棋盘上等等。基于上述领域的开始,一些研究人员继续开发更先进的新架构或算法以击败上述方法;

其他研究人员关注如何使DNN相关技术在人类日常生活中实用。Iandola等人提出的SqueezeNet是一个典型的例子,因为它将AlexNet的参数数量减少了50倍,但可以保持相当的精度。MobileNet和ShuffleNet也是很好的例子。前者将实际硬件操作延迟直接添加到架构设计的考虑中,而后者将硬件特性的分析用作设计神经网络架构的参考。

就在ResNet、ResNeXt和DenseNet架构解决了深层网络训练中遇到的收敛问题之后,近年来CNN架构的设计集中在以下几点:

  1. 特征融合

  1. 感受野增强

  1. 注意机制

  1. 分支选择机制

换句话说,大多数研究遵循深度网络的共同认知,即从浅层提取low-level特征,从深层提取high-level特征。根据上述原则,可以使用它们来设计神经网络架构,以有效地组合数据路径(前馈路径)中的不同level的特征。

然而,这样的设计策略是否一定正确?从图1中发现,通过调整目标和损失层的配置,可以控制每个层(浅层或深层)学习的特征。也就是说,权重学习什么样的特征主要取决于使用什么样的信息来教它,而不是输入来自哪些层的组合。基于这一发现,作者重新定义了网络设计策略。

由于提出网络结构可以用目标函数可以指导神经网络学习信息的概念来设计,因此必须首先了解目标函数如何影响网络权重的更新。

目前,主要的权重更新方法是反向传播算法,它使用偏微分生成梯度,然后通过梯度下降来更新权重。该算法以链式规则的方式将梯度信息传播到浅层,并重复这些步骤,直到更新所有层的权重。换句话说,目标函数教导的信息以梯度的形式在层之间传播。

在本文中提出通过分析通过目标函数的引导生成的梯度,可以在执行反向传播过程时通过梯度路径来设计网络结构。作者分别为3个不同级别的策略设计网络架构,如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)。

2、本文方法

2.1、网络设计策略

如图2所示,在本文中将网络设计策略分为两种:

  1. 数据路径设计策略

  1. 梯度路径设计策略

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

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

接下来将分别讨论数据路径设计策略和梯度路径设计策略的优点和缺点。

数据路径设计策略有3个优点:

  1. 可以提取具有特定物理意义的特征。例如,使用非对称计算单元来提取具有不同感受野的特征;

  1. 可以为不同的输入自动选择具有参数化模型的合适的操作单元。例如,使用kernel选择来处理输入具有不同的性质;

  1. 可以直接重用所学习的特征。例如,特征金字塔网络可以直接利用从不同层提取的特征进行更准确的预测。

数据路径设计策略有2个缺点:

  1. 在训练过程中,有时会导致效果的不可预测的降级,此时需要设计更复杂的架构来解决问题。例如,non-local网络的成对关系很容易退化为一元信息;

  1. 各种专门设计的运算单元容易导致性能优化的困难。例如,在专用于AI的ASIC设计中,如果设计者想要添加算术单元,则需要额外的一组电路。

对于梯度路径设计策略,总共有3个优点:

  1. 可以有效地使用网络参数,在这一部分中提出通过调整梯度传播路径,不同计算单元的权重可以学习各种信息,从而实现更高的参数利用效率;

  1. 具有稳定的模型学习能力,由于梯度路径设计策略直接确定并传播信息以更新权重到每个计算单元,因此所设计的架构可以避免训练期间的退化;

  1. 具有高效的推理速度,梯度路径设计策略使得参数利用非常有效,因此网络可以在不增加额外复杂架构的情况下实现更高的精度。

由于上述原因,所设计的网络在架构上可以更轻、更简单。

梯度路径设计策略有一个缺点:

  1. 当梯度更新路径不是网络的简单反向前馈路径时,编程的难度将大大增加。

2.2、Partial Residual Networks

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

  1. 第一个是梯度的源层。源层由连接到梯度路径的不相交边缘的节点组成;

  1. 第二个因素是梯度流通过链式法则的操作从损失层到达特定层所需的时间。

需要注意的一点是,当梯度在链规则更新过程中发生变化时,其覆盖的丢失信息量将随着链的增长而逐渐减少。作者将上述持续时间定义为梯度流从损失层行进到特定层所需的层数。在PRN中提出了以下2种结构来改进ResNet:

1、Masked residual layer

在ResNet的设计中,将每个计算块的输出与identity连接一起添加,这样的结构称为残差层。在PRN中,将identity连接乘以二进制Mask,并且只允许将某些通道的特征映射添加到计算块的输出中。将此结构称为Masked residual layer,其架构如图3所示。使用Masked residual layer的机制允许将特征图分为两部分,其中与被Mask的通道相对应的权重和与具有identity连接的通道相对的权重将由于上述identity效应而显著增加梯度组合的数量。此外,梯度源的差异将同时影响整个梯度时间戳(沿时间轴的时间节点),从而使梯度组合更加丰富。

2、Asymmetric residual layer

在ResNet架构下,只能添加相同大小的特征图,这就是为什么它是一个非常受限的架构。通常,当执行优化的架构的计算量和推理速度时,常常受到这种架构的限制,无法设计出符合要求的架构。在PRN架构下,提出的Masked residual layer可以将通道数量的不一致性视为某些通道被阻塞,从而允许具有不同通道数量的特征图执行Masked residual操作。

将以上述方式操作的层称为Asymmetric residual layer。Asymmetric residual layer以这样的方式设计,即网络架构更灵活,并且更能够保持基于梯度路径的模型的属性。例如,当进行特征集成时,一般方法需要额外的过渡层来将不同的特征映射投影到同一维度,然后执行添加操作。然而,上述操作将增加大量参数和计算量,并且还将使梯度路径更长,从而影响网络的收敛。引入Asymmetric residual layer可以完美地解决类似问题。

2.3、Cross Stage Partial Networks

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

CSPNet主要有以下2种结构:

1、Cross stage partial operation

从最大化梯度源的角度来看可以很容易地发现,当每个通道具有不同的梯度路径时,梯度源可以最大化。此外,从最大化梯度时间戳的角度来看,当每个通道具有不同深度的计算块时,可以最大化梯度时戳的数量。

根据上述概念可以导出一种设计用于最大化梯度源和梯度时间戳的架构。这种架构将是类似fractal-like的架构和具有深度卷积的类似分形的架构。虽然上述设计可以有效地提高参数利用率,但会大大降低并行化能力。此外,这将导致模型显著降低GPU和TPU等推理引擎上的推理速度。

从前面的分析知道划分通道可以增加梯度源的数量,并且使不同通道连接的子网络具有不同的层可以增加梯度时间戳的数量。本文设计的Cross stage部分操作可以最大化梯度的组合,并在不破坏架构的情况下提高推理速度,并且可以并行化。

该体系结构如图4所示。在图4中,将stage的输入特征图分成两部分,并使用这种方式增加梯度源的数量。

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

2、Gradient flow truncate operation

为了使设计的网络架构更强大进一步分析了用于更新CSPNet的梯度流。由于计算块中经常使用shortcut连接,提供2条路径的梯度源必然会重叠很多。当特征图通过kernel函数时,它相当于空间投影。通常可以在两条路径的末端插入过渡层,以截断复制的梯度流。通过以上步骤可以使从2条路径和相邻Stage学习到的信息具有更明显的多样性。

作者设计了3种不同的重复梯度流截断操作组合,如图5所示。这些操作可以与不同的架构相匹配,例如计算块和下采样块,以获得更好的结果。

2.4、高效的层聚合网络

高效层聚合网络(ELAN)的代码于2022年7月发布。在网络层面,它属于梯度路径设计网络的范畴。设计ELAN的主要目的是解决在执行模型缩放时深度模型的收敛性会逐渐恶化的问题。

作者分析了通过整个网络中每个层的最短梯度路径和最长梯度路径,从而设计了具有有效梯度传播路径的层聚合架构。ELAN主要由VoVNet和CSPNet组成,并利用计算块中的堆栈结构优化了整个网络的梯度长度。在接下来的内容中将详细说明计算块中的堆栈是如何工作的。

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

最好的例子之一是Scaled-YOLOv4,看到它的P7模型使用了昂贵的参数和操作,但只有少量的精度增益,而且在许多流行网络中也会出现同样的现象。例如,ResNet-152的计算强度大约是ResNet-50的3倍,但在ImageNet上的精度提高不到1%。当ResNet堆叠到200层时,其精度甚至比ResNet-152更差。此外,当VoVNet堆叠到99层时,其精度甚至远低于VoVNet-39。

从梯度路径设计策略的角度来看,作者推测VoVNet的精度退化比ResNet快得多的原因是因为VoVNet堆叠基于OSA模块。每个OSA模块都包含一个过渡层,因此每次堆叠OSA模块时,网络中所有层的最短梯度路径都会增加一个。

至于ResNet,它是由残余块堆叠的,残余层的堆叠只会增加最长的梯度路径,而不会增加最短的梯度路径。为了验证模型缩放的可能影响,作者基于YOLOR-CSP进行了一些实验。从实验结果中发现,当堆叠层达到80+层时,CSP fusion first的精度开始优于正常的CSPNet。此时,每个Stage的计算块的最短梯度路径将减少1。随着网络的不断扩大和加深,CSP fusion last将获得最高的精度,但此时所有层的最短梯度路径将减少1。

上述实验结果证实了先前的假设。在上述实验的支持下,如图6所示,在ELAN中设计了“计算块中的堆栈”策略。设计的目的是避免使用过多过渡层的问题,并使整个网络的最短梯度路径快速变长。当网络堆叠得更深时,上述设计策略能够成功地训练ELAN。

3、分析

在本节中,将分析基于经典网络架构提出的梯度路径设计策略。

  • 首先,将使用梯度组合的概念分析现有的网络架构和所提出的PRN,该示例表明表现良好的网络架构确实具有更丰富的梯度组合。

  • 然后,将分析所提出的CSPNet如何带来更丰富的梯度组合和其他好处。

  • 最后,通过stop 梯度分析了梯度路径长度的重要性,从而证实了所提出的ELAN具有设计概念上的优势。

3.1、梯度组合分析

一般研究人员通常使用最短梯度路径和集成特征的数量来衡量网络架构的学习效率和能力。然而,从SparseNet中可以发现,如表1所示,这些度量与准确性和参数使用并不完全相关。作者观察了梯度传播的过程,发现用于更新不同层权重的梯度组合与网络的学习能力非常匹配,在本节中将分析梯度组合。

梯度组合由2种类型的组件组成,即Gradient Timestamp和Gradient Source。

1、Gradient Timestamp

图7显示了ResNet、PRN、DenseNet和SparseNet的架构。其中,作者展开了cascaded residual connection和concatenation connection以便于观察梯度传播过程。此外,图7还显示了每个架构上的gradient flow delivery timestamps。gradient sequence相当于广度优先搜索过程,每个sequence将访问上一轮遍历所到达的所有outdegree nodes。

从图7中可以看到PRN使用通道分割策略来丰富由对应于不同通道的权重接收的Gradient Timestamp。至于SparseNet,它使用稀疏连接来使与不同层相对应的权重连接所接收的Timestamp更加可变。

上述两种方法都可以学习具有不同权重的更多样的信息,这使得提出的架构更强大。

2、Gradient Source

图8显示了第1个梯度时间戳处ResNet、PRN和DenseNet的Gradient Source。从图8可以看出,connection-based的架构,如DenseNet和SparseNet,属于必须特别处理的网络。这是因为在梯度传播过程中,如果它是由同一层在某个Gradient Timestamp传播的梯度信息,因为梯度流已经被预先分割,所以它不能像普通网络那样被处理。

对于基于残差连接的架构,如ResNet和PRN,完全相同的梯度信息被传播到所有的outdegree层。由于PRN的outdegree仅连接到其他层的某些通道,因此它可以具有比ResNet整体更丰富的梯度组合。

此外,还有使用其他split-transform merge策略的网络架构,例如基于group convolution-based 的ResNeXt和基于depth-wise convolution的MobileNet等,这也可以增加Gradient Source的数量。

3、总结

总之,通过对梯度反向传播过程中产生的Gradient Timestamp和Gradient Source的分析,可以清楚地解释现有的流行网络架构以及提出的PRN所学习的信息和参数的利用效率。在ResNet中,不同的层共享相同Timestamp和相同Gradient Source的许多梯度,DenseNet将相同Timestamp但不同Source的梯度信息传递给相应的层。这部分清楚地解释了为什么基于串联连接的DenseNet可以避免像基于残差连接的ResNet那样容易地学习大量无用信息的问题。本文提出的PRN使用简单的masked residual layer来增加沿时间轴的梯度组合的数量,同时保持ResNet网络拓扑,并转移Gradient Source,从而增加Gradient Source的可变性。

3.2、跨阶段部分策略分析

CSPNet旨在增强在线学习能力,同时加快推理速度,因此将分别从这两个方面讨论CSPNet策略的优势。在第3.1节中进行的分析中观察到,即使Gradient Source生成的组合数量相同,当不同组合之间接收到的公共分量减少时,这使得梯度分量更丰富,也使网络学习更好。这种现象实际上发生在为单层权重学习大量参数的过程中。

例如,dropout使用随机伯努利Mask神经元来防止参数学习协同适应信息。从数学模型的角度来看,dropout是通过使用不同输入产生的梯度来更新不同部分的权重,这相当于随机集成结构。至于CSPNet,它通过梯度路径上梯度的时间差和空间变换,直接增加了梯度组合的丰富性。接下来将介绍CSPNet使用什么策略来解决重复梯度信息的问题,以及它如何提高资源利用率。

1、Duplicated Gradient Information

在第3.1节中分析了梯度组合的数量以及多样性对网络学习能力的影响。在CSPNet中进一步分析了不同层接收的梯度信息内容,并设计了架构以提高参数使用效率。从PRN和SparseNet的梯度组合可以发现,它们在增加梯度组合丰富度的过程中具有共同性,即通过残差连接或密集连接接收大量重复梯度信息的情况显著减少。作者推测,这些重复的梯度是大量权重容易学习共适应信息的主要原因。

对于PRN,它利用梯度定时差来更新部分通道的权重。随着链式规则的更新过程,上述时间差将扩散到整个网络,然后实现更丰富的梯度组合。

此外,CSPNet直接使用cross stage使整个stage的两条路径具有很大的时间差,并使用不同的融合结构来减少stage与stage之间或计算块路径与cross stage connection路径之间的重复梯度信息。

2、Resource Usage Efficiency

以Darknet-53为例,假设cross stage部分操作根据通道的方向将特征图分成两个相等的部分。此时,残差块的输入通道数和输出通道数减半,而中间的通道数保持不变。

根据上述结构,计算块的总体计算和参数量将减少到原始的一半,而内存峰值是输入特征图和输出特征图的大小之和,因此将减少到原来的2/3。此外,由于整个计算块中卷积层的输入通道和输出通道相等,因此此时的存储器访问成本将最小。

3、总结

总之,CSPNet成功地将梯度组合的概念与硬件利用效率相结合,使得所设计的网络架构同时提高了学习能力和推理速度。CSPNet仅使用简单的channel split、 cross stage connection并在不改变原有网络计算单元的情况下成功完成预设目标。

CSPNet的另一个优点是它可以应用于许多流行的网络架构,并在各个方面提高整体网络效率。在表2中展示了应用于几种流行网络架构的CSPNet的优异性能。最后,由于CSPNet对许多硬件资源的要求较低,因此它适用于具有更严格硬件约束的设备上的高速推理。

3.3、坡度路径长度分析

如第3.1节所述,整个网络的梯度路径越短并不意味着学习能力越强。此外,即使整个梯度组合路径的长度是固定的,作者发现ResNet的学习能力仍然下降当堆叠非常深时。然而,作者发现上述问题可以用于在训练阶段使用随机深度将ResNet分解为较浅的随机子网络进行训练,这可以使超深ResNet收敛到更好的结果。

上述现象告诉我们,在分析梯度路径时,不仅可以查看整个网络的最短梯度路径和最长梯度路径,还需要更详细的梯度路径分析。在下文中,将通过在训练期间调整梯度流来控制梯度路径长度,然后根据结果讨论在设计网络架构时的梯度长度策略。

1、Stop gradient

首先基于ResNet探讨最短梯度长度的重要性。与PlainNet相比,ResNet中的每个残差块除了通过计算块的梯度之外,还通过identity连接在计算块上具有一部分梯度。这里,如图9所示,分别对计算块和identity连接执行Stop梯度操作。

当在identity连接上执行Stop梯度时,整个网络的梯度路径将类似于PlainNet。也就是说,最长的梯度路径与最短的梯度路径长度相同,网络深度也相同。当在计算块上执行Stop梯度时,最短的梯度路径将直接穿过所有残差连接并直接到达起始层,此时最短梯度路径长度为1。由于每个计算块有两层,因此其最长梯度路径为2。可以使用这两组设置来观察残差学习本身的好处和梯度路径的减少。

使用Microsoft COCO数据集中的目标检测和实例分割作为基线模型,对YOLOR CSP进行消融研究,结果如表3所示。实验结果表明,在ResNet中执行缩短的梯度路径确实是深度网络更好收敛的重要因素。

2、Gradient path planning

根据以上分析和在YOLOR-CSP中使用CSP融合进行的模型缩放实验,重新规划了VoVNet的过渡层并进行了实验。首先移除深度VoVNet的每个OSA模块的过渡层,只留下每个阶段中最后一个OSA模块中的过渡层。以与上述相同的方式组织网络的最长梯度路径和通过每个层的最短梯度路径。同时,还将CSPNet结构应用于上述网络,以进一步观察CSPNet的多功能性,相关实验结果如表4所示。可以清楚地看到,深度VoVNet已经从无法收敛变为能够很好地收敛并获得非常好的精度。

3、总结

简而言之,从上述实验和分析中推断,在规划整个网络的梯度路径时,不仅应该考虑最短的梯度路径,而且应该确保每个层的最短梯度路径都可以有效地训练。至于整个网络的最长梯度路径的长度,它将大于或等于任何层的最长的梯度路径。因此,在实施网络级梯度路径设计策略时,需要考虑网络中所有层的最长最短梯度路径长度,以及整个网络的最长梯度路径。

4、实验

4.1、 Layer-level梯度路径设计策略

在PRN实验中将被masked residual layer mask的通道数设置为原始通道数的一半,实验结果如表5所示。由于PRN的设计维护了整个网络的所有参数和拓扑结构,所以只有残差连接中的加法操作减少了一半,所以总体计算量几乎没有变化。

然而,YOLOR-PRN在精度上得到了显著的提高,因为每层都使用了用来更新权重的梯度组合。与YOLOR-v3相比,PRN在目标检测上提高了0.5%的AP,也可以观察到高质量和显著的改进。在实例分割上,将AP提高了0.1%,AP75提高了0.3%。

4.2、Stage-level梯度路径设计策略

在CSPNet实验中遵循优化推理速度的原则,将梯度分割比设置为50%-50%,实验结果如表6所示。由于只有一半的通道特征图将进入计算块可以清楚地看到,与YOLOR-v3相比,YOLOR-CSP显著减少了22%的计算量。然而,通过丰富的梯度组合,YOLOR-CSP在目标检测上显著提高了1.5%。与YOLOR-v3相比,YOLOR和CSPNet(YOLOR-CSP)的组合增加了更多高质量的结果。

作者进一步比较了梯度流截断操作来减少重复梯度信息,清楚地看到YOLOR-CSP策略比CSP fusion first和CSP fusion last学习得更好。值得一提的是,无论采用何种融合策略,基于csp的体系结构的计算负荷都比YOLOR-v3低得多,精度也远高于YOLOR-v3。

4.3、Network-level梯度路径设计策略

在ELAN实验中分别测试了计算块在Backbone和Neck的叠加时间,结果如表7所示。从这个表中可以清楚地看出,ELAN在比YOLOR-v3少35%的计算量下,仍然可以提高0.7%的目标检测性能。

在ELAN中可以灵活地设置堆栈的数量,从而在精度和计算量之间进行权衡。从表7中列出的实验结果可以看到,在堆栈设置2,1s,YOLOR-ELAN可以在降低26%计算量的情况下,显著提高目标检测和实例分割的性能分别1.9%和0.6%。

4.4、比较

最后,综合比较了Layer-level 设计策略设计的YOLOR-PRN、Stage-level 设计策略设计的YOLOR-CSP和Network-level 设计策略设计的YOLOR-ELAN,以及基线YOLOR-v3和YOLOv5(r6.2),结果如表8所示。

从表中可以看出,基于梯度路径设计策略设计的模型在各个方面都优于基于基线的方法。此外,无论计算量如何。由Network-level 设计策略设计的YOLOR-ELAN在参数数量和精度方面可以全面获得最突出的性能。

研究结果表明,基于梯度路径分析能够设计出更好的网络架构设计策略。如果与一般的基于数据路径的策略相比,由数据路径策略设计的体系结构通常需要额外的参数或计算成本来获得更好的精度。相比之下,这三种基于梯度路径设计策略的体系结构可以显著提高整体性能。

5、参考

[1].Designing Network Design Strategies Through Gradient Path Analysis.

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

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

相关文章

Ubuntu22.04 设置静态IP

1.查看网卡名称及IP ip addr 网卡名称:ens33 IP:192.168.44.130 2.修改配置文件 在 /etc/netplan/ 目录下找到配置文件 *.yaml ,修改为 network:version: 2#renderer: NetworkManagerethernets:ens33:addresses: [192.168.44.130/24]dhcp4: nooptio…

Chrome扩展程序(插件),用你开发的脚本在浏览器上随心所欲

Chrome扩展程序(插件),用你开发的脚本在浏览器上随心所欲Chrome插件的文件结构Hello_World编写利用JavaScript实现Hello Everything灵活运用浏览器的存储storageoptions_Page基本用法电脑发通知 - Notifications的应用普通界面右键菜单 - con…

Android 9.0系统源码_SystemUI(八)PhoneWindow更新状态栏和导航栏背景颜色的流程解析

前言 状态栏与导航栏属于SystemUi的管理范畴,虽然界面的UI会受到SystemUi的影响,但是,APP并没有直接绘制SystemUI的权限与必要。APP端之所以能够更改状态栏的颜色、导航栏的颜色,其实还是操作自己的View更改UI。可以这么理解&…

【Linux】探索缓冲区的概念 | Git 三板斧 | 实现简易进度条

爆笑教程,只送有缘人 👉 《看表情包学Linux》 💭 写在前面:本章我们先对缓冲区的概念进行一个详细的探究,之后会带着大家一步步去编写一个简陋的 "进度条" 小程序,过程还是挺有意思的&#xff0c…

EMQX 在 Kubernetes 中如何进行优雅升级

背景 为了降低 EMQX 在 Kubernetes 上的部署、运维成本,我们将一些日常运维能力进行总结、抽象并整合到代码中,以 EMQX Kubernetes Operator 的方式帮助用户实现 EMQX 的自动化部署和运维。 此前,EMQX Kubernetes Operator v1beta1、v1beta…

React--》如何在React中创建TypeScript项目并使用?

目录 React中创建TS项目 TS目录结构 React函数组件类型 React类组件类型 如果你已经掌握了TS中基础类型、高级类型的使用,还想在前端项目中更深一层的使用TS,还需要掌握React、Vue、Angular等框架和框架提供的API,懂得如何在框架中使用TS…

【ROS】—— 机器人导航(仿真)—导航实现(十八)[重要][重要][重要]

文章目录前言准备条件1. 导航实现01_SLAM建图1.1 gmapping简介1.2 gmapping节点说明1.3 gmapping使用1.3.1 编写gmapping节点相关launch文件1.3.2 执行2. 导航实现02_地图服务2.1 map_server简介2.2 map_server使用之地图保存节点(map_saver)2.2.1 map_saver节点说明2.2.2 地图…

你是真的“C”——函数递归详解汉诺塔+青蛙跳台阶

函数递归详解汉诺塔青蛙跳台阶问题😎前言🙌函数递归之汉诺塔详解分析🙌汉诺塔问题的简介😊汉诺塔的移动图解😊汉诺塔具体的移动过程展示😊汉诺塔的难处所在:😊函数递归之青蛙跳台阶详…

从头安装gdal库(Linux环境下的Python版)

目录前言GDAL安装SWIG安装proj 安装sqlite安装pkg-config 安装其他报错No package libtiff-4 foundPackage liblzma, required by libtiff-4, not foundPackage libjpeg, required by libtiff-4, not foundPackage zlib, required by libtiff-4, not foundchecking for curl-co…

Windows下IIS部署网站流程

IIS Internet information service 是一个web服务器 1. IIS用于windows系统 2.apache用于Linux系统,JAVA的web服务器 3.Nginx用于Linux,负责负载均衡,反向代理 安装完IIS之后,去更改DNS的指向。 DNS指向:IP 和 域名 的…

Dopamine-PEG-N3,多巴胺聚乙二醇叠氮 科研试剂用于点击化学

中文:多巴胺-聚乙二醇-叠氮 英文:Dopamine-PEG-N3,DOPA-PEG-azide 存储条件:-20C,避光,避湿 用 途:仅供科研实验使用,不用于诊治 外观: 固体或粘性液体,取决于分子量 …

3D游戏引擎系统源码C++本科毕业设计,C++ 3D引擎源码,渲染系统使用的OpenGL 及 OpenGL ES

Effective 3D Engine 渲染系统使用的OpenGL 及 OpenGL ES,Windows上OpenGL ES使用AMD的ES模拟器。 环境部署 完整代码下载地址:3D游戏引擎系统源码C本科毕业设计 Win32环境配置 编辑器 将proj_win32/RenderSystem/gles_renderSystem/GLES/dll 中的d…

【web】微信小程序笔记小结(模板与配置)

来源:黑马程序员前端微信小程序开发教程 目录 I. WXML 模板语法 ① 数据绑定 ※※ 基本原则 ※※ 在 data 中定义数据 ※※ 在 WXML 中使用数据 ※※※※ Mustache 语法的格式 ※※※※ Mustache 主要应用场景 1)动态绑定内容 2)动…

测试篇(二): 如何合理的创建bug、bug的级别、bug的生命周期、跟开发产生争执怎么办

目录一、如何合理的创建bug二、bug的等级三、bug的生命周期四、和开发产生争执怎么办一、如何合理的创建bug 创建Bug的目的就是为了能够让其他人可以尝试复现 一个合格的bug应该包含以下一个要素: 发现问题的版本 例如Web程序对应的浏览器版本,或某个应…

AutoLISP 演练(一)

一、输入左下角点、矩形宽、矩形高后,自动的将图形依所给的条件画出二、变量约定本程序所需的AutoLisp功能函数(setq 变量名 变量值) ⬅ 设定变量值(getpoint [基点] [提示]) ⬅ 请求参考基点输入一个点坐标(getreal […

PyTorch中contiguous、view、Sequential、permute函数的用法

在pytorch中,tensor的实际数据以一维数组(storage)的形式存储于某个连续的内存中,以“行优先”进行存储。 1. tensor的连续性 tensor连续(contiguous)是指tensor的storage元素排列顺序与其按行优先时的元素…

【前端】列表页点进某个详情页,详情页可按顺序跳转到上一条/下一条的实现思路(2种)

需求概述 列表页展示列表,点击某个列表可以跳转到对应的详情页,点击上一页下一页可以按列表顺序跳转到对应详情页。比如点击列表2进入到详情2,我点上一页可以跳转到详情1,点击下一页可以跳转到详情3。难点:详情页如何…

Http客户端 Feign 的使用 (黑马springcloud笔记)

Feign基本使用 目录Feign基本使用一、Feign代替RestTemplate二、自定义配置三、Feign使用优化1. 底层优化2. 日志优化四、最佳实践方式一&#xff1a;继承方式二&#xff1a;抽取一、Feign代替RestTemplate 步骤&#xff1a; 引入依赖 <dependency><groupId>org.s…

UITableView内输入框(UITextView)换行

业务描述&#xff1a; UITableView内存在一个Cell&#xff0c;该Cell内有一输入框可以输入文字&#xff0c;超出输入框宽度则换行展示&#xff0c;即该Cell高度要增加 如图&#xff1a; 解决方法&#xff1a; 思路&#xff1a; 1:取到最大输入框宽度 2:计算当前文字宽度与最…

QT自定义控件工程结构框架

目录前言一、cutewidgets是什么&#xff1f;二、工程结构三、框架的工程配置1 cutewidgets.pro2 cutewidgets.pri2.1 cutewidgetsconfig.pri2.2 cutewidgetsfunctions.pri2.3 cutewidgetsbuild.pri四、源码1 src1.1 src.pro1.2 cutewidgets_global.h1.3 testedit1.4 扩展2 exam…