商汤 x TechBeat系列直播课程回顾(三): OpenMMLab开源工具使用教学②

2021年1月14日,商汤×TechBeat系列直播课—OpenMMLab第③期线上课程开播!课程主讲嘉宾是香港中文大学在读博士生徐瑞,他主要介绍了如何使用 MMSegmentaion、MMClassification 和 MMEditing 进行算法开发。

登陆将门-TechBeat社区网址,

https://www.techbeat.net/

搜索【OpenMMLab】即可观看直播回放~

以下是本期课程总结,希望对大家有所帮助~

点击查看往期课程直播回顾:

课程回顾(一): OpenMMLab开源体系揭秘

课程回顾(二): OpenMMLab开源工具使用教学(一)


语义分割框架 MMSegmentation


1.1 任务介绍

语义分割对每个像素要给它一个不同类别的预测,对整个图像按照类别进行分割,可以划分成道路、车辆、植物这些不同的区域。

图像示意


1.2 框架特性

  • 多样模块;
  • 统一超参;
  • 丰富配置。
  • 1. MMSegmentation支持了非常丰富的算法模型。

    以上为 MMSegmentation 所包含的算法模型。MMSegmentation 不仅做了算法的合集,也做了模块的抽象, 方便大家做拼接。

    主要组件分为 backbone、head 和 neck 组件,backbone 负责特征提取,提取后会输入给 head;neck 是做进一步的 refund 和增强;涉及到训练会有 loss 的支持。

    2. 关于超参设定,采取以下四个方面进行统一的性能标定。

  • 主干网络: 预训练网络,空洞卷积;
  • 学习策略: 初始学习率,学习率下降;
  • 数据增强:尺度放缩,区域剪裁,颜色扰动,水平翻转;
  • 输入尺度:Cityscapes: 769x769 & 512x1024,ADE20k: 512x512,PascalVOC: 512x512,Pascal Context: 480x480。
  • 3. MMSegmentation 支持20+算法,300+训练模型,9个数据集。

    在300+训练模型也进行了全面的性能标定,在显存占用、推理速度、测试精度三个方面。

    PSPNet 在 MMSegmentation 中性能标定


    1.3 实战

    如何在 MMSegmentation 中支持新的算法/神经网络模块?

    标准步骤:

  • 实现这个模块并将它注册进对应的 Registry,如 NECKS、HEADS、BACKBONES。
  • Import 这个模块。
  • 修改配置文件。
  • 训练与测试。
  • 实例书写:

    例1: 在 MMSegmentation 中增加 NonLocal 模块进行分割。

    1. 实现 NonLocalHead 并将 NonLocalHead 注册进 HEADS。

    注意注册器机制,但下一步需要再次 import 才能真正注册进去。

    2. Import NonLocalHead。

    3. 修改配置文件。

    4. 训练与测试 。


    图像分类框架 MMClassification


    2.1 任务介绍

    图像分类是大家比较熟悉的基础任务,其输入是一张图片,模型需要将图片中的主要物体进行分类。


    2.2 框架特性

  • 提供多样模型结构支持:提供 9 种主流模型结构;
  • 丰富的训练技巧:提供多种常见的训练技巧,如标签平滑等;
  • 大规模训练的配置:探索集群训练并行;
  • 高效率和高拓展性:接口的设计考虑下游任务,易于拓展。

  • 2.3 实战

    例1: 如何在 MMClassification 中使用已有模型?

    使用方法和 MMSegmentation 相似。

    例2: 在 MMClassification 中自定义 data pipeline:以 Imagenet on Resnet50 为例。

    ⚠️注册器机制:

    实现需要的data augmentation操作(if necessary):在
    mmcls/datasets/pipelines/transforms.py中实现RandomResizedCrop, 并在
    mmcls/datasets/pipelines/__init__.py 中导入。

    为什么在 __init__.py 中 import transform 类呢?

    Registry 注册机制是基于 Python 的 import 机制,只有在 Python 执行过程中(Python 在脚本启动时先处理所有的 import)运行环境里的模块才能被 Registry 看到并且被其注册。所以仅完成第一步是不够的。

    将需要的操作写入 config 中的 pipeline。

    在 MMClassification 中自定义 data pipeline。

    支持的操作:

    例3: 在 MMClassification 中支持新的算法/神经网络模块: 以 mobilenet_v2 为例。

    标准步骤:

  • 实现 MobileNetV2 并将 MobileNetV2 注册进 BACKBONES。
  • Import MobileNetV2。
  • 修改配置文件。
  • 训练与测试。
  • 1. 实现 MobileNetV2 并将 MobileNetV2 注册进 BACKBONES :在 mmcls/models/backbones/ 目录下新建文件 mobilenet_v2.py 并实现代码如图示。

    2. Import MobileNetV2:


    mmcls/models/backbones/__init__.py 中写入如下代码。

    为什么在 __init__.py 中 import MobileNetV2 呢?

    Registry 注册机制是基于 Python 的 import 机制,只有在 Python 执行过程中(Python 在脚本启动时先处理所有的 import )运行环境里的模块才能被 Registry 看到并且被其注册。所以仅完成第一步是不够的。

    3. 修改配置文件。

    base:继承已有配置文件。

    4. 训练与测试 。

    例4: 在下游任务中将 MMClassification 模型作为预训练模型加载:

    以 MMSegmentation 中使用 mobilenet_v2 为例:


    mmsegmentation/configs/mobilenet_v2/fcn_m-v2-d8_512x512_160k_ade20k.py 如下。

    实现原理:在 mmcv 中,
    mmcv/mmcv/model_zoo/mmcls.json。

    注意事项:

    目前 MMCV 只支持了 MobileNetV2 的标准模型,如有其他需求,需要自己训练 backbone,无法从 MMCV 中加载。如果模型参数对不上,会报 warning。


    图像视频编辑 MMEditing


    3.1 任务介绍

    1. 图像修复(Inpainting):

    输入:受损图片,Mask(明确哪些图像受损)。

    输出:修复之后的图片。

    算法模型:Global&Local, Partial Conv, DeepFillv1, and DeepFillv2。

    2. 抠图(Matting):

    输入:原图,alpha map。

    输出:精细分割的 mask。

    算法模型:DIM, GCA, and IndexNet。

    3. 图像超分辨率(Super Resolution):

    输入:低分辨率图片。

    输出:高分辨率图片。

    算法模型:EDSR, EDVR, ESRGAN, SRCNN, SRResNet。

    4. 图像生成:

    输入:某个 domain 中的图片。

    输出:另一个 domain 中的图片。

    算法模型:Pix2Pix, CycleGAN。


    3.2 实战与解析

    对抗生成模型,在底层视觉(low-level vision)中有着大量的应用。同样在 MMEdinting 中,对抗训练也是当前代码库的主要组成部分。

    例1. 如何基于 MMCV 在 OpenMMLab 的框架中实现对抗训练呢?

    要点:

    1. EpochBasedRunner ➡️ IterBasedRunner。

    2. 在模型的 train_step 方法中实现参数的更新(之前是通过 OptimizerHook )。

    3. 为 MMDDP 增加一个 wrapper (特有的)。

    标准对抗训练步骤

    例2. 如何定制对抗训练?

    在对抗生成模型中,往往需要非常灵活地定制自己的训练流程。在 MMEditing 以及其他的代码库中,我们在模型的定义时提供了 train_cfg 字段,来帮助我们实现高自由度的对抗训练,同时我们可以通过更改 train_step 里面的逻辑来实现新的训练算法。这里我们以 Global&Local 模型为例来讲解如果通过 MMEditing 来实现定制化的对抗训练流程。

    代码实例:one-stage inpaintor⬇️

    代码实例:global&local inpaintor⬇️

    例3. 如何处理小数据集?

    在 low-level vision 中,有很多数据集都是小规模的数据集,为了提升训练时的速度以及减少因为 Dataloader 重载而导致的训练间隙,我们推荐使用 RepeatDataset。

    config 实例:
    srcnn_x4k915_g1_1000k_div2k.py


    Q & A


    1/请问可以实现自己的 runner 吗?

    现在 MMCV 已经支持自定义 runner 了,实现一个 runner 后可以调用 MMCV 的 runner注册器进行一个装饰再 import 进去,通过 build runner 来使用 runner。


    2/MMEditing 混合精度训练怎么改呢?

    需要改一下 optimizer hook 就可以了,但是由于 MMEditing 参数的更新,需要根据 optimizer hook 的代码进行 transit app 中一些修改来实现混合精度训练。

    举报