ARM模塊【來源于BiSeNet】:細化特征圖的注意力,增強重要特征并抑制不重要的特征。
Attention Refinement Module (ARM) 詳解
ARM (Attention Refinement Module) 是 BiSeNet 中用于增強特征表示的關鍵模塊,它通過注意力機制來細化特征圖,突出重要特征并抑制不重要的特征。下面從多個角度深入理解 ARM 模塊。
1. ARM 的核心設計思想
ARM 的設計基于以下兩個核心思想:
- 全局上下文感知:通過全局平均池化捕獲圖像級的上下文信息
- 通道注意力機制:自適應地重新校準通道特征響應
這種設計使網絡能夠:
- 增強與語義相關的特征通道
- 抑制噪聲或不重要的特征通道
- 在不增加計算復雜度的前提下提升特征表示能力
2. ARM 的詳細結構分析
分解 ARM 的結構:
class AttentionRefinementModule(nn.Module):def __init__(self, in_chan, out_chan, *args, **kwargs):super(AttentionRefinementModule, self).__init__()# 特征變換層self.conv = ConvBNReLU(in_chan, out_chan, ks=3, stride=1, padding=1)# 注意力生成分支self.conv_atten = nn.Conv2d(out_chan, out_chan, kernel_size=1, bias=False)self.bn_atten = nn.BatchNorm2d(out_chan)self.sigmoid_atten = nn.Sigmoid()
2.1 特征變換層 (self.conv
)
- 使用一個 3×3 的卷積 + BN + LeakyReLU
- 將輸入特征從
in_chan
維變換到out_chan
維 - 保持空間尺寸不變 (stride=1, padding=1)
2.2 注意力生成分支
-
全局平均池化:
- 對每個通道的所有空間位置取平均值
- 將 H×W×C 的特征圖壓縮為 1×1×C 的通道描述符
-
1×1 卷積 (
self.conv_atten
):- 學習通道間的相關性
- 無偏置項,減少參數數量
-
批歸一化 (
self.bn_atten
):- 穩定訓練過程
- 加速收斂
-
Sigmoid 激活 (
self.sigmoid_atten
):- 將注意力權重歸一化到 [0,1] 范圍
- 實現特征的軟選擇
3. ARM 的前向傳播過程
def forward(self, x):# 1. 特征變換feat = self.conv(x)# 2. 生成注意力圖atten = F.avg_pool2d(feat, feat.size()[2:]) # 全局平均池化atten = self.conv_atten(atten) # 1×1卷積atten = self.bn_atten(atten) # 批歸一化atten = self.sigmoid_atten(atten) # 激活# 3. 應用注意力out = torch.mul(feat, atten) # 逐通道相乘return out
3.1 數學表達
輸出特征可以表示為:
3.2 計算流程圖示
輸入特征 [ C × H × W ] ↓
3×3 Conv+BN+ReLU → 特征變換 [ C' × H × W ]↓ ↓
全局平均池化 [C'×1×1] |↓ |
1×1 Conv [C'×1×1] |↓ |BN |↓ ↓
Sigmoid → 注意力權重 [C'×1×1]↓逐通道乘法 → 輸出特征 [ C' × H × W ]
4. ARM 的特點與優勢
4.1 輕量高效
- 僅增加少量參數 (一個 1×1 卷積)
- 計算開銷主要來自全局平均池化,但這是非常輕量的操作
4.2 與 SE 模塊的對比
ARM 與 SENet 中的 SE 模塊類似,但有重要區別:
特性 | ARM | SE 模塊 |
---|---|---|
位置 | 用于語義分割任務 | 用于圖像分類任務 |
輸入 | 來自上下文路徑的多尺度特征 | 單一尺度特征 |
輸出 | 直接用于后續分割 | 用于分類 |
設計目標 | 保持空間信息 | 通道重校準 |
典型應用 | BiSeNet 中的特征細化 | ResNet 等分類網絡中的增強 |
4.3 在 BiSeNet 中的作用
在 BiSeNet 中,ARM 被應用于不同尺度的特征:
- ARM32:處理最深層特征 (32倍下采樣)
- ARM16:處理中間層特征 (16倍下采樣)
- ARM8:處理較淺層特征 (8倍下采樣)
這種多尺度注意力機制使網絡能夠:
- 在深層捕獲全局語義信息
- 在中間層平衡語義和細節
- 在淺層保留更多空間細節
5. ARM 的變體與改進
5.1 Attentionout
模塊(正常殘差,通道注意VS空間注意)
class Attentionout(nn.Module):def __init__(self, out_chan, *args, **kwargs):self.conv_atten = nn.Conv2d(out_chan, out_chan, kernel_size=1,bias=False)self.bn_atten = nn.BatchNorm2d(out_chan)self.sigmoid_atten = nn.Sigmoid()def forward(self, x):atten = self.conv_atten(x) # 直接處理特征圖,而非池化后的atten = self.bn_atten(atten)atten = self.sigmoid_atten(atten)out = torch.mul(x, atten)x = x + out # 添加殘差連接return out
特點:
- 不使用全局池化,直接處理空間特征
- 添加了殘差連接
- 生成空間注意力圖而非通道注意力
5.2 SAR
模塊 (Spatial Attention Refinement)【局部注意】
class SAR(nn.Module):def __init__(self, in_chan, mid, out_chan):self.conv_reduce = ConvBNReLU(in_chan, mid, 1, 1, 0)self.conv_atten = nn.Conv2d(2, 1, kernel_size=3, padding=1, bias=False)def forward(self, x):x_att = self.conv_reduce(x)low_attention_mean = torch.mean(x_att, 1, True) # 通道均值low_attention_max = torch.max(x_att, 1, True)[0] # 通道最大值low_attention = torch.cat([low_attention_mean, low_attention_max], dim=1)spatial_attention = self.sigmoid_atten(self.bn_atten(self.conv_atten(low_attention)))x = x * spatial_attention # 空間注意力return x
特點:
- 同時考慮通道均值和最大值
- 生成空間注意力圖
- 使用 3×3 卷積捕獲局部空間關系
6. ARM 的實際效果
在實際應用中,ARM 模塊能夠:
- 增強語義特征:使網絡更關注與類別相關的區域
- 抑制背景噪聲:降低無關背景區域的響應
- 改善小目標檢測:通過多尺度注意力增強小目標的特征
- 提升模型魯棒性:對光照變化、遮擋等更具適應性
在 BiSeNet 的論文中,ARM 模塊的引入帶來了約 2-3% 的 mIoU 提升,而計算代價僅增加不到 1%。
7. 總結
ARM 模塊是 BiSeNet 中高效且有效的注意力機制,它通過:
- 全局上下文建模
- 通道注意力重校準
- 多尺度特征細化
顯著提升了語義分割的性能,同時保持了模型的輕量級特性。這種設計思想也被后續許多實時分割網絡所借鑒和發展。