目标检测论文阅读:RepPoints算法笔记

news2024/7/6 17:54:52

标题:RepPoints: Point Set Representation for Object Detection
会议:ICCV2019
论文地址:https://ieeexplore.ieee.org/document/9009032/
官方代码:https://github.com/microsoft/RepPoints
作者单位:北京大学、清华大学、微软亚洲研究院

文章目录

  • Abstract
  • 1. Introduction
  • 2. Related Work
  • 3. The RepPoints Representation
    • 3.1. Bounding Box Representation
    • 3.2. RepPoints
  • 4. RPDet: an Anchor Free Detector
  • 5. Experiments
    • 5.1. Experimental Settings
    • 5.2. Ablation Study
    • 5.3. RepPoints Visualization
    • 5.4. State-of-the-art Comparison
  • 6. Conclusion

Abstract

现代目标检测器在各个识别阶段严重依赖于矩形边界框来表示目标,如锚框(anchor)、建议(proposal)和最终预测(final prediction)。边界框使用方便,但是只提供了目标的粗糙定位,导致目标特征相应地粗糙提取。在本文中,我们提出RepPoints(representative points),一种新的更精细的目标表示,它是一组对定位和识别都有益的采样点。给定用于训练的真值位置和识别目标,RepPoints学习以一种限制目标的空间范围并指示语义显著的局部区域的方式来自动地排列自己。而且它们不需要使用anchor来采样边界框空间。我们展示了基于RepPoints的anchor-free目标检测器可以和SOTA的anchor-based检测方法一样有效,在COCO test-dev检测基准上,使用ResNet-101模型具有46.5 AP和67.4 AP 50 _{50} 50

1. Introduction

目标检测旨在定位图像中的目标并提供其类别标签。作为计算机视觉中最基本的任务之一,它是许多视觉应用的关键组成部分,包括实例分割、人体姿态分析和视觉推理。目标检测问题的重要性以及深度神经网络的快速发展导致了近年来的大量进展。
在目标检测pipeline中,将包含图像矩形区域的边界框作为处理的基本元素。它们在目标检测器的各个阶段描述目标的位置,从锚框和建议到最终预测。基于这些边界框,提取特征并用于目标分类和位置细化等目的。边界框表示的流行可以部分归因于目标检测性能的常用度量,即目标的估计边界框和真值边界框之间的重叠度。另一个原因在于其形状规则,易于将矩形窗口细分为池化单元格矩阵,便于在深度网络中进行特征提取。
虽然边界框便于计算,但它们只提供不符合目标形状和姿态的目标的粗糙定位。因此,从边界框的规则单元格中提取的特征可能会受到背景内容或包含很少语义信息的不提供信息的前景区域的严重影响。这可能导致较低的特征质量,从而降低目标检测中的分类性能。
在本文中,我们提出了一种新的表示,称为RepPoints,它提供了更细粒度的定位并便于分类。如图1所示,RepPoints是一组点,学习以一种限制目标的空间范围并指示语义显著的局部区域的方式来自动地在目标上给自己定位。RepPoints的训练由目标定位和识别目标共同驱动,使得RepPoints被真值边界框紧紧地限制,引导检测器正确地进行目标分类。这种自适应和可微的表示可以在现代目标检测器的不同阶段中一致使用,不需要使用anchor在边界框空间上采样。
在这里插入图片描述
RepPoints不同于现有的用于目标检测的非矩形表示,它们都是以自底向上的方式构建的。这些自底向上的表示识别独特的点(例如边界框角点或目标末端),并依靠手工聚类将其组合成目标模型。而且它们的表示要么仍然像边界框那样轴对齐(axis-aligned),要么需要真值目标掩码作为额外的监督。相反,RepPoints以自顶向下的方式从输入图像/目标特征中学习,允许端到端的训练,并且在没有额外监督的情况下产生细粒度的定位。
用RepPoints替换两阶段目标检测器中所有传统的边界框表示,包括锚框、建议和最终定位目标,我们开发了一个干净有效的anchor-free目标检测器,在COCO基准上不使用多尺度训练和测试就实现了42.8 AP和65.0 AP 50 _{50} 50,使用ResNet-101模型和多尺度训练和测试实现了46.5 AP和67.4 AP 50 _{50} 50

2. Related Work

目标检测问题的边界框。 在目标检测领域中,边界框一直是目标表示的主导形式。其流行的一个原因是边界框标注起来方便,几乎没有歧义性,同时为后续的识别过程提供了足够准确的定位。这可以解释为什么主要的基准都使用基于边界框的标注和评估。反过来,这些基准激发了目标检测方法使用边界框作为其基本表示,以便与评估协议保持一致。
边界框占据主导地位的另一个原因是几乎所有的图像特征提取器,无论是在之前还是在深度学习时代,都是基于具有规则网格形式的输入块。因此可以方便地使用边界框表示来促进特征提取。
虽然提出的RepPoints具有不规则的形式,但我们表明它可以经得起检验来方便地进行特征提取。我们的方法使用RepPoints结合可变形卷积,它自然地与RepPoints对齐,因为它在几个采样点上聚合来自输入特征的信息。此外,从RepPoints可以很容易地生成一个矩形伪框,使这种新的表示可以与目标检测基准一起使用。
现代目标检测器中的边界框。 迄今为止,性能最好的目标检测器一般遵循多阶段识别范式,而边界框表示几乎出现在所有阶段:①作为预定义的或学习到的锚框,充当边界框空间上的假设;②作为联系连续识别阶段的精细化目标建议;③作为最终的定位目标。
利用RepPoints可以替换目标检测器模型所有阶段的边界框表示,从而得到更有效的新的目标检测器。具体来说,锚框由中心点代替,这是RepPoints的一种特殊配置。用RepPoints建议和最终目标代替边界框建议和最终定位目标。值得注意的是,由于使用中心点作为初始的目标表示,因此得到的目标检测器是anchor-free的。所以它比基于边界框的方法在使用上更加方便。
目标检测的其它表示。 为了解决矩形边界框的局限性,已经有一些尝试来开发更灵活的目标表示。其中包括用于行人检测的椭圆表示和以更好地处理旋转变化的旋转边界框。
另一些工作旨在以自底向上的方式表示目标。早期的自底向上表示方法包括DPM和Poselet。最近,已经利用深度网络探索了自底向上的目标检测方法。CornerNet首先预测左上角和右下角,然后使用专门的组合方法得到目标的边界框。然而,两个相对的角点本质上仍然是一个矩形边界框。ExtremeNet被提出用于定位目标在x方向和y方向上的极值点,并由真值掩码标注进行监督。一般而言,自底向上的检测器受益于更小的假设空间(例如,CornerNet和ExtremeNet都是检测2维点,而不是直接检测4维边界框)和可能更细粒度的定位。然而,它们也存在一些局限性,例如依赖手工聚类或后处理步骤来从检测到的点组合成整个目标。
与这些自底向上的工作类似,RepPoints也是一种灵活的目标表示。然而,该表示是以自顶向下的方式构建的,不需要手工的聚类步骤。与ExtremeNet需要额外的掩码监督不同,RepPoints可以在没有监督的情况下自动学习极值点和关键语义点。
目标识别中的变形建模。 视觉识别最基本的挑战之一是识别具有各种几何变化的目标。为了有效地建模这种变化,一种可能的解决方案是利用低层组件的自底向上组合。沿该方向的代表性检测器包括DPM和Poselet。另一种方法是以自顶向下的方式隐式地建模这种变换,在输入特征上应用一个轻量级的神经网络块,可以是全局的也可以是局部的。
RepPoints受到了这些工作的启发,特别是自顶向下的变形建模方法。主要区别在于,我们旨在开发一种灵活的目标表示,除了语义特征提取外,实现精确的几何定位。相比之下,可变形卷积和可变形RoI池化方法都是为了改进特征提取而设计的。在第4节中测验了可变形RoI池化无法学习精确的几何定位。在这个意义上,我们扩展了以往几何建模方法中自适应采样点的用法,使其包含更精细的目标定位。

3. The RepPoints Representation

我们首先回顾边界框表示及其在多阶段目标检测器中的应用。接着描述RepPoints及其与边界框的区别。

3.1. Bounding Box Representation

边界框是一个编码目标空间位置的4维表示, B = ( x , y , w , h ) \mathcal{B}=(x,y,w,h) B=(x,y,w,h),其中 x x x y y y表示中心点, w w w h h h表示宽度和高度。由于其简单和使用方便,现代目标检测器在检测pipeline的各个阶段都严重依赖边界框来表示目标。
多阶段目标检测器的回顾。 性能最好的目标检测器通常遵循多阶段识别范式,目标定位是逐阶段细化的。目标表示经过该pipeline步骤的作用如下:
b b o x   a n c h o r s → b b o x   r e g . b b o x   p r o p o s a l s   ( S 1 ) → b b o x   r e g . b b o x   p r o p o s a l s   ( S 2 ) . . . → b b o x   r e g . b b o x   o b j e c t   t a r g e t s (1) \begin{align} \mathrm{bbox~anchors}&\xrightarrow{\mathrm{bbox~reg.}}\mathrm{bbox~proposals~(S1)}\\ &\xrightarrow{\mathrm{bbox~reg.}}\mathrm{bbox~proposals~(S2)}\\ &...\\ &\xrightarrow{\mathrm{bbox~reg.}}\mathrm{bbox~object~targets} \end{align}\tag{1} bbox anchorsbbox reg. bbox proposals (S1)bbox reg. bbox proposals (S2)...bbox reg. bbox object targets(1)开始时,假设多个锚框覆盖了一定范围的边界框尺度和纵横比。一般来说,高覆盖率是通过大型4维假设空间上的稠密锚框获得的。例如,RetinaNet中每个位置使用45个锚框。
对于一个锚框,采用其中心点处的图像特征作为目标特征,然后利用该特征,通过边界框回归过程来产生关于锚框是否为目标的置信度分数和精细化的边界框。细化后的边界框记为“bbox proposals (S1)”。
在第二个阶段,通常采用RoI-pooling或RoI-Align,从细化后的边界框建议中提取细化的目标特征。对于两阶段框架,细化后的特征将通过边界框回归产生最终的边界框目标。对于多阶段方法,细化后的特征被用来生成中间的细化的“bbox proposals (S2)”,也是通过边界框回归。该步骤可以迭代多次直到生成最终的边界框目标。
在该框架中,边界框回归在逐步细化目标定位和目标特征方面起着核心作用。
边界框回归。 通常,预测一个4维的回归向量 ( Δ x p , Δ y p , Δ w p , Δ h p ) (\Delta x_p,\Delta y_p,\Delta w_p,\Delta h_p) (Δxp,Δyp,Δwp,Δhp)来将当前的边界框建议 B p = ( x p , y p , w p , h p ) \mathcal{B}_p=(x_p,y_p,w_p,h_p) Bp=(xp,yp,wp,hp)映射到一个细化的边界框 B r \mathcal{B}_r Br,其中:
B r = ( x p + w p Δ x p , y p + h p Δ y p , w p e Δ w p , h p e Δ h p ) (2) \mathcal{B}_r=(x_p+w_p\Delta x_p,y_p+h_p\Delta y_p,w_pe^{\Delta w_p},h_pe^{\Delta h_p})\tag{2} Br=(xp+wpΔxp,yp+hpΔyp,wpeΔwp,hpeΔhp)(2)给定目标的真值边界框 B t = ( x t , y t , w t , h t ) \mathcal{B}_t=(x_t,y_t,w_t,h_t) Bt=(xt,yt,wt,ht),边界框回归的目标是使 B r \mathcal{B}_r Br B t \mathcal{B}_t Bt尽可能地接近。具体来说,在目标检测器的训练过程中,我们使用预测的4维回归向量和期望的4维回归向量之间的距离 F ^ ( B p , B t ) \hat{\mathcal{F}}(\mathcal{B}_p,\mathcal{B}_t) F^(Bp,Bt)作为学习的目标,使用smooth l 1 l_1 l1损失:
F ^ ( B p , B t ) = ( x t − x p w p , y t − y p h p , l o g w t w p , l o g h t h p ) (3) \hat{\mathcal{F}}(\mathcal{B}_p,\mathcal{B}_t)=(\frac{x_t-x_p}{w_p},\frac{y_t-y_p}{h_p},\mathrm{log}\frac{w_t}{w_p},\mathrm{log}\frac{h_t}{h_p})\tag{3} F^(Bp,Bt)=(wpxtxp,hpytyp,logwpwt,loghpht)(3)这种边界框回归过程在现有的目标检测方法中被广泛使用。当所需的细化程度较小时,它在实际中表现较好,但当初始表示与目标距离较大时,它往往表现较差。另一个问题是 Δ x p \Delta x_p Δxp Δ y p \Delta y_p Δyp Δ w p \Delta w_p Δwp Δ h p \Delta h_p Δhp之间的尺度差异,这需要调整它们的损失权重以获得最佳性能。

3.2. RepPoints

如前所述,4维边界框是目标位置的粗糙表示。边界框表示只考虑目标的矩形空间范围,没有考虑形状和姿态以及语义重要的局部区域的位置,它们可以用于更精细的定位和更好的目标特征提取。
为了克服上述限制,RepPoints转为建模一组自适应采样点:
R = { ( x k , y k ) } k = 1 n (4) \mathcal{R}=\{(x_k,y_k)\}_{k=1}^n\tag{4} R={(xk,yk)}k=1n(4)其中, n n n是在该表示中使用的采样点总数。在我们的工作中, n n n默认设置为9。
RepPoints细化。 逐步细化边界框定位和特征提取对于多阶段目标检测方法的成功至关重要。对于RepPoints,细化可以简单地表示为:
R r = { ( x k + Δ x k , y k + Δ y k ) } k = 1 n (5) \mathcal{R}_r=\{(x_k+\Delta x_k,y_k+\Delta y_k)\}_{k=1}^n\tag{5} Rr={(xk+Δxk,yk+Δyk)}k=1n(5)其中, { ( Δ x k , Δ y k ) } k = 1 n \{(\Delta x_k,\Delta y_k)\}_{k=1}^n {(Δxk,Δyk)}k=1n是新采样点相对于旧采样点的预测偏移量。我们注意到,这种细化不会面临边界框回归参数之间的尺度差异问题,因为在RepPoints的细化过程中,偏移量处于同一尺度。
将RepPoints转换为边界框。 为了在RepPoints的训练中利用边界框标注,同时为了评估RepPoint-based目标检测器,需要一种将RepPoints转换为边界框的方法。我们使用一个预定义的转换函数 T : R P → B P \mathcal{T}:\mathcal{R}_P\to\mathcal{B}_P T:RPBP,其中 R P \mathcal{R}_P RP表示目标 P P P的RepPoints, T ( R P ) \mathcal{T}(\mathcal{R}_P) T(RP)表示一个伪框。
为此考虑了三个转换函数:

  • T = T 1 \mathcal{T}=\mathcal{T}_1 T=T1:最小最大函数(Min-max function)。 在RepPoints上执行两个坐标轴上的最小-最大操作以确定 B P \mathcal{B}_P BP,相当于采样点上的边界框。
  • T = T 2 \mathcal{T}=\mathcal{T}_2 T=T2:部分最小最大函数(Partial min-max function)。 在采样点的子集上执行两个坐标轴上的最小-最大操作以获得矩形框 B P \mathcal{B}_P BP
  • T = T 3 \mathcal{T}=\mathcal{T}_3 T=T3:基于矩的函数(Moment-based function)。 利用RepPoints的均值和标准差来计算矩形框 B P \mathcal{B}_P BP的中心点和尺度,其中尺度会乘以全局共享的可学习乘子 λ x \lambda_x λx λ y \lambda_y λy。这些函数都是可微的,当插入到目标检测系统中时,可以实现端到端的学习。在我们的实验中,我们发现它们工作同等地好。

学习RepPoints。 RepPoints的学习由目标定位损失和目标识别损失共同驱动。为了计算目标定位损失,我们首先使用前面讨论的转换函数 T \mathcal{T} T将RepPoints转换为伪框。然后,计算转换后的伪框与真值边界框之间的差异。在我们的系统中,我们使用左上角点和右下角点之间的smooth l 1 l_1 l1距离来表示定位损失。这个smooth l 1 l_1 l1距离不需要像计算边界框回归向量(即 Δ x p \Delta x_p Δxp Δ y p \Delta y_p Δyp Δ w p \Delta w_p Δwp Δ h p \Delta h_p Δhp)之间的距离那样调整不同的损失权重。图4表明,当训练由目标定位和目标识别损失的组合来驱动时,目标的极值点和语义关键点被自动学习到( T 1 \mathcal{T}_1 T1用于将RepPoints转换为伪框)。

4. RPDet: an Anchor Free Detector

我们设计了一个anchor-free目标检测器,使用RepPoints代替边界框作为其基本表示。在多阶段pipeline中,目标表示的演化如下:
o b j e c t   c e n t e r s → R P   r e f i n e R e p P o i n t s   p r o p o s a l s   ( S 1 ) → R P   r e f i n e R e p P o i n t s   p r o p o s a l s   ( S 2 ) . . . → R P   r e f i n e R e p P o i n t s   o b j e c t   t a r g e t s (6) \begin{align} \mathrm{object~centers}&\xrightarrow{\mathrm{RP~refine}}\mathrm{RepPoints~proposals~(S1)}\\ &\xrightarrow{\mathrm{RP~refine}}\mathrm{RepPoints~proposals~(S2)}\\ &...\\ &\xrightarrow{\mathrm{RP~refine}}\mathrm{RepPoints~object~targets} \end{align}\tag{6} object centersRP refine RepPoints proposals (S1)RP refine RepPoints proposals (S2)...RP refine RepPoints object targets(6)我们的RepPoints检测器(RPDet)是利用基于可变形卷积的两个识别阶段来构建的,如图2所示。可变形卷积与RepPoints配合很好,因为其卷积是在不规则分布的采样点集合上计算的,反过来它的识别反馈可以指导这些点的定位训练。在这一节,我们介绍RPDet的设计,并讨论它与现有目标检测器的联系和区别。
在这里插入图片描述
基于中心点的初始目标表示。 在目标检测的初始阶段,预定义的锚框主导了目标的表示,我们遵循YOLO和DenseBox的方法,使用中心点作为目标的初始表示,从而得到一个anchor-free目标检测器。
中心点表示的一个重要优点在于它比anchor-based表示具有更紧凑的假设空间。anchor-based方法通常依靠大量多比例和多尺度的锚框来保证大型4维边界框假设空间的稠密覆盖,而基于中心点的方法可以更容易地覆盖其2维空间。事实上,所有目标都会有位于图像内部的中心点。
然而,基于中心点的方法也面临着识别目标歧义的问题,这是两个不同的目标位于特征图中相同的位置导致的,限制了其在现代目标检测器中的流行。在以前的方法中,主要是通过在每个位置产生多个目标来解决的,这面临着另一个归属歧义(vesting ambiguity)问题(如果多个真值目标的中心点位于同一特征图位置,则只分配一个随机选择的真值目标作为该位置的目标。)。在RPDet中,我们表明使用FPN结构可以大大缓解这个问题,原因如下:首先,不同尺度的目标将被分配到不同的图像特征层,这解决了不同尺度相同中心点位置的目标;其次,FPN对于小目标有高分辨率的特征图,这也减少了两个目标的中心位于同一特征位置的机会。事实上,我们观察到在COCO数据集中只有1.1%的目标在使用FPN时会存在中心点位于同一位置的问题。
值得注意的是,中心点表示可以看作是一种特殊的RepPoints配置,其仅使用单个固定的采样点,从而在整个检测框架中保持一致的表示。
Reppoint的使用。 如图2所示,RepPoints作为整个检测系统的基本目标表示。从中心点开始,通过回归中心点上的偏移量得到第一组RepPoints。这些RepPoints的学习由两个目标来驱动:①产生的伪框和真值边界框之间左上角和右下角点的距离损失;②后续阶段的目标识别损失。如图4所示,极值点和关键点被自动地学习。第二组RepPoints表示最终的目标定位,由第一组RepPoints通过公式5细化得到。第二组RepPoints在点距离损失单独的驱动下,旨在学习更精细的目标定位。
与可变形RoI池化的关系。 如第2节所述,与所提出的RepPoints相比,可变形RoI池化在目标检测中发挥了不同的作用。总的说来,RepPoints是目标的几何表示,反映了更准确的语义定位,而可变形RoI池化则是为了学习目标更强的外观特征。事实上,可变形RoI池化无法学习代表目标准确定位的采样点。
我们还注意到,可变形RoI池化可以与RepPoints互补,如表6所示。
主干和头部结构。 我们的FPN主干遵循RetinaNet,从stage3 (下采样率为8)到stage7(下采样率为128)产生5个特征金字塔层。
头部结构如图3所示。这里有两个非共享的子网络,分别旨在定位(RepPoints generation)和分类。定位子网络首先应用3个256维的3×3卷积层,然后应用2个连续的小网络来计算两组RepPoints的偏移量。分类子网络也应用了3个256维的3×3卷积层,然后是1个256维的3×3可变形卷积层,其输入偏移域与定位子网络中的第一个可变形卷积层共享。在两个子网络的前3个256维的3×3卷积层之后分别应用组标准化(group normalization)层。
在这里插入图片描述
值得注意的是,虽然我们的方法使用了两阶段的定位,但它比单阶段的RetinaNet检测器更高效(使用ResNet-50时210.9 vs. 234.5 GFLOPS)。额外的定位阶段由于层共享所以引入的开销很小。anchor-free设计减少了最终分类层的负担,从而导致计算量略有减少。
定位/类别目标分配。 这里有两个定位阶段:从目标中心点的假设(特征图bins)细化生成第一个RepPoints集合;从第一个RepPoints集合细化生成第二个RepPoints集合。对于这两个阶段,只有正目标假设在训练中被分配了定位(RepPoints)目标。对于第一个定位阶段,如果①该特征图bin的金字塔层等于真值目标的对数尺度 s ( B ) = ⌊ l o g 2 ( w B h B / 4 ) ⌋ s(B)=\left\lfloor log_2(\sqrt{w_Bh_B}/4) \right\rfloor s(B)=log2(wBhB /4);②该真值目标的中心点的投影位于该特征图bin中,则该特征图bin为正。对于第二个定位阶段,如果第一组RepPoints产生的伪框与真值目标有足够的重叠即它们的交并比大于0.5,则它是正的。
分类只在第一组RepPoints上进行。分类分配的准则遵循RetinaNet,IoU(产生的伪框和真值边界框之间)大于0.5为正,小于0.4为背景,否则忽略。使用Focal Loss进行分类训练。

5. Experiments

5.1. Experimental Settings

介绍了实验中的一些细节设置。

5.2. Ablation Study

在这里插入图片描述
RepPoints相比于边界框表示的有效性,具体的实验结论可以参照原文。
在这里插入图片描述
目标定位监督和目标识别损失的必要性,具体的实验结论可以参照原文。
在这里插入图片描述
在这里插入图片描述
几种基于中心点的方法、anchor-based方法和anchor-free方法的对比,具体的实验结论可以参照原文。
在这里插入图片描述
不同的转换函数效果都很好,具体的实验结论可以参照原文。
在这里插入图片描述RepPoints和可变形RoI池化是互补的,具体的实验结论可以参照原文。

5.3. RepPoints Visualization

在这里插入图片描述
RepPoints的可视化,具体的实验结论可以参照原文。

5.4. State-of-the-art Comparison

在这里插入图片描述
和SOTA的对比,具体的实验结论可以参照原文。

6. Conclusion

在本文中,我们提出了RepPoints,一种用于目标检测的表示,它建模细粒度的定位信息并识别对目标分类有意义的局部区域。基于RepPoints,我们开发了一个称为RPDet的目标检测器,在不需要锚框的情况下实现了有竞争力的目标检测性能。学习更丰富、更自然的目标表示,如RepPoints,是目标检测的一个很有前途的方向。

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

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

相关文章

Jetpack Compose 深入探索系列六:Compose runtime 高级用例

Compose runtime vs Compose UI 在深入讨论之前,非常重要的一点是要区分 Compose UI 和 Compose runtime。Compose UI 是 Android 的新 UI 工具包,具有 LayoutNodes 的树形结构,它们稍后在画布上绘制其内容。Compose runtime 提供底层机制和…

qsort快速排序的实现以及模拟实现qsort的功能(狠狠的拿捏)

当你为错过太阳而哭泣的时候,你也要再错过群星了。 --泰戈尔 目录 一.qsort快速排序的实现 二.模拟实现一个qsort功能的函数 一.qsort快速排序的实现 下面是 qsort() 函数的声明: void qsort(void *base, size_t nitems, size_t size, int (…

Java——电话号码的字母组合

题目链接 leetcode在线oj题——电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 题目示例…

高压功率放大器在压电驱动器的研究中的应用

实验名称:压电驱动器的电致振动特性研究研究方向:压电驱动器测试目的:旨在分析压电驱动器的电激励振动特性。以双晶压电悬臂梁为对象,基于能量法和热力学平衡方程推导了压电悬臂梁在电压激励下的强迫振动微分方程。利用自行搭建的…

Spring的核心基础——IOC与DI

文章目录一、Spring简介1 Spring介绍1.1 为什么要学1.2 学什么2 初识Spring2.1 Spring家族2.2 Spring发展史3 Spring体系结构3.1 Spring Framework系统架构图4 Spring核心概念问题导入4.1 核心概念二、IOC和DI入门1 IOC入门问题导入1.1 门案例思路分析1.2 实现步骤1.3 实现代码…

【计算机网络】HTTP

一、基础概念 请求和响应报文 客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端。 请求报文结构: 第一行是包含了请求方法、URL、协议版本;接下来的多行都是请求首…

大数据开发的工作内容与流程

大数据开发的工作内容与流程离线数据仓库开发实时流处理开发离线数据仓库开发 我们之后在做开发的时候,可能是选择某几个组件来使用。比如做数仓开发,可能就是用sqoop把数据抽到hdfs里,用spark或者mapreduce对这部分数据做一个清洗。 清洗的…

嵌入式开发--STM32H750VBT6开发中,新版本CubeMX的时钟问题,不能设置到最高速度480MHZ

嵌入式开发–STM32H750VBT6开发中,新版本CubeMX的时钟问题,不能设置到最高速度480MHZ 问题描述 之前开发的项目,开发环境是CubeMX6.6.1,H7系列的支持包版本是1.10.0。跑得没问题,最近需要对项目做修改,同…

vue学习(7)vuex的辅助函数封装(基于vue3)

简介: 封装了 mapState,mapGetters,mapActions,mapMutations,用更灵活的方式来使用vuex,主要使用的是vuex的createNamespacedHelpers方法,此方法是帮助重写以特定模块为主的辅助函数 createNa…

Spring Cloud(微服务)学习篇(四)

Spring Cloud(微服务)学习篇(四) 1.nacos实现服务之间传参数 1.1 在dto包(shop-sms-api项目)中创建SmsDTO类 package com.zlz.shop.sms.api.dto;import lombok.Data;Data public class SmsDTO {private String tel; }1.2 复制SmsDTO类到shop-sms-server项目的dto包下面 1.3 …

AVL 树实现

AVL 树的概念 也许因为插入的值不够随机,也许因为经过某些插入或删除操作,二叉搜索树可能会失去平衡,甚至可能退化为单链表,造成搜索效率低。 AVL Tree 是一个「加上了额外平衡条件」的二叉搜索树,其平衡条件的建立是…

buu [MRCTF2020]Easy_RSA 1

题目描述: import sympy from gmpy2 import gcd, invert from random import randint from Crypto.Util.number import getPrime, isPrime, getRandomNBitInteger, bytes_to_long, long_to_bytes import base64from zlib import * flag b"MRCTF{XXXX}" …

【基础算法】单链表的OJ练习(1) # 反转链表 # 合并两个有序链表 #

文章目录前言反转链表合并两个有序链表写在最后前言 上一章讲解了单链表 -> 传送门 <- &#xff0c;后面几章就对单链表进行一些简单的题目练习&#xff0c;目的是为了更好的理解单链表的实现以及加深对某些函数接口的熟练度。 本章带来了两个题目。一是反转链表&#x…

Springboot怎么实现restfult风格Api接口

前言在最近的一次技术评审会议上&#xff0c;听到有同事发言说&#xff1a;“我们的项目采用restful风格的接口设计&#xff0c;开发效率更高&#xff0c;接口扩展性更好...”&#xff0c;当我听到开头第一句&#xff0c;我脑子里就开始冒问号&#xff1a;项目里的接口用到的是…

Django实践-03模型-01表生成模型

文章目录Django实践-03模型Django MTV之模型投票案例1.创建应用1.创建应用2.配置模板文件2.配置关系型数据库MySQL1.创建数据库2.创建表3.按照MySQL依赖4.修改settings.py文件 添加应用 配置数据库5. 基于数据库生成实体类3.使用ORM完成模型的CRUD操作1.新增2.删除3.更新4.查询…

代数小课堂:向量代数(方向比努力更重要)

文章目录 引言I 数字的方向性1.1 箱子受力1.2 爆破逃离方向II 向量的表示法2.1 极坐标方法对向量表示2.2 终点的坐标表示向量III 向量的计算3.1 计算向量的长度和方向3.2 平行四边形法则(计算向量的长度)引言 代数学除了带来了方程和函数工具,还揭示了关于数字的另一个规律,…

C++——特殊类设计

目录 不能被拷贝的类 只能在堆上创建对象的类 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 饿汉模式 懒汉模式 单例对象释放问题 不能被拷贝的类 C98&#xff1a;将拷贝构造函数与赋值运算符重载只声明不定义&#xff0c;并且将其访问权…

React Native学习笔记(2.基本语法-类组件)

1. 基本语法 (1). 引入组件。(2). 继承共通。(3). 定义render函数。(4). 返回文本。(5). export导出 2. 自定义组件&#xff08;引用&#xff09; 将上面定义的"cat“组件引用到当前文件里 (1). inprot引入。(2). 使用 3. 自定义组件&#xff08;参数定义与传参&#x…

【Linux】项目自动化构建工具——make/Makefile

目录 1.make与Makefile的关系 Makefile make 项目清理 clean .PHONY 当我们编写一个较大的软件项目时&#xff0c;通常需要将多个源文件编译成可执行程序或库文件。为了简化这个过程&#xff0c;我们可以使用 make 工具和 Makefile 文件。Makefile 文件可以帮助我们自动…

你知道Java中的JCP, JEP, JLS, JSR是什么意思吗?

目录 一、JCP 二、JSR 三、JLS 四、JEP 公众号&#xff1a;MCNU云原生&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;及时掌握。 JCP, JEP, JLS, JSR这些概念是Java社区中的一些概念&#xff0c;但是没有没有经常关注社区的童鞋们未必知道这些缩写所代表的…