摘要:尽管基于CNNs的backbone在多种视觉任务中取得重大进展,但本文提出了一个用于密集预测任务的、无CNN的的简单backbone——Pyramid Vision Transformer(PVT)。相比于ViT专门用于图像分类的设计,PVT将金字塔结构引入到transformer,使得可以进行下游各种密集预测任务,如检测、分割等。与现有技术相比,PVT有如下优点:(1)相比于ViT的低分辨率输出、高计算复杂度、高内存占用,PVT不仅可以对图像进行密集划分训练以达到搞输出分辨率的效果(这对密集预测很重要),还可以使用一个逐渐缩小的金字塔来降低大feature maps的计算量;(2)PVT兼具了CNNs和Transformer的优点,使其成为一个通用的无卷积backbone,可以直接替换基于CNN的backbone;(3)大量实验表明,PVT可以提高多种下游任务的性能,如目标检测、语义/实例分割等。
比如,参数量相当的情况下, RetinaNet+PVT可以在COCO上达到40.4AP,而RetinNet+ResNet50只有36.3AP。作者希望PVT能够成为像素级预测任务的一种可供选择的backbone,并促进后续的研究。
CNN通过stack CNN 层来学习一个层次化的feature representations, 并且随着层数的增加,感受野越来越大, channel数越来越大,feature map尺寸越来越小,然后后边连接一到多个特定的任务网络来执行具体的任务;
如图b, 经典的ViT是一个柱式结构,实际上就是stack transformer block, 为了把NLP中的Transformer用到Vision中,惯用做法是通过网格化把feature转化为sequence of patches,每个patches的尺寸一般为32 x 32,
如图c即为所提出的Pyramid Vision Transformer (PVT), 也是首先把figure 转化为Sequence of patches, 从结构来说也是学习一个层次化的representation,只不过基本的building block 已经由 Conv. 替换为 Attention module.
PVT和ViT都是纯Transformer的模型,没有任何卷积操作,而两者主要的不同在于PVT引入了特征金字塔结构。在ViT中,使用的是传统Transformer,其输入与输出尺寸相同。由于资源限制,ViT的输出只能是一个比较粗糙的feature map,如16*16、32*32,相应的其输出步幅也比较低,如16步长、32步长。结果就导致ViT很难直接用于那些对分辨率要求比较高的密集预测任务。PVT通过引入渐进缩减金字塔打破了Transformer的这种限制,可以像传统CNN backbone那样生成多尺度feature map。此外,还设计了一个简单有效的注意力层—SRA,来处理高分辨率feature maps并减低计算复杂度和内存消耗。总的来说,PVT相比ViT有如下优势:
(1)更加灵活:可以在不同的stage生成不同分辨率、通道的feature maps
(2)更加通用:可以轻松嵌入到大多下游任务的模型中
(3)对计算、内存更加友好:可以处理高分辨率的feature maps
PVT模型变体配置信
在YOLOv5项目中添加模型作为Backbone使用的教程:
(1)将YOLOv5项目的models/yolo.py修改parse_model函数以及BaseModel的_forward_once函数
(2)在models/backbone(新建)文件下新建pvt.py,添加如下的代码:
(3)在models/yolo.py导入模型并在parse_model函数中修改如下(先导入文件):
(4)在model下面新建配置文件:yolov5_pvt.yaml
(5)运行验证:在models/yolo.py文件指定--cfg参数为新建的yolov5_pvt.yaml