基于win10复现swin-transformer图像分类源码

本文详细介绍了Swin-Transformer的结构特点,并记录了在Windows 10环境下搭建实验环境的具体步骤,包括安装依赖库和解决多GPU训练时遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

       为了学业在tensorflow和pytorch中渐行渐远,复现他人的成果是一条不比自己创新简单的道路,过程中会遇到各种各样的问题,即使完全按照别人的步骤和过程来操作也会不断的遇到令人秃头的报错。但是大部分基于linux、docker等一些东西对于为了出成果以及初学者来说是一件吃力费劲的事情,所以基于windows10系统学习成了唯一的执著,同时也带来了一堆烦恼,只能在秃头的路上继续坚持!


一、swin-transformer结构

在这里插入图片描述
结构很优雅,在现有模型结构中一骑绝尘,效果均表现优异,短时间之内基于swin-transformer的成果创新层出不穷,再不学习来不及了,快上车!!!

二、环境搭建

复现代码最好使用与成果同样的环境,会避免很多的问题,此处为官方示例的步骤Swin Transformer for Image Classification,区别在于步骤:安装apex不同。下面步骤会全部叙述。

复现使用数据集:tiny-imagenet-200,
链接:https://pan.baidu.com/s/1JVPqlQfC_zM-UNvHAuZJCg
提取码:8888

1.克隆工程

官方代码:

git clone https://github.com/microsoft/Swin-Transformer.git
cd Swin-Transformer

2.创建环境

在anaconda命令行中创建环境:

conda create -n swin python=3.7 -y
conda activate swin

3.安装pytorch

官方代码:

conda install pytorch==1.7.1 torchvision==0.8.2 cudatoolkit=10.1 -c pytorch

安装其他版本参考上一篇博客,最好跟官方一样,不过后续这里会改动,接着看。

4.安装其他库

分别在命令行中执行:

pip install timm==0.3.2
pip install opencv-python==4.4.0.46 termcolor==1.1.0 yacs==0.1.8

5.安装Apex

Apex是一款基于 PyTorch 的混合精度训练加速神器

官方代码为(基于linux系统):

git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

因为我们是基于windows10操作系统,所以这里会有一点不一样。具体步骤如下:

       1.在github下载源码https://github.com/NVIDIA/apex 到本地文件夹(安装步骤第一步网盘中也有相关文件资源);

       2.在命令行中切换到apex所在文件夹;

       3.输入命令: python setup.py install 等待安装完成即可。

举例操作如下:(假定已经下载好apex文件,此处以放在E盘根目录为例)

$ 接第四步安装完其他库之后,在anaconda命令行 中先将路径切换到E盘符

在这里插入图片描述
$ 然后继续将路径切换指定到apex文件夹


$ 最后输入 python setup.py install ,回车,等待apex安装完成。

在这里插入图片描述

6.小结

环境搭建过程就是上述这些,整个工程文件夹如下图所示,其中imagenet是存放数据集文件夹,pth是预训练模型文件夹,output为模型保存文件夹(程序运行时会自动创建),其他文件夹均为官方代码工程文件。

在这里插入图片描述
敲黑板
imagenet数据集太大,所以跑的时候用的是tiny-imagenet-200数据集(下载链接见第二章开头),而下载下来的数据集结构如下:

在这里插入图片描述
在这里插入图片描述

可以看到val验证集里面是一堆图片,没有像train训练集那样分类放在子文件夹下,而官方标准数据文件夹结构如下:

在这里插入图片描述
所以需要对val处理一下,编写一个 .py 自动执行脚本,代码如下:

import glob
import os
from shutil import move
from os import rmdir

target_folder = './imagenet/val/'

val_dict = {}
with open('./imagenet/val/val_annotations.txt', 'r') as f:
    for line in f.readlines():
        split_line = line.split('\t')
        val_dict[split_line[0]] = split_line[1]
# print(val_dict)
# print(val_dict.keys())

paths = glob.glob('E:\\Swin-Transformer\\imagenet\\val\\images\\*')
for path in paths:
    file = path.split('\\')[-1]
    # print(file)
    folder = val_dict[file]
    if not os.path.exists(target_folder + str(folder)):
        os.mkdir(target_folder + str(folder))
        os.mkdir(target_folder + str(folder) + '/images')

for path in paths:
    file = path.split('\\')[-1]
    folder = val_dict[file]
    dest = target_folder + str(folder) + '/images/' + str(file)
    move(path, dest)

rmdir('./imagenet/val/images')

其中的路径按照自己的来改,注意/和\的区别,可以把脚本文件放到工程文件里,然后在pycharm中右键运行就好了,得到和train一样的文件结构。

7.代码运行

下述均在终端Terminal中运行

1.在imagenet上训练swin transformer模型:

官方代码:

python -m torch.distributed.launch --nproc_per_node <num-of-gpus-to-use> --master_port 12345  main.py --cfg <config-file> --data-path <imagenet-path> [--batch-size <batch-size-per-gpu> --output <output-directory> --tag <job-tag>]

尖括号中参数需自己配置,可以运行如下示例:

python -m torch.distributed.launch --nproc_per_node 4 --master_port 12345 main.py --cfg configs/swin_tiny_patch4_window7_224.yaml --data-path imagenet --batch-size 64

其中 nproc_per_node 为GPU数量,可以设置为自己拥有的数量,不修改的话也可以,忽略警告即可;master_port 为端口号,如果此处报错 RuntimeError: Address already in use ,可以更改为其他空闲端口,如23467,88888等。

2. 模型评估

官方代码:

python -m torch.distributed.launch --nproc_per_node <num-of-gpus-to-use> --master_port 12345 main.py --eval --cfg <config-file> --resume <checkpoint> --data-path <imagenet-path> 

实际运行可为:

python -m torch.distributed.launch --nproc_per_node 4 --master_port 12345 main.py --eval --cfg configs/swin_tiny_patch4_window7_224.yaml --resume/pth/swin_tiny_patch4_window7_224.pth --data-path imagenet

三、出现问题及解决办法

因为我们是在windows10上运行代码,所以做到上述第7步会出现报错导致代码运行不了,需要做一些修改。

1) 提示在main.py文件第312行报错,如图:

在这里插入图片描述

解决方法:将 backend=‘nccl’ 修改为 backend=‘gloo’,原因是win10暂时不支持nccl模式,即第312行改为:

torch.distributed.init_process_group(backend='gloo', init_method='env://', world_size=world_size, rank=rank)

2) 重新运行,阿偶,依然报错,错误同上图类似,为RuntimeError: No rendezvous handler for env://,这个问题很头疼,源于多GPU训练,而且windows对pytorch分布式计算支持不够,网上可以参考的解决办法很少。

解决办法:
修改环境配置,没看错,将pytorch版本更新,即将pytorch 1.7.1+torchvision 0.8.2 版本更新为pytorch 1.8.1+torchvision 0.9.1(upgrade作用好像是更新到最新版本,最新版本的话会出现其它问题)

conda install pytorch==1.8.1 torchvision==0.9.1 cudatoolkit=10.1 -c pytorch

其他办法
这个方法是从官方社区看到的,自己太菜没有尝试,思路为将代码中分布式训练的DistributedDataParallel修改为Dataparallel,或者将分布式训练的代码直接去掉。

究极办法
换电脑!换电脑!换电脑!
最终在3个2080Ti的电脑上跑的很顺畅。平时用的电脑是NVIDIA Quadro P4000,代码能跑倒是能跑,有时会报错RuntimeError: CUDA error: invalid device ordinal,有时直接第一轮训练跑一点就直接Killing subprocess,所以不管是不是win10系统,代码运行跟电脑配置还是有很大关系的!


总结

折腾了四五天时间,最终以batch size=64 在3个2080 Ti 电脑上跑了将近26个小时,才跑完在imagenet上建立模型的过程,评估过程倒是很快,最终结果还挺不错。

鸽了很久才写完这篇,想表达的东西有很多,想起来再做补充,谨以此作为学习笔记和心得分享!


### 关于Swin Transformer用于目标检测的复现教程 #### 下载并安装依赖库 为了能够顺利运行Swin Transformer的目标检测模型,需要先准备好相应的开发环境。这通常意味着要获取官方提供的源码仓库,并按照指示来构建适合实验的工作空间[^1]。 对于具体的实践操作而言,可以从GitHub上克隆`Swin-Transformer-Object-Detection`项目到本地计算机: ```bash git clone https://github.com/microsoft/Swin-Transformer.git cd Swin-Transformer/ ``` 接着依据文档说明完成必要的软件包安装过程,比如通过pip工具安装Python所需的第三方模块等。 #### 配置mmdetection框架 由于Swin Transformer的对象检测功能建立在mmdetection之上,因此还需要特别关注该平台的相关设定事项。具体来说就是调整参数选项、指定预训练权重路径以及定义新的数据集接口等方面的内容[^2]。 当一切准备就绪之后,可以参照如下命令来进行初步测试: ```bash python tools/train.py configs/swin/cascade_mask_rcnn_swin_base_patch4_window7.pth --gpus 1 ``` 上述指令将会启动单GPU模式下的Cascade Mask R-CNN算法训练流程,所使用的骨干网络即为Swin Base variant版本。 #### 自定义数据集适配指南 如果打算利用这套体系结构处理自有的图像资料,则需进一步学习有关如何创建适用于特定应用场景的数据集描述文件。这部分工作涉及到标注图片中的感兴趣区域(ROI),并将这些信息转换成符合预期输入格式的标准JSON档[^3]。 此外,在某些情况下可能还会遇到其他形式的支持资源可供选用,例如由社区成员维护的扩展版实现方案也能提供额外的帮助和支持[^4]。 #### 示例代码片段展示 下面给出一段简单的Python脚本作为例子,展示了怎样加载预训练好的Swin Transformer模型并对一张给定的照片执行推理预测任务: ```python from mmdet.apis import init_detector, inference_detector, show_result_pyplot config_file = 'configs/swin/cascade_mask_rcnn_swin_tiny_patch4_window7.pth' checkpoint_file = './checkpoints/cascade_mask_rcnn_swin-t-p4-w7_fpn_1x_coco.pth' model = init_detector(config_file, checkpoint_file) img = 'demo/demo.jpg' result = inference_detector(model, img) show_result_pyplot(img, result) ``` 此段程序首先初始化了一个基于Swin Tiny架构的实例分割器对象;随后读取了一张名为'demo.jpg'的样本照片并通过调用`inference_detector()`函数获得其对应的识别结果;最后借助matplotlib库将最终可视化效果呈现出来。
评论 79
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值