从零开始使用MMSegmentation训练Segformer

这篇具有很好参考价值的文章主要介绍了从零开始使用MMSegmentation训练Segformer。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从零开始使用MMSegmentation训练Segformer

写在前面:最新想要用最新的分割算法如:Segformer or SegNeXt 在自己的数据集上进行训练,但是有不是搞语义分割出身的,而且也没有系统的学过MMCV以及MMSegmentation。所以就折腾了很久,感觉利用MMSegmentation搭建框架可能比较系统,但是对于不熟悉的或者初学者非常不友好,因此记录一下自己training Segformer的心路历程。

Segformer paper: https://arxiv.org/abs/2105.15203>
官方实现: https://github.com/NVlabs/SegFormer>
纯Torch版Segformer: https://github.com/camlaedtke/segmentation_pytorch

方法

从零开始使用MMSegmentation训练Segformer
从零开始使用MMSegmentation训练Segformer
由于本人不是研究语义分割的,所以只能简要地介绍一下Segformer。
SegFormer的动机在于:

① ViT作为backbone只能输出固定分辨率的特征图,这对于密集预测任务显然不够友好;
② 由于self-attention操作的存在,transformer的运算量和参数两都非常大,不利于大尺度图像的分割。

为此作者提出了相应的创新:

① 先是对transformer进行层次化结构设计,得到多层级的特征图;
② 构造轻量级的decoder,仅使用MLP进行特征聚合。
③ 除此之外,SegFormer抛弃了位置信息编码,选择采用MixFCN来学习位置信息,这样可以很好地扩充到不同尺度的测试环境下(避免由于尺寸变化,需要对positional-encoding进行插值,从而影响性能)。最后提出的模型在ADE20k上达到了新sota,并且在速度、性能和鲁棒性上都表现很好。

程序复现

在重新训练过程中主要参考了:手把手教你使用Segformer训练自己的数据
作者给的教程比较详细, 但是有几处修改并不合适,导致我复现出来的结果没啥效果,因此记录一下自己的采坑记录。
自己的主要配置为:

CUDA 10.1
Pytorch 1.10.0, torchvision 0.11.1
MMCV-full 1.3.0

其中在安装MMCV-full过程中还遇到了很多问题,主要是版本不适配的原因导致的。
在安装好环境后,首先从Github下载SegFormer的项目工程: https://github.com/NVlabs/SegFormer
然后进去SegFormer目录:

pip install -r requirements.txt
pip install -e . --user

安装需要的依赖。

数据集准备

代码默认用的是ADE20K数据集进行训练
ADE20K数据集 格式如下,按照要求放就完了

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

但是@中科哥哥使用的是VOC的数据格式,因此就使用了VOC的数据格式

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

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

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

在这里可以根据自己的需要修改
下面是我自己的数据格式:

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

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

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

其实完全可以简洁一点:

├── MFNet
│   ├── Segmentation
│   │   ├── train.txt
│   │   ├── val.txt
│   │   ├── test.txt

│   ├── Images
│   │   ├── *.png#所有图片

│   ├── Label
│   │   ├── *.png    #所有标签图

其中: train.txt; val.txt; test.txt; 只要图片名,不需要后缀和路径 如下
从零开始使用MMSegmentation训练Segformer
后面的程序修改都基于复杂的版本进行介绍(自己在程序复现时使用的复杂的目录,因为是按照的教程来的)
数据准备好 之后可以在SegFormer目录先新建一个/datasets/ 目录来存放自己的数据集

程序修改

  1. mmseg/datasets/voc.py修改自己数据集的类别即修改CLASSESPALETTE在我自己的数据集中一共由于9个类别,所以修改如下:
    从零开始使用MMSegmentation训练Segformer

  2. mmseg/models/decode_heads/segformer_head.py 中BatchNorm 方式(如果使用单卡训练的话就修改,多卡训练的话就不用修改)。 将第59行SyncBN 修改为 BN
    从零开始使用MMSegmentation训练Segformer

  3. 修改 local_configs/segformer/B5/segformer.b5.640x640.ade.160k.py 的配置文件(这里我们使用的是B5模型,需要使用哪个模型就修改对应的配置文件即可,配置文件都位于:**local_configs/segformer/**下 );主要修改

__base__=[]中的数据集文件路径(也就是下图中的第二行)
指定dataset_type的类型,此处
dataset_type = 'PascalVOCDataset'
data_root = '/data1/timer/Segmentation/SegFormer/datasets/VOC2012'  也可以给相对路径。
然后根据自己的数据需要修改文件中的crop_size, train_pipline中的img_scale,以及test_pipline中的img_scale

从零开始使用MMSegmentation训练Segformer

同时还需要在data字典中指定 img_dir, ann_dir, 以及split的路径,如果是单卡训练的话需要将norm_cfg 的type由的SyncBN 修改为 BN
从零开始使用MMSegmentation训练Segformer
接下来继续修改模型相关的文件,主要是给定预训练权重的位置即修改:pretrained 以及backbone[‘type’],这里的type因为使用的是B5的结构所以type就指定为mit_b5,然后预训练权重需要从项目中给定的链接下载。值得注意的是还需要指定decode_head[‘num_classes’] (这个需要根据你的数据集来指定,因为我的数据集中包含9类,所以这里就设置为9了)
从零开始使用MMSegmentation训练Segformer

  1. local_configs/base/models/segformer.py 修改

norm_cfg[‘type’]=‘BN’
num_classes=9 (这里修改成你数据集对应的类别的数量)

从零开始使用MMSegmentation训练Segformer
5. 在 tools/train.py中修改

parser.add_argument('--config', default='/data1/timer/Segmentation/SegFormer/local_configs/segformer/B5/segformer.b5.640x640.ade.160k.py') 
parser.add_argument('--work-dir', default='res_MFNet')

其中 /data1/timer/Segmentation/SegFormer/local_configs/segformer/B5/segformer.b5.640x640.ade.160k.py 是配置文件的路径
res_MFNet是训练日志和模型保存的路径
同时指定GPU的卡号

    group_gpus.add_argument(
        '--gpu-ids',
        type=int,        
        default=[0],
        help='ids of gpus to use '
        '(only applicable to non-distributed training)')

从零开始使用MMSegmentation训练Segformer6. 进入tools目录下运行

python train.py

即可开始训练模型。
由于本人也在摸索阶段,有不当之处,恳请各位不吝赐教。也欢迎大家交流:2458707789@qq.com文章来源地址https://www.toymoban.com/news/detail-484590.html

到了这里,关于从零开始使用MMSegmentation训练Segformer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始训练 Stable Diffusion 的成本 < 16 万美元

    我们想知道使用我们的流数据集、Composer 和 MosaicML 云平台从头开始训练稳定扩散模型需要多少时间(和金钱)。我们的结果:13 天内我们将花费 79,000 个 A100 小时,总培训成本不到 160,000 美元。我们的工具不仅将时间和成本减少了 2.5 倍,而且还具有可扩展性和简单易用性。

    2024年02月11日
    浏览(38)
  • 从零开始复现seaformer(语义分割)训练自己的数据集——linux

    出于模型轻量化需求,需对原有的皮肤分割模型进行重新研发。seaformer是作为今年复旦大学和腾讯联合提出的轻量级语义分割算法,具有很好的参考价值。因此,作者基于seaformer算法对自研数据集进行训练,完成轻量级皮肤分割模型的开发。 1.下载地址:https://github.com/fudan

    2024年04月12日
    浏览(33)
  • 适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)

      目录 一、前期准备+所需环境配置  1.1. 虚拟环境创建 1.2 下载yolov8源码,在pycharm中进行配置 1.2.1 下载源码 1.2.2 在pycharm终端中配置conda 1.3 在pycharm的terminal中激活虚拟环境  1.4 安装requirements.txt中的相关包 1.5 pip安装其他包 1.6 预训练权重的下载  1.7 验证环境配置是否成功

    2024年02月05日
    浏览(76)
  • mmsegmentation 训练自己的数据集

    open-mmlab有许多非常实用的框架,其中目标检测的话mmdetection确实很实用。但语义分割的话当属mmsegmentation,这篇博客就是介绍如何用mmsegmentation训练自己的数据集。 mmdetection的环境mmsegmentation也可以用,有mmdetection环境的话就可以不用重新搭建了 给个代码链接mmsegmentation mmsegm

    2024年02月06日
    浏览(38)
  • MMSeg框架segformer模型训练自己的数据集

    框架是MMSegmentation; 自己的数据集是 voc 格式; 代码:https://github.com/NVlabs/SegFormer mmlab环境的安装:https://blog.csdn.net/Scenery0519/article/details/129595886?spm=1001.2014.3001.5501 mmseg 教程文档:https://mmsegmentation.readthedocs.io/zh_CN/latest/useful_tools.html#id10 首先需要配置好 mmlab 环境。 参考 mmlab环

    2024年01月18日
    浏览(38)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(九):从零开始实现线性回归的训练

    在深度学习中,用来训练的数据集通过标注来实现。 咱们在这一步使用函数来生成一组数据集 定义数据生成函数:synthetic_data

    2024年02月14日
    浏览(41)
  • 从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型

    从零开始的目标检测和关键点检测(一):用labelme标注数据集 从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型 在 [1]用labelme标注自己的数据集 中已经标注好数据集(关键点和检测框),通过labelme2coco脚本将所有的labelme json文件集成为两个coco格式的json文件,

    2024年02月06日
    浏览(36)
  • 从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型

    从零开始的目标检测和关键点检测(一):用labelme标注数据集 从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型 1、数据集类型即coco格式的数据集,在dataset_info声明classes、keypoint_info(关键点)、skeleton_info(骨架信息)。 2、训练参数 3、模型定义、数据预处理、

    2024年02月06日
    浏览(40)
  • 学习Segformer语义分割模型并训练测试cityscapes数据集

    官方的segformer源码是基于MMCV框架,整体包装较多,自己不便于阅读和学习,我这里使用的是Bubbliiiing大佬github复现的segformer版本。 Bubbliiiing大佬代码下载链接: https://github.com/bubbliiiing/segformer-pytorch 大佬的代码很优秀简练,注释也很详细,代码里采用的是VOC数据集的格式,因

    2024年02月15日
    浏览(40)
  • MMSegmentation训练自己的语义分割数据集

    然后 ctrl +N 开启多边形标注即可,命名类为person 之后会保存到同目录下json文件: 下载labelme代码里的转换代码: labels里存储的如下形式 运行指令 生成如下 mmseg/datasets里生成一个my_data.py文件,这个文件存储的是类别信息和seg颜色 需要多加一个backbone mmseg/utils/class_names.py文件

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包