商汤 x TechBeat系列直播课程回顾(三): OpenMMLab开源工具使用教学②
2021年1月14日,商汤×TechBeat系列直播课—OpenMMLab第③期线上课程开播!课程主讲嘉宾是香港中文大学在读博士生徐瑞,他主要介绍了如何使用 MMSegmentaion、MMClassification 和 MMEditing 进行算法开发。
登陆将门-TechBeat社区网址,
https://www.techbeat.net/
搜索【OpenMMLab】即可观看直播回放~

以下是本期课程总结,希望对大家有所帮助~
点击查看往期课程直播回顾:
语义分割框架 MMSegmentation
1.1 任务介绍
语义分割对每个像素要给它一个不同类别的预测,对整个图像按照类别进行分割,可以划分成道路、车辆、植物这些不同的区域。

图像示意
1.2 框架特性
1. MMSegmentation支持了非常丰富的算法模型。

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

主要组件分为 backbone、head 和 neck 组件,backbone 负责特征提取,提取后会输入给 head;neck 是做进一步的 refund 和增强;涉及到训练会有 loss 的支持。
2. 关于超参设定,采取以下四个方面进行统一的性能标定。
3. MMSegmentation 支持20+算法,300+训练模型,9个数据集。
在300+训练模型也进行了全面的性能标定,在显存占用、推理速度、测试精度三个方面。

PSPNet 在 MMSegmentation 中性能标定
1.3 实战
如何在 MMSegmentation 中支持新的算法/神经网络模块?
标准步骤:
实例书写:
例1: 在 MMSegmentation 中增加 NonLocal 模块进行分割。
1. 实现 NonLocalHead 并将 NonLocalHead 注册进 HEADS。

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

3. 修改配置文件。

4. 训练与测试 。


图像分类框架 MMClassification
2.1 任务介绍
图像分类是大家比较熟悉的基础任务,其输入是一张图片,模型需要将图片中的主要物体进行分类。
2.2 框架特性
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 为例。
标准步骤:
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 中一些修改来实现混合精度训练。