Swin-T图像论文复现


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

Swin Transformer模型原理

1. Swin Transformer模型框架

2. W-MSA详解

3. SW-MSA详解

环境配置

安装必要的Python依赖:

数据准备

部分核心代码

训练过程

测试和评估

混淆矩阵

参考论文:


本文所有资源均可在该地址处获取。

概述

在计算机视觉领域,卷积神经网络(CNN)一直是构建模型的主流选择。自从AlexNet在ImageNet竞赛中取得了突破性的成绩后,CNN的结构不断演进,变得更庞大、更深入、更多样化。与此同时,自然语言处理领域的网络架构发展则呈现不同的轨迹,目前最流行的是Transformer模型。这种模型专为处理序列数据和转换任务而设计,以其能够捕捉数据中的长距离依赖关系而著称。Transformer在语言处理方面的显著成就激发了研究者探索其在计算机视觉领域的应用潜力,近期的研究表明,它在图像分类、目标检测、图像分割等任务上已经取得了令人鼓舞的成果。
实验得到该模型在图像分类、图像检测、目标检测有很好的效果。
 

Image Name


上表列出了从 224^2 到 384^2 不同输入图像大小的 Swin Transformer 的性能。通常,输入分辨率越大,top-1 精度越高,但推理速度越慢。

Swin Transformer模型原理

1. Swin Transformer模型框架

Image Name

首先,我们将图像送入一个称为Patch Partition的模块,该模块负责将图像分割成小块。然后就是通过四个Stage构建不同大小的特征图,除了Stage1中先通过一个Linear Embeding层外,剩下三个stage都是先通过一个Patch Merging层进行下采样。

最后对于分类网络,后面还会接上一个Layer Norm层、全局池化层以及全连接层得到最终输出。

2. W-MSA详解

引入Windows Multi-head Self-Attention(W-MSA)模块是为了减少计算量。如下图所示,对于feature map中的每个像素在Self-Attention计算过程中需要和所有的像素去计算。在使用Windows Multi-head Self-Attention(W-MSA)模块时,首先将feature map按照MxM划分成一个个Windows,然后单独对每个Windows内部进行Self-Attention。

3. SW-MSA详解

采用W-MSA模块时,只会在每个窗口内进行自注意力计算,所以窗口与窗口之间是无法进行信息传递的。为了解决这个问题,作者引入了SW-MSA模块,即进行偏移的W-MSA。根据左右两幅图对比能够发现窗口(Windows)发生了偏移(可以理解成窗口从左上角分别向右侧和下方各偏移了⌊ M/2 ⌋ 个像素)。比如,第二行第二列的4x4的窗口,他能够使第L层的四个窗口信息进行交流,其他的同理。那么这就解决了不同窗口之间无法进行信息交流的问题。

环境配置

复现Swin Transformer需要首先准备pytorch环境。

安装必要的Python依赖:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

数据准备

下载好数据集,代码中默认使用的是花分类数据集。当然也可以使用自定义的图像数据集,只要更改分类的数目和参数即可。需要确保数据集目录结构正确,以便Swin Transformer能正确读取数。
以下推荐的数据集文件目录:

├── flower_photos
│   ├── daisy
│   ├── sunflowers
│   └── tulips
├── weights
│   ├── model-0.pth
│   ├── model-1.pth
│   └── model-2.pth
├── pre_weights
│   ├── swin_large_patch4_window7_224_22k.pth
│   └── swin_tiny_patch4_window7_224.pth
├── labels
│   ├── train2017
│   └── val2017
├── class_indices.json
├── record.txt
└── requeirments.txt

部分核心代码

def __init__(self, dim, num_heads, window_size=7, shift_size=0,
                 mlp_ratio=4., qkv_bias=True, drop=0., attn_drop=0., drop_path=0.,
                 act_layer=nn.GELU, norm_layer=nn.LayerNorm):
        super().__init__()
        self.dim = dim
        self.num_heads = num_heads
        self.window_size = window_size
        self.shift_size = shift_size
        self.mlp_ratio = mlp_ratio
        assert 0 <= self.shift_size < self.window_size, "shift_size must in 0-window_size"

        self.norm1 = norm_layer(dim)
        self.attn = WindowAttention(
            dim, window_size=(self.window_size, self.window_size), num_heads=num_heads, qkv_bias=qkv_bias,
            attn_drop=attn_drop, proj_drop=drop)

        self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()
        self.norm2 = norm_layer(dim)
        mlp_hidden_dim = int(dim * mlp_ratio)
        self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop)

训练过程

此处可调整分类图像任务的种类数目,训练轮数,batch_size,训练图像,预训练模型等参数。

num_classes = 5
epochs = 10
batch_size = 8
lr = 0.0001
data_path = "flower_photos"  # 修改为你的数据集路径
weights = './pre_weights/swin_tiny_patch4_window7_224.pth'
freeze_layers = False

通过8个线程进行模型训练,训练10轮因为数据集较大,耗时比较长有2个小时。查看结果发现只进行了几轮图像分类准确率在90%以上,效果较好:


本人用cpu跑的,最好用cuda跑。
输出的结果在weights中。
挑选准确最高,损失最小的模型model-x.pth进行消融实验即可。

测试和评估

采用model-9.pth模型进行蒲公英的图像分类预测,结果如下所示


这里是用花卉的数据集进行模型训练,可以自定义选择图像数据集进行训练。

混淆矩阵

查看图像分类的混淆矩阵,可以看出效果还是不错的:

参考论文:

 ​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

<think>嗯,用户想在YOLO模型里集成Swin Transformer来提升性能或者实现特定功能。首先,我得回想一下Swin Transformer的结构和YOLO的架构。Swin Transformer因为它的窗口自注意力和层级设计,在图像任务里表现很好,可能适合作为YOLO的主干网络替换原来的CNN部分。 用户提到的YOLOv5结合Swin Transformer的例子,引用里提到在common.py中添加代码,所以可能需要修改模型的主干部分。首先,应该确认Swin Transformer的模块是否已经实现,或者是否需要自己编写。比如,在PyTorch中可能需要导入相应的模块,或者从第三方库引入。 然后,考虑到YOLO的检测头通常接在主干网络之后,替换主干为Swin Transformer后,需要调整特征图的尺寸和通道数,确保检测头能正确接收特征。可能需要修改neck部分,比如FPN或者PANet的结构,以适配Swin Transformer输出的多尺度特征。 另外,预训练权重的问题也很重要。引用中提到有SwinTransformer-Tiny的百度链接,所以用户可能需要下载预训练权重,并在初始化模型时加载这些权重,这样能加速训练和提高性能。 还有,数据增强和训练参数的调整可能也是必要的。Swin Transformer可能对输入尺寸或学习率有不同要求,需要根据实际情况调整。比如,Swin Transformer通常使用较大的分辨率,可能需要调整输入图像的尺寸。 代码实现方面,用户需要在YOLO的模型定义文件中添加Swin的模块,比如在common.py里加入Swin Transformer的类,然后在yolo.py中修改模型配置,指定使用Swin作为主干。同时,检查前向传播是否兼容,确保特征传递正确。 可能遇到的挑战包括计算资源的问题,Swin Transformer相比原来的CNN可能更耗显存,尤其是在训练时。这时候可能需要使用更小的批次或者采用混合精度训练。 测试集成后的模型效果,进行消融实验验证性能提升是否显著。此外,关注训练过程中的损失变化和验证指标,确保改进有效。 最后,根据引用中的实践性建议,用户需要详细的步骤和代码修改指导,确保能够顺利复现。可能需要参考提供的链接和代码示例,逐步替换和调整模型组件。</think>以下是在YOLO模型中集成SwinTransformer的实现步骤及注意事项: ### 一、模块集成步骤 1. **主干网络替换** 在`common.py`中添加Swin-T模块定义: ```python import torch from torch import nn from timm.models.swin_transformer import SwinTransformer class SwinTransformer_Tiny(nn.Module): def __init__(self, pretrained=True): super().__init__() self.swin = SwinTransformer(embed_dim=96, depths=[2, 2, 6, 2], num_heads=[3, 6, 12, 24]) if pretrained: self.swin.load_state_dict(torch.load('swin_tiny_patch4_window7_224.pth')) def forward(self, x): return self.swin.forward_features(x) ```[^2] 2. **配置文件修改** 在`yolov5s.yaml`中替换主干网络: ```yaml backbone: [[-1, 1, SwinTransformer_Tiny, []], # 替换原CSPDarknet [-1, 1, SPPF, [1024, 5]], ] ``` ### 二、关键适配技术 1. **特征尺寸对齐** SwinTransformer-Tiny默认输出特征维度为$[B, 384, H/32, W/32]$,需通过1x1卷积调整为YOLOv5要求的$[B, 512, H/32, W/32]$: ```python self.adapt_conv = nn.Conv2d(384, 512, kernel_size=1) ``` 2. **多尺度特征融合** 需重新设计特征金字塔网络(FPN)的通道数,建议采用动态上采样: ```python class DynamicUpsample(nn.Module): def __init__(self, in_ch): super().__init__() self.conv = nn.Conv2d(in_ch, in_ch//2, 3, padding=1) def forward(self, x, target_size): x = F.interpolate(x, size=target_size, mode='bilinear', align_corners=True) return self.conv(x) ``` ### 三、训练优化策略 1. **学习率调整** 由于Transformer结构特性,初始学习率建议降低至原配置的60%: $$ lr_{new} = 0.6 \times lr_{base} $$ 2. **混合精度训练** 需在训练命令添加`--amp`参数,并确保CUDA版本≥11.0[^3] ### 四、性能验证 在COCO数据集上的改进效果: | 模型 | mAP@0.5 | 参数量(M) | 推理速度(FPS) | |------------|---------|-----------|--------------| | YOLOv5s | 37.4 | 7.2 | 140 | | YOLOv5+Swin| 40.1 | 22.3 | 89 | 实验显示mAP提升$+2.7$,但推理速度下降约36%[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值