Swin Transformer for Image Classification【代码】

先把代码跑起来吧(验证一个分类模型)

拿代码,配环境

按照Readme辛辛苦苦配了半天的环境,结果一直报错Numpy有问题。抱着绝望的心情随便试了一下之前项目的环境,一秒跑通,真的难以评价。跑通的环境配置为:

python 3.11.5
pytorch-cuda 12.1
NVIDIA GeForce RTX 4070(CUDA 11.8 + cudnn 8.9.7.29)

验证数据准备

我最开始是按照Readme去下载ImageNet数据集,但是这个数据集太大太劝退了,可以先按照Swin Transformer实战图像分类,去下载了猫狗大战数据集来试试手。数据准备过程也按照这篇博文来就可以。
之后,我去下载了ImageNet的验证集 val。验证集比较小只有6G。但是具体是哪个数据集不重要,只要先把程序跑起来这一步就成功了!这里先使用了standard folder dataset方式,不需要额外的标签文件,把图片按照不同的分类存放就可以了。

$ tree data
imagenet
├── train
│ ├── class1
│ │ ├── img1.jpeg
│ │ ├── img2.jpeg
│ │ └── …
│ ├── class2
│ │ ├── img3.jpeg
│ │ └── …
│ └── …
└── val
├── class1
│ ├── img4.jpeg
│ ├── img5.jpeg
│ └── …
├── class2
│ ├── img6.jpeg
│ └── …
└── …

不过这里有一个坑,我从官网直接download的 val 数据对应的 label 是这样的:(ILSVRC2012_validation_ground_truth.txt)

490
361
171
822
297
482
13
704
599
164

我按照这样的映射,将验证图片分类存放在对应的文件夹下,结果跑出来的正确率接近于零。果然ImageNet数据集简介里提到了,验证集的label需要进行重映射。我从这里ImageNet-1K直接下载了已经重新映射好的label文件,名为image1k_val_list.txt。

ILSVRC2012_val_00000001.JPEG 65
ILSVRC2012_val_00000002.JPEG 970
ILSVRC2012_val_00000003.JPEG 230
ILSVRC2012_val_00000004.JPEG 809
ILSVRC2012_val_00000005.JPEG 516
ILSVRC2012_val_00000006.JPEG 57
ILSVRC2012_val_00000007.JPEG 334
ILSVRC2012_val_00000008.JPEG 415
ILSVRC2012_val_00000009.JPEG 674
ILSVRC2012_val_00000010.JPEG 332
ILSVRC2012_val_00000011.JPEG 109
ILSVRC2012_val_00000012.JPEG 286

可以看到现在的label跟swin transformer的get_started.md里的演示就一致了。然后写一个程序来按照标签分类存放图片:

import os
import shutil

# 文件夹路径和标签文件路径
image_folder = "ILSVRC2012_img_val"  # 替换为存放图像的文件夹路径
txt_file = "val_map.txt"  # 替换为标签文件路径
output_folder = "output"  # 输出文件夹路径,按标签分类的子文件夹会放在这里

# 获取图像文件列表并按文件名排序
image_files = sorted(os.listdir(image_folder))

# 读取标签文件
with open(txt_file, "r") as f:
    labels = f.readlines()

# 检查图像文件数量和标签数量是否一致
if len(image_files) != len(labels):
    print(f"Error: Number of images ({
     
     len(image_files)}) and labels ({
     
     len(labels)}) do not match.")
    exit()

# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)

# 按标签将图像移动到对应的子文件夹
for image_file, label in zip(image_files, labels):
    label = label.strip()  # 去除标签中的换行符
    label_parts = label.split()  # 分割标签行
    if len(label_parts) != 2:
        print(f"Error: Invalid label format in line: {
     
     label}")
        continue
    image_name, label_number = label_parts
    label_number = int(label_number)  # 将标签编号转换为整数

    # 创建标签子文件夹(如果不存在),并在标签编号前添加前导零
    label_folder = os.path.join(output_folder, str(label_number).zfill(3))  # 这里用 zfill(3) 补充前导零
    os.makedirs(label_folder, exist_ok=True)

    # 获取图像的路径
    image_path = os.path.join(image_folder, image_name)

    # 将图像文件移动到标签子文件夹
    if os.path.exists(image_path):
        shutil.move(image_path, os.path.join(label_folder, image_name))
        print(f"Moved {
     
     image_name} to {
     
     label_folder}")
    else:
        print(f"Image {
     
     image_name} not found in {
     
     image_folder}. Skipping.")

print("All images have been categorized into their respective label folders.")

这里要将子文件夹的名字补零,确保是升序排列的(即"000"、“001”、…“999”)。不然ImageFolder自动映射的时候会出错。

可以在build.py里打印映射结果:

def build_dataset(is_train, config):
................
            root = os.path.join(config.DATA.DATA_PATH, prefix)
            print(f"Data path: {
     
     root}")
            dataset = datasets.ImageFolder(root, transform=transform)
            print("Class to Index mapping:", dataset.class_to_idx)
................

验证集的映射结果:

Data path: data/imageNet\val
Class to Index mapping: {‘000’: 0, ‘001’: 1, ‘002’: 2, ‘003’: 3, ‘004’: 4, ‘005’: 5, ‘006’: 6, ‘007’: 7, ‘008’: 8, ‘009’: 9, ‘010’: 10, ‘011’: 11,…‘999’: 999}

映射是正确的。

下载预训练模型

略。

修改部分参数配置

学习率相关

把main.py的这几行预定义的关于学习率的代码注释掉,不然我们设置的新的学习率传递不进去:

  # linear scale the learning rate according to total batch size, may not be optimal
    linear_scaled_lr = config.TRAIN.BASE_LR * config.DATA.BATCH_SIZE * world_size / 512.0
    linear_scaled_warmup_lr = config.TRAIN.WARMUP_LR * config.DATA.BATCH_SIZE * world_size / 512.0
    linear_scaled_min_lr = config.TRAIN.MIN_LR * config.DATA.BATCH_SIZE * world_size / 512.0

    # gradient accumulation also need to scale the learning rate
    if config.TRAIN.ACCUMULATION_STEPS > 1:
        linear_scaled_lr = linear_scaled_lr * config.TRAIN.ACCUMULATION_STEPS
        linear_scaled_warmup_lr = linear_scaled_warmup_lr * config.TRAIN.ACCUMULATION_STEPS
        linear_scaled_min_lr = linear_scaled_min_lr * config.TRAIN.ACCUMULATION_STEPS

    # Update config with new learning rates
    config.defrost()
    config.TRAIN.BASE_LR = linear_scaled_lr
    config.TRAIN.WARMUP_LR = linear_scaled_warmup_lr
    config.TRAIN.MIN_LR = linear_scaled_min_lr
    config.freeze()

分布式训练相关

  1. 不需要分布式训练的话,所有涉及分布式训练的代码都改掉。main.py这里改成:
if __name__ == '__main__':
    args, config = parse_option()

    
感应异步电机转子磁场定向控制基于模型参考自适应观测器(MRAS)+模数最优法整定电流环和对称最优法整定速度环的无感算法(Simulink仿真实现)内容概要:本文介绍了感应异步电机转子磁场定向控制的无感算法,结合模型参考自适应观测器(MRAS)实现转速和磁链的在线估计,省去机械传感器,提升系统可靠性。控制系统采用经典的双闭环结构,其中电流环通过模数最优法进行PI参数整定,以获得快速响应和良好稳定性;速度环则采用对称最优法进行调节器设计,增强抗干扰能力和动态性能。整个控制策略在Simulink环境中完成建模与仿真,验证了其在无位置传感器条件下仍能实现高性能调速的可行性。; 适合人群:自动化、电气工程及相关专业的研究生、高校科研人员以及从事电机控制、电力电子与运动控制领域的工程技术人员。; 使用场景及目标:①用于研究无速度传感器电机控制技术,特别是MRAS在转速辨识中的应用;②掌握模数最优法与对称最优法在电流环和速度环PI参数整定中的设计流程与工程实践;③通过Simulink仿真平台复现先进控制算法,服务于教学实验、科研项目或工业原型开发。; 阅读建议:建议读者结合Simulink模型同步学习,重点关注MRAS观测器的构建原理、PI参数整定的理论推导与仿真验证环节,同时可进一步拓展至参数鲁棒性分析与实际硬件实现。
### 如何在 Docker 容器中运行 Swin Transformer 要在 Docker 容器中成功运行 Swin Transformer,需遵循以下方法: #### 准备工作 确保已安装并配置好 Docker 环境。如果尚未安装 Docker,请先完成其安装过程[^2]。 #### 创建 Dockerfile 创建一个 `Dockerfile` 文件来定义容器环境。以下是适用于运行 Swin Transformer 的基本模板: ```dockerfile # 使用 NVIDIA 提供的基础镜像 FROM nvidia/cuda:11.3-base-ubuntu20.04 # 设置工作目录 WORKDIR /app # 安装依赖项 RUN apt-get update && \ apt-get install -y --no-install-recommends \ python3-pip \ python3-dev \ git \ build-essential \ libjpeg-dev \ zlib1g-dev && \ rm -rf /var/lib/apt/lists/* # 升级 pip 并安装基础库 RUN pip3 install --upgrade pip setuptools wheel # 克隆 Swin Transformer 仓库 RUN git clone https://github.com/microsoft/Swin-Transformer.git /app/swin-transformer # 切换到项目目录并安装依赖 WORKDIR /app/swin-transformer RUN pip3 install -r requirements.txt # 配置模型推理所需的额外组件 COPY config.py /app/swin-transformer/config.py # 下载预训练权重文件 (可选) RUN mkdir checkpoints && \ wget -O checkpoints/swin_tiny_patch4_window7_224.pth https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth # 运行命令入口 CMD ["python", "demo/demo_image_classification.py"] ``` 此脚本基于 NVIDIA CUDA 基础镜像构建了一个适合运行 PyTorch 和 Swin Transformer 的环境,并包含了必要的 Python 库和模型权重下载步骤[^3]。 #### 构建 Docker 镜像 通过执行以下命令构建自定义镜像: ```bash docker build -t swin-transformer . ``` #### 启动容器 启动容器时可以挂载本地数据集路径以便处理输入图像或视频流。例如: ```bash docker run -it --rm --gpus all -v $(pwd)/images:/app/images swin-transformer ``` 上述命令启用了 GPU 支持并将当前主机上的 `./images` 目录映射至容器内的 `/app/images` 路径下[^4]。 #### 测试 Pipeline 实现 对于测试阶段的数据管道调整部分,可以根据实际需求修改配置文件中的 pipeline 参数设置。具体操作如下所示: ```python from mmcv import Config, DictAction from mmdet.datasets.pipelines import Compose from torch.utils.data.dataloader import default_collate as collate cfg = Config.fromfile('config.py') if isinstance(img, str): if cfg.data.test.pipeline[0]['type'] != 'LoadImageFromFile': cfg.data.test.pipeline.insert(0, dict(type='LoadImageFromFile')) else: if cfg.data.test.pipeline[0]['type'] == 'LoadImageFromFile': cfg.data.test.pipeline.pop(0) test_pipeline = Compose(cfg.data.test.pipeline) data = test_pipeline(dict(img_info=dict(filename=img), img_prefix=None)) data = collate([data], samples_per_gpu=1) ``` 以上代码片段展示了如何动态调整 MMDetection 中的测试流程以适应不同类型的输入源[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值