YOLO12改进-Backbone-引入Swin Transformer替换backbone
在计算机视觉领域,卷积神经网络(CNNs)一直是主流架构,从 AlexNet 开始,其结构不断优化,推动了该领域的快速发展。与此同时,在自然语言处理(NLP)中,Transformer 凭借其注意力机制在处理长距离依赖关系上的优势,成为主导架构,并取得了显著成功。受 Transformer 在 NLP 中的启发,研究人员开始探索将其应用于计算机视觉领域,并在某些任务中展现出潜力。然而,将 Transformer 从语言领域迁移到视觉领域面临诸多挑战,例如视觉元素尺度变化大、图像像素分辨率高导致计算复杂度高等问题。为了解决这些问题,Swin Transformer 应运而生,通过引入滑动窗口机制和层次化设计,有效降低了计算复杂度,同时保持了 Transformer 的建模能力,为视觉任务提供了新的解决方案。
上面是原模型,下面是改进模型

1. Swin Transformer介绍
基于移位窗口的自注意力计算:标准 Transformer 的全局自注意力计算复杂度与令牌数量呈二次关系,不适用于许多视觉任务。Swin Transformer 提出在局部窗口内计算自注意力,将窗口均匀划分图像且互不重叠,降低计算复杂度。同时,采用移位窗口分区方法,在连续的 Swin Transformer 块中交替使用两种分区配置,引入跨窗口连接,增强模型建模能力。
相对位置偏差:在计算自注意力时,引入相对位置偏差,为每个头计算相似度时加入相对位置偏差矩阵B。通过参数化一个较小尺寸的偏差矩阵B^来获取B的值,实验表明这种方式相较于无位置编码或使用绝对位置嵌入,能显著提升模型性能。
从提供的图片来看,Swin Transformer模块主要包含以下几个部分:
整体架构:Swin Transformer 首先将输入的 RGB 图像通过补丁分割模块划分为不重叠的补丁,每个补丁视为一个 “令牌”,并通过线性嵌入层将其特征投影到指定维度。接着,经过多个带有修改后自注意力计算的 Transformer 块(Swin Transformer 块)进行特征变换。为生成层次化表示,随着网络加深,通过补丁合并层减少令牌数量,同时增加特征维度。整个架构包含多个阶段,每个阶段由补丁合并层和 Swin Transformer 块组成,最终产生与典型卷积网络相同分辨率的层次化特征图。
Swin Transformer 块:Swin Transformer 块由基于移位窗口的多头自注意力(MSA)模块和一个 2 层的多层感知器(MLP)组成,中间使用 GELU 非线性激活函数。在每个 MSA 模块和 MLP 之前应用层归一化(LN),并在每个模块之后应用残差连接 。
2. YOLOv12与Swin Transformer的结合
采用 Swin Transformer 替代 YOLO12 的骨干网络,能够通过其层次化特征图构建和移位窗口自注意力机制,更高效地处理多尺度视觉信息,从而提升对不同尺寸目标的检测能力。这一改进不仅显著提高了目标检测的精度,在 COCO 检测任务中表现尤为突出,同时保持了相对较低的计算复杂度,为实际应用场景提供了强有力的技术支持。
3. Swin Transformer代码部分
YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
4. 将Swin Transformer引入到YOLOv12中
第一: 先新建一个change_model,将下面的核心代码复制到下面这个路径当中,如下图如所示。YOLOv12\ultralytics\change_model。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV12.YAMY文件中
第五:运行代码
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorldif __name__=="__main__":# 使用自己的YOLOv12.yamy文件搭建模型并加载预训练权重训练模型model = YOLO(r"E:\Part_time_job_orders\YOLO_NEW\YOLOv12_all\ultralytics\cfg\models\12\yolo12_SwinTransformer.yaml")# .load(r'E:\Part_time_job_orders\YOLO_NEW\YOLOv12\yolo12n.pt') # build from YAML and transfer weightsresults = 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)