MMSegmentation V0.27.0官方问题(包含多尺度设置)与技术改进文章整理(四)

14 篇文章 20 订阅
14 篇文章 20 订阅

1、 写给 MMSegmentation 工具箱新手的避坑指南

2、 超详细!带你轻松掌握 MMSegmentation 整体构建流程

3、超详细!手把手带你轻松用 MMSegmentation 跑语义分割数据集

4、 如何训练多波段遥感数据?这份教程请收好!

官方的问题解析与回答

1、batch_size、GPU的关系设定以及训练轮数

通过阅读MMsegmention的官方文档配置名称的命名风格:

{model}_{backbone}_[misc]_[gpu x batch_per_gpu]_{resolution}_{iterations}_{dataset}

{xxx} is required field and [yyy] is optional.
{model}: model type like psp, deeplabv3, etc.
{backbone}: backbone type like r50 (ResNet-50), x101 (ResNeXt-101).
[misc]: miscellaneous setting/plugins of model, e.g. dconv, gcb, attention, mstrain.
[gpu x batch_per_gpu]: GPUs and samples per GPU, 8x2 is used by default.
{iterations}: number of training iterations like 160k.
{dataset}: dataset like cityscapes, voc12aug, ade.

了解到大部分模型是在8块GPU,batch_size=2的条件下训练的,根据学习率线性缩放规律,单个GPU学习率计算公式:
在这里插入图片描述

问题 1、在单个 GPU 上再现性能 #179(添加链接描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

问题 2、How to change the training policy from Iter to Epoch based on the existing training profile ?如何根据已有的训练配置文件的训练政策从Iter改为Epoch? #2908

在这里插入图片描述

2、模型结构配置文件的设定修改

问题 1、使用独立的分段器 #2931

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题 2、使用 class_weight 时出错 #2723

在这里插入图片描述
在这里插入图片描述

问题 3、如何使用 PyTorch 的 WeightedRandomSampler 或编写自定义采样器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、数据加载与数据管道配置相关问题

官方文档参数设置、MMDetection 图像缩放 Resize 详细说明

(1)通过 scale 参数

在这里插入图片描述

(2)通过 scale_factor 参数

在这里插入图片描述
在这里插入图片描述

(3)通过 img_scale 参数实现

在这里插入图片描述

1、keep_ratio 参数设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(1) range 即在指定的范围内进行随机 resize,multiscale mode=‘range’。

在该模式下,img_scale 长度必须是2,内部会基于该 list 重算得到新的缩放范围:

# 3 多尺度,range 模式 
dict( 
    type='Resize', 
    img_scale=[(1333, 640), (1333, 800)], 
    multiscale_mode='range', 
    keep_ratio=True),   
assert mmcv.is_list_of(img_scales, tuple) and len(img_scales) == 2 
# 两个 list 中 max 集合,上面输入得到 [1333, 1333] 
img_scale_long = [max(s) for s in img_scales] 
# 两个 list 中 min 集合,上面输入得到 [640, 800] 
img_scale_short = [min(s) for s in img_scales] 
# 分别从 max 和 min 集合中随机 
long_edge = np.random.randint( 
    min(img_scale_long), 
    max(img_scale_long) + 1) 
short_edge = np.random.randint( 
    min(img_scale_short), 
    max(img_scale_short) + 1) 
# 得到新的 img_scale 
img_scale = (long_edge, short_edge)  

在这里插入图片描述

(2) value 即在指定的范围内选择某个尺度进行 resize

在改模式下,会随机从 list 中采样一个新的 img_scale

# 4 多尺度,value 模式 
dict( 
    type='Resize', 
    img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), 
               (1333, 768), (1333, 800)], 
    multiscale_mode='value', 
    keep_ratio=True),
assert mmcv.is_list_of(img_scales, tuple) 
scale_idx = np.random.randint(len(img_scales)) 
img_scale = img_scales[scale_idx] 
return img_scale, scale_idx 
(3) ratio_range 模式

如果在设置了 ratio_range 情况下,表示会先随机采样缩放 scale 值,然后作用于 img_scale 上,并且在该模式下,[img_scale] 必须长度是 1。

 # 5 多尺度,ratio_range 模式,随机采样 ratio_range 范围,然后作用于 img_scale 上 
 dict( 
    type='Resize', 
    img_scale=(640, 640), 
    ratio_range=(0.8, 1.2), 
    keep_ratio=True),    
if self.ratio_range is not None: 
    scale, scale_idx = self.random_sample_ratio( 
        self.img_scale[0], self.ratio_range) 
 
 
assert isinstance(img_scale, tuple) and len(img_scale) == 2 
# 缩放比例范围 
min_ratio, max_ratio = ratio_range 
assert min_ratio <= max_ratio 
# 随机采样比例 
ratio = np.random.random_sample() * (max_ratio - min_ratio) + min_ratio 
# 作用于 img_scale 上 
scale = int(img_scale[0] * ratio), int(img_scale[1] * ratio) 
return scale, None       
(4)其余参数及其功能

在这里插入图片描述
在这里插入图片描述

问题 1、一些管道和 data_preprocessor 建议 #3103

在这里插入图片描述
在这里插入图片描述

问题 2、多尺度的选择规则和技巧

在这里插入图片描述
在这里插入图片描述

# 1 单尺度,不保持宽高比 
dict(type='Resize', img_scale=(511, 511), keep_ratio=False) 
# 2 单尺度,保持宽高比 
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True) 
# 3 多尺度,range 模式 
dict( 
    type='Resize', 
    img_scale=[(1333, 640), (1333, 800)], 
    multiscale_mode='range', 
    keep_ratio=True),   
# 4 多尺度,value 模式 
dict( 
    type='Resize', 
    img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), 
               (1333, 768), (1333, 800)], 
    multiscale_mode='value', 
    keep_ratio=True),   
 # 5 多尺度,ratio_range 模式,随机采样 ratio_range 范围,然后作用于 img_scale 上 
 dict( 
    type='Resize', 
    img_scale=(640, 640), 
    ratio_range=(0.8, 1.2), 
    keep_ratio=True),    

前两种情况已经分析过了,需要注意的是在 keep_ratio=True 情况下,img_scale 内部的值顺序不重要,因为其内部会基于 min 和 max 函数重新计算缩放范围。

常用的多尺度训练配置是上面的 3 和 4 例子,具体分为 range 和 value 两种模式。当 img_scale 是 list 类型时候,multiscale_mode 参数才起作用。

问题 3 数据集参数(reduce_zero_label)

借助 reduce_zero_label 管理 0 值背景

mmseg 中已经为各种公共分割数据集编写了描述文件和加载代码,对于有用过 PyTorch 的小伙伴而言,学习各种数据集的描述文件还是很自如的,只有 reduce_zero_label 对于 mmseg 的新手比较陌生,所以,在搭建自己的 mmseg 数据集时,新手最疑惑的大概就是 reduce_zero_label 到底应该是 True 还是 False。
它有什么用呢?从名字直译过来就是“减少 0 值标签”。在多类分割任务中,如果你的数据集中 0 值作为 label 文件中的背景类别,是建议忽略的。
打开加载数据的源码片段可以看到一段处理 reduce_zero_label 的代码,意思是:若开启了 reduce_zero_label,原本为 0 的所有标注设置为 255,也就是损失函数中 ignore_index 参数的默认值,该参数默认避免值为 255 的标注参与损失计算。前文按下不表的 150 类的 ADE 数据集,它不包含背景的原因就是开了 reduce zero label,原本为 0 值的背景设置为了 ignore_index。

# mmseg/datasets/pipelines/loading.py

...
# reduce zero_label
if self.reduce_zero_label:
    # avoid using underflow conversion
    gt_semantic_seg[gt_semantic_seg == 0] = 255
    gt_semantic_seg = gt_semantic_seg - 1
    gt_semantic_seg[gt_semantic_seg == 254] = 255
...
reduce_zero_label 导致的常见问题描述

我们这里以 ADE 数据集源码为例,reduce_zero_label 默认设置为 True,然而,就算新手掌握了上一节的 reduce_zero_label,也可能对 ADE 了解比较肤浅,会怀疑配置文件中开启的 reduce_zero_label 是不是把 150 个实例类中的第一个给忽略掉了,毕竟 num_classes 不就是 150 吗,然后想当然把 reduce_zero_label 关掉。

错误原因分析
# configs/_base_/datasets/ade20k.py

train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', reduce_zero_label=True), # ADE中reduce_zero_label默认设置为True
    dict(...),
    ...
]

label 中实际参加训练的确实只有 150 类,定义在 CLASSES 中,但 label 文件中实际包含了 151 类,而背景类(剩下仍没有标记的,或者被意外忽略的区域都归为背景,在 label 中值为 0)不包含在 150 个 CLASSES 中,需要在训练的时候设置成 ignore_index,所以我们借助上一小节的 reduce_zero_label 将背景从 151 个类中提出来单独设置为了 ignore_index,我们倘若错误地将 reduce_zero_label 关掉了,那 num_classes 就是 151 了。

车道线检测模型 ERFNet

实时语义分割模型 BiSeNet

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值