Shortcuts

教程 6:可视化

图像的可视化是衡量图像处理、编辑和合成质量的重要手段。 在配置文件中使用 visualizer 可以在训练或测试时保存可视化结果。您可以跟随MMEngine文档学习可视化的用法。MMagic提供了一套丰富的可视化功能。 在本教程中,我们将介绍MMagic提供的可视化函数的用法。

概述

建议先学习 设计文档 里关于可视化的基本概念。

在MMagic中,训练或测试过程的可视化需要配置三个组件:VisualizationHookVisualizerVisBackend, 如下图表展示了 VisualizerVisBackend 的关系。

VisualizationHook 在训练期间以固定的间隔获取模型输出的可视化结果,并将其传递给VisualizerVisualizer 负责将原始可视化结果转换为所需的类型(png, gif等),然后将其传输到VisBackend进行存储或显示。

GAN的可视化配置

对于像StyleGANSAGAN这样的GAN模型,通常的配置如下所示:

# 可视化钩子
custom_hooks = [
    dict(
        type='VisualizationHook',
        interval=5000,  # 配置可视化勾子的间隔数
        fixed_input=True,  # 是否固定噪声输入生成图像
        vis_kwargs_list=dict(type='GAN', name='fake_img')  # 对于GAN模型预先定义可视化参数
    )
]
# 可视化后端
vis_backends = [
    dict(type='VisBackend'),  # 可视化后端用于存储。
    dict(type='WandbVisBackend',  # 可以上传至Wandb的可视化后端
        init_kwargs=dict(
            project='MMagic',   # Wandb项目名
            name='GAN-Visualization-Demo'  # Wandb实验命名
        ))
]
# 可视化器
visualizer = dict(type='Visualizer', vis_backends=vis_backends)

如果您将指数移动平均(EMA)应用于生成器,并希望可视化EMA模型,您可以修改VisualizationHook的配置,如下所示:

custom_hooks = [
   dict(
       type='VisualizationHook',
       interval=5000,
       fixed_input=True,
       # 同时在`fake_img`中可视化ema以及orig
       vis_kwargs_list=dict(
           type='Noise',
           name='fake_img',  # 使用`fake_img`保存图片
           sample_model='ema/orig',  # 对于`NoiseSampler`特别定义参数
           target_keys=['ema.fake_img', 'orig.fake_img']  # 指定的可视化的键值
       ))
]

图像翻译模型的可视化配置

对于CycleGANPix2Pix等翻译模型,可以形成如下可视化配置:

# 可视化钩子
custom_hooks = [
    dict(
        type='VisualizationHook',
        interval=5000,
        fixed_input=True,
        vis_kwargs_list=[
            dict(
                type='Translation',  # 在训练集可视化结果
                name='trans'),  #  保存`trans`字段的图像
            dict(
                type='Translationval',  # 在验证集可视化结果
                name='trans_val'),  #  保存`trans_val`字段的图像
        ])
]
# 可视化后端
vis_backends = [
    dict(type='VisBackend'),  # 可视化后端用于存储。
    dict(type='WandbVisBackend',  # 可以上传至Wandb的可视化后端
        init_kwargs=dict(
            project='MMagic',   # Wandb项目名
            name='Translation-Visualization-Demo'  # Wandb实验命名
        ))
]
# 可视化器
visualizer = dict(type='Visualizer', vis_backends=vis_backends)

扩散模型的可视化配置

对于扩散模型,例如Improved-DDPM,我们可以使用以下配置通过gif来可视化去噪过程:

# 可视化钩子
custom_hooks = [
    dict(
        type='VisualizationHook',
        interval=5000,
        fixed_input=True,
        vis_kwargs_list=dict(type='DDPMDenoising'))  # 对于DDPM模型预先定义可视化参数
]
# 可视化后端
vis_backends = [
    dict(type='VisBackend'),  # 可视化后端用于存储。
    dict(type='WandbVisBackend',  # 可以上传至Wandb的可视化后端
        init_kwargs=dict(
            project='MMagic',   # Wandb项目名
            name='Diffusion-Visualization-Demo'  # Wandb实验命名
        ))
]
# 可视化器
visualizer = dict(type='Visualizer', vis_backends=vis_backends)

图像补全模型的可视化配置

对于图像补全模型,如AOT-GANGlobal&Local,通常的配置如下所示:

# 可视化后端
vis_backends = [dict(type='LocalVisBackend')]
# 可视化器
visualizer = dict(
    type='ConcatImageVisualizer',
    vis_backends=vis_backends,
    fn_key='gt_path',
    img_keys=['gt_img', 'input', 'pred_img'],
    bgr2rgb=True)
# 可视化钩子
custom_hooks = [dict(type='BasicVisualizationHook', interval=1)]

图像抠图模型的可视化配置

对于DIMGCA等图像抠图模型,通常的配置如下所示:

# 可视化后端
vis_backends = [dict(type='LocalVisBackend')]
# 可视化器
visualizer = dict(
    type='ConcatImageVisualizer',
    vis_backends=vis_backends,
    fn_key='trimap_path',
    img_keys=['pred_alpha', 'trimap', 'gt_merged', 'gt_alpha'],
    bgr2rgb=True)
# 可视化钩子
custom_hooks = [dict(type='BasicVisualizationHook', interval=1)]

SISR/VSR/VFI等模型的可视化配置

对于SISR/VSR/VFI等模型,如EDSR, EDVRCAIN,通常的配置如下所示:

# 可视化后端
vis_backends = [dict(type='LocalVisBackend')]
# 可视化器
visualizer = dict(
    type='ConcatImageVisualizer',
    vis_backends=vis_backends,
    fn_key='gt_path',
    img_keys=['gt_img', 'input', 'pred_img'],
    bgr2rgb=False)
# 可视化钩子
custom_hooks = [dict(type='BasicVisualizationHook', interval=1)]

可视化钩子、可视化器和可视化后端组件的具体配置如下所述.

可视化钩子

在MMagic中,我们使用BasicVisualizationHookVisualizationHook作为可视化钩子。 可视化钩子支持以下三种情况。

(1) 修改vis_kwargs_list,实现特定输入下模型输出的可视化,适用于特定数据输入下GAN生成结果和图像翻译模型的翻译结果的可视化等。下面是两个典型的例子:

# input as dict
vis_kwargs_list = dict(
    type='Noise',  # 使用'Noise'采样生成模型输入
    name='fake_img',  # 定义保存图像的命名
)

# input as list of dict
vis_kwargs_list = [
    dict(type='Arguments',  # 使用'Arguments'采样生成模型输入
         name='arg_output',  # 定义保存图像的命名
         vis_mode='gif',  # 通过gif来可视化
         forward_kwargs=dict(forward_mode='sampling', sample_kwargs=dict(show_pbar=True))  # 为'Arguments'采样定义参数
    ),
    dict(type='Data',  # 在dataloader使用'Data'采样提供数据作为可视化输入
         n_samples=36,  # 定义多少采样生成可视化结果
         fixed_input=False,  # 定义对于可视化过程不固定输入
    )
]

vis_kwargs_list接受字典或字典的列表作为输入。每个字典必须包含一个type字段,指示用于生成模型输入的采样器类型,并且每个字典还必须包含采样器所需的关键字字段(例如:ArgumentSampler要求参数字典包含forward_kwargs)。

需要注意的是,此内容由相应的采样器检查,不受BasicVisualizationHook的限制。

此外,其他字段是通用字段(例如:n_samplesn_row,name,fixed_input等等)。 如果没有传入,则使用BasicVisualizationHook初始化的默认值。

为了方便用户使用,MMagic为GANTranslation modelsSinGANDiffusion models预置了可视化参数,用户可以通过以下配置直接使用预定义的可视化方法:

vis_kwargs_list = dict(type='GAN')
vis_kwargs_list = dict(type='SinGAN')
vis_kwargs_list = dict(type='Translation')
vis_kwargs_list = dict(type='TranslationVal')
vis_kwargs_list = dict(type='TranslationTest')
vis_kwargs_list = dict(type='DDPMDenoising')

可视化器

在MMagic中,我们实现了ConcatImageVisualizerVisualizer,它们继承自mmengine.VisualizerVisualizer的基类是ManagerMixin,这使得Visualizer成为一个全局唯一的对象。 在实例化之后,Visualizer可以在代码的任何地方通过Visualizer.get_current_instance()调用,如下所示:

# configs
vis_backends = [dict(type='VisBackend')]
visualizer = dict(
    type='Visualizer', vis_backends=vis_backends, name='visualizer')
# `get_instance()` 是为全局唯一实例化调用
VISUALIZERS.build(cfg.visualizer)

# 通过上述代码实例化后,您可以在任何位置调用`get_current_instance`方法来获取可视化器
visualizer = Visualizer.get_current_instance()

Visualizer的核心接口是add_datasample。 通过这个界面,该接口将根据相应的vis_mode调用相应的绘图函数,以获得np.ndarray类型的可视化结果。 然后调用showadd_image来直接显示结果或将可视化结果传递给预定义的vis_backend

可视化后端

  • MMEngine的基本VisBackend包括LocalVisBackendTensorboardVisBackendWandbVisBackend。您可以关注MMEngine Documents了解更多有关它们的信息。

  • VisBackend: File System的后端。将可视化结果保存到相应位置。

  • TensorboardVisBackend: Tensorboard的后端。将可视化结果发送到Tensorboard。

  • WandbVisBackend: Wandb的后端。将可视化结果发送到Tensorboard。

一个Visualizer对象可以访问任意数量的visbackend,用户可以在代码中通过类名访问后端。

# 配置文件
vis_backends = [dict(type='Visualizer'), dict(type='WandbVisBackend')]
visualizer = dict(
    type='Visualizer', vis_backends=vis_backends, name='visualizer')
# 代码内
VISUALIZERS.build(cfg.visualizer)
visualizer = Visualizer.get_current_instance()

# 通过类名访问后端
gen_vis_backend = visualizer.get_backend('VisBackend')
gen_wandb_vis_backend = visualizer.get_backend('GenWandbVisBackend')

当有多个VisBackend具有相同的类名时,用户必须为每个VisBackend指定名称。

# 配置文件
vis_backends = [
    dict(type='VisBackend', name='gen_vis_backend_1'),
    dict(type='VisBackend', name='gen_vis_backend_2')
]
visualizer = dict(
    type='Visualizer', vis_backends=vis_backends, name='visualizer')
# 代码内
VISUALIZERS.build(cfg.visualizer)
visualizer = Visualizer.get_current_instance()

local_vis_backend_1 = visualizer.get_backend('gen_vis_backend_1')
local_vis_backend_2 = visualizer.get_backend('gen_vis_backend_2')

在不同的存储后端可视化

如果想用不同的存储后端( Wandb, Tensorboard, 或者远程窗口里常规的后端),像以下这样改配置文件的 vis_backends 就行了:

Local

vis_backends = [dict(type='LocalVisBackend')]

Tensorboard

vis_backends = [dict(type='TensorboardVisBackend')]
visualizer = dict(
    type='ConcatImageVisualizer', vis_backends=vis_backends, name='visualizer')

Wandb

vis_backends = [dict(type='WandbVisBackend', init_kwargs=dict(project={PROJECTS}, name={EXPNAME}))]
visualizer = dict(
    type='ConcatImageVisualizer', vis_backends=vis_backends, name='visualizer')
Read the Docs v: latest
Versions
latest
stable
0.x
Downloads
pdf
epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.