极市导读
本文介绍了一种即插即用的涨点神器——Attentional Feature Fusion(AFF)。注意力特征融合技术适用于大多数常见场景,本文详细展示了它的实现方法和实验结果。>>加入极市CV技术交流群,走在计算机视觉的最前沿
特征融合是指来自不同层或分支的特征的组合,是现代网络体系结构中很常见的一种操作。它通常通过简单的操作(例如求和或串联)来实现,但这可能不是最佳选择。在本论文中提出了一个统一而通用的方案,即注意力特征融合,该方案适用于大多数常见场景,包括由short and long skip connections以及在Inception层内的特征融合。
为了更好地融合语义和尺度不一致的特征,提出了一个多尺度的通道注意力模块,该模块解决了在融合不同尺度的特征时出现的问题。同时还通过添加另一个注意力级别(称为迭代注意力特征融合)来缓解特征图的初始集成的瓶颈。
class ResGlobLocaChaFuse(HybridBlock):
def __init__(self, channels=64):
super(ResGlobLocaChaFuse, self).__init__()
with self.name_scope():
self.local_att = nn.HybridSequential(prefix= 'local_att')
self.local_att.add(nn.Conv2D(channels, kernel_size= 1, strides= 1, padding= 0))
self.local_att.add(nn.BatchNorm())
self.global_att = nn.HybridSequential(prefix= 'global_att')
self.global_att.add(nn.GlobalAvgPool2D())
self.global_att.add(nn.Conv2D(channels, kernel_size= 1, strides= 1, padding= 0))
self.global_att.add(nn.BatchNorm())
self.sig = nn.Activation( 'sigmoid')
def hybrid_forward(self, F, x, residual):
xa = x + residual
xl = self.local_att(xa)
xg = self.global_att(xa)
xlg = F.broadcast_add(xl, xg)
wei = self.sig(xlg)
xo = 2 * F.broadcast_mul(x, wei) + 2 * F.broadcast_mul(residual, 1-wei)
return xo
class AXYforXplusYAddFuse(HybridBlock):
def __init__(self, channels=64):
super(AXYforXplusYAddFuse, self).__init__()
with self.name_scope():
self.local_att = nn.HybridSequential(prefix= 'local_att')
self.local_att.add(nn.Conv2D(channels, kernel_size= 1, strides= 1, padding= 0))
self.local_att.add(nn.BatchNorm())
self.global_att = nn.HybridSequential(prefix= 'global_att')
self.global_att.add(nn.GlobalAvgPool2D())
self.global_att.add(nn.Conv2D(channels, kernel_size= 1, strides= 1, padding= 0))
self.global_att.add(nn.BatchNorm())
self.sig = nn.Activation( 'sigmoid')
def hybrid_forward(self, F, x, residual):
xi = x + residual
xl = self.local_att(xi)
xg = self.global_att(xi)
xlg = F.broadcast_add(xl, xg)
wei = self.sig(xlg)
xo = F.broadcast_mul(wei, residual) + x
return xo
class AXYforXYAddFuse(HybridBlock):
def __init__(self, channels=64):
super(AXYforXYAddFuse, self).__init__()
with self.name_scope():
self.local_att = nn.HybridSequential(prefix= 'local_att')
self.local_att.add(nn.Conv2D(channels, kernel_size= 1, strides= 1, padding= 0))
self.local_att.add(nn.BatchNorm())
self.global_att = nn.HybridSequential(prefix= 'global_att')
self.global_att.add(nn.GlobalAvgPool2D())
self.global_att.add(nn.Conv2D(channels, kernel_size= 1, strides= 1, padding= 0))
self.global_att.add(nn.BatchNorm())
self.sig = nn.Activation( 'sigmoid')
def hybrid_forward(self, F, x, residual):
xi = x + residual
xl = self.local_att(xi)
xg = self.global_att(xi)
xlg = F.broadcast_add(xl, xg)
wei = self.sig(xlg)
xo = F.broadcast_mul(wei, xi)
return xo
推荐阅读
ACCV 2020国际细粒度网络图像识别竞赛正式开赛!