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

2023-11-11


恭喜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计算。

在这里插入图片描述
相比于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之后使用残差连接。
行了,不扯了,直接上干货!!!!!!!!!!!!!!

系统配置

  • 操作系统: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

在这里插入图片描述
4. GPU iD 单卡时候
tool/train添加

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

在这里插入图片描述

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

    修改norm_cfg SyncBN->BN 单卡用BN
    修改num_classes 2处
    在这里插入图片描述
    在这里插入图片描述

6、config/swin文件夹下对应的在train设置的–config模型
在这里插入图片描述

修改所有num_classes

在这里插入图片描述
修改data[‘samples_per_gpu’]

在这里插入图片描述

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

开始训练

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

在这里插入图片描述

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • python3 学习笔记(三):函数与模块

    python3 学习笔记 python 优雅 明确 简单 函数与模块 1 函数 组织好的 可重复使用的 用来实现某一功能的代码段 1 定义 def function x pass 其中 def为关键字 function 为函数名 x为形参
  • C语言基础知识--weak关键字

    目录 一 C语言弱函数定义 weak关键字 1 weak关键字简介 2 weak关键字使用示例 二 总结 一 C语言弱函数定义 weak关键字 1 weak关键字简介 使用 attribute weak 修饰函数 告诉编译器此函数为同名函数
  • 修改服务器404页面,Apache服务器404页面设置具体步骤

    在网站运营过程中 由于某些原因有时候要对网页进行删除 也就意味以后用户或者用户访问删除页面都是访问不了的 如果用户和搜索引擎访问错误页面返回值不是404的话 那么就很不友好 大大增加跳出率 404页面就是引导用户从错误的页面访问到正确的页面
  • 经典算法题收集一

    1 题目一 有 n个人围成一圈 顺序排号 从第一个人开始报数 从 1 到 3 报数 凡报到 3 的人退出圈子 问最后留下的是原来第几号的那位 其实这是一个约瑟夫环问题 这个问题最本质其实就是循环链表的问题 围成一个圈之后 报数即是循环链表的
  • Oracle小数连接字符串时开头的0不见的问题

    小数在连接成字符串的时候 如果小数的开头是0 几的话 前面的 0 会被省略掉 在excel中也有这个特点 具体是为什么不清楚 如 select 0 8 from dual 结果 8 可以用下面的方式避免 防止导致查询到的最终结果不合适 se
  • leetcode分类刷题:基于数组的双指针(四、小的移动)

    leetcode上有些题是真的太难了 正常读题之后完全想不到要用双指针来求解 本次博客总结的题目是双指针初始时位于数组两端 哪个元素小就移动哪个指针 11 盛最多水的容器 1 这道题放在42 接雨水的相似题目里 可能是因为它们都有相似的双指

随机推荐

  • Android 10.0系统启动之init进程-[Android取经之路]

    原文链接 https blog csdn net yiranfeng article details 103549394 摘要 init进程是linux系统中用户空间的第一个进程 进程号为1 当bootloader启动后 启动kernel
  • CTFshow 击剑杯 部分WP

    摆烂了摆烂了 太难了 聪明的师傅已经组队打起月赛了 试试能不能苟住前5 苟住了 复现的后面再补充吧 文章目录 1 Misc 中文识别带师 2 Web 简单的验证码 easyPOP 3 Pwn pwn01 My sword is ready
  • FOX算法的MPI实现

    算法描述如下 将待相乘的矩阵A和B分成p个方块Ai j和Bi j 0 j i p 1 每块大小为 n p n p 并将他们分配给 p p 个处理器 开始时处理器Pi j存放有Ai j和Bi j 并负责计算块Ci j 然后Fox算法执行以下
  • 离线强化学习(Offline RL)系列7: (状态处理) OfflineRL中的状态空间的数据增强(7种增强方案)

    Arxiv原文 S4RL Surprisingly Simple Self Supervision for Offline Reinforcement Learning in Robotics 本文是由多伦多大学 斯坦福大学和Nvidia三
  • elementUI组件修改样式 覆盖无效

    在我们使用第三方UI组件库开发时有时需要对这些组件进行一些样式修改 为了vue页面样式模块化 不对全局样式造成污染 我们往往都会加入scoped属性用来限制样式的作用域 然而这也会导致当我们修改部分ui组件样式失效 为了避免这种情况 我们常
  • 区块链系统:什么是私钥?

    在比特币中 私钥本质上就是一个256位的随机整数 我们以JavaScript为例 演示如何创建比特币私钥 在JavaScript中 内置的Number类型使用56位表示整数和浮点数 最大可表示的整数最大只有9007199254740991
  • 经典C语言面试题1:malloc 和 new的区别?

    malloc free是 C C语言的标准库函数 而new delete是C 的运算符 malloc内存分配成功返回的类型为void 需要通过强制类型转换将void 转换为我们需要的类型 new内存分配失败时会抛出bac alloc异常 不
  • 51单片机开发:通过74HC595控制LED点阵

    1 LED点阵介绍 1 LED点阵就是多个LED发光二极管的集合 在单个LED的发光原理上没有任何区别 2 上面是16x16的LED点阵 总共有16x16 256个LED灯 由32个引脚来控制 其中16个引脚是正极 posn n 1 2 1
  • 数据结构:JAVA 顺序表

    今天介绍的是java里面的顺序表 目录 1 新建一个类并且初始化几个变量 2 display方法 展示数组 3 add方法 添加新元素 4 contains 查询需要找的元素在不在数组中 indexOf 找到这个元素 5 get和set 获
  • mongoDB (zip安装配置)+自动运行

    目录 一 mongo下载 二 文件配置 三 环境变量设置 cmd运行测试 四 设置自动运行 一 mongo下载 下载网址 Download MongoDB Community Server MongoDB 选择zip方式下载 如图 下载完后
  • python怎么产生随机浮点数_玩转random---随机数模块

    random模块介绍 主要用于生成随机数 大部分python人都会用 但是一般人都是使用randint 帮我们生成某个范围的整数 但其实random模块还有很多非常使用的功能供我们使用 接下来我们就一一了解一下我们的random 使用方法
  • JAVA 字符串中找出连续最长的数字串

    题目要求 读入一个字符串str 输出字符串str中的连续最长的数字串 输入描述 个测试输入包含1个测试用例 一个字符串str 长度不超过255 输出描述 在一行内输出str中里连续最长的数字串 示例 输入 abcd12345ed125ss1
  • 灰色预测模型

    一 灰色预测的概念及思想 灰色系统是指系统数据有一些是未知 有一些是已知 白色系统是全都已知 黑色系统是全都未知 而灰色预测就是对含有已知和未知信息的系统进行预测 寻找数据变动规律 生成有较强规矩性的序列 再建立相应的微分方程模型 来对事物
  • Java小项目之简单职工信息管理系统(io流存储数据)

    项目要求 设计一个职工信息管理系统 提供以下功能 1 职工信息录入功能 职工信息用文件保存 输入 2 职工信息浏览功能 输出 3 查询或排序功能 至少一种查询方式 算法 按工资查询 按学历查询等 4 职工信息删除功能 5 职工信息修改功能
  • GE IS220PDIAH1A 336A4940CSP1 控制主板模块

    GE IS220PDIAH1A 336A4940CSP1 是一款控制主板模块 通常用于工业自动化和控制系统中 以下是可能与这种控制主板模块相关的一些产品功能 信号处理 GE IS220PDIAH1A 336A4940CSP1控制主板模块通常
  • 无线渗透测试&基础命令操作

    文章目录 无线网络参数 基础命令 iwconfig route route相关文件 arp arp相关文件 常用命令 aireplay ng airodump ng 无线网络参数 Cell 01 Address 78 EB 14 B9 96
  • Unity Timeline的使用

    创建TimeLine 第一种方法 在Assets目录下 右键Create gt TimeLine 双击创建的TimeLine文件 就可以打开TimeLine窗口 第二种方法 找到右上角的菜单Window 找到Sequencing gt Ti
  • uniapp 微信小程序 web-view如何查看console.log和调试H5页面

    问题场景 在微信小程序的页面中 web view内嵌了另一个页面url 从小程序跳转到该H5页面的时候 看不到该H5页面的控制台调试信息console log值 解决方案 当从小程序跳转到H5页面的时候 在微信开发者工具模拟器页面的底栏 会
  • 基于stata的medsens包进行中介效应分析

    中介变量 mediator 是一个重要的统计概念 如果自变量 X 通过某一变量 M 对因变量 Y 产生一定影响 则称 M 为 X 和 Y 的中介变量 我们既往已经介绍了SPSS和R语言行中介效应分析 今天继续介绍stata中介效应分析 大家
  • 使用Swin-Transformer-Semantic-Segmentation训练自己的数据(语义分割,自己做数据)

    使用Swin Transformer Semantic Segmentation训练自己的数据 系统配置 代码链接 针对MMCV 选择系统 Windows环境要求 ubuntu 18 04 安装swin segmentation 制作VOC