PVT,PVTv2

复现可能是坑的地方:https://hub.fastgit.org/whai362/PVT/issues/21

作者论文里说,mini-batch=128,用了8个GPU

这里 mini-batch 不等于 batchsize,也就是说,batch-size = 8x128

因此,设置你的学习率的时候,要相应的线性缩放



PVT

摘要:虽然卷积神经网络(CNNs)在计算机视觉中取得了巨大的成功,但本文研究了一种简单的骨干网络,它可以用于许多没有卷积的密集预测任务。与最近提出的专门用于图像分类的Transformer模型(如ViT)不同,我们提出了金字塔视觉Transformer(PVT),它克服了将Transformer移植到各种密集预测任务的困难。与现有技术相比,PVT具有若干优点:(1) 与通常具有低分辨率输出以及高计算和存储成本的ViT不同,PVT不仅可以在图像的密集分区上训练以获得高输出分辨率,这对于密集预测非常重要,而且可以使用渐进收缩金字塔来减少大特征图的计算;(2) PVT继承了CNN和Transformer的优点,通过简单地替换CNN主干,使其成为各种视觉任务中的统一主干,而无需卷积;(3) 我们通过大量的实验验证了PVT的有效性,实验结果表明PVT可以提高许多下游任务的性能,如目标检测、语义和实例分割等。例如,在相当数量的参数下,RetinaNet+PVT在COCO数据集上达到40.4ap,超过RetinaNet+ResNet50(36.3ap)4.1ap。我们希望PVT可以作为像素级预测的一个替代和有用的主干,并促进未来的研究。代码位于https://github.com/whai362/PVT

图1:不同架构的比较,其中“Conv”和“TF-E”分别表示卷积和变压器编码器(a) 研究表明,许多CNN骨干网采用金字塔结构进行密集的预测任务,如目标检测(DET)、语义和实例分割(SEG)(b)表明最近提出的视觉变换器(ViT)[10]是一种专为图像分类(CLS)设计的“柱状”结构(c) 通过引入CNNs的金字塔结构,我们提出了金字塔视觉变换器(PVT),它可以作为计算机视觉任务的多功能主干,拓宽了ViT的应用范围和影响。此外,我们的实验还表明,PVT可以很容易地与DETR结合,构建一个端到端的目标检测系统,而不需要卷积和手工制作的组件,如密集锚和非最大抑制(NMS)。

1.引言

卷积神经网络(CNN)在计算机视觉领域取得了显著的成功,在几乎所有的计算机视觉任务中都成为了一种通用且占主导地位的方法[9,28,11,63,41,15,56,36,14,27,7,21]。然而,这项工作是试图探索新的无卷积的多功能骨干网络。我们研究了一种超越CNN的替代模型,用于密集预测任务,如目标检测、语义和实例分割,而不是图像分类。

受Transformer[51]在自然语言处理(NLP)中的成功启发,许多研究人员正试图探索Transformer在计算机视觉中的应用。例如,一些著作[4、64、55、43、17]将视觉任务建模为具有可学习查询的字典查找问题,并将Transformer解码器用作CNN主干(如VGG[41]和ResNet[15])顶部的特定于任务的头部。虽然一些现有技术已经将注意模块[53、35、61]并入CNNs,但据我们所知,探索干净且无卷积的变压器主干以解决计算机视觉中的密集预测任务的研究很少。

最近,Dosovitskiy等人[10]使用Transformer进行图像分类。这是一个有趣而有意义的尝试,用一个无卷积的模型来代替CNN主干。如图1(b)所示,ViT具有柱状结构,其输入为粗糙的图像块(即,用较大的块大小分割图像)。(注:由于计算资源的限制,ViT无法使用更细的图像分块(例如4×4)作为输入,只能以粗块(例如32×32)作为输入,这导致其输出是低分辨率的,即1/32尺寸。)尽管ViT适用于图像分类,但直接适应像素级的密集预测(如目标检测和分割)是一个挑战,因为(1)其输出特征图只有一个低分辨率的单一尺度;(2)即使对于常见的输入图像大小(如:COCO检测基准中短边长为800像素的图像),其内存占用和计算量也比较高。

为了弥补上述局限性,本文提出了一种基于变换器模型的无卷积主干网络,称为金字塔视觉变换器(PVT),它可以作为多种下游任务的主干,包括图像级预测和像素级密集预测。具体来说,如图1(c)所示,与ViT不同,PVT通过(1)采用细粒度图像块(4 × 4 per patch)克服了传统变压器的困难,作为输入学习高分辨率表示,这对于密集的预测任务是必不可少的,(2)在网络深度增加时引入渐进收缩金字塔以减少变换器的序列长度,显著减少计算量,(3)采用空间收缩注意(SRA,spatial-reduction attention)层,进一步降低学习高分辨率特征地图的资源开销。

总体而言,PVT具有以下优点。首先,相对于传统的CNN主干(见图1(a))感受野随着深度的增加而增加,PVT总是产生一个全局感受野(通过所有小patch之间的注意),它比CNN的局部感受野更适合检测和分割。其次,与ViT(见图1(b))相比,由于金字塔结构的进步,我们的方法更容易插入许多具有代表性的密集预测管道,例如RetinaNet[27]和Mask R-CNN。第三,利用PVT,我们可以将PVT与其他针对不同任务设计的Transformer解码器相结合,构建一个无卷积的流水线,例如PVT+DETR[4]用于目标检测。例如,据我们所知,我们的实验给出了第一个端到端的目标检测管道PVT+DETR,它完全没有卷积。它在COCO val2017上达到34.7,优于基于ResNet50的原始DETR。

这项工作的主要贡献如下。

•    我们提出了金字塔视觉转换器(PVT),它是第一个为各种像素级密集预测任务设计的无卷积主干。结合PVT和DETR,我们可以建立一个端到端的目标检测系统,不需要卷积和手工制作的组件,如密集锚和非最大抑制(NMS)。

•    我们克服了将Transformer移植到密集像素级预测时的许多困难,通过设计渐进收缩金字塔和空间缩减注意(SRA),能够减少使用Transformer的资源消耗,使PVT灵活地学习多尺度和高分辨率特征图。

•    我们通过将PVT应用于许多不同的任务(如图像分类、目标检测和语义分割)来验证PVT,并将其与精心设计的Resnet[15]和ResNeXts[56]进行比较。如图2所示,与现有技术相比,具有不同参数数目的PVT能够持续地改进性能。例如,RetinaNet+PVTSmall在COCO val2017上达到40.4 AP,比RetinaNet+ResNet50高出4.1 AP(40.4 vs.36.3)。此外,RetinaNet+PVT-Large的AP值为42.6ap,比RetinaNet+ResNeXt101-64x4d的AP值高1.6倍,且参数个数减少了30%。

2.    相关工作

2.1. 计算机视觉中的卷积主干

卷积块是深度神经网络在视觉识别中的重要组成部分。[23]中首次引入了标准和基本卷积块来区分手写数字。该区块包含一定感受野的卷积核,捕捉有利的视觉环境。为了引入平移等价性,卷积核的权值在整个图像空间中共享。随着计算资源(例如,GPU)的快速发展,在大规模图像分类数据集(例如,ImageNet[38])上成功训练几个卷积块[22,41]的堆栈成为可能。GoogLeNet[46]证明了包含多个核路径的卷积算子可以获得非常有竞争力的性能。在Inception系列[47,45]、ResNeXt[56]、DPN[8]、MixNet[52]和SKNet[24]中进一步验证了多径卷积块的有效性。此外,ResNet[15]提出了卷积块中的跳跃连接,这使得非常深的网络成为可能,并在计算机视觉领域产生了令人印象深刻的影响。DenseNet[18]引入了密接拓扑,它将每个卷积块与其之前的块连接起来。在最近的survey/review论文[20,40]中可以找到更新的进展。

2.2. 密集预测任务

密集预测任务的目标是对特征图进行像素级分类或回归。目标检测和语义分割是两个典型的密集预测任务。

目标检测。    在深度学习时代,CNN[23]已成为目标检测的主导框架,它包括单级探测器(如SSD[30]、RetinaNet[27]、FCOS[49]、GFL[25]、PolarMask[54]和OneNet[42])和多阶段探测器(Faster R-CNN[36]、Mask R-CNN[14]、Cascade R-CNN[3]和Sparse R-CNN[44])。这些常用的目标检测器大多建立在高分辨率或多尺度特征图上,以获得良好的检测性能。最近,DETR[4]和可变形DETR[64]结合CNN骨干网和变压器解码器,构建了端到端对象检测器。与以前基于CNN的探测器一样,它们还需要高分辨率或多尺度特征图来精确检测目标。

语义分割。    CNN在语义分割中也起着重要作用。在早期,FCN[31]引入了全卷积结构,以生成给定大小图像的空间分割映射。之后,Noh等人[34]引入转置卷积运算,并在PASCAL VOC 2012数据集[39]上取得了令人印象深刻的性能。在FCN的启发下,针对医学图像分割领域,提出了U-Net[37],它将相应的低层和高层次特征图之间的信息流连接起来,并实现了相同空间大小的图像分割。为了探索更丰富的全局上下文表示,赵等人[62]在不同的池尺度上设计了金字塔池模块,Kirillov等人[21]基于FPN[26]开发了一个称为语义FPN的轻量级分割头。DeepLab家族[6,29]在保持特征地图分辨率的同时,利用扩张卷积来扩大接收域。与目标检测方法类似,语义分割方法也依赖于高分辨率或多尺度特征映射。

2.3. 计算机视觉中的自注意力和Transformer

由于卷积滤波器的权值在训练后通常是固定的,因此对其动态适应输入的变化是不灵活的。因此,人们提出了许多通过自注意操作来缓解这一问题的方法。非局部块[53]试图对空间和时间上的长距离依赖性进行建模,这对于准确的视频分类是有益的。非局部算子虽然取得了成功,但其内存和计算代价都很高。Criss-cross[19]通过仅通过criss-cross路径生成稀疏注意图,进一步降低了复杂性。Ramachandran等人[35]提出独立的自注意(Stand-Alone Self-Attention,SASA)是用局部自我注意单位来代替卷积层。AANet[2](Attention augmented convolutional networks)将自我注意和卷积运算结合起来,获得了竞争性的结果。DETR[4]利用Transformer解码器将目标检测建模为具有可学习查询的端到端字典查找问题,成功地消除了手工制作的过程,如非最大抑制(NMS)。基于DETR,可变形DETR[64]进一步引入了可变形注意层,将注意力集中在一组稀疏的上下文元素上,从而获得快速收敛和更好的性能。最近,Vision Transformer(ViT)[10]采用纯Transformer[51]模型,通过将图像处理为一系列patch来进行图像分类。DeiT[50]通过使用一种新的蒸馏方法进一步扩展了ViT。与以往的方法不同,本文尝试将金字塔结构引入到变压器中,设计了一个纯变压器主干,用于密集预测任务。

3.金字塔视觉变压器(PVT)

3.1. 总体架构

我们的目标是将金字塔结构引入到Transformer中,使它能够为密集的预测任务(如目标检测和语义分割)生成多尺度的特征映射。PVT的概述如图3所示。与CNN主干[15]类似,我们的方法有四个阶段来生成不同尺度的特征图。所有阶段共享一个类似的架构,它由一个patch embedding layer和个Transformer编码器层组成。

图3     PVT总体结构。整个模型包括4个阶段,每个阶段包含一个patch embedding layer和Li个Transformer编码器。四个阶段的输出分辨率从1/4尺寸逐步缩减至1/32层尺寸。

在第一阶段,给定一个大小为H×W×3的输入图像,我们先把它分为的patches(像ResNet一样,我们输出特征的最大分辨率为1/4尺寸),每个块(patch)的大小是4×4×3。然后,我们将展平的块(flattened patches)输入给线性投影,这样就得到嵌入的块(embedded patches),形状为。然后,embedded patches连同位置嵌入一起通过一个层的变压器编码器,输出被reshape为特征图,其形状为。同样地,使用来自前一阶段的特征映射作为输入,我们获得以下特征映射F2、F3和F4,其相对于输入图像的步长为8、16和32像素。利用特征金字塔{F1,F2,F3,F4},我们的方法可以很容易地应用于大多数下游任务,包括图像分类,目标检测和语义分割。

3.2. 变压器特征金字塔

与CNN骨干网[15]使用卷积步长获得多尺度特征图不同,我们的PVT使用渐进收缩策略progressive shrinking strategy通过patch embedding layers来控制特征图的大小。

这里,我们将第阶段的patch size表示为。在第阶段开始时,我们首先将输入的特征映射平均划分为个patches,然后将每个patch展平,并线性投影为维的嵌入。线性投影之后, embedded patches的形状可以看作为,其高度和宽度小于输入的倍。

通过这种方法,我们可以灵活地调整每个阶段特征图的比例,从而可以为变压器构造一个特征金字塔。

3.3. 变压器编码器

对于阶段中的变压器编码器,其具有个编码器层,并且每个编码器层由注意层和前馈层组成[51]。由于我们的方法需要处理高分辨率(例如,1/4尺寸)特征图,我们提出了一种空间缩减注意(SRA)层来取代编码器中传统的多头部注意(MHA)层[51]。

图4:多头注意力(MHA)与空间收缩注意力(SRA)。使用空间收缩操作,计算量和内存占用可以大大减小,所以我们的SRA对高分辨率特征映射更加友好。

与MHA类似,SRA还接收一个查询Q、一个键K和一个值V作为输入,并输出一个refined的特征。不同的是,我们的SRA在注意操作之前减小K和V的空间尺度,如图4所示,这大大减少了计算/内存开销。第阶段SRA的详细内容可表述如下:

    

    

其中,,,是线性投影的参数,是第阶段Transformer编码器的头数。因此,每个头的维度等于。是空间收缩操作,其定义为:

    

这里,表示第阶段注意力层的缩减比。是reshape操作,将输入变形为尺寸是。是线性投影,将输入序列的维度缩减至。是layer normalization[1]。和Transformer[5]一样,是注意力操作,计算为:

通过这些公式,我们可以看出我们的操作的计算量/内存占用比MHA小的倍,因此它可以用有限的资源处理较大的输入特征映射/序列。

3.4. 模型详细信息

综上所述,我们方法的超参数如下:

•    :第阶段的patch size;

•    :第级输出的通道数;

•    :第阶段的编码器层数;

•    :第阶段SRA的缩减比;

•    :第阶段SRA的头数;

•    :第阶段前馈层[51]的膨胀率;

遵循ResNet[15]的设计规则,我们(1)在浅级使用小的输出通道数;(2)将主要计算资源集中在中间阶段。

为了提供讨论的实例,我们在表1中描述了一系列不同规模的PVT模型,即PVT-Tiny、-Small、-Medium和-Large。在具体的下游任务中使用这些模型的更多细节将在第4节中介绍。

表1:PVT系列的详细设置。设计遵循ResNet的两条规则[15]:(1) 随着网络深度的增加,通道数逐渐增大,输出分辨率逐渐减小;(2) 主要的计算资源集中在第3阶段。

3.5. 讨论

与我们的方法最相关的工作是ViT[10]。在这里我们详细讨论了它们之间的关系和区别。

PVT和ViT都是无卷积运算的纯变压器模型。它们之间的主要区别是金字塔结构。与传统的变压器[51]类似,ViT的输出序列长度与输入序列长度相同,这意味着ViT的输出是单尺度的(见图1(b))。此外,由于资源有限,ViT的输出是粗粒度的(例如,the patch size is 16 or 32 pixels),因此其输出分辨率相对较低(例如,1/16尺寸或1/32尺寸)。因此,在需要高分辨率或多尺度特征图的密集预测任务中,很难直接应用ViT。

我们的PVT通过引入一个渐进收缩金字塔打破了变压器的常规。它可以像传统的CNN主干一样生成多尺度特征图。此外,我们还设计了一个简单而有效的注意层SRA,用于处理高分辨率的特征映射,减少计算/内存开销。得益于上述设计,我们的方法比ViT具有以下优点:1)更灵活,在不同阶段可以生成不同尺度、不同通道的特征图;2) 在大多数下游任务模型中,可以很容易地并入和起作用;3) 更友好的计算/内存可以处理更高分辨率的特征图。

4.应用于下游任务

4.1. 图像级预测

图像分类是图像级预测中最具代表性的任务。继ViT[10]和DeiT[50]之后,我们在最后一个阶段的输入中添加一个可学习的分类令牌(a learnable classification token),然后使用一个全连接的层在分类令牌的顶部进行分类。

4.2. 像素级密集预测

除了图像级预测之外,在下游任务中还经常看到需要在特征图上执行像素级分类或回归的密集预测。在这里,我们讨论两个典型的任务,即目标检测和语义分割。

目标检测。    我们将我们的PVT模型应用于两种具有代表性的目标检测方法,即RetinaNet[27]和Mask R-CNN[14]。RetinaNet是一种应用广泛的单级检测器,Mask R-CNN是主流的两级实例分割框架之一。具体实现细节如下:(1)与ResNet一样,我们直接使用输出特征金字塔{F1,F2,F3,F4}作为FPN的输入[26],然后将细化后的特征映射反馈给后续检测或实例分割头(2) 在目标检测中,输入可以是任意形状,因此在ImageNet上预训练的位置嵌入可能不再有意义。因此,我们根据输入图像对预先训练好的位置嵌入进行双线性插值(3) 在检测模型的训练过程中,PVT中的所有层都不会被冻结。

语义分割。    我们选择语义FPN[21]作为基线,这是一种简单的分割方法,无需特殊操作(例如,扩展卷积)。因此,用它作为基线可以很好地检验主干的原始有效性。与目标检测中的实现类似,我们将特征金字塔直接输入到语义FPN中,并使用双线性插值来调整预训练位置嵌入的大小。

5.实验

我们将PVT与两个最具代表性的CNN主干进行比较,即ResNet[15]和ResNeXt[56],这两个主干被广泛用于许多下游任务的基准测试。

5.1. 图像分类

实验设置。    我们在ImageNet数据集上进行了图像分类实验。ImageNet 2012数据集[38]包含128万个训练图像和50K个验证图像,1000个类别。我们在训练集中训练模型,并在验证集中报告top-1 error。为了公平比较,我们按照DeiT[50]执行random-size cropping至224×224,随机水平翻转[46],和mixup数据增强[59]。在训练期间使用标签平滑正则化[47]。我们默认使用AdamW[33],动量为0.9,最小批量为128,权重衰减为。初始学习速率设置为,余弦衰减[32]。所有模型都在8个V100 gpu上从头开始训练300个epoch。为了进行基准测试,我们在验证集上应用中心裁剪,裁剪至224×224像素。

结果。    在表2中,我们发现在相同的参数数目和计算预算下,我们的PVT模型优于传统的CNN主干。例如,当GFLOPs大致相似时,PVT Small的top-1误差达到20.2,比ResNet50[15](21.5)高1.3。同时,在类似或相对较低的复杂度下,我们的PVT系列存档性能与最近提出的基于变压器的模型(如ViT[10]和DeiT[50])相当(即18.2对18.3)。这个结果在预期之内,因为金字塔结构可能有利于密集的预测任务,但是它给图像分类带来的收益是有限的。

注意,ViT和DeiT可能有局限性,因为它们是专门为分类任务设计的,这不适用于通常需要有效特征金字塔的密集预测任务。

5.2. 目标检测

实验设置。    我们在具有挑战性的COCO基准上进行目标检测实验[28]。所有模型都在COCO train2017上接受培训(∼118k图像),并在val2017(5k图像)上进行评估。我们在两个标准的检测器上评估我们的PVT主干:RetinaNet[27]和Mask R-CNN[14]。在训练过程中,我们首先使用ImageNet上预先训练好的权值来初始化主干,然后使用Xavier[13]来初始化新添加的层。我们的模型在8个V100 gpu上以16的批量大小进行训练,并通过AdamW[33]进行优化,初始学习率为1×10−4.按照常见的设置[27,14,5],所有检测模型,我们采用1× 或3× 的训练计划(即12或36个epoch)。训练图像被调整到短边为800像素,而长边不超过1333像素。使用3×  训练计划中,我们还随机调整输入图像的短边长在[640,800]范围内。在测试阶段,输入图像的短边固定为800像素。

结果。    如表3所示,使用RetinaNet进行目标检测时,我们发现当参数数目相当时,PVT变体显著优于其对应变体,这表明我们的PVT可以作为CNN主干的一个很好的目标检测替代品。例如,使用1× 训练计划中,RetinaNet+PVT-Tiny比RetinaNet+ResNet18[15]高4.9ap(36.7比31.8)。此外,3× 训练计划和多尺度训练,RetinaNet+PVT-Large-达到 43.4ap,超过RetinaNet+ResNeXt101-64x4d[56]41.8ap,而我们的参数数减少了30%(71.1M比95.5M)。

在使用Mask R-CNN的实例分割实验中也发现了类似的结果,如表4所示× 训练计划中,Mask R-CNN+PVT-Tiny达到35.1 Mask AP(APm),比Mask R-CNN+ResNet18高3.9 APm,甚至比Mask R-CNN+ResNet50高0.7 APm。用Mask-RCNN+PVT-Large得到的最佳APm为40.7,比基于ResNeXt101-64x4d的模型高1.0apm。

5.3. 语义分割

实验设置。    我们选择了ADE20K[63],这是一个具有挑战性的场景分析基准,用于语义分割。ADE20K包含150个细粒度语义类别,其中分别有20210、2000和3352个图像用于训练、验证和测试。我们将PVT主干应用于Semantic FPN[21](Panoptic feature pyramid networks),这是一种没有扩展卷积的简单分割方法[57],以此来评估我们的PVT主干。在训练阶段,主干用ImageNet上预先训练的权重初始化[9],其他新添加的层用Xavier初始化[13]。我们使用AdamW[33]优化模型,初始学习率为1e-4。按照常见设置[21,6],我们在4个V100 gpu上训练80k迭代的模型,批量大小为16。学习率按polynomial衰减规律衰减,幂为0.9。我们随机调整训练图像的大小并将其裁剪为512× 512并在测试期间将图像缩放到短边长为512。

结果。    如表5所示,在不同的参数尺度下,我们的PVT始终优于ResNet[15]和ResNeXt[56],使用语义FPN进行语义分割。例如,在参数数目几乎相同的情况下,我们的PVT Tiny/Small/Medium至少比ResNet-18/50/101高出280万。此外,尽管我们的Semantic FPN+PVT Large的参数数目比Semantic FPN+ResNeXt101-64x4d的参数数目低了20%,但mIoU仍然高出1.9(42.1比40.2),这表明对于语义分段来说,我们的PVT可以提取比CNN更好的特征,这得益于全局注意机制。

5.4. 纯变压器密集预测

我们在DETR[4]上用PVT代替ResNet50进行检测,Trans2Seg[55]进行分割,构建了纯变压器密集预测管道。实验结果表明,完全无卷积变换在目标检测和语义分割方面都有很好的效果。

PVT+DETR    我们将我们的PVT与DETR[4]相结合,建立了一个用于目标检测的纯变压器模型,DETR具有基于变压器的检测头。我们在COCO train2017上培训了50个epoch的模型,初始学习率为1× 10−4.在第33个时期,学习率除以10。我们使用随机翻转和随机缩放作为数据扩充。所有其他实验设置与Sec5.2相同。 如表6所示,COCO val2017的PVT+DETR为34.7 AP,比ResNet50+DETR高出2.4 AP(34.7 vs.32.3)。

PVT+Trans2Seg    我们将我们的PVT与Trans2Seg[55]相结合,建立了一个用于语义分割的纯Transformer模型,Trans2Seg是一个基于Transformer解码器的分割头。根据第5.3节的实验设置。我们在ADE20K[63]数据集上进行了40k迭代训练、单尺度测试的实验,并与ResNet50+Trans2Seg、DeeplabV3+dilation 8(d8)和16(d16)进行了比较,如表7所示。

我们发现PVT Small+Trans2Seg达到42.6mIoU,优于ResNet50-d8+DeeplabV3+(41.5)。注意,ResNet50-d8+DeeplabV3+具有120.5gflops,这是由于扩展卷积的高计算成本,而我们的PVT Small+Trans2Seg只有31.6gflops。PVTSmall+Trans2Seg的性能也优于ResNet50-d16+Trans2Seg(31.6G的Flops比79.3 GFLOPs,42.6mIoU 比39.7 mIoU,只有40%的GFLOPs,mIoU高2.9)。

5.5. 烧蚀研究

实验设置。    我们对ImageNet[9]和COCO[28]数据集进行消融研究。ImageNet上的实验设置与Sec5.1.中的设置相同。在COCO数据集上,所有模型都使用1×  训练时间表(即12个时期)和其他实验设置遵循第5.2. 节中的设置。

金字塔结构。    金字塔结构是应用于密集预测任务的关键。以前的ViT是一个列式框架,其输出是单尺度的。它提出了一个问题,当使用粗糙的图像补丁(例如,32×32 per patch)作为输入,输出特征图的分辨率较低,导致检测性能较差(COCO val2017上为31.7 AP),如表8所示。当使用细粒度图像块(例如,4×4 per patch)作为输入,ViT将耗尽GPU内存(例如32G)。不同的是,我们的方法通过一个渐进收缩金字塔来避免这个问题。该方法可以处理浅部高分辨率特征图和深部低分辨率特征图。因此,我们的方法在COCO val2017上获得了40.4的有希望的AP,比ViT Small/32高8.7 AP(40.4比31.7)。

更深与更宽。    CNN主干是应该更深入还是更广泛的问题已经在以前的工作中进行了广泛的讨论[15,58]。在这里,我们在我们的PVT中探索这个问题。为了公平比较,我们将PVT Small的隐藏维度{C1,C2,C3,C4}乘以比例因子1.4,使其具有与深度模型(即PVT Medium)等价的参数数。如表9所示,在ImageNet和COCO上,deep模型(即PVT-Medium)始终优于wide模型(即PVT-Small-wide)。因此,在PVT的设计中,更深的设计比更宽的设计更有效。基于这一观察结果,在表1中,我们通过增加模型深度开发了不同尺度的PVT模型。

预训练的权重。    大多数密集的预测模型(例如RetinaNet[27])依赖于主干,其权重是在ImageNet上预先训练的。我们在PVT中也讨论了这个问题。在图5的顶部,我们绘制了RetinaNet-PVT-Small使用(红色曲线)和不使用(蓝色曲线)预训练权重的验证AP曲线。我们发现,使用预训练具有更好的收敛性,在1×训练长度下,两者区别达到13.8;在3×训练长度和多尺度训练下,两者区别达到8.4。因此,与基于CNN的模型一样,预训练权重也可以帮助基于PVT的模型更快更好地收敛。此外,在图5的底部,我们还看到基于PVT的模型(红色曲线)的收敛速度比基于ResNet的模型(绿色曲线)更快。

计算成本。    随着输入尺寸的增加,我们方法的GFLOPs增长率大于ResNet[15],但小于ViT[10],如图6所示,这意味着我们的PVT更适合中等分辨率输入的任务(例如,较短的尺寸不超过800像素)。在COCO上,输入图像的短边是800像素。在这种情况下,基于PVT Small的RetinaNet的推理速度比基于ResNet50的推理速度慢,如表10所示。

解决这一问题的直接方法是缩小输入规模。当将输入图像的短边缩小到640像素时,基于PVT Small的模型比基于ResNet50的模型运行得更快,但是我们的AP高出2.4(38.7比36.3)。另一个可能的解决方案是开发一种新的具有较低计算复杂度的视觉任务的自注意层。这是一个值得探索的方向,今后我们将继续努力。

6.结论和今后的工作

在本文中,我们介绍了PVT,一个纯变压器骨干密集的预测任务,如目标检测和语义分割。为了在有限的计算/存储资源下获得多尺度特征图,我们设计了一个渐进收缩金字塔和一个空间缩减注意层。在目标检测和语义分割基准上的大量实验验证了我们的PVT比设计良好的CNN主干在同等数量的参数下更强大。

尽管PVT可以作为CNN主干网的替代方案(如ResNet、ResNeXt),但仍有一些特定的模块和操作是为CNN设计的,但在本研究中没有考虑,如SE[16]、SK[24]、扩展卷积[57]和NAS[48]。此外,经过多年的快速发展,有许多精心设计的CNN主干网,如Res2Net[12]、EfficientNet[48]和ResNeSt[60]。相反,基于变压器的计算机视觉模型还处于发展的初级阶段。因此,我们相信未来还有许多潜在的技术有待探索。我们希望我们的方法可以作为一个良好的起点。



PVT2

摘要:计算机视觉领域的变压器最近取得了令人鼓舞的进展。本文对原有的金字塔视觉变换器(PVTv1)进行了改进,增加了三种改进设计,包括:(1)重叠块嵌入;(2)卷积前馈网络;(3)线性复杂度注意层

通过这些简单的修改,我们的PVTv2在分类、检测和分割方面显著地改进了PVTv1。此外,PVTv2实现了比最近的工作,包括Swin变压器更好的性能。我们希望这项工作将使最先进的视觉变压器的研究更容易。代码位于https://github.com/whai362/PVT

1.引言

最近对视觉变换器的研究主要集中在主干网络[7,29,31,32,21,34,9,4]上,这些主干网络是为图像分类,目标检测,实例和语义分割等下游视觉任务而设计的。迄今为止,已经取得了一些有希望的成果。例如,Vision Transformer(ViT)[7]首先证明了一个纯变压器可以在图像分类中保存最先进的性能。金字塔视觉变换器(PVT)[31]表明,在一些检测和分割任务中,纯变换器主干也可以超过CNN。之后,Swin-Transformer[21]、CoaT[34]、LeViT[9]和Twins[4]进一步改进了Transformer主干的分类、检测和分割性能。

这项工作的目的是在PVTv1框架的基础上建立更强大、更可行的基线。我们报告了三个改进的设计,即(1)重叠补丁嵌入,(2)卷积前馈网络和(3)线性复杂度注意层,与PVTv1框架正交,当与PVT结合使用时,它们可以带来更好的图像分类、目标检测、实例和语义分割性能。具体来说,PVTv2-B5(注释:PVTv2有6个不同大小型号,从B0到B5)在ImageNet上产生83.8%的top-1错误,这明显优于Swin-B[21]和Twins-SVT-L[4],而PVTv2-B5的参数和gflop较少。此外,GFL[17](Generalized focal loss)与PVT-B2在COCO val2017上的记录值为50.2 AP,比与SWN-T[21]的记录值高2.6 AP,比与ResNet50[12]的记录值高5.7 AP。希望这些改进后的基线能为未来视觉转换器的研究提供参考。

2.相关工作

变压器主干。    ViT[7]将每个图像视为一系列具有固定长度的 tokens (patches),然后将它们馈送到多个Transformer层进行分类。这是第一个证明在训练数据足够的情况下(例如ImageNet22k[6],JFT-300M),纯变压器也可以在图像分类中保存最新性能的工作。DeiT[29]进一步探索了一种数据高效的ViT训练策略和蒸馏方法。

为了提高图像分类的性能,最近的一些方法对ViT进行了定制的修改。T2T ViT[35]将重叠滑动窗口内的令牌逐步连接成一个令牌。TNT[10]利用内部和外部变换块分别生成像素嵌入和块嵌入(pixel embeddings and patch embeddings)。CPVT[5]用条件位置编码(conditional position encodings)代替了ViT中嵌入的固定大小的位置编码,使得处理任意分辨率的图像更容易。CrossViT[2]通过双分支变压器处理不同大小的图像块。LocalViT[18]将深度卷积合并到视觉变换器中,以改善特征的局部连续性。

为了适应密集的预测任务,如目标检测、实例和语义分割,也有一些方法[31、21、32、34、9、4]将CNNs中的金字塔结构引入到变压器主干的设计中。PVTv1是第一个金字塔结构变换器,它提出了一个具有四个阶段的层次变换器,表明一个纯变换器主干可以像CNN主干一样通用,在检测和分割任务中表现更好。在那之后,[21,32,34,9,4]进行了改进,增强了特征的局部连续性,消除了固定大小的位置嵌入。例如,Swin Transformer[21]用相对位置偏置代替了固定大小的位置嵌入,并限制了移动窗口内的自注意。CvT[32]、CoaT[34]和LeViT[9]将类似卷积的运算引入到视觉变压器中。Twins[4]将局部注意和全局注意机制结合起来,以获得更强的特征表示。

3.改进的金字塔视觉变换器

PVTv1的限制。    (1) 与ViT[7]类似,PVTv1[31]将图像视为一系列不重叠的patch,这在一定程度上丧失了图像的局部连续性(2) PVTv1中的位置编码是固定大小的,这对于处理任意大小的图像是不灵活的(3)当处理高分辨率输入(例如,短边为800像素)时,PVTv1的计算复杂度相对较大。这些问题限制了PVTv1在视觉任务上的性能。

为了解决这些问题,我们提出了PVTv2,它通过以下设计改进了PVTv1:

重叠补丁嵌入(Overlapping Patch Embedding)。    我们利用重叠补丁嵌入来标记图像。如图1(a)所示,我们放大了patch window,使相邻窗口重叠一半的面积,并用零填充特征图以保持分辨率。在这项工作中,我们使用带零填充的卷积来实现Overlapping Patch Embedding。具体来说,给定一个输入形状为,我们将其输入给一个卷积,卷积步幅为,核大小为,填充大小为,核数为。输出形状为。

有卷积的前馈。    受[16,5,18]的启发,我们去掉了固定大小的位置编码[7],并在PVT中引入了零填充位置编码。如图1(b)所示,我们在前馈网络中第一个全连接(FC)层和GELU[14]之间添加一个3×3深度卷积,其padding size为1。

线性空间收缩注意力。    为了进一步降低PVT的计算成本,我们提出了线性空间缩减注意(SRA),如图2所示。与SRA不同的是,线性SRA像卷积层一样具有线性计算和存储成本。具体来说,给定一个大小为h×w×c的输入,SRA和线性SRA的复杂性为:

    

    

其中是SRA的空间压缩比[31]。是线性SRA的池大小(pooling size),默认设置为7。

图2 PVTv1中的SRA和PVTv2中的LinearSRA

结合这三种改进,PVTv2可以(1)获得更多的图像和特征图的局部连续性(2) 灵活处理变量分辨率输入(3) 享受和CNN一样的线性复杂度。

4  PVTv2系列细节

我们通过改变超参数将PVTv2从B0扩展到B5。具体如下:

•    :第阶段重叠斑块嵌入的步幅the stride of the overlapping patch embedding;

•    :第级输出的通道数;

•    :第阶段的编码器层数;

•    :第阶段SRA的收缩比;

•    :第阶段线性SRA的自适应平均池大小adaptive average pooling size;

•    :第阶段高效自注意的头数;

•    :第阶段前馈层的膨胀率[30];

表1显示了PVTv2系列的详细信息。我们的设计遵循ResNet的原则[13](1) 随着层深的增加,通道维数增加,空间分辨率减小(2)阶段3分配给大部分计算成本。

5.实验

5.1. 图像分类

设置。    图像分类实验在ImageNet-1K数据集[25]上进行,该数据集包含128万个训练图像和50K个验证图像,1000个类别。所有模型都在训练集上训练以进行公平比较,并在验证集中报告top-1 error。我们遵循DeiT[29],并应用随机裁剪、随机水平翻转[27]、标签平滑正则化[28]、混合[36]和随机擦除[38]作为数据增强。在训练期间,我们使用AdamW[23],动量为0.9,mini批量为128,权重衰减为5× 10−2。初始学习速率设置为1× 10−3,余弦衰减[22]。所有模型都在8个V100 gpu上从头开始训练300个时代。我们对基准测试的验证集应用中心裁剪至224×224。

结果。    在表2中,我们看到PVTv2是ImageNet-1K分类的最新方法。与PVT相比,PVTv2具有相似的FLOPs和参数,但图像分类精度有很大提高。例如,PVTv2-B1比PVTv1-Tiny高3.6%,PVTv2-B4比PVT-Large高1.9%。与最近的同类产品相比,PVTv2系列在精度和型号尺寸方面也有很大的优势。例如,PVTv2-B5达到83.8%的ImageNet top-1精度,比Swin Transformer[21]和Twins[4]高0.5%,而我们的参数和Flops更少。

5.2. 目标检测

设置。    目标检测实验是在具有挑战性的COCO基准上进行的[20]。所有模型都在COCO train2017(118k图片)上接受培训,并在val2017(5k图片)上接受评估。我们验证了PVTv2主干在主流探测器上的有效性,包括RetinaNet[19]、Mask R-CNN[11]、Cascade Mask R-CNN[1]、ATSS[37]、GFL[17]和 Sparse R-CNN[26]。在训练之前,我们使用ImageNet上预训练的权值来初始化主干,并使用Xavier[8]来初始化新添加的层。我们在8个v100gpu上训练批量为16的所有模型,并采用AdamW[23],初始学习率为1× 10−4作为优化器。按照惯例[19,11,3],我们采用1× 或3× 所有检测模型的训练计划(即12或36个周期)。调整训练图像的大小,使其短边为800像素,而长边不超过1333像素。当使用3× 在训练计划中,我们在[640,800]的范围内随机调整输入图像的短边大小。在测试阶段,输入图像的短边固定为800像素。

结果。    如表3所示,在模型尺寸相似的单级和两级目标探测器上,PVTv2显著优于PVTv1。例如,PVTv2-B4在RetinaNet[19]的基础上达到了46.1 AP,在R-CNN的基础上达到47.5 APb[11],分别比PVTv1模型增加了3.5 AP和3 AP^b。

为了公平比较PVTv2和Swin Trans-former[21],我们保持所有设置不变,包括ImageNet-1K预训练和COCO微调策略。我们在四种最先进的探测器上评估了Swin变压器和PVTv2,包括Cascade R-CNN[1]、ATSS[37]、GFL[17]和Sparse R-CNN[26]。在所有的检测器中,PVTv2比Swin-Transformer获得了更好的AP,显示了其更好的特征表示能力。例如,在ATSS上,PVTv2与Swin-T具有相似的参数和FLOPs,但是PVTv2达到49.9ap,比Swin-T高2.7。我们的PVTv2-Li可以大大减少计算量,从258GFlops缩减至到194GFlops,同时只牺牲一点性能。

编者注:

训练检测模型踩坑记:

1. mmcv的安装版本:

https://blog.csdn.net/jizhidexiaoming/article/details/108837584

https://hub.fastgit.org/open-mmlab/mmcv    (一定要点进去看看,不要瞎填空,否则有的组合没有,导致安装报错一片红)

2. 自己设计的模型没有注册:

https://hub.fastgit.org/whai362/PVT/issues/36

3. 自己设计的模型的num_classes=1000,与coco数据集的不匹配:

把自己设计的主干的.py文件复制粘贴过去的时候,要把self.num_classes那行注释掉,把self.head注释掉, 把def forward_features()和def forward()中相应的该注释掉的注释掉(即不计算分类头的部分)

4. [Errno 2] No such file or directory: '/....../train2017/000000575652.jpg'

别人的:https://zhuanlan.zhihu.com/p/70878433

冷静,不一定是数据集下载错的原因

coco官网:https://cocodataset.org/#home

https://zhuanlan.zhihu.com/p/29393415

coco训练集的说明:https://blog.csdn.net/qq_37643960/article/details/103466904

这里也有下载链接:https://blog.csdn.net/qq_41185868/article/details/82939959

经过验证,上面那个链接下载的数据集是没问题的

5.[W reducer.cpp:346] Warning: Grad strides do not match bucket view strides. This may indicate grad was not created according to the gradient layout contract, or that the param's strides changed since DDP was constructed. This is not an error, but may impair performance.

grad.sizes() = [1024, 1, 3, 3], strides() = [9, 1, 3, 1]

bucket_view.sizes() = [1024, 1, 3, 3], strides() = [9, 9, 3, 1] (function operator())

没找到哪一句导致这个问题。把模型里所有.view换成.reshape,在所有transpose后面接.contiguous(),问题解决。

6. 从第一次迭代开始,出现 loss_cls: nan, loss_bbox: nan, loss: nan

是在ImageNet上预训练权重未成功加载导致nan。不知道mmdet是怎么加载的。手动再加载一下,问题解决。

co

    PVTv2的语义分割结果(在arxiv论文里没有更新,但是前几天有开源):https://github.com/whai362/PVTv2-Seg

你可能感兴趣的:(PVT,PVTv2)