HAT超分辨率重建注意力机制,也可用于目标检测,有效涨点。 混合注意力变换器(HAT)的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。 通道注意力关注于识别哪些通道更重要,而自注意力则关注于图像内部各个位置之间的关系。 HAT利用这两种注意力机制,有效地整合了全局的像素信息,从而提供更为精确的上采样结果。
盯着屏幕里糊成马赛克的图片,我叼着棒棒糖开始搓手。老司机们总说注意力机制是炼丹师的魔法,这次HAT搞的混合注意力确实有点东西。它不像Transformer那样一股脑堆自注意力,也不像SENet只盯着通道维度——这货玩的是双线操作,左手通道注意力,右手空间自注意力,跟调鸡尾酒似的。
先看通道注意力这部分的骚操作。代码里用GlobalAveragePooling扒拉出通道权重,但加了点新花样:
class ChannelAttention(nn.Module): def __init__(self, num_feat): super().__init__() self.gap = nn.AdaptiveAvgPool2d(1) self.conv = nn.Conv2d(num_feat, num_feat//4, 1) self.act = nn.GELU() self.final_conv = nn.Conv2d(num_feat//4, num_feat, 1) def forward(self, x): weight = self.gap(x) weight = self.conv(weight) weight = self.act(weight) # 这里用GELU代替ReLU挺有意思 return x * self.final_conv(weight).sigmoid()这代码里藏着两个彩蛋:一是中间用1x1卷积压缩通道时用了GELU激活,比传统ReLU更顺滑;二是最后用sigmoid而不是softmax,避免不同通道权重互相挤压。好比给不同滤镜设置独立的强度调节杆,红色通道加强的同时不影响蓝色通道的权重。
接着看自注意力部分。HAT没有直接用原始Transformer的QKV结构,而是搞了个轻量版:
class SpatialAttention(nn.Module): def __init__(self, num_feat): super().__init__() self.norm = LayerNorm(num_feat) self.qkv = nn.Conv2d(num_feat, num_feat*3, 1) def forward(self, x): B, C, H, W = x.shape q, k, v = self.qkv(self.norm(x)).chunk(3, dim=1) q = q.flatten(2).transpose(1, 2) # [B, H*W, C] k = k.flatten(2) # [B, C, H*W] attn = (q @ k) * (C ** -0.5) attn = attn.softmax(dim=-1) v = v.flatten(2).transpose(1, 2) out = attn @ v return out.transpose(1, 2).view(B, C, H, W)这实现里藏着几个小心机:1)用卷积代替全连接生成QKV,保留局部特征;2)计算注意力时没像传统那样用多头机制,而是单头但加大通道数;3) 把LayerNorm放在最前面,避免特征分布偏移。就像用单反相机拍全景,既保留细节又能把握全局。
当这两个模块在残差块里相遇时,会产生奇妙的化学反应:
class HATBlock(nn.Module): def __init__(self, num_feat): super().__init__() self.ca = ChannelAttention(num_feat) self.sa = SpatialAttention(num_feat) self.conv = nn.Conv2d(num_feat, num_feat, 3, padding=1) def forward(self, x): # 通道注意力先行 x = self.ca(x) + x # 自注意力殿后 x = self.sa(x) + x # 常规卷积收尾 return self.conv(x) + x这个顺序安排很讲究——先让通道注意力调整特征重要性,再让自注意力处理空间关系,最后用3x3卷积捕捉局部模式。就像先调色再构图最后加滤镜,三个步骤各司其职。
实测在超分任务中,这种结构对恢复高频细节特别有效。比如在处理建筑纹理时,通道注意力会强化边缘相关的特征图,自注意力则能捕捉窗户排列的规律性。有个好玩的发现:当处理老照片的划痕时,HAT会自发在划痕区域降低注意力权重,相当于自带去伪影功能。
迁移到目标检测时,把HATBlock插在Backbone和Head之间,mAP能涨1.2个点左右。特别是小目标检测,注意力机制能帮网络聚焦在关键区域,相当于给检测头装了个可变焦镜头。不过要注意计算量,别在浅层特征就用HAT,容易算力爆炸。