Vision Transformers for Dense Prediction 论文阅读
作者:互联网
研一小菜鸡一枚,刚刚入门CV领域,最近对大火的Transformer 比较感兴趣,把刚刚阅读过的一篇论文和大家分享一下,第一次写文章,如有错误,还请指正。
先放一下论文链接:https://arxiv.org/pdf/2103.13413v1.pdf
Background
在阅读论文之前我们要先知道Dense prediction的定义
Dense Prediction:Pixelwise dense prediction is the task of predicting a label for each pixel in the image 也就是要标注出每个像素点的对象类别,例如在Depth Estimation 任务中,需要给出每个像素点对应的深度值。
在密集预测任务中,基于深度学习的做法主要有两种:
- 基于图像分块任务:利用像素,超像素块周围的小邻域进行独立的分类(使用的是全连接层,因此需要固定图像块的尺寸大小)
- 基于全卷积网络:对图像进行 pixel-to-pixel的预测,可以得到任意大小图形的分割结果,而且不需要对每个图像块进行分类,速度快。
在Transformer应用在Dense predicition中之前,全卷积网络在Dense predicition应用较多,但是卷积自身也有很多的缺点。
使用卷积作为主干时,需要逐步对图片进行下采样操作,以获得多个尺度上的特征,讲低级特征分组成抽象的高级特征,同时保证不会超出网络的内存。但是下采样操作有明显的缺点,在密集预测中尤其明显,经过下采样操作处理之后,特征的分辨率和粒度会丢失,而且这种丢失在解码阶段很难恢复。
粗粒度图像分类:类别之间差异大,比如人、汽车、树
细粒度图像分类:类别之间差异小,比如200种鸟的分类、100种花的分类
为了解决特征粒度损失提出了各种技术。
-
dialated convolutions 结构
空洞卷积可以使得感受野扩大的同时,但是特征空间维度不需要进行改变,但是空洞卷积得到的都是高分辨率的特征图,计算量比较大 -
skip connection
建立编码端到解码端的链接,下图为U-Net网络模型,将不经过下采样的feature map传递到解码端。
-
connecting multiresolution representations in parallel throughout the net-
work
在编码过程中保持多分辨率的特征图同时存在,传递给解码端。下图为HRNet,可以看出特征图在下采样的同时,也保留了高分辨率的特征,减少了粒度的损失。
介绍完背景之后,我们知道卷积处理特征图会有一些不可避免的缺点,这也是作者考虑使用其他的主干替代卷积的原因。
motivation
这一节介绍一下作者为什么想到使用Transformer替代卷积,以及使用Transformer替代卷积有什么优点。
虽然有了前面提到的三项技术,但是这些技术的主干还是没有发生改变,仍然受制于卷积:要想获得一个大的感受野,就需要通过堆叠层数来实现,这需要消耗大量的内存。
这篇论文的代码以VIT作为baseline 放一下原文吧VIT原文
这是VIT的整体架构,在使用Transformer 编码过程中,Transfomer维持token的数量不变,而token和图像块是一一对应的关系,所以输入Transformer中的图像块的数量也不会发生改变,即特征图的分辨率不会变化,而且Transformer在整个的编码过程中一直是保持一个全局的感受野,不需要通过堆叠Transformer的层数来增大感受野,这是卷积不能做到的。
Architecture
DPT(Dense prediction Transformer)在输入Transformer编码前,对图像的处理是和VIT相同的,先将图片进行切块,flatten成vector ,增加一个class token(在 Depth Estimation是用不到的,作者在后面会对class token进行处理,有一个选项是直接忽略,为什么不在这个时候不加这个token呢? 我还没做实验,后面会试一下,有没有大佬能解答一下,会不会有什么影响)加入位置编码,最后输入Transformer 编码器中。
Transformer Encoder
作者一共使用了三种模型 DPT-Base(12层的Transformer Encoder)、DPT-Large(24 层的Transformer)、DPT-Hybrid(12层的Transformer Encoder,在对图像进行切块前,使用ResNet50提取特征),不管使用那种模型,都会在四层中选取出特征图,作者关于这些层次的选取做了一些消融实验。
(使用的评判指标应该都是Absrel ,HRWSI,BlendedMVS,ReDWeb代表的应该是不同的数据集)
3,6,9,12等等数字代表的是使用第几层Transformer 处理后的特征图,R0,R1代表的是ResNet block
作者发现高层和底层的特征都提取效果比只提取高层表现要好。
Convolutional decoder
在Transformer 提取的特征是(N+1)xD,要先对这些特征进行一些处理
N = (H*W)/ p*p p:切块之后图像的大小
Read
首先,我们在切块的时候是切成了N块,但是收入过来的却是N+1块,这是因为我们在前面提价的class token,在这边我们要先处理掉。作者一共提供了三种方法来处理class token
-
Ignore
直接忽略掉添加的那个class token
-
add
将class token 和其他的相加
-
proj
将class token 和其他的concatenate,然后使用mlp处理。
作者在这也做了一下对比实验
直接忽略掉效果没有比proj差多少,为什么不能直接不加Class token呢
Concatenate
处理掉class token后,特征维度为NxD,需要进行拼接
Resample
获得特征图之后,需要对其进行处理,获取多尺度的特征图。
Fusion
获取多尺度的特征图之后要对其进行融合,论文中采用的是RefineNet的模块
ReFineNet 结构图
融合之后的特征图,针对不同的任务使用不同的head 进行处理。
解码部分写的有点烂,后面我在仔细看一下,在进行补充 ,如果有错误,还请各位大佬帮忙指正。
标签:Transformer,Transformers,卷积,Prediction,特征,token,图像,Dense,class 来源: https://blog.csdn.net/qq_42434944/article/details/121065404