SwinTransformer实战:timm使⽤、Mixup、Cutout和评分⼀⽹打尽,。。。⽂章⽬录
摘要
本例提取了植物幼苗数据集中的部分数据做数据集,数据集共有12种类别,演⽰如何使⽤timm版本的Swin Transformer图像分类模型实现分类任务已经对验证集得分的统计,本⽂实现了多个GPU并⾏训练。
通过本⽂你和学到:
1、如何从timm调⽤模型、loss和Mixup?
2、如何制作ImageNet数据集?
3、如何使⽤Cutout数据增强?
4、如何使⽤Mixup数据增强。
5、如何实现多个GPU训练和验证。
6、如何使⽤余弦退⽕调整学习率?
7、如何使⽤classification_report实现对模型的评价。
8、预测的两种写法。
城市空间Swin Transformer简介
⽬标检测刷到58.7 AP!
实例分割刷到51.1 Mask AP!
语义分割在ADE20K上刷到53.5 mIoU!
今年,微软亚洲研究院的Swin Transformer⼜开启了吊打CNN的模式,在速度和精度上都有很⼤的提⾼。这篇⽂章带你实现Swin Transformer图像分类。
资料汇总
⼀些⼤佬的B站视频:
2、ClimbingVision社区:
关于Swin Transformer的资料有很多,在这⾥就不⼀⼀列举了,我觉得理解这个模型的最好⽅式:源码+论⽂。
数据增强Cutout和Mixup
为了提⾼成绩我在代码中加⼊Cutout和Mixup这两种增强⽅式。实现这两种增强需要安装torchtoolbox。安装命令:
pip install torchtoolbox
Cutout实现,在transforms中。
ansform import Cutout
# 数据预处理
transform = transforms.Compo([
transforms.Resize((224,224)),
Cutout(),
transforms.ToTensor(),
transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
])
需要导⼊包:from timm.data.mixup import Mixup,
定义Mixup,和SoftTargetCrossEntropy
mixup_fn = Mixup(
mixup_alpha=0.8, cutmix_alpha=1.0, cutmix_minmax=None,
prob=0.1, switch_prob=0.5, mode='batch',
label_smoothing=0.1, num_class=12)
criterion_train = SoftTargetCrossEntropy()
项⽬结构
Swin_demo
├─data
│├─Black-grass
│├─Charlock
│├─Cleavers
│├─Common Chickweed
│├─Common wheat
│├─Fat Hen
│├─Loo Silky-bent
│├─Maize
│├─Scentless Mayweed
│├─Shepherds Pur
│├─Small-flowered Cranesbill
│└─Sugar beet
├─mean_std.py
├─makedata.py
├─train.py
├─test1.py
└─test.py解决失眠的最佳方法
mean_std.py:计算mean和std的值。
makedata.py:⽣成数据集。
计算mean和std
为了使模型更加快速的收敛,我们需要计算出mean和std的值,新建mean_std.py,插⼊代码:
from torchvision.datats import ImageFolder
import torch
from torchvision import transforms
def get_mean_and_std(train_data):
train_loader = torch.utils.data.DataLoader(
train_data, batch_size=1, shuffle=Fal, num_workers=0,表内除法
pin_memory=True)
mean = s(3)
std = s(3)
for X, _ in train_loader:
格言联壁
for d in range(3):
mean[d]+= X[:, d,:,:].mean()
std[d]+= X[:, d,:,:].std()
mean.div_(len(train_data))
std.div_(len(train_data))
return list(mean.numpy()),list(std.numpy())
if __name__ =='__main__':
train_datat = ImageFolder(root=r'data1', transform=transforms.ToTensor())
print(get_mean_and_std(train_datat))
数据集结构:
运⾏结果:
([0.3281186, 0.28937867, 0.20702125], [0.09407319, 0.09732835, 0.106712654])把这个结果记录下来,后⾯要⽤!
⽣成数据集
我们整理还的图像分类的数据集结构是这样的
data
├─Black-grass
├─Charlock
├─Cleavers
├─Common Chickweed
├─Common wheat
├─Fat Hen
├─Loo Silky-bent
├─Maize
├─Scentless Mayweed
├─Shepherds Pur
├─Small-flowered Cranesbill
└─Sugar beet
pytorch和keras默认加载⽅式是ImageNet数据集格式,格式是
││├─Black-grass
││├─Charlock
││├─Cleavers
││├─Common Chickweed
││├─Common wheat
││├─Fat Hen
││├─Loo Silky-bent
││├─Maize
││├─Scentless Mayweed
││├─Shepherds Pur
││├─Small-flowered Cranesbill
││└─Sugar beet
│└─train
│├─Black-grass
│├─Charlock
│├─Cleavers
│├─Common Chickweed
│├─Common wheat
│├─Fat Hen
│├─Loo Silky-bent
│├─Maize
│├─Scentless Mayweed
│├─Shepherds Pur
│├─Small-flowered Cranesbill
│└─Sugar beet
新增格式转化脚本makedata.py,插⼊代码:
import shutil
image_list=glob.glob('data1/*/*.png')
print(image_list)
file_dir='data'
if ists(file_dir):
print('true')
#os.rmdir(file_dir)
<(file_dir)#删除再建⽴
os.makedirs(file_dir)
el:
os.makedirs(file_dir)
del_lection import train_test_split
牛黄解毒片的副作用
trainval_files, val_files = train_test_split(image_list, test_size=0.3, random_state=42)
train_dir='train'
val_dir='val'
train_root=os.path.join(file_dir,train_dir)
val_root=os.path.join(file_dir,val_dir)
for file in trainval_files:
file_place("\\","/").split('/')[-2]
file_place("\\","/").split('/')[-1]
file_class=os.path.join(train_root,file_class)
if not os.path.isdir(file_class):
os.makedirs(file_class)
for file in val_files:领袖气质
file_place("\\","/").split('/')[-2]
file_place("\\","/").split('/')[-1]
file_class=os.path.join(val_root,file_class)三板交易
if not os.path.isdir(file_class):
os.makedirs(file_class)
训练
完成上⾯的步骤后,就开始train脚本的编写,新建train.py.
导⼊项⽬使⽤的库
import torch
as nn
parallel
import torch.optim as optim
import torch.utils.data
import torch.utils.data.distributed一年级小故事
import torchvision.datats as datats
ansforms as transforms
ics import classification_report
from timm.data.mixup import Mixup
from timm.loss import SoftTargetCrossEntropy
dels import swin_small_patch4_window7_224
ansform import Cutout
设置全局参数
设置学习率、BatchSize、epoch等参数,判断环境中是否存在GPU,如果没有则使⽤CPU。建议使⽤GPU,CPU太慢了。