语义分割在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计算。
相比于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 Block。其中一个Swin Transformer Block由一个带两层MLP的shifted window based MSA组成,另一个Swin Transformer Block由一个带两层MLP的window based MSA组成。在每个MSA模块和每个MLP之前使用LayerNorm(LN)层,并在每个MSA和MLP之后使用残差连接。
行了,不扯了,直接上干货!!!!!!!!!!!!!!
github地址:https://github.com/SwinTransformer/Swin-Transformer-Semantic-Segmentation
ubuntu 配置环境很方便,所以不做详细介绍,只讲解win10安装方式:ubuntu安装方式会单独说
MMCV 选择系统时,由于mmcv-full 对windows目前没做高版本配置,相对不友好。需要自己下载源码编译。
安装虚拟环境
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直接安装,需要使用源码安装
一行搞定
pip install mmcv_full-1.2.7+torch1.7.0+cu110-cp38-cp38-manylinux1_x86_64.whl
版本自己可以换
这是在swin segmentation目录下
pip install -r requirements.txt
pip install -e . --user (mmcv 安装有问题会报错)
也有 pip install segmentation
下载权重 demo/image_demo.py 修改–img --config --checkpoint路径 并运行
权重下载链接可以找我本地博文库,或者私信我,我发给你
代码默认用的是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/下,可以任意,我就放这里了
2 mmseg/datasets/voc.py修改
CLASSES PALETTE
多分类一样,自己改
'--gpu-ids',
type=int,
default=[1],
nargs='+',
6、config/swin文件夹下对应的在train设置的–config模型
修改所有num_classes
预训练权重文件优先选择训练图片尺寸的大小
进入到tools路径下 python train.py 即可完成模型训练
完成后测试效果
原图
测试结果
测试效果确实相当不错
测试代码需要的话私信我就行。