使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)

使用Swin-Transformer-Semantic-Segmentation训练自己的数据

  • 系统配置
  • 代码链接
  • 针对MMCV 选择系统
    • Windows环境要求:
    • ubuntu 18.04
  • 安装swin segmentation
  • 制作VOC 数据集
  • 代码部分修改
  • 开始训练

恭喜Swin Transformer拿到2021 ICCV Best Paper!MSRA再一次拿到Best Paper,上一次可以追溯到ResNet,巧合的是,这一次也是通用骨干网络模型。

语义分割在ADE20K上刷到53.5 mIoU,超过之前SOTA大概4.5 mIoU!
最近Transformer的文章眼花缭乱,但是精度和速度相较于CNN而言还是差点意思,直到Swin Transformer的出现,让人感觉到了一丝丝激动,Swin Transformer可能是CNN的完美替代方案。

作者分析表明,Transformer从NLP迁移到CV上没有大放异彩主要有两点原因:1. 两个领域涉及的scale不同,NLP的scale是标准固定的,而CV的scale变化范围非常大。2. CV比起NLP需要更大的分辨率,而且CV中使用Transformer的计算复杂度是图像尺度的平方,这会导致计算量过于庞大。为了解决这两个问题,Swin Transformer相比之前的ViT做了两个改进:1.引入CNN中常用的层次化构建方式构建层次化Transformer 2.引入locality思想,对无重合的window区域内进行self-attention计算。

使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第1张图片
相比于ViT,Swin Transfomer计算复杂度大幅度降低,具有输入图像大小线性计算复杂度。Swin Transformer随着深度加深,逐渐合并图像块来构建层次化Transformer,可以作为通用的视觉骨干网络,应用于图像分类、目标检测和语义分割等任务。

Swin Transformer
在这里插入图片描述
整个Swin Transformer架构,和CNN架构非常相似,构建了4个stage,每个stage中都是类似的重复单元。和ViT类似,通过patch partition将输入图片HxWx3划分为不重合的patch集合,其中每个patch尺寸为4x4,那么每个patch的特征维度为4x4x3=48,patch块的数量为H/4 x W/4;stage1部分,先通过一个linear embedding将输划分后的patch特征维度变成C,然后送入Swin Transformer Block;stage2-stage4操作相同,先通过一个patch merging,将输入按照2x2的相邻patches合并,这样子patch块的数量就变成了H/8 x W/8,特征维度就变成了4C,这个地方文章写的不清楚,猜测是跟stage1一样使用linear embedding将4C压缩成2C,然后送入Swin Transformer Block。

另外有一个细节,Swin Transformer和ViT划分patch的方式类似,Swin Transformer也是先确定每个patch的大小,然后计算确定patch数量。不同的是,随着网络深度加深ViT的patch数量不会变化,而Swin Transformer随着网络深度的加深数量会逐渐减少并且每个patch的感知范围会扩大,这个设计是为了方便Swin Transformer的层级构建,并且能够适应视觉任务的多尺度。

使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第2张图片
上图是两个连续的Swin Transformer Block。其中一个Swin Transformer Block由一个带两层MLP的shifted window based MSA组成,另一个Swin Transformer Block由一个带两层MLP的window based MSA组成。在每个MSA模块和每个MLP之前使用LayerNorm(LN)层,并在每个MSA和MLP之后使用残差连接。
行了,不扯了,直接上干货!!!!!!!!!!!!!!

系统配置

  • 操作系统:Ubuntu 18.04
  • 内存:8G × 2
  • CPU:Intel® Core™ i5-8300H CPU @ 2.30GHz × 8
  • 显卡:NVIDIA GeForce GTX 3090 单卡

代码链接

github地址:https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation

针对MMCV 选择系统

ubuntu 配置环境很方便,所以不做详细介绍,只讲解win10安装方式:ubuntu安装方式会单独说

MMCV 选择系统时,由于mmcv-full 对windows目前没做高版本配置,相对不友好。需要自己下载源码编译。

Windows环境要求:

  • VS2019
  • pytorch 1.8.1
  • torchvision 0.9.1

安装虚拟环境

conda create -n swinseg python=3.8
conda activate swinseg conda
install pytorch=1.8 torchvision cudatoolkit=10.2 -c pytorch
pip install cython matplotlib opencv-python==4.5.1.48

安装vs2019,不需要安装全部包,只需要安装编译库即可,完成后查看如下路径是否存在,加粗部分会根据版本不同不同。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC*14.29.30037*\bin\Hostx86\x64

注意是vs2019 中间版本号可能不同 但是一定要Hostx86/x64的cl.exe。把cl.exe路径添加到系统环境变量并移至最上层 cuda10.2高于10.1.10.0

cmd set Path=C
cmd cl查看

打开anaconda power shell,切记是 anaconda power shell,要不然编译会出错,配置过程中注意不要开启VPN。

首先下载mmcv-1.2-7代码,代码包可在链接下载:

git (较慢):git clone https://github.com/open-mmlab/mmcv.git
本地博文库:https://download.csdn.net/download/weixin_38353277/82292837

安装mmcv
cd mmcv-1.2.7
pip install -r .\requirements.txt
查看英伟达显卡算力
在这里插入图片描述

$env:TORCH_CUDA_ARCH_LIST="8.6"  根据自己显卡算例设置。nvidia 官网可查
$env:MMCV_WITH_OPS = 1
$env:MAX_JOBS = 4  一般电脑核数

python setup.py build_ext
会显示下面的界面,有一个过程,这个才算在编译,若是一闪而过的话,那么大概率是出问题了
在这里插入图片描述
编译完成后的界面长下面这样

python setup.py develop  #时间会长点

在这里插入图片描述
完成后长下面这样(1.3.6之前编译界面)

在这里插入图片描述
注意事项
注意:不要在同一个环境下安装两个版本,否则可能会遇到类似ModuleNotFoundError. 您需要先卸载一个,然后再安装另一个。Installing the full version is highly recommended if CUDA is available.
windows端安装的时候,不能使用pip直接安装,需要使用源码安装
注意:MMCV 需要 Python3.6++。
编译的时候不能使用CMD进行编译,必须使用powershell进行编译才行
cuda就用10.2 PyTorch就用1.8,这个是一定可以配置成功的,其他的版本没试过,不做保证,可能会有各种各样的坑,如果愿意的话,可以自行尝试

报错
ERROR: Failed building wheel for mmcv-full
在这里插入图片描述

ERROR: Command errored out with exit status 1
安装过程中报错,原因是没有C++环境!
windows端安装的时候,不能使用pip直接安装,需要使用源码安装

ubuntu 18.04

一行搞定

pip install mmcv_full-1.2.7+torch1.7.0+cu110-cp38-cp38-manylinux1_x86_64.whl

版本自己可以换

安装swin segmentation

这是在swin segmentation目录下

pip install -r requirements.txt
pip install -e . --user (mmcv 安装有问题会报错)

也有 pip install segmentation

下载权重 demo/image_demo.py 修改–img --config --checkpoint路径 并运行
权重下载链接可以找我本地博文库,或者私信我,我发给你

制作VOC 数据集

代码默认用的是ADE20K数据集进行训练,其实都一样,我voc习惯了,所用就教教怎么用voc哈

ADE20K数据集 格式如下,按照要求放就完了

├── data
│   ├── ade
│   │   ├── ADEChallengeData2016
│   │   │   ├── annotations
│   │   │   │   ├── training
│   │   │   │   ├── validation
│   │   │   ├── images
│   │   │   │   ├── training
│   │   │   │   ├── validation

VOC 数据集格式是

├── VOCdevkit
│   ├── VOC2012
│   │   ├── ImageSets
│   │   │   ├── Segmentation
│   │   │   │   ├── train.txt
│   │   │   │   ├── val.txt
│   │   │   │   ├── trainval.txt

│   │   │   ├── JPEGImages
│   │   │   │   ├── *.jpg    #所有图片

│   │   │   ├── SegmentationClass
│   │   │   │   ├── *.jpg    #所有标签图

其中: train.txt val.txt trainval.txt 只要图片名,不需要后缀和路径 如下
在这里插入图片描述
train val 比例自己分,这里不做讲解

JPEGImages, SegmentationClass放的是所有图片和label,切记如果2分类SegmentationClass 标签是0,1。多分类以此类推 0,1,2,……

然后将数据集放置在路径tools/data/下,可以任意,我就放这里了

代码部分修改

  1. configs/base/datasets/pascal_voc12.py修改
    data_root 你放数据的位置

在这里插入图片描述
2 mmseg/datasets/voc.py修改
CLASSES PALETTE
在这里插入图片描述
多分类一样,自己改

  1. tool/train修改–config --work-dir --load_from

使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第3张图片
4. GPU iD 单卡时候
tool/train添加

'--gpu-ids',
        type=int,
		default=[1],
        nargs='+',

使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第4张图片

  1. config/base/models文件夹下对应的upernet_swin.py

    修改norm_cfg SyncBN->BN 单卡用BN
    修改num_classes 2处
    使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第5张图片
    使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第6张图片

6、config/swin文件夹下对应的在train设置的–config模型
使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第7张图片

修改所有num_classes

使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第8张图片
修改data[‘samples_per_gpu’]

使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)_第9张图片

预训练权重文件优先选择训练图片尺寸的大小

开始训练

进入到tools路径下 python train.py 即可完成模型训练

在这里插入图片描述

完成后测试效果
原图
在这里插入图片描述

测试结果
在这里插入图片描述
测试效果确实相当不错

测试代码需要的话私信我就行。

你可能感兴趣的:(Swin,transformer,transformer,深度学习,计算机视觉)