当前位置:   article > 正文

MMSegmentation的用法(手把手入门教程)搭配Colab,对自己的数据进行训练_mmsegmentation miou其他类为0

mmsegmentation miou其他类为0

本文所用到的所有资料和代码已上传到Github,欢迎star:GitHub - zlr-zmm/MMSeg

1 介绍

MMSegmentation是一个基于Pytorch的开源语义分割工具箱,他是OpenMMLab项目的一部分 GitHub:GitHub - open-mmlab/mmsegmentation: OpenMMLab Semantic Segmentation Toolbox and Benchmark. MMseg提供的模块化设计极大便利了使用者,特别是用于入门学习,对于各类常用网络模型的即插即用集合,非常适合快速上手。

 这是mmsegmentation文件的预览,接下来,本文将以自己的数据集,利用谷歌云盘和谷歌colab服务器来重现一下MMsegmentation的使用方法

2 数据集准备

将mmsegmentation文件下载到本地来进行操作

本次数据集采用MICCAI2023牙齿分割挑战的数据集

下载来的数据集按照CHASE_DB1数据集的格式分配好,CHASE_DB1数据集格式如下:

CHASE_DB1
│   ├── images
│   │   ├── training
│   │   ├── validation
│   ├── annotations
│   │   ├── training
│   │   ├── validation

然后把数据压缩,命名为CHASEDB1.zip,使用mmseg给的数据集转换工具来转换:

使用时注意路径,需要先cd到该文件的路径,在我电脑上就是:

cd E:\mmsegmentation\mmsegmentation  # 这条指令就是把当前路径放到这个文件夹这里
python tools/dataset_converters/chase_db1.py /path/to/CHASEDB1.zip   # 使用数据转换工具

转换后的数据标签的深度是8位的,看上去是全黑的,具体显示效果如下:


(右边是给定的标签,可以将图像像素值x255,这样就看得到标签了)

这里仅仅展示这一个数据集的转换方法,其他数据集转换方法也类似,读者可以按照自己的需求进行选择。数据转换完成之后,工作就完成了一大半,接下来介绍如何利用Google Colab和Google Drive完成数据训练

3 Google Colab和Google Drive介绍

!!!使用需要科学上网!!!

Google Colab是谷歌提供的一个在线的工作平台,用户可以通过浏览器访问,最最最重要的是他提供免费的GPU算力,可以帮助落魄学生进行简单的模型训练,Colab的用法和Jupyter NoteBook一直,都是基于.ipynb格式的文件。

Colab可以最长运行时间为12小时,使用的时候需要把控这个时间,免费的GPU算力可能无法满足你的项目需求,Colab也支持氪金,但是略贵

如果没有visa支付的国内用户,可以去某宝下单,会更便宜,一个项目可以买一个pro。
对于存储,推荐使用谷歌云盘(Google Drive),谷歌云盘提供免费的5GB内存(很适合白嫖),如果数据集很大,或者运行保存的模型很大,推荐氪金,没有很贵

(MOP是澳币,这里是梯子的问题,所以显示的是澳币),200GB一般够用,如果不够用订阅2T就行了,某宝可以帮助用户订阅,而且如果需要更多的内存,补差价就行了,还是很方便的。

了解了谷歌平台的使用,读者需要在Google Drive中新建一个文件夹,点击左上角的新建按钮,然后新建文件夹,命名为Dataset,这里我已经新建好了这个文件夹,把自己的命名为CHASE_DB1的数据集上传到这里,不需要压缩上传,直接拖进来就可以上传,上传速度与网速有关。

4 MMSegmentation使用(以SegFormer为例)

接下来关注到configs这个文件夹,打开mmsegmentation/configs/segformer文件夹,可以看到里面有很多文件,(mmseg中SegFormer地址:https://github.com/open-mmlab/mmsegmentation/tree/main/configs/segformer

 这里讲解一下这些文件命名规则:segformer是网络模型,mit-b0是使用的backbone,160k是训练轮次,cityscapes是使用的数据集,512x512是crop size。点开segformer_mit-b0_8xb2-160k_ade20k-512x512.py可以看到有如下内容:

  1. _base_ = [
  2. '../_base_/models/segformer_mit-b0.py', '../_base_/datasets/ade20k.py',
  3. '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py'
  4. ]
  5. crop_size = (512, 512)
  6. data_preprocessor = dict(size=crop_size)
  7. checkpoint = 'https://download.openmmlab.com/mmsegmentation/v0.5/pretrain/segformer/mit_b0_20220624-7e0fe6dd.pth' # noqa
  8. model = dict(
  9. data_preprocessor=data_preprocessor,
  10. backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint)),
  11. decode_head=dict(num_classes=150))
  12. optim_wrapper = dict(
  13. _delete_=True,
  14. type='OptimWrapper',
  15. optimizer=dict(
  16. type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01),
  17. paramwise_cfg=dict(
  18. custom_keys={
  19. 'pos_block': dict(decay_mult=0.),
  20. 'norm': dict(decay_mult=0.),
  21. 'head': dict(lr_mult=10.)
  22. }))
  23. param_scheduler = [
  24. dict(
  25. type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500),
  26. dict(
  27. type='PolyLR',
  28. eta_min=0.0,
  29. power=1.0,
  30. begin=1500,
  31. end=160000,
  32. by_epoch=False,
  33. )
  34. ]
  35. train_dataloader = dict(batch_size=2, num_workers=2)
  36. val_dataloader = dict(batch_size=1, num_workers=4)
  37. test_dataloader = val_dataloader

其中

  1. _base_ = [
  2. '../_base_/models/segformer_mit-b0.py', '../_base_/datasets/ade20k.py',
  3. '../_base_/default_runtime.py', '../_base_/schedules/schedule_160k.py'
  4. ]

这里定义了模型、数据集、一些默认参数,运行轮次参数,接下来在config当中新建一个文件夹,给定一个任意的名字,这就是我们自己项目的config文件,并新建一个python文件叫做baseline

将segformer_mit-b0_8xb2-160k_ade20k-512x512.py或者按照你的需求,把整个文件中的内容复制到baseline.py里面

接着来介绍一下_base_里面的内容

 datasets文件存放了各种数据集的数据读取文件,和data_load差不多,点开chase_db1.py,里面有这些内容:

  1. # dataset settings
  2. dataset_type = 'ChaseDB1Dataset'
  3. data_root = 'data/CHASE_DB1'
  4. img_scale = (960, 999)
  5. crop_size = (128, 128)
  6. train_pipeline = [
  7. dict(type='LoadImageFromFile'),
  8. dict(type='LoadAnnotations'),
  9. dict(
  10. type='RandomResize',
  11. scale=img_scale,
  12. ratio_range=(0.5, 2.0),
  13. keep_ratio=True),
  14. dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75),
  15. dict(type='RandomFlip', prob=0.5),
  16. dict(type='PhotoMetricDistortion'),
  17. dict(type='PackSegInputs')
  18. ]
  19. test_pipeline = [
  20. dict(type='LoadImageFromFile'),
  21. dict(type='Resize', scale=img_scale, keep_ratio=True),
  22. # add loading annotation after ``Resize`` because ground truth
  23. # does not need to do resize data transform
  24. dict(type='LoadAnnotations'),
  25. dict(type='PackSegInputs')
  26. ]
  27. img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75]
  28. tta_pipeline = [
  29. dict(type='LoadImageFromFile', backend_args=None),
  30. dict(
  31. type='TestTimeAug',
  32. transforms=[
  33. [
  34. dict(type='Resize', scale_factor=r, keep_ratio=True)
  35. for r in img_ratios
  36. ],
  37. [
  38. dict(type='RandomFlip', prob=0., direction='horizontal'),
  39. dict(type='RandomFlip', prob=1., direction='horizontal')
  40. ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')]
  41. ])
  42. ]
  43. train_dataloader = dict(
  44. batch_size=4,
  45. num_workers=4,
  46. persistent_workers=True,
  47. sampler=dict(type='InfiniteSampler', shuffle=True),
  48. dataset=dict(
  49. type='RepeatDataset',
  50. times=40000,
  51. dataset=dict(
  52. type=dataset_type,
  53. data_root=data_root,
  54. data_prefix=dict(
  55. img_path='images/training',
  56. seg_map_path='annotations/training'),
  57. pipeline=train_pipeline)))
  58. val_dataloader = dict(
  59. batch_size=1,
  60. num_workers=4,
  61. persistent_workers=True,
  62. sampler=dict(type='DefaultSampler', shuffle=False),
  63. dataset=dict(
  64. type=dataset_type,
  65. data_root=data_root,
  66. data_prefix=dict(
  67. img_path='images/validation',
  68. seg_map_path='annotations/validation'),
  69. pipeline=test_pipeline))
  70. test_dataloader = val_dataloader
  71. val_evaluator = dict(type='IoUMetric', iou_metrics=['mDice'])
  72. test_evaluator = val_evaluator

这里就定义了数据集的一些如图像大小、数据集路径等系列东西,复制里面的所有内容然后粘贴到我们自己的baseline.py里面

models文件里面存放了各类模型定义文件,找到segformer_mit-b0.py,里面存放的东西如下:
 

  1. # model settings
  2. norm_cfg = dict(type='SyncBN', requires_grad=True)
  3. data_preprocessor = dict(
  4. type='SegDataPreProcessor',
  5. mean=[123.675, 116.28, 103.53],
  6. std=[58.395, 57.12, 57.375],
  7. bgr_to_rgb=True,
  8. pad_val=0,
  9. seg_pad_val=255)
  10. model = dict(
  11. type='EncoderDecoder',
  12. data_preprocessor=data_preprocessor,
  13. pretrained=None,
  14. backbone=dict(
  15. type='MixVisionTransformer',
  16. in_channels=3,
  17. embed_dims=32,
  18. num_stages=4,
  19. num_layers=[2, 2, 2, 2],
  20. num_heads=[1, 2, 5, 8],
  21. patch_sizes=[7, 3, 3, 3],
  22. sr_ratios=[8, 4, 2, 1],
  23. out_indices=(0, 1, 2, 3),
  24. mlp_ratio=4,
  25. qkv_bias=True,
  26. drop_rate=0.0,
  27. attn_drop_rate=0.0,
  28. drop_path_rate=0.1),
  29. decode_head=dict(
  30. type='SegformerHead',
  31. in_channels=[32, 64, 160, 256],
  32. in_index=[0, 1, 2, 3],
  33. channels=256,
  34. dropout_ratio=0.1,
  35. num_classes=19,
  36. norm_cfg=norm_cfg,
  37. align_corners=False,
  38. loss_decode=dict(
  39. type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)),
  40. # model training and testing settings
  41. train_cfg=dict(),
  42. test_cfg=dict(mode='whole'))

这里就是一些模型的参数等等,同样复制这个文件粘贴到baseline.py,剩下的'../base/default_runtime.py', '../base/schedules/schedule_160k.py'这两个文件以此类推进行复制粘贴。这里可以发现官方介绍没有CHASEDB1数据集格式,但是我们采用了,读者要根据自己的实际需求去模块化穿插就行了。

经过上述处理,可以得到一个完整的baseline.py,这样把这些内容复制粘贴到一个文件,可以避免对其他文件进行改动,接下来按照实际对baseline.py进行修改

修改1:

 num_classes需要按照自己的实际情况进行修改,我这里是分割牙齿,因此num_classes是1+1=2(需要算上背景),调整完数据集格式,需要到mmsegmentation/mmseg/datasets/chase_db1.py里面去调整自己的标签名字和数据集格式

 修改2:

然后需要更改数据存放的位置,'/content/drive/MyDrive/Dataset/CHASE_DB1/'就是我们数据集在谷歌云盘存储的位置

截至这里,初步的一些操作都已经完成,接下来将整个mmsegmentation文件夹上传到谷歌云盘,也可以将configs文件里面除了我们自己的文件夹(我的叫做teeth_seg),其他都删掉上传
上传完成之后谷歌云盘如上

5 在Colab中使用数据

1、选择高性能运行环境

 点击右上角的向下箭头,出现菜单栏,接着选择查看资源
 

 点击更改运行时类型
 

选择T4 GPU,这样就可以使(bai)用(piao)谷歌的云算力

 2、链接Colab和谷歌云盘

  1. from google.colab import drive
  2. drive.mount('/content/drive')

 点击这个类似播放按钮运行这个单元,运行完成之后会提示“Mounted at /content/drive“

使用下述指令,将当前目录跳转到mmsegmentation中:

!cd /content/drive/MyDrive/mmsegmentation

安装需要的库:

  1. !pip install openmim
  2. !mim install mmengine
  3. !mim install mmcv
  4. !mim install mmsegmentation

这里需要替换到mmseg中datasets里面chase_db1.py这个文件,因为我们刚才对这个文件夹进行了修改,指令如下:

  1. %cd /usr/local/lib/python3.10/dist-packages/mmseg/datasets
  2. !rm chase_db1.py
  3. !cp /content/drive/MyDrive/mmsegmentation/mmseg/datasets/chase_db1.py chase_db1.py

/usr/local/lib/python3.10/ 这个路径是mmseg下载保存的位置,可能会不一样,可以打印路径查看到底放在lib里面那个版本的python中

这里是打印datasets文件夹内文件的示例,可以按照实际需求进行更改

3、运行baseline.py

首先确保当前路径在mmsegmentation中,以防万一,可以先cd到这个文件夹

!cd /content/drive/MyDrive/mmsegmentation

然后是计算参数量,这一步可以测试baseline.py代码的逻辑是否存在问题

!python /content/drive/MyDrive/mmsegmentation/tools/analysis_tools/get_flops.py /content/drive/MyDrive/mmsegmentation/configs/teeth_seg/baseline.py

如果成功打印出参数量和计算量,就可以开始训练模型

!python tools/train.py configs/teeth_seg/baseline.py --work-dir work_dir/baseline

测试代码:

!python tools/test.py configs/teeth_seg/baseline.py work_dir/baseline/iter_40000.pth  --out test_result/baseline/iter_40000.pkl --show-dir test_result/baseline

这里为了快,只训练了40000轮,按照上述流程应该训练的是160000轮。测试结果(左图label,右图是预测结果):

这里只是介绍快速入手,更多的训练和测试详细使用可以参阅官方给的文档:教程4:使用现有模型进行训练和测试 — MMSegmentation 1.1.1 文档

这里介绍的是在colab上使用的情况,在本地使用流程相似,在本地新建一个notebook用来执行指令,然后更改文件路径

mmsegmentation是一个很便于使用的工具箱,读者在了解如何进行基础训练之后可以更多关注mmseg这个文件中对各种模型模块化的设计
 

读者可以根据自己的需要,在mmseg中进行修改,需要注意的是:修改完上传到云盘后,记得按照刚才的指令把文件和user中的文件替换一下。

这里以添加loss为例子,读者在新建python文件设计了自己的loss function之后,需要在init.py中声明一下,然后才可以在baseline.py中使用。

以上就是本博客的所有内容,仅限快速入门使用这个工具箱,后续如果有深入使用技巧,会持续更新,有问题欢迎留言或私信提问

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号