[TOC]
这东西老实说是一个大坑,坑在哪呢,学的东西要写很久。姑且先鸽一会。
VIT
第一次将transformer引入cv中,因为transformer在NLP中的表现很好。
Transformer的优势
1.并行计算
2.全局视野
3.灵活的堆叠能力
VIT结构
只使用了transformer的encoder
但是transformer有全局视野
self attention
对相似度的计算
Query:查询,询问
Key:键值,关键词
Value:价值,数值
q1,k1向量点积计算相似度,从点积求投影就可以看成,越相似,投影越长。
norm只是为了让值小一点,multiply我理解为重要程度,而sum就是上下文。
矩阵计算本身就是并行
MultiHead Attention 有多个Wq,Wk,Wv,上述操作重复多次结果concat一起
可以给注意力提供多种可能性,比如稀疏,密集之类
transformer encoder
输入端适配
因为transformer本身并非用于cv的,而是NLP,所以需要做出一些调整,将图片进行切分然后按编号输入网络。用来模拟句子,当然输入线性层直接打平。
Patch 0的作用
需要一个整合信息的向量 如果只有原始输出的9个向量 用哪个向量来分类都不好全用计算量又很大 所以加一个可学习的vector也就是patch 0来整合信息。
同时图像切片损失了位置信息,而且transformer本身也不关注这个。所以需要补位置信息。ViT使用了一个可学习的vector来编码 vector和patch vector直接相加组成输入。(相加是concat的特例)
PVT
挺拉的,就别浪费时间管他了,主要就想控制显存,transformer真不是一般人能用的,控制k,v的数量,但是它怎么控制的我真不想评价,只能说给我干沉默了。
Swin transformer
很好的baseline!
它和之前的PVT其实关注的都是一个问题,transformer占显存,通过控制token大小与数量来实现。
VIT的缺点
显存占用- Token数量
表示方法-Token应该多大?
难以用在下游任务
- Token指的是模型运行中最小的处理单元。
- NLP中的Token一般指的是一个单词,Token的数量就是一段文字中单词的数量,一般不会特别多。
- ViT中的Token指的是一个Patch,Token的数量就是Patch的数量,这一点和图像分辨率以及Patch大小有关
dilemma
Patch小-> Token数量多->MHA复杂度高->资源不足
Patch大->Token数量少->Feature Map分辨率低
structure
W-MSA
Swin Transformer使用window multiscale self attention,将attention的计算限制在同一个窗口内,使得复杂度降到了o(n)
缺点
显然这样硬性的限制会丢失全局信息,限制模型能力,因此需要一个跨Window的操作,增强window间的交互,所以还要一个SW-MSA
SW-MSA
缺点
移动切分后,window的数量变多了,而且window的尺寸不一样了。
所以他们设计了一种更高效的办法cyclic shift
相对位置编码
这里的相对位置编码是对每个window内的patch写死的,是不可学习的,是人为设计好的
inductive bias
比较有趣的一个东西,它就是我们所说的归纳偏置 归纳->总结,也就是从现存的例子中找到一些比较通用的规则偏置->选择偏好。 整理在一起可以理解为:在面对一些特定问题的时候,我们认为模型应该会有哪些特点会比较容易work,因此而做出的一系列对模型的人为限制。 比如图像处理中,每个位置的信息与周围的信息相关,因此设计出conv
conv中的两个归纳偏置
- 局部相关性:邻近的像素是相关的。会导致feature map十分平滑,在一定程度上影响目标检测的效果。
- 权重共享:图像的不同部分应该以相同的方式处理,无论它们的绝对位置如何。
比如NLP中,认为输出的结果与单词的先后顺序相关,因此设计出RNN。
为什么卷积核是奇数的
因为奇数的卷积核拥有中心,可以很好确定位置
为什么深层feature map让人san值狂掉
因为浅层特征还关注的是颜色边缘,深层以后其实已经是多个特征组成的语义了。能理解就怪了()
DETR
structure
nms缺点
- 如果两个框离的很近,那么两个框很有可能属于同一instance(两个instance本来就很近)
- 在属于同一instance的框中,分类得分越高的,定位质量越高(并不一定)
Dense prediction
- 利用Anchor进行预定位
- 判断Anchor是前景还是背景给出proposal
- 之后预测给出的proposal的类别
- 最后NMS输出结果
Set prediction
将预测集与GT集进行匹配。
match loss
匈牙利算法之前deepsort说过,这里就不说了,就是找最大匹配。
位置编码(position embedding)
这里的位置编码是写死的,不可学习的 具体写法是根据左边公式,其中pos代表token在序列中的位置,而d代表一个token用多少维来表示。由于图像是2d的,因此DETR将这种方法推广到了2d,见右边公式。
这里的位置编码会应用到每一个encoder上,而不只是开头的第一个而且只会加到QK上,不影响V 原因: Patch间的信息交互才需要位置信息,也就是需要加到Q@KT这一步上。而下一次生成QK,是根据V生成的,所以每一个encoder都要重新加一遍这个信息。
encoder&decoder
左侧为编码器,右侧为解码器 多出来的MSA,K和V来自于encoder而Q是来自于Obj queries 这种来QK来自于不同地方的attention也叫cross attention
Object quiries
这个东西的作用和cls token类似,也是在整合信息。 Object queries是一个可学习的向量(num, b, dim)
- Num是人为给的值,远大于图片内物体数量,默认100b是batch size
- dim是attention运行过程中用的维度数
最终学出来的东西类似于Anchor