【有啥问啥】SimAM(Similarity-Aware Activation Module)注意力机制详解
SimAM(Similarity-Aware Activation Module)注意力机制详解
引言
在计算机视觉领域,注意力机制通过引导模型关注图像中的关键区域,显著提升了模型处理和理解图像的能力。SimAM(Similarity-Aware Activation Module)作为一种轻量级、无参数的注意力机制,以其独特的优势逐渐受到研究者和开发者的关注。本文将详细解析SimAM注意力机制的工作原理、实现方式、优势。
SimAM注意力机制概述
SimAM是一种基于特征图局部自相似性的注意力机制。它通过计算特征图中每个像素与其周围像素之间的相似性,来动态地调整每个像素的权重,从而实现对重要特征的增强和对不相关特征的抑制。SimAM的创新之处在于其无参数特性,使得模型在保持较低复杂度的同时,依然能够取得出色的性能。
SimAM的工作原理与公式解释
SimAM的工作原理可以分为以下几个步骤,并伴随相应的公式解释:
-
特征图提取:通过卷积神经网络(CNN)提取输入图像的特征图 X ∈ R B × C × H × W X \in \mathbb{R}^{B \times C \times H \times W} X∈RB×C×H×W,其中 B B B 是批次大小, C C C 是通道数, H H H 和 W W W 分别是特征图的高度和宽度。
-
计算局部自相似性:对于特征图中的每个像素 x i , j x_{i,j} xi,j(其中 i , j i, j i,j 分别表示像素在特征图中的位置索引),SimAM计算其与周围像素的相似性。这种相似性通过计算像素间特征向量的距离来衡量,常用的是欧几里得距离的负平方。但SimAM实际上是通过计算每个像素与其邻域内像素差的平方的平均值(经过归一化)来间接反映相似性。具体地,对于每个像素,计算其与邻域内所有像素差的平方,然后求和并归一化:
s i , j = 1 N ∑ k ∈ Ω i , j ∥ x i , j − x k ∥ 2 2 s_{i,j} = \frac{1}{N} \sum_{k \in \Omega_{i,j}} \|x_{i,j} - x_k\|_2^2 si,j=N1k∈Ωi,j∑∥xi,j−xk∥22
其中, Ω i , j \Omega_{i,j} Ωi,j 表示像素 x i , j x_{i,j} xi,j 的邻域(不包括 x i , j x_{i,j} xi,j 本身, N N N 是邻域内像素的数量),但SimAM实际实现中通常使用整个特征图的均值进行中心化,并减去中心化后的结果来计算差的平方,以简化计算。
-
生成注意力权重:基于上述计算的 s i , j s_{i,j} si,j(或更准确地说是基于中心化后的差的平方),SimAM通过以下公式生成注意力权重 w i , j w_{i,j} wi,j:
w i , j = 1 1 + exp ( − 1 4 ( s i , j σ i , j 2 + ϵ − 1 ) ) w_{i,j} = \frac{1}{1 + \exp\left(-\frac{1}{4} \left( \frac{s_{i,j}}{\sigma_{i,j}^2 + \epsilon} - 1 \right) \right)} wi,j=1+exp(−41(σi,j2+ϵsi,j−1))1
其中, σ i , j 2 \sigma_{i,j}^2 σi,j2 是 s i , j s_{i,j} si,j 的某种形式的归一化(在SimAM的实现中,通常是通过整个特征图或局部区域的 s i , j s_{i,j} si,j 的平均值和标准差来近似), ϵ \epsilon ϵ 是一个很小的常数(如 1 e − 4 1e-4 1e−4),用于防止除零错误。这个公式实际上是一个sigmoid函数的变体,用于将 s i , j s_{i,j} si,j 映射到 ( 0 , 1 ) (0, 1) (0,1) 区间内,作为注意力权重。
但请注意,上述公式是对SimAM原理的一种概括性描述。在实际实现中,SimAM通过计算特征图中心化后的差的平方,并对其进行归一化和缩放,最后应用sigmoid函数来生成注意力权重。
-
注意力图与特征图相乘:将生成的注意力权重图 W ∈ R B × 1 × H × W W \in \mathbb{R}^{B \times 1 \times H \times W} W∈RB×1×H×W(注意这里忽略了通道维度,因为SimAM通常对每个通道独立计算注意力权重)与原始特征图 X X X 相乘,得到加权的特征图 X ′ = W ⊙ X X' = W \odot X X′=W⊙X,其中 ⊙ \odot ⊙ 表示逐元素相乘。
SimAM的实现
SimAM的实现相对简单,可以直接嵌入到现有的CNN模型中。以下是基于PyTorch的简化实现示例(注意,这里的实现可能与上述公式描述略有不同,但核心思想相同):
import torch
import torch.nn as nnclass SimAM(nn.Module):def __init__(self, channels=None, e_lambda=1e-4):super(SimAM, self).__init__()self.activaton = nn.Sigmoid()self.e_lambda = e_lambdadef forward(self, x):b, c, h, w = x.size()n = w * h - 1 # 可以选择是否减去中心像素,但通常不减去# 中心化特征图mu = x.mean(dim=[2, 3], keepdim=True).expand_as(x)x_centered = x - mu# 计算差的平方x_minus_mu_square = x_centered.pow(2)# 归一化并计算注意力权重norm_factor = x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambday = x_minus_mu_square / (4 * norm_factor) + 0.5attention_map = self.activaton(y)# 将注意力权重图与原始特征图相乘return x * attention_map# 示例使用
# 假设输入x是一个四维张量,代表一批图像的特征图
# x = torch.randn(batch_size, channels, height, width)
# simam_module = SimAM(channels=channels, e_lambda=1e-4)
# output = simam_module(x)
SimAM的优势
SimAM注意力机制具有以下优势:
-
轻量级与无参数:SimAM不需要引入任何额外的参数,降低了模型的复杂度和计算成本。
-
性能提升:通过计算特征图的局部自相似性,能够有效增强重要特征,抑制不相关特征,从而提升模型的整体性能。
-
通用性强:SimAM可嵌入多种现有的CNN架构中,适应性强,能广泛应用于不同的计算机视觉任务。
-
鲁棒性:在处理具有噪声和遮挡的图像时,SimAM展现出了良好的鲁棒性,能够更好地识别重要特征。
SimAM的应用
SimAM注意力机制已经在多个计算机视觉任务中得到了应用,如图像分类、目标检测、图像分割等,并取得了良好的效果。例如,SimAM可以提高目标检测模型在复杂场景中的检测准确率,并增强图像分割模型对边界的敏感性。未来,随着研究的深入和应用的拓展,SimAM有望在更多的计算机视觉任务中发挥重要作用,特别是在实时处理和移动设备上的应用。
结论
SimAM作为一种轻量级、无参数的注意力机制,在计算机视觉领域展现出了巨大的潜力。通过计算特征图的局部自相似性并生成注意力权重,SimAM实现了对重要特征的增强和对不相关特征的抑制,从而提升了模型的性能。未来,我们期待看到SimAM在更多领域和任务中的应用和发展,同时也期待其在更复杂的视觉任务中发挥更大的作用。
相关文章:

【有啥问啥】SimAM(Similarity-Aware Activation Module)注意力机制详解
SimAM(Similarity-Aware Activation Module)注意力机制详解 引言 在计算机视觉领域,注意力机制通过引导模型关注图像中的关键区域,显著提升了模型处理和理解图像的能力。SimAM(Similarity-Aware Activation Module&a…...
鸿蒙应用开发,如何保存登录信息
在鸿蒙应用开发中,保存登录信息是实现用户自动登录、个性化展示等功能的基础。以下是一些常用的保存登录信息的方法: 一、全局状态管理 对于简单的应用,可以在全局范围内定义一个类(如UserManager),使用单…...

★ C++进阶篇 ★ map和set
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将继续和大家一起学习C进阶篇第四章----map和set ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页:椎名澄嵐-CSDN博客 C基础篇专栏:★ C基础篇 ★_椎名澄嵐的博客-CSDN博…...
Python知识点:如何使用Nvidia Jetson与Python进行边缘计算
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Nvidia Jetson与Python进行边缘计算 Nvidia Jetson平台是专为边缘计算设…...

动态分配内存
目录 前言 一.malloc,free函数 1.malloc,free函数原型 2.使用方法 3.具体实例 4.注意事项 二.calloc函数 1.calloc函数原型 2.主要特点 3.使用案例 三.realloc函数 1.realloc函数原型 2.使用案例 3.注意事项 前言 动态内存是指在程序运行时,按需分配和…...

Unity Input System自动生成配置
参考视频 创建及配置新输入系统 New Input System|Unity2022.2 最新教程《勇士传说》入门到进阶|4K_哔哩哔哩_bilibili ProjectSettings设置 Unity编辑器菜单栏选择Edit->Project Settings->Player->Other Settings,将Api Compatibility Level…...

【Windows】在任务管理器中隐藏进程
在此前的一篇,我们已经介绍过了注入Dll 阻止任务管理器结束进程 -- Win 10/11。本篇利用 hook NtQuerySystemInformation 并进行断链的方法实现进程隐身,实测支持 taskmgr.exe 的任意多进程隐身。 任务管理器 代码: // dllmain.cpp : 定义 …...
【TypeScript学习】TypeScript基础学习总结二
主要记录ts中的类、接口与泛型 1.类 无论是在哪种语言中,类都是面向对象编程(OOP)的一个主要实现方式。能够实现代码更加灵活,更具有结构化。类作用都是提供一个模板,通过类可以创建多个具有相同结构的对象。 // 类的定义,与对象…...

中国电信解锁万亿参数大模型:TeleAI的创新与突破
首个由万卡集群训练出来的万亿参数大模型,已被一家央企解锁。 具体而言,为了推动纯国产人工智能的探索,带来这条新路径的正是中国电信人工智能研究院(TeleAI)。 该研究院由中国电信集团的CTO、首席科学家兼院长李学龙…...

戴尔PowerEdge R840服务器亮黄灯 不开机
最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后,无法正常开机的问题, 大概故障现象是 插上电源线 按卡机按钮无响应,无法开机,无显示输出,工程师到现场检修,经过idrac中日志分析&#…...

【前端安全】js逆向之微信公众号登录密码
❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 随着发展,越来越多的登录页面添加了密码加密的措施,使得暴力破解变得不在简单&a…...

C# 泛型使用案例_C# 泛型使用整理
一、系统自带常用的泛型 1.字典,集合 //字典 Dictionary<string, int> dic new Dictionary<string, int>(); //泛型集合 List<int> list new List<int>(); 2.泛型委托,输入参数,输出参数 //泛型 委托---输出参…...

Docker 安装 Citus 单节点集群:全面指南与详细操作
Docker 安装 Citus 单节点集群:全面指南与详细操作 文章目录 Docker 安装 Citus 单节点集群:全面指南与详细操作一 服务器资源二 部署图三 安装部署1 创建网络2 运行脚本1)docker-compose.cituscd1.yml2)docker-compose.cituswk1.…...

Arthas redefine(加载外部的.class文件,redefine到JVM里 )
文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine(加载外部的.class文件,redefine到JVM里 )举例1:加载新的代码,jad/mc 命令使用举例2:上传 .class 文件到服务器的技巧 本人其他相关文章…...
C++教程(三):c++常用的配置文件类型
目录 1. INI 文件 2. JSON 文件 3. YAML 文件 4. XML 文件 5. TOML 文件 6. 二进制配置文件(Protocol Buffers, MessagePack, Avro 等) 总结 在 C 项目中,常用的配置文件类型有多种选择,具体选择取决于项目的复杂性、可读性…...
Arduino Uno控制雨滴传感器模块的设计方案
以下是Arduino Uno控制雨滴传感器模块的设计方案: 一、硬件准备: 1. Arduino Uno 开发板一块。 2. 雨滴传感器模块一个。 3. 杜邦线若干。 4. 9V直流电源一个。 二、硬件连接: 1. 将Arduino Uno板的Vin引脚、GND引脚分别连接到9V直流电…...
华为常见命令手册
常见命令 display ip interface brief —> 查看设备上的每个接口的IP地址【地址/掩码/状态】 display interface gi0/0/0 → 查看该接口的MAC 地址 ipconfig → 查看 PC 上面的 IP地址 display arp → 查看设备的 ARP 表 arp -a → 查看 PC 上面的 ARP 表 display m…...

TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点
论文标题: 英文:TinyAP: An intelligent Access Point to combat Wi-Fi attacks using TinyML中文:TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点 作者信息: Anand Agrawal 和 Rajib Ranjan Maiti,来自印…...

grafana频繁DataSourceError问题
背景 随着 Grafana 数据量的不断增加,逐渐暴露出以下问题: Grafana 页面加载缓慢;Grafana 告警频繁出现 DatasourceError 错误。 对于第一个问题,大家可以参考这篇文章:Grafana 加载缓慢的解决方案。 不过…...

python-ds:Python 中的数据结构库(适用于面试的数据结构和算法合集)
在软件开发中,数据结构是组织和存储数据的方式,对算法的效率和程序的性能至关重要。Python 提供了许多内置的数据结构,但在一些复杂的应用场景中,原生数据结构可能无法满足特定需求。这时,一个功能强大、易于使用的数据…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...