YOLO12改进-模块-引入HaloNet 局部自注意力HaloNet local self-attention 自注意力机制轻量化

        传统全局自注意力在处理高分辨率图像时,计算量随图像尺寸呈平方级增长,导致显存占用和推理延迟显著增加。例如,一张 1024×1024 的图像需要计算约 10^6 个 token 的交互,这在实际应用中难以承受。同时,卷积神经网络(CNN)虽通过局部感受野降低计算量,但其参数依赖型感受野扩展(如 3×3 卷积堆叠)和内容无关的交互(固定权重)限制了对复杂视觉模式的捕捉能力。
        HaloNet 提出分块局部自注意力,将图像划分为非重叠块,每个块仅与周围扩展的 Halo 区域进行交互。这种设计既保留了自注意力的内容敏感特性,又通过分块策略大幅降低计算量,同时通过 Halo 区域扩展感受野,实现全局信息的有效传递。

上面是原模型,下面是改进模型

1. HaloAttention介绍 

  1. 分块局部自注意力(Blocked Local Self-Attention)

    该方法将计算复杂度从 O (N²) 降至 O (B²),同时通过 Halo 区域实现跨块信息传递,平衡了局部细节与全局上下文。

    1. 分块策略:将图像划分为 B×B 的非重叠块,每个块作为查询区域(Query Block)。

    2. Halo 区域扩展:每个查询块周围扩展 H×H 的 Halo 区域,形成 (B+2H)×(B+2H) 的邻域块(Key/Value Block)。Halo 区域允许相邻块的信息交互,扩大感受野。

    3. 注意力计算:在每个查询块的 Halo 邻域内计算自注意力,仅关注块内和 Halo 区域的像素,而非全局所有像素。

  2. Strided 自注意力下采样
    HaloNet 采用Strided 自注意力层替代传统的卷积下采样。具体来说,通过调整查询块的步长(Stride)实现特征图的降采样,同时保持自注意力的内容敏感性。这种设计避免了传统卷积下采样的信息丢失,且减少了 4 倍的计算量(如摘要 9 所述)。

  3. 放松平移等变性
    传统自注意力要求严格的平移等变性(即特征图平移后输出不变),但这会限制硬件利用率。HaloNet 通过分块和 Halo 区域设计,允许块内和 Halo 区域的局部交互,放松平移等变性,从而提升计算效率和模型准确率。

       

2. YOLOv12与HaloAttention的结合          

          HSM - SSD 与 YOLOv12 结合,借助其线性计算复杂度和全局建模能力,在提升检测精度的同时保持高效推理,尤其利于小目标和高分辨率场景。

3. HaloAttention代码部分

https://github.com/tgf123/YOLOv8_improve/blob/master/YOLOV12.md

 4. 将HaloAttention引入到YOLOv12中

第一: 先新建一个change_model,将下面的核心代码复制到下面这个路径当中,如下图如所示。YOLOv12\ultralytics\change_model。

            ​​​​​​  ​​​​​​​​​​​​​​   

第二:在task.py中导入

 ​​​      ​​​​​​​ ​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​      

第三:在task.py中的模型配置部分下面代码

        ​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​   ​​​​​​​

第四:将模型配置文件复制到YOLOV12.YAMY文件中

 ​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​ 

     ​​​​​​​ ​​​​​​​​​​​​​​ ​​​​​​​ ​​​​​​​​​​​​​第五:运行代码


from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld

if __name__=="__main__":

    # 使用自己的YOLOv12.yamy文件搭建模型并加载预训练权重训练模型
    model = YOLO(r"E:\Part_time_job_orders\YOLO_NEW\YOLOv12_all\ultralytics\cfg\models\12\yolo12_Halo_Attention.yaml")
        # .load(r'E:\Part_time_job_orders\YOLO_NEW\YOLOv12\yolo12n.pt')  # build from YAML and transfer weights

    results = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv12\ultralytics\cfg\datasets\VOC_my.yaml',
                          epochs=300,
                          imgsz=640,
                          batch=64,
                          # cache = False,
                          # single_cls = False,  # 是否是单类别检测
                          # workers = 0,
                         # resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
                          amp = True
                          )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值