













本文介绍了内容感知Token聚合网络(CATANet)中的局部区域自注意力(LRSA)模块在YOLO26中的结合。基于Transformer的图像超分辨率方法存在计算复杂度高、捕捉长距离依赖能力受限等问题。LRSA作为CATANet的核心辅助模块,通过重叠补丁策略强化局部特征交互,补充局部细节。我们将相关代码加入指定目录,在ultralytics/nn/tasks.py中注册,配置YOLO26 - LRSA.yaml文件,最后通过实验脚本和结果验证了方法的有效性。
文章目录: YOLO26改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总
专栏链接: YOLO26改进专栏

基于 Transformer 的方法在图像超分辨率(SR)等底层视觉任务中展现出了卓越的性能。然而,其计算复杂度随着空间分辨率的增加呈二次方级增长。一系列研究工作试图通过将低分辨率图像划分为局部窗口(local windows)、轴向条纹(axial stripes)或空洞窗口(dilated windows)来缓解这一问题。SR 通常利用图像的冗余性进行重建,而这种冗余不仅存在于局部区域,也存在于长距离区域中。然而,上述方法将注意力计算局限在与内容无关的局部区域内,直接限制了注意力机制捕捉长距离依赖关系的能力。为了解决这些问题,我们提出了一种轻量级的内容感知 Token 聚合网络(CATANet)。具体而言,我们提出了一种高效的内容感知 Token 聚合模块,用于聚合长距离且内容相似的 Token,该模块在所有图像 Token 间共享 Token 中心,且仅在训练阶段对其进行更新。随后,我们利用组内自注意力(intra-group self-attention)来实现长距离的信息交互。此外,我们还设计了一种组间交叉注意力(inter-group cross-attention),以进一步增强全局信息的交互。实验结果表明,与最先进的(SOTA)基于聚类的方法 SPIN 相比,我们的方法取得了更优越的性能,PSNR 最大提升了 0.33dB,且推理速度几乎翻倍。
论文地址:论文地址
代码地址:代码地址
Local-Region Self-Attention(LRSA,局部区域自注意力)是CATANet中负责细化图像局部细节的核心辅助模块,与捕捉长距离依赖的Token-Aggregation Block(TAB)形成功能互补,共同支撑轻量级图像超分辨率任务的高效性能。其设计核心是在低计算复杂度前提下,强化局部范围内像素/特征块的信息交互,弥补长距离注意力在细节还原上的不足。
作为CATANet深度特征提取阶段的关键组件(每个残差组RG包含TAB、LRSA和3×3卷积),LRSA专注于局部特征交互——在长距离依赖已被TAB捕捉后,进一步优化图像边缘、纹理等细粒度细节,避免因过度关注全局信息导致的局部模糊或 artifacts。
LRSA参考了HPINet(Hierarchical Pixel Integration Network)的局部注意力结构,核心采用重叠补丁(Overlapping Patches) 策略:
设LRSA的输入为经过TAB处理后的特征图 ( X_o \in \mathbb{R}^{N \times d} )(其中 ( N ) 为特征token数量,( d ) 为特征维度),其工作流程可概括为3步:
| 注意力机制 | 关注范围 | 核心功能 | 计算复杂度 |
|---|---|---|---|
| LRSA | 局部补丁(如8×8) | 细化边缘、纹理等局部细节 | 线性复杂度(与补丁尺寸相关) |
| IASA(组内自注意力) | 跨图像的内容相似组 | 捕捉长距离依赖 | 线性复杂度(与组内token数量相关) |
| IRCA(组间交叉注意力) | 组与全局token中心 | 强化全局信息交互 | 低复杂度(( M \ll N ),( M ) 为token中心数量) |
LRSA的核心价值的是“补位”——IASA和IRCA解决了“长距离相似信息交互”问题,但可能忽略局部像素的精细关联,而LRSA专注于局部细节修复,三者形成“全局依赖+局部细节”的完整覆盖。
class LRSA(nn.Module):
"""Attention module.
Args:
dim (int): Base channels.
num (int): Number of blocks.
qk_dim (int): Channels of query and key in Attention.
mlp_dim (int): Channels of hidden mlp in Mlp.
heads (int): Head numbers of Attention.
"""
def __init__(self, dim, qk_dim, mlp_dim,heads=1):
super().__init__()
self.layer = nn.ModuleList([
PreNorm(dim, Attention(dim, heads, qk_dim)),
PreNorm(dim, ConvFFN(dim, mlp_dim))])
def forward(self, x, ps):
step = ps - 2
crop_x, nh, nw = patch_divide(x, step, ps) # (b, n, c, ps, ps)
b, n, c, ph, pw = crop_x.shape
crop_x = rearrange(crop_x, 'b n c h w -> (b n) (h w) c')
attn, ff = self.layer
crop_x = attn(crop_x) + crop_x
crop_x = rearrange(crop_x, '(b n) (h w) c -> b n c h w', n=n, w=pw)
x = patch_reverse(crop_x, x, step, ps)
_, _, h, w = x.shape
x = rearrange(x, 'b c h w-> b (h w) c')
x = ff(x, x_size=(h, w)) + x
x = rearrange(x, 'b (h w) c->b c h w', h=h)
return x
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
# 修改为自己的配置文件地址
model = YOLO('./ultralytics/cfg/models/26/yolo26-LRSA.yaml')
# 修改为自己的数据集地址
model.train(data='./ultralytics/cfg/datasets/coco8.yaml',
cache=False,
imgsz=640,
epochs=10,
single_cls=False, # 是否是单类别检测
batch=8,
close_mosaic=10,
workers=0,
optimizer='MuSGD',
amp=True,
project='runs/train',
name='yolo26-LRSA',
)

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。