回答思路
人类视觉系统可以有选择地将注意力集中在较为显著的区域,以更好地捕捉时空间语意结构。注意力机制不仅能告诉人们何时何地关注,还能提高关注区域的表现力。
自然语言处理领域(NLP)最先引入被称为self-attention的注意力机制《Attention is all you need》 ,通过transformer模块捕捉长距离依赖特征,取得很大进展。随后注意力机制也在图像修复、超分辨率、风格迁移等计算机视觉领域得到广泛应用,常用的策略包括空间注意力、通道注意力等。
视频动作识别领域同样受益于该机制,主要可以分为spatial-wise和channel-wise两种模式。其中空间注意力模块以Non-Local为代表,主要关注不同位置特征的关系,捕获两个不同空间位置、时间位置的依赖关系。
通道级别的注意力,目的是增强最有用的通道的响应,削弱影响较小的通道的响应。考虑到直接进行对时空两个特征图进行拼接有些唐突(忽视了2D与3D之间信息的不同和相互关系)研究人员于是设计了一个新型的channel fusion和attention mechanism,来强调通道内部的相互关系,同时实现channel fuse和attention,即引入了通道融合和注意力机制。
左边是原图,右边可视化的注意力图,颜色越深的地方,表示模型越关注的地方。
代码示例
下面给出了两个常用的注意力模块的代码实现
#通道注意力class ChannelAttention(nn.Module): def __init__(self,channel,reduction=16): super().__init__() self.maxpool=nn.AdaptiveMaxPool2d(1) self.avgpool=nn.AdaptiveAvgPool2d(1) self.se=nn.Sequential( nn.Conv2d(channel,channel//reduction,1,bias=False), nn.ReLU(), nn.Conv2d(channel//reduction,channel,1,bias=False) ) self.sigmoid=nn.Sigmoid() def forward(self, x) : max_result=self.maxpool(x) avg_result=self.avgpool(x) max_out=self.se(max_result) avg_out=self.se(avg_result) output=self.sigmoid(max_out+avg_out) return output #空间注意力class SpatialAttention(nn.Module): def __init__(self,kernel_size=7): super().__init__() self.conv=nn.Conv2d(2,1,kernel_size=kernel_size,padding=kernel_size//2) self.sigmoid=nn.Sigmoid() def forward(self, x) : max_result,_=torch.max(x,dim=1,keepdim=True) avg_result=torch.mean(x,dim=1,keepdim=True) result=torch.cat([max_result,avg_result],1) output=self.conv(result) output=self.sigmoid(output) return output