发表年份:2021.4

发表单位:加州大学圣地亚哥分校

期刊/会议:ICCV2021
论文链接:https://arxiv.org/abs/2104.06399

代码链接:https://github.com/mlpc-ucsd/CoaT‍

目录

Abstract

1.Introduction

2.Related Works

3. Revisit Scaled Dot-Product Attention

4. Conv-Attention Module

4.1. Factorized Attention Mechanism

4.2. Convolution as Position Encoding

5. Co-Scale Conv-Attentional Transformers

5.1. Co-Scale Mechanism

5.2. Model Architecture

6. Experiments

6.1. Experiment Details

6.2. CoaT for ImageNet Classification

6.3. Object Detection and Instance Segmentation

6.4. Ablation Study

7. Conclusion


Abstract

在本文中,我们提出了co-scale conv-attention image transformer(CoaT),这是一种基于Transformer的图像分类器,配备了co-scaleconv-attention机制。首先,co-scale机制在各个尺度上保持Transformer编码器支路的完整性,同时允许在不同尺度上学习到的特征能相互有效通信;我们设计了一系列串行和并行块来实现co-scale机制。其次,我们通过在因子化注意模块中实现相对位置嵌入公式,并采用高效的卷积实现,设计了一种conv-attention机制。CoaT使图像转换器具有丰富的多尺度和上下文建模功能。在ImageNet上,与类似大小的卷积神经网络和图像/视觉Transformer相比,相对较小的CoaT模型可以获得更好的分类结果。CoaT主干在目标检测和实例分割方面的有效性也得到了验证,证明了其适用于下游计算机视觉任务。

1.Introduction

人工智能最近的一个显著发展是注意力机制(Attention)[38]和转换机制(Transformer)[31]的创建,这在自然语言处理[7,20]、文档分析[39]、语音识别[8]和计算机视觉[9,3]等一系列领域都产生了深远的影响。过去,最先进的图像分类器主要建立在卷积神经网络(CNN)[15、14、27、26、11、36]上,卷积神经网络在滤波器上运行。然而,最近的发展[30,9]开始显示基于Transformer的图像分类器的令人鼓舞的结果。

本质上,卷积[15]和注意力[38]操作都通过建模局部内容和上下文来解决结构化数据(例如图像和文本)的基本表示问题。CNN中的感受野通过一系列的卷积操作逐渐扩大。然而,注意力机制[38,31]与卷积运算不同的是:(1)卷积运算自我注意力中每个位置或标记的感受野[31]很容易覆盖整个输入空间,因为每个token与包括自身在内的所有token“匹配”;(2) 每对token的自注意力操作计算一个点“查询”(考虑中的令牌)之间的乘积和“键”(匹配的令牌)来加权“value”(匹配令牌的)。

此外,虽然卷积和自注意力操作都执行加权和,但它们的权重计算不同:在CNN中,权重在训练期间学习,但在测试期间固定在自注意力机制中,根据每对token之间的相似性或亲和力动态计算权重。因此,自注意力机制中的自相似操作提供了比卷积运算更具适应性和通用性的建模方法。此外,位置编码和嵌入[31]的引入为Transformer提供了额外的灵活性,可以对固定输入结构之外的空间配置进行建模(即不固定长度)。

当然,注意力机制的优点并不是免费提供的,因为自注意力操作产生的相似性矩阵比卷积中的线性滤波需要更多的计算。Transformers的早期开发主要集中于自然语言处理任务[31、7、20],因为文本比图像“短”,并且文本更容易标记。在计算机视觉中,已采用自注意力为各种应用提供额外的建模能力[34、37、44]。随着底层框架的不断发展[9,30],Transformer通过展示其丰富的建模能力,开始在计算机视觉[3,9]中取得成果。

在DETR[3]算法中,采用Transformer来执行目标检测和全景分割,但DETR仍然使用CNN骨干网络来提取基本图像特征。最近,人们努力从头开始构建图像分类器,所有这些分类器都基于Transformer[9、30、33]。虽然基于Transformer的图像分类器展示了令人鼓舞的结果,但与成熟的CNN模型相比,性能和设计差距仍然存在。例如,在[9,30]中,输入图像被划分为固定patch大小的单个网格。在本文中,我们通过引入两种对基于Transformer的图像分类器具有实际意义的机制,开发了co-scale conv-attention image Transformer(CoaT)。我们的工作贡献总结如下:

  • 我们通过在不同尺度上保持编码器分支,同时跨尺度吸引注意力,为图像Transformer引入了一种co-scale机制。开发了两种类型的构建块,即串行块和并行块,实现从细到粗、从粗到细和跨尺度图像建模
  • 我们设计了一个conv-attention模块,以实现因子化注意力模块中卷积的相对位置嵌入,与Transformers中的普通自注意力层相比,计算效率显著提高。

我们得到的CoaT在模块化架构下学习有效表示。在ImageNet基准上,与竞争卷积神经网络(例如高效卷积神经网络[29])相比,CoaT实现了最先进的分类结果,同时优于竞争基于Transformer的图像分类器[9、30、33],如图1所示。

2.Related Works

我们的工作受到了最近实现基于Transformer的图像分类器的努力[9,30]的启发。ViT[9]证明了从头开始构建基于Transformer的图像分类器的可行性,但如果不包括额外的训练数据,则无法在ImageNet[23]上实现其性能;DeiT[30]通过使用有效的训练策略和模型蒸馏,消除了[9]中的数据要求,获得了与卷积分类器相当的结果。然而,ViT[9]和DeiT[30]都基于固定patch大小的单个图像网格

我们的CoaT的发展是由两个观察结果推动的:(1)多尺度建模通常会增强再现学习的能力[11,22,32];(2) 相对位置编码和卷积之间的内在联系使得可以使用类似conv的操作来实现有效的自注意力。因此,实验中显示的CoaT模型的优异性能来自我们在Transformer中的两个新设计:(1)允许跨尺度交互的co-scale机制;(2) 一个conv注意力模块,用于实现高效的自注意力操作。接下来,我们重点介绍了两个拟议模块在标准操作和概念方面的差异。

  • 共尺度与多尺度。多尺度方法在计算机视觉领域有着悠久的历史[35,19]。卷积神经网络[15,14,11]自然地实现了从细到粗的策略。除了标准的从细到粗的路径外,U-Net[22]还强制执行从粗到细的路径;HRNet[32]通过在整个卷积层中同时保持精细和粗尺度,提供了进一步增强的建模能力。在我们的并行开发[33]中,不同尺度的层串联用于图像变换,但[33]仅执行从细到粗的策略。本文提出的共尺度机制在响应的计算方式和相互作用方面不同于现有方法:CoaT由一系列高度模块化的串行和并行块组成,以实现对符号化表示的精细到粗、粗到细和跨尺度信息的注意力。我们的共尺度模块中跨不同尺度的联合注意力机制提供了超越现有Vision Transformer的增强建模能力[9、30、33]。
  • conv注意力与注意力。纯注意力模型[21、13、44、9、30]已被引入视觉领域。[21、13、44]用自注意力模块代替类似ResNet架构中的卷积,以更好地进行局部和非局部关系建模。与[9,30]直接将Transformer[31]用于图像识别相反。最近,有文献[1,6]通过引入卷积来增强注意机制LambdaNets[1]为全局上下文建模引入了一种有效的自注意力替代方案,并使用卷积来实现局部上下文建模中的相对位置嵌入。CPVT[6]设计了二维深度卷积作为自注意力后的条件位置编码。在我们的转换注意力中,我们:(1)采用[1]之后的有效因式分解注意力;(2) 将其扩展为深度卷积相对位置编码和卷积位置编码的组合,与CPVT相关[6]。第4.1节和第4.2节详细讨论了我们的网络设计及其与LambdaNets[1]和CPVT[6]的关系。

3. Revisit Scaled Dot-Product Attention

变压器将向量表示为序列作为输入,(即token)x1,…,xN或等价于X∈ R N×C。
Transformers中的自注意力机制使用学习的线性变换WQ、WK和WV将每个xi∈ R C×C投影到相应的查询、键和值向量中。因此,整个序列的投影生成代表Q、K、V∈ R N×C。原始的Transformer[31]的点积注意力公式如下:

在Vision Transformer[9,30]中,向量的输入序列由类标记CLS和展平的特征向量x1,...,xHW作为特征映射F∈ R H×W×C中的图像标记,总长度N=HW+1。等式(1)中的softmax Logit对于高分辨率图像(即N≫ C) 由于其O(N^2)空间复杂度O(N^2×C)时间复杂度。为了减少序列的长度,ViT[9,30]通过patch而不是像素来标记图像。然而,粗分割(例如16×16面片)限制了在每个面片内建模细节的能力。为了解决这一难题,我们提出了一种共尺度机制,该机制借助有效的conv-attention模块提供增强的多尺度图像表示,从而降低高分辨率图像的计算复杂度。

4. Conv-Attention Module

4.1. Factorized Attention Mechanism

在等式1中,softmax logits和注意力映射的物化导致了O(N2)空间复杂度和O(N2C)时间复杂度。受最近关于自注意力线性化的工作[5,25,1]的启发,我们通过使用两个函数分解来近似softmax注意力图,并一起计算第二个矩阵乘法(键和值):

分解导致空间复杂度(包括和矩阵乘积中的中间步骤的输出)和时间复杂度,其中两者都是序列长度N的线性函数。研究者[5]使用μ和ψ中的随机投影来表示近似性,但成本相对较大。有效注意力[25]将softmax函数应用于,这是有效的,但在我们的实验中会导致视觉任务的性能显著下降。在这里,我们根据LambdaNets[1]开发了我们的因式注意机制,其中为单位函数,为softmax:

其中,softmax(·)以元素方式应用于序列中的token,并且投影通道C′=C。在LambdaNets[1]中,比例因子隐式地包含在权重初始化中,而我们的分解注意力显式地应用比例因子。这种分解注意力需要空间复杂度和时间复杂度。值得注意的是,在[1]之后提出的分解注意力并不是缩放点积注意力的直接近似值,但它仍然可以被视为使用查询、键和值向量建模特征交互的广义注意力机制。

4.2. Convolution as Position Encoding

我们的因式注意力模块减轻了原始缩放点积注意力的计算负担。然而,因为我们先计算,L可以被视为查询映射Q中每个特征向量的全局数据相关线性变换。

这表明如果我们有两个查询向量q1,q2∈ R C来自Q,q1=q2,则其相应的自注意力输出将相同:

没有位置编码,Transformer仅由线性层和自注意力模块组成。因此,token的输出依赖于相应的输入,而不知道其局部特征的任何差异。这一特性不适用于语义分割等视觉任务(例如,天空和海洋中相同的蓝色斑块被分割为同一类别)。

卷积相对位置编码。为了能用于视觉任务,ViT和DeiT[9,30]将绝对位置嵌入到输入中,这可能在建模局部token之间的关系方面有局限性。相反,根据[24],我们可以集成相对位置编码,窗口大小为M,以获得相对注意力图;在注意力公式中,如果token被视为一维序列:

其中编码矩阵E∈ R N×N包含以下元素:

其中是一个指示函数。每个元素Eij表示从查询qi到窗口M内的值vj的关系,(EV)_i 聚合关于查询qi的所有相关值向量。不幸的是,EV项仍然需要O(N2)空间复杂度和O(N2C)时间复杂度。在CoaT中,我们建议通过将查询中的每个通道、位置编码和值向量视为内部头,将EV项简化为EV^。因此,对于每个内部头l,我们有:

实际上,我们可以使用一维深度卷积来计算EVˆ:

哪里O是Hadamar乘积。值得注意的是,在Vision Transformer中,我们有两种类型的token,class token(CLS)和image token。因此,我们使用二维深度卷积(窗口大小为M×M,核权重为P),并仅将其应用于重塑image token(即分别来自Q、V的Qimg、V img∈ RH×W×C):

基于我们的推导,深度卷积可以被视为相对位置编码的特例。

卷积相对位置编码与其他相对位置编码。通常参考的相对位置编码[24]在标准缩放点积注意力设置中工作,因为编码矩阵E与注意力图中的softmax logit相结合,而在我们的因式注意力中没有具体化。相对于我们的工作,原始LambdaNets[1]的主要结果使用三维卷积直接计算EV,并减少查询通道和键到CK的通道,其中,但其成本为空间复杂度和时间复杂度,这导致当通道大小C_K,C较大时,计算相对繁重。LambdaNets[1]中最近的一个更新提供了一种在资源受限场景下具有深度卷积的有效变体。我们的因子注意力计算EVˆ时,只需要O(NC)空间复杂度和时间复杂度,目的是实现更好的效率。

卷积位置编码。然后,我们将卷积相对位置编码的思想扩展到一般卷积位置编码情况。卷积相对位置编码模型查询和值之间基于位置的局部关系。与大多数 image Transformer[9,30]中使用的绝对位置编码类似,我们希望将位置关系直接插入到输入图像特征中,以丰富相对位置编码的效果。在每个conv-attention模块中,我们将深度卷积插入输入特征X,并按照标准绝对位置编码方案(见图2下半部分)将产生的位置感知特征连接回输入特征,这类似于CPVT中条件位置编码的实现[6]。

CoaT和CoaT Lite共享同一尺度内串行和并行模块的卷积位置编码权重和卷积相对位置编码权重。对于卷积位置编码,我们将卷积核大小设置为3。对于卷积相对位置编码的不同注意头的图像特征,我们将卷积核大小设置为3、5和7。

CPVT[6]的工作探索了卷积作为条件位置编码的使用,方法是在单尺度下将其插入前馈网络之后。我们的工作重点是将卷积作为相对位置编码和具有因子注意的一般位置编码

Conv-attention机制。最终的Conv-attention模块如图2所示:我们对输入的image token应用第一卷积位置编码。然后,我们将其输入ConvAtt(·),包括因子注意和卷积相对位置编码。生成的映射用于后续前馈网络。

5. Co-Scale Conv-Attentional Transformers

5.1. Co-Scale Mechanism

提出的共尺度机制旨在将细到粗、粗到细和交叉尺度信息引入image Transformer。在这里,我们描述了CoaT体系结构中的两种类型的构建块,即串行块和并行块,以建模多尺度并启用共尺度机制。

CoaT串行块。串行块(如图4所示)以降低的分辨率对图像表示进行建模。在典型的串行块中,我们首先使用patch embedding层按一定比例对输入特征图进行采样,然后将缩减后的特征图展平为一系列图像标记。
然后,我们将image token与额外的CLS token(执行图像分类的专用向量)连接,并应用多个conv注意模块,如第4节所述,以了解image token和CLS token之间的内部关系。最后,我们将CLS token与image token分离,并将image token重塑为下一个串行块的二维特征映射。

CoaT并行块。我们在每个并行组中的并行块之间实现了一种共尺度机制(如图5所示)。在典型的并行组中,我们有来自不同比例串行块的输入特征序列(image token和CLS token)。为了在并行块中实现从细到粗、从粗到细和跨尺度的交互,我们开发了两种策略:(1)直接跨层注意;(2) 注意特征插值。在本文中,我们采用注意力和特征插值来获得更好的经验性能。两种策略的有效性见第6.4节。

直接跨层注意。在直接跨层注意中,我们从每个尺度的输入特征中形成查询、键和值向量。对于同一层内的注意力,我们使用conv-attention(图2)和来自当前尺度的查询、键和值向量。为了引起不同层次的注意,我们对键和值进行向下采样或向上采样以匹配其他尺度的分辨率,从而实现从细到粗和从粗到细的交互。然后,我们执行cross注意力,通过使用另一个尺度的键和值从当前尺度进行查询来扩展conv注意力。最后,我们将conv注意力和cross注意力的输出相加,并应用共享前馈层。通过直接跨层注意,以cross注意方式融合跨尺度信息。

注意特征插值。与直接执行跨层注意不同,我们还使用特征插值进行注意。首先,由独立的conv注意力模块处理来自不同尺度的输入图像特征。然后,我们使用双线性插值从每个尺度下采样或上采样图像特征,以匹配其他尺度的尺寸,或对其自身尺度保持相同。属于同一尺度的特征在并行组中求和,并进一步传递到共享前馈层。这样,下一步中的conv注意力模块可以基于当前步骤中的特征插值来学习跨尺度信息。

5.2. Model Architecture

CoaT-Lite。CoaT-Lite,图3(左图),用串行序列块处理输入图像,这些序列块遵循从细到粗的金字塔结构。给定输入图像,每个序列块将图像特征采样到较低的分辨率,得到四个分辨率的序列: 。在CoaT-Lite中,我们在最后一个序列块中获得CLS token,并基于CLS token通过线性投影层执行图像分类。

CoaT。我们的CoaT模型如图3(右)所示,由串行和并行块组成。一旦我们从串行块获得多尺度特征映射{F1,F2,F3,F4},我们将F2,F3,F4和相应的CLS token传递到具有三个独立并行块的并行组中。为了使用CoaT进行分类,我们从其他三个尺度中聚合了CLS token。

模型变体。在本文中,我们探讨了几种不同模型尺寸的CoaT和CoaT - Lite,即 Tiny, Mini,
Small and Medium。架构细节如表1所示。例如,Tiny模型表示具有5M参数预算约束的模型。具体来说,这些tiny的模块有四个串行块,每个块有两个conv注意力模块。在CoaT-Lite tiny架构中,注意力层的隐藏维度在后面的块中增加。CoaT Tiny将平行组中注意力层的隐藏维度设置为相等,并在六个平行组内执行共尺度机制。mini、small和medium模型遵循相同的架构设计,但增加了嵌入维度,并增加了块内conv注意力模块的数量。

6. Experiments

6.1. Experiment Details

图像分类。我们在标准ILSVRC-2012 ImageNet数据集上执行图像分类[23]。标准ImageNet基准在训练集中包含130万个图像,在验证集中包含50K个图像和 1000个对象类。图像裁剪大小设置为224×224。为了公平比较,我们按照DeiT[30]中相同的程序执行数据扫描,例如混合[42]、剪切混合[41]、随机擦除[45]、重复增强[12]和标签平滑[28]。表2中我们的模型的所有实验结果都在300个时期进行了重新报告,与以前的方法[30]一致。所有模型均在NVIDIA自动混合精度(AMP)框架下使用AdamW[18]优化器进行训练。学习速率按比例为

        目标检测和实例分割。我们在上下文中的常见对象(COCO2017)数据集[16]上进行了管道对象检测和实例分割实验。COCO2017基准包含118K个训练图像和5K个验证图像。我们使用掩码R-CNN[10]和级联掩码R-CNN[2]评估了CoaT在目标检测和实例分割中的泛化能力。我们使用MMDetection[4]框架,并遵循Swin Transformers[17]的设置。此外,我们根据其数据处理设置,基于可变形DETR[46]执行目标检测。

对于Mask R-CNN优化,我们通过学习率为0.0001的AdamW优化器在8个GPU上使用ImageNet预训练主干训练模型。训练周期包括1×设置中的12个时期和3×设置中的36个时期。

对于Cascade R-CNN实验,我们使用三个检测头,优化和训练周期与掩码R-CNN相同。对于可变形DETR优化,我们使用初始学习率为2×10的AdamW优化器,使用预训练主干训练模型50个时代−4,β1=0.9,β2=0.999。在第40个阶段,我们将学习速率降低了10倍。

6.2. CoaT for ImageNet Classification

表2显示了与最先进的方法相比,我们的模型在ImageNet验证集上的最高精度结果。我们将模型架构分为两类:卷积网络(ConvNet)和Transformers(VitNet)。在不同的参数预算约束下,CoaT和CoaT-Lite与其他ConvNet和ViTNet方法相比表现出更强的结果。

6.3. Object Detection and Instance Segmentation

表3和4展示了COCO val2017数据集上Mask R-CNN和Cascade Mask R-CNN框架下的CoaT目标检测和实例分割结果。在1×setting和3×setting下,我们的CoaT和CoaT Lite模型与ResNet、PVT[33]和Swin[17]主干相比显示出明显的性能优势。特别是,我们的CoaT模型带来了巨大的性能增益,表明我们的共尺度机制对于提高下游任务中基于变压器的架构的性能至关重要。
        此外,我们使用表5中的Deformable DETR(DD)框架执行目标检测。我们将我们的模型与COCO数据集[16]上的标准ResNet-50主干进行了比较。与使用ResNet-50的Deformable DETR结果相比,我们的CoaT骨架的平均精度(AP)提高了3.9%[46]。

6.4. Ablation Study

位置编码的有效性。我们研究了卷积相对位置编码(CRPE)和卷积位置编码(CPE)组合在表6中的转换注意力模块中的有效性。我们的CoaT Lite没有任何位置编码,因此性能较差,这表明位置编码对于视觉转换器至关重要。我们观察到CRPE或CPE的CoaT-Lite变体有了很大的改进,CRPE和CPE的结合产生了最佳性能(77.5%的top-1精度),使两种位置编码方案互补而不是冲突。

co-scale的有效性。在表7中,我们给出了CoaT中两种共尺度变体的性能结果,即直接跨层注意力和带特征插值的注意力。我们还报告了没有co-scale作为基线的CoaT。与没有co-scale机制的CoaT相比,具有特征插值的CoaT显示了在分类和目标检测上的性能改进(Mask R-CNN w /FPN 1×)。与直接跨层注意力相比,特征插值注意力具有明显的优势,因为计算复杂度较低,准确性较高。

 计算成本。我们在表8中报告了FLOPs、FPS、latency, and GPU memory usage。总之,CoaT模型比类似尺寸的Swin-Transformer具有更高的精度,但CoaT模型通常具有更大的la \\\\ tency \/FLOPs。CoaT中当前的并行组对计算的要求更高,这可以通过在未来的工作中重新减少高分辨率并行块并在共尺度机制中重新使用其特征图来缓解。CoaT中的延迟开销可能是因为操作(例如。层、位置编码、上采样\下采样)不是并行运行的。

7. Conclusion

在本文中,我们提出了一种基于Transformer的图像分类算法,即共尺度的注意力转移图像变换器(CoaT),其中开发了跨尺度注意和有效的注意力转移操作。CoaT模型在ImageNet上获得了很强的分类结果,其适用于下游计算机视觉任务,用于目标检测和实例分割。

【论文阅读】CoaT:Co-Scale Conv-Attentional Image Transformers相关推荐

  1. [论文阅读] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

    论文地址:https://arxiv.org/abs/2010.11929 代码:https://github.com/google-research/vision_transformer 发表于:I ...

  2. 论文阅读:DETR:End-to-End Object Detection with Transformers

    题目:End-to-End Object Detection with Transformers 来源:Facebook AI ECCV2020 论文链接:https://arxiv.org/abs/ ...

  3. 【论文阅读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    文章目录 论文内容 摘要(Abstract) 1. 介绍(Introduction) 2. 相关工作(略) 3. BERT 3.1 预训练BERT(Pre-training BERT) 4. 个人总结 ...

  4. 【PaddlePaddle论文复现】LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS阅读心得

    [PaddlePaddle论文复现]LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS阅读心得 作者:Andrew B ...

  5. Over Coat AnImplicit Canvas for 3D Painting论文阅读

    看完了论文<Over Coat: AnImplicit Canvas for 3D Painting>给我的感觉就是即便是在siggraph这样的国际一流大会上,论文运用的数学公式其实也是 ...

  6. Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling论文阅读

    <Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling& ...

  7. 《论文阅读》MOJITALK: Generating Emotional Responses at Scale

    <论文阅读>MOJITALK: Generating Emotional Responses at Scale 简介 论文试图解决什么问题? 论文中提到的解决方案之关键是什么? 新的收获? ...

  8. 《Scale Invariant Feature Transform on the Sphere: Theory and Applications》论文阅读和源码理解(一)

    <Scale Invariant Feature Transform on the Sphere: Theory and Applications>论文阅读和源码理解(一) 摘要 主要贡献 ...

  9. 目标检测——Faster R-CNN论文阅读

    论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...

  10. 论文阅读 R-FCN: Object Detection via Region-based Fully Convolutional Networks

    本文转载自: http://www.cnblogs.com/lillylin/p/6277094.html R-FCN论文阅读(R-FCN: Object Detection via Region-b ...

最新文章

  1. 我是如何做软件测试项目的?
  2. make后gcc出现不全_Linux零基础:C语言和gcc
  3. 《编程题》找出数组中出现次数超过一半的数(时间复杂度O(n),空间复杂度为O(1))
  4. 代码控制树视图 c# 1614262980
  5. Json学习总结(6)——Fastjson远程代码执行漏洞
  6. 如何保证消息队列的高可用啊
  7. uva10340 Ail in All
  8. Linux驱动开发经典书籍
  9. 怎么快速将Excel文件转为DBF格式文件
  10. windows资源管理器管理工具Qttabbar个人使用总结
  11. GCC官方文档13 SSA
  12. visual studio code打不开
  13. 文件 或者 图片 与 base64 之间的转换
  14. windows下Python2.7 的 pyOpenGL模块安装
  15. FX:{6630f2d7-bd52-4072-bfa7-863f3d0c5da0}
  16. mfc中StretchBlt缩放图像失真问题【zozo】
  17. 修复 重装 远程桌面工具(mstsc.exe)完美解决方案
  18. c++中的前置和后置加加没你想的这么简单
  19. 上海富士康 软件测试 工程师 bcb 职责,富士康面试测试题.doc
  20. 【BugKu-CTF论坛writeup(杂项)】细心的大象

热门文章

  1. 【VSCode】切换文件与编辑器的快捷键
  2. 研究生毕业条件---小论文发表历程
  3. 合成大西瓜:开年第一爆是怎么火的?
  4. 读猿码系列——1. gRPC+Etcd3的服务发现负载均衡
  5. 最多有多少个点在一条线上
  6. house of apple1
  7. Python 与数据库交互的封装(MySQL,SQLServer,SQLite)
  8. 辰东暂排第二:第四届橙瓜网络文学奖20年十佳玄幻大神
  9. 众美集团石家庄新盘预售 梦想+青年住区持续劲销
  10. 库存转储STO 总结