Global Attention Mechanism (GAM) Overview
The Global Attention Mechanism enhances feature discrimination by jointly modeling channel-wise and spatial dependencies. It employs a dual-path design: a multilayer perceptron (MLP) branch for channel attention and a lightweight convolutional branch for spatial attention, both operating on the same input tensor.
GAM Implemantation
import torch
import torch.nn as nn
class GlobalAttentionModule(nn.Module):
def __init__(self, channels: int, reduction_ratio: int = 4):
super().__init__()
mid_channels = channels // reduction_ratio
# Channel attention pathway: MLP with ReLU activation
self.channel_proj = nn.Sequential(
nn.Linear(channels, mid_channels),
nn.ReLU(inplace=True),
nn.Linear(mid_channels, channels)
)
# Spatial attention pathway: two 7×7 convolutions with batch norm
self.spatial_proj = nn.Sequential(
nn.Conv2d(channels, mid_channels, kernel_size=7, padding=3, bias=False),
nn.BatchNorm2d(mid_channels),
nn.ReLU(inplace=True),
nn.Conv2d(mid_channels, channels, kernel_size=7, padding=3, bias=False),
nn.BatchNorm2d(channels)
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
batch_size, channels, height, width = x.shape
# Channel attention: reshape → MLP → sigmoid
permuted = x.permute(0, 2, 3, 1).reshape(batch_size, -1, channels)
channel_weights = self.channel_proj(permuted).reshape(batch_size, height, width, channels)
channel_att = channel_weights.permute(0, 3, 1, 2).sigmoid()
x = x * channel_att
# Spatial attention: conv → sigmoid
spatial_att = self.spatial_proj(x).sigmoid()
return x * spatial_att
Integration Steps
1. Module Registration
Place GlobalAttentionModule in models/newmodels/gam.py, then expose it in models/newmodels/__init__.py:
from .gam import GlobalAttentionModule
2. Model Parser Extension
In models/yolo.py, add support in the parse_model function:
elif m is GlobalAttentionModule:
args = [ch[f], *args]
Ensure GlobalAttentionModule is imported at the top of yolo.py.
3. YAML Configuration Update
Create models/detect/yolov9-gam.yaml. Insert the module at the final stage of the deteciton head — right before the detector layer. Adjust layer indices accordingly. Example excerpt:
# ... previous backbone and neck layers ...
# Final detection head layer
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 37
[-1, 1, GlobalAttentionModule, []], # 38 ← inserted GAM block
# Detection layer: update indices to include new layer 38
[[31, 34, 38, 16, 19, 22], 1, DualDDetect, [nc]]
Note: All downstream references (e.g., in DualDDetect) must reflect updated indices if the new module shifts layer numbering.
4. Training Script Adjustment
Modify train_dual.py:
- Set
--weights ''to train from scratch. - Specify
--cfg models/detect/yolov9-gam.yaml. - Configure
--data,--epochs, and--batch-sizeper hardware constraints.
Verification during training initialization confirms successful integration when the printed model architecture includes GlobalAttentionModule.