其他
NeurIPS 2021 | Twins:重新思考高效的视觉注意力模型设计
总第498篇
2022年 第015篇
导读
背景
视觉注意力模型设计的难点
Twins 模型设计
Twins-PCPVT
Twins-SVT
实验
ImageNet-1k 分类
ADE20K 分割
COCO 目标检测(Retina 框架)
COCO 目标检测(Mask-RCNN 框架)
在高精地图多要素语义分割场景的应用
总结
导读
Twins-PCPVT 将金字塔 Transformer 模型 PVT [2] 中的固定位置编码(Positional Encoding)更改为团队在 CPVT [3] 中提出的条件式位置编码 (Coditional Position Encoding, CPE),从而使得模型具有平移等变性(即输入图像发生平移后,输出同时相应发生变化),可以灵活处理来自不同空间尺度的特征,从而能够广泛应用于图像分割、检测等变长输入的场景。 Twins-SVT 提出了空间可分离自注意力机制(Spatially Separable Self-Attention,SSSA)来对图像特征的空间维度进行分组,分别计算各局部空间的自注意力,再利用全局自注意力机制对其进行融合。这种机制在计算上更高效,性能更优。
背景
视觉注意力模型设计的难点
高效率的计算:缩小和卷积神经网络在运算效率上的差距,促进实际业务应用; 灵活的注意力机制:即能够具备卷积的局部感受野和自注意力的全局感受野能力,兼二者之长; 利于下游任务:支持检测、分割等下游任务,尤其是输入尺度变化的场景。
Twins 模型设计
Twins-PCPVT
条件位置编码
def __init__(self, in_chans, embed_dim):
super(PEG, self).__init__()
self.peg = nn.Conv2d(in_chans, embed_dim, 3, 1, 1, bias=True, groups=embed_dim)
def forward(self, feat_token, H, W):
B, N, C = feat_token.shape
cnn_feat = feat_token.transpose(1, 2).view(B, C, H, W)
x = self.peg(cnn_feat) + cnn_feat
x = x.flatten(2).transpose(1, 2)
return x
Twins-SVT
def forward(self, x, H, W):
B, N, C = x.shape
h_group, w_group = H // self.ws, W // self.ws # 根据窗口大小计算长(H)和宽(W)维度的分组个数
total_groups = h_group * w_group
x = x.reshape(B, h_group, self.ws, w_group, self.ws, C).transpose(2, 3) # 将输入根据窗口进行分组 B* h_group * ws * w_group * ws * C
qkv = self.qkv(x).reshape(B, total_groups, -1, 3, self.num_heads, C // self.num_heads).permute(3, 0, 1, 4, 2, 5) # 计算各组的 q, k, v
q, k, v = qkv[0], qkv[1], qkv[2]
attn = (q @ k.transpose(-2, -1)) * self.scale # 计算各组的注意力
attn = attn.softmax(dim=-1) # 注意力归一化
attn = self.attn_drop(attn) # 注意力 Dropout 层
attn = (attn @ v).transpose(2, 3).reshape(B, h_group, w_group, self.ws, self.ws, C) # 用各组内的局部自注意力给 v 进行加权
x = attn.transpose(2, 3).reshape(B, N, C)
x = self.proj(x) # MLP 层
x = self.proj_drop(x) # Dropout 层
return x
def forward(self, x, H, W):
B, N, C = x.shape
q = self.q(x).reshape(B, N, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) # 根据输入特征 x 计算查询张量 q
x_ = x.permute(0, 2, 1).reshape(B, C, H, W)
x_ = self.sr(x_).reshape(B, C, -1).permute(0, 2, 1) # 缩小输入特征的尺寸得到 x_
x_ = self.norm(x_) # 层归一化 LayerNorm
kv = self.kv(x_).reshape(B, -1, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) # 根据缩小尺寸后的特征后 x_,计算 k, v
k, v = kv[0], kv[1]
attn = (q @ k.transpose(-2, -1)) * self.scale # 计算全局自注意力
attn = attn.softmax(dim=-1)
attn = self.attn_drop(attn)
x = (attn @ v).transpose(1, 2).reshape(B, N, C) # 根据全局自注意力对 v 加权
x = self.proj(x)
x = self.proj_drop(x)
return x
实验
ImageNet-1k 分类
ADE20K 分割
COCO 目标检测(RetinaNet 框架)
COCO 目标检测(Mask-RCNN 框架)
在高精地图多要素语义分割场景的应用
总结
参考文献
作者简介
美团视觉智能部 AutoML 算法团队旨在通过 AutoML 及前沿的视觉技术赋能公司各项业务、加速算法落地,涵盖 AutoML、分割、检测(2D、3D)、Self-training 等技术方向。欢迎感兴趣的校招和社招同学发送简历至:chuxiangxiang@meituan.com(实习、正式均可)。
美团自动车配送部高精地图团队是高精地图技术研发团队,我们的职责是为美团自动驾驶提供高精度、高鲜度、大范围的高精地图服务。高精地图是涉及多种学科的综合技术,不仅需要依托 SLAM、地理测绘、深度学习、多传感器定位等算法进行高精地图的构建,而且还需要利用大数据技术、高性能计算、高并发服务等进行大规模高精地图处理、存储和查询服务。高精地图团队长期招聘计算机视觉、SLAM、系统开发等专家,感兴趣的同学可以将简历发送至:tech@meituan.com(邮件主题:美团高精地图)。
美团科研合作
美团科研合作致力于搭建美团各部门与高校、科研机构、智库的合作桥梁和平台,依托美团丰富的业务场景、数据资源和真实的产业问题,开放创新,汇聚向上的力量,围绕人工智能、大数据、物联网、无人驾驶、运筹优化、数字经济、公共事务等领域,共同探索前沿科技和产业焦点宏观问题,促进产学研合作交流和成果转化,推动优秀人才培养。面向未来,我们期待能与更多高校和科研院所的老师和同学们进行合作。欢迎老师和同学们发送邮件至:meituan.oi@meituan.com 。
阅读更多