Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation 关键代码解析
def PCM(self, cam, f):
n,c,h,w = f.size()
cam = F.interpolate(cam, (h,w), mode='bilinear', align_corners=True).view(n,-1,h*w)
# 对 CAM 进行双线性插值,使其尺寸与特征图 f 一致,然后将其展平
f = self.f9(f)
f = f.view(n,-1,h*w)
f = f/(torch.norm(f,dim=1,keepdim=True)+1e-5) # 将特征图 f 展平,然后归一化
aff = F.relu(torch.matmul(f.transpose(1,2), f),inplace=True)
aff = aff/(torch.sum(aff,dim=1,keepdim=True)+1e-5)
# 计算特征之间的关联矩阵(亲和性矩阵),并进行归一化
cam_rv = torch.matmul(cam, aff).view(n,-1,h,w)
# 将 CAM 与关联矩阵相乘,得到经过协同显著图增强的 CAM
return cam_rv