参考资料:
transformer最初是为了解决NLP任务,把一句话分成词向量然后编码运算出词汇之间的关联。那么视觉中transformer的意义我个人理解为:把图片也抽象成向量,通过增加位置信息和类别信息来建立图中各部分的相互关联性。
Self-attention
QKV
Q(query):用于主动 与其他token计算相似度。
K(key):被用于 与其他token计算相似度。
V(value):表示当前token的重要程度。
计算过程
位置编码
方案一:通过公式生成位置编码。
方案二:生成可学习的位置编码,即输入随机初始化一个编码,作为参数进行更新。
Multi-head Attention
Vision Transformer(ViT)
论文:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
-
patch embedding:将图像分割成14×14大小的patch(14×14×3),然后经过卷积核卷积(3×3×768),得到输出特征图(14×14×768),然后将这些特征图进行flattern(768×196),再tranpose一下,成为image token(196×768)。
-
class embedding + positional Embedding:将类别信息class token(1×768)与image token相concat(197×768);将位置信息position embedding(197×768)与new image token相add(197×768)。
-
transformer encoder: 将上一步得到的向量(197×768)输入Encoder中,经过了Norm层→Multi-Head→Norm层→MLP→Norm层得到输出(197×768)。
-
classify-分类:将位置信息class token(1×768)输入MLP Head(可以理解为全连接层),得到分类结果。
DETR
论文:End-to-End Object Detection with Transformers
-
卷积网络提取特征-backbone:输入图片(3×800×1066)通过卷积网络提取特征(2048×25×34),再经过1×1的降维操作(256×25×34),与位置信息(256×25×34)add操作,然后进行flattern(256×850)和transpose(850×256),输入Transformer Encoder。
-
Transformer Encoder学习全局特征:经过encoder输出仍然是(850×256)。
-
Transformer Decoder强化学习到的特征:将encoder输出特征与object queries(100×256)送入decoder中,得到输出向量(100×256)。
-
计算loss:将Decoder的输出送入检测头FFN(feed forward network,可以理解为全连接层)中,预测出x,y,w,h,class(有多少类,class就是多长),训练时将预测框与Ground Truth做匹配,计算loss: 一张图片输入DETR中,得到N个预测框,将预测框与GT的类别、位置信息进行loss计算,通过最优二分图匹配算法(可以调用scipy包中的linear-sum-assignment函数),找到使得loss最小的,唯一匹配GT的预测框,由于是唯一的,因此不需要NMS算法。
特点:对于小目标的检测效果并不出众。