MMSegmentation 1.x 可视化全攻略:训练监控、验证预测与单样本结果渲染
MMSegmentation 1.x 可视化全攻略训练监控、验证预测与单样本结果渲染【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读本文围绕 MMSegmentation 1.x 的官方可视化能力展开系统讲解两大核心场景训练状态监控基于 TensorBoard 的标量曲线查看与数据/结果可视化验证与测试期间自动保存预测图、单样本语义分割结果渲染。读完本文你将掌握TensorboardVisBackend的配置方法、SegVisualizationHook的参数调优、SegLocalVisualizer的编程式调用并从源码层面理解调色板叠加、类别标签绘制与SegDataSample数据结构的工作机制可以直接上手复现文中的配置与脚本。一、训练状态监控TensorBoard 集成MMSegmentation 1.x 使用 TensorBoard 监控训练状态。其核心思路是把训练过程中由日志处理器log processor产出的标量学习率、损失、data_time、各类评估指标通过可视化后端VisBackend写入磁盘再由 TensorBoard 服务读取展示。1.1 安装 TensorBoard 依赖按照 TensorFlow 官方安装指南的步骤安装即可核心命令如下pip install tensorboardX pip install future tensorboard其中tensorboardX用于写入事件文件tensorboard用于启动可视化服务。1.2 在配置中添加TensorboardVisBackendMMSegmentation 的默认运行时配置位于 configs/base/default_runtime.py其默认只启用本地后端vis_backends [dict(typeLocalVisBackend)] visualizer dict( typeSegLocalVisualizer, vis_backendsvis_backends, namevisualizer)要启用 TensorBoard需要在vis_backends列表中追加TensorboardVisBackendvis_backends [dict(typeLocalVisBackend), dict(typeTensorboardVisBackend)] visualizer dict( typeSegLocalVisualizer, vis_backendsvis_backends, namevisualizer)两点说明LocalVisBackend负责把标量、图片等写入本地vis_data目录务必保留因为 TensorBoard 读取的正是该目录下的事件文件visualizer统一指定为typeSegLocalVisualizer它是 MMSegmentation 对 MMEngineVisualizer的语义分割定制实现源码见 mmseg/visualization/local_visualizer.py训练、验证、测试流程都通过这个实例向外输出可视化数据。1.3 启动训练并检查标量以 PSPNet 在 ADE20K 上的训练配置为例启动一次训练实验python tools/train.py configs/pspnet/pspnet_r50-d8_4xb4-80k_ade20k-512x512.py --work-dir work_dir/test_visual开始训练后在work_dir下找到vis_data路径例如work_dirs/test_visual/20220810_115248/vis_datavis_data目录中的标量文件包括学习率、损失函数、data_time等同时记录了评估指标结果。如果你想记录自定义数据例如自定义 loss 的中间分量可以参照 MMEngine 的记录日志教程自行扩展日志记录逻辑这里不再展开。使用下面的命令启动 TensorBoard 查看可视化结果tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data启动后浏览器打开 TensorBoard 默认地址通常为http://localhost:6006即可看到 loss、lr、mIoU 等曲线随迭代的变化。二、数据和结果的可视化2.1 验证/测试期间自动可视化SegVisualizationHookMMSegmentation 提供了SegVisualizationHook它是一个用于在模型验证和测试期间可视化 ground truth 与预测分割结果的钩子源码位于 mmseg/engine/hooks/visualization_hook.py。其核心配置位于default_hooks中执行器层面的钩子装配逻辑可参见 MMEngine 的 Runner 教程。SegVisualizationHook的关键参数参数默认值作用drawFalse是否绘制预测结果。为False时钩子完全不生效不绘制也不存储任何结果interval50可视化采样间隔以迭代/iter 为单位。设为 1 时保存每一次推理结果showFalse是否直接弹窗显示绘制图像。为True时只显示不存储vis_backends会被排除wait_time0showTrue时窗口显示的间隔秒backend_argsNone实例化文件后端的参数依赖 mmcv2.0.0rc4、mmengine0.2.0例如在 configs/base/schedules/schedule_20k.py 中修改SegVisualizationHook配置将draw置为True以启用网络推理结果的存储interval设为 1 表示保存每次推理结果default_hooks dict( timerdict(typeIterTimerHook), loggerdict(typeLoggerHook, interval50, log_metric_by_epochFalse), param_schedulerdict(typeParamSchedulerHook), checkpointdict(typeCheckpointHook, by_epochFalse, interval2000), sampler_seeddict(typeDistSamplerSeedHook), visualizationdict(typeSegVisualizationHook, drawTrue, interval1))从源码看该钩子在after_val_iter中每self.interval个验证迭代触发一次total_curr_iter runner.iter batch_idx能被interval整除时读取outputs[0].img_path对应的图片调用self._visualizer.add_datasample完成绘制在after_test_iter中则对每个测试样本逐个可视化step用self._test_index递增标记。因此验证阶段启动训练实验后可视化结果会在 validation loop 中存储到本地文件夹测试阶段对一个数据集启动评估模型时如python tools/test.py ...每个样本的预测结果同样会被存储。本地可视化的存储结果保存在$WORK_DIRS/vis_data/vis_image下例如work_dirs/test_visual/20220810_115248/vis_data/vis_image另外如果在vis_backends中同时添加了TensorboardVisBackend见上文 1.2 节配置还可以运行下面的命令在 TensorBoard 的 IMAGES 面板中查看这些预测图tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data2.2 可视化单个数据样本SegLocalVisualizer当你想脱离训练/验证流程、独立可视化某个样本例如调试数据集、检查标注质量时建议直接使用SegLocalVisualizer。SegLocalVisualizer是继承自 MMEngineVisualizer类的子类专门面向 MMSegmentation 的可视化需求语义分割掩码叠加、类别标签绘制、深度图绘制等。其构造参数包括name、image、vis_backends、save_dir、classes、palette、dataset_name与alpha掩码透明度默认0.8等注册于VISUALIZERS注册表。以下是官方示例脚本Cityscapes 样本。首先下载示例数据wget https://user-images.githubusercontent.com/24582831/189833109-eddad58f-f777-4fc0-b98a-6bd429143b06.png --output-document aachen_000000_000019_leftImg8bit.png wget https://user-images.githubusercontent.com/24582831/189833143-15f60f8a-4d1e-4cbb-a6e7-5e2233869fac.png --output-document aachen_000000_000019_gtFine_labelTrainIds.png然后编写脚本对其进行可视化import mmcv import os.path as osp import torch # PixelData 是 MMEngine 中用于定义像素级标注或预测的数据结构 # 详情可参考 MMEngine 的数据结构教程PixelData 章节。 from mmengine.structures import PixelData # SegDataSample 是 MMSegmentation 中定义的不同组件之间的数据结构接口 # 它包含 ground truth、语义分割预测结果和预测 logits。 from mmseg.structures import SegDataSample from mmseg.visualization import SegLocalVisualizer out_file out_file_cityscapes save_dir ./work_dirs image mmcv.imread( osp.join( osp.dirname(__file__), ./aachen_000000_000019_leftImg8bit.png ), color) sem_seg mmcv.imread( osp.join( osp.dirname(__file__), ./aachen_000000_000019_gtFine_labelTrainIds.png # noqa ), unchanged) sem_seg torch.from_numpy(sem_seg) gt_sem_seg_data dict(datasem_seg) gt_sem_seg PixelData(**gt_sem_seg_data) data_sample SegDataSample() data_sample.gt_sem_seg gt_sem_seg seg_local_visualizer SegLocalVisualizer( vis_backends[dict(typeLocalVisBackend)], save_dirsave_dir) # 数据集的元信息通常包括类名的 classes 和 # 用于可视化每个前景颜色的 palette。 # 所有类名和调色板都在 mmseg/utils/class_names.py 中定义。 seg_local_visualizer.dataset_meta dict( classes(road, sidewalk, building, wall, fence, pole, traffic light, traffic sign, vegetation, terrain, sky, person, rider, car, truck, bus, train, motorcycle, bicycle), palette[[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156], [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0], [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60], [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], [0, 80, 100], [0, 0, 230], [119, 11, 32]]) # 当 showTrue 时直接显示结果 # 当 showFalse 时结果将保存在本地文件夹中。 seg_local_visualizer.add_datasample(out_file, image, data_sample, showFalse)运行后可视化图像结果和其对应的 ground truth 图像可以在./work_dirs/vis_data/vis_image/路径找到文件名是out_file_cityscapes_0.png。脚本要点解读PixelData(**gt_sem_seg_data)用像素级数据构造 MMEngine 数据结构sem_seg的 shape 为(1, H, W)data_sample.gt_sem_seg gt_sem_seg把标注挂载到SegDataSample上可视化器据此取到gt_sem_seg字段dataset_meta中的classes与palette必须一一对应数量相等否则会触发断言错误见set_dataset_meta中的assert len(classes) len(palette)add_datasample在showFalse、未指定out_file时会把绘制结果交给LocalVisBackend写入save_dir/vis_data/vis_image/。三、源码级深度解析3.1SegLocalVisualizer的绘制流程SegLocalVisualizermmseg/visualization/local_visualizer.py的核心绘制链路如下add_datasample(name, image, data_sample, draw_gtTrue, draw_predTrue, showFalse, wait_time0, out_fileNone, step0, with_labelsTrue)入口方法同时绘制 GT 与预测。当两者都存在时左右拼接为一张图np.concatenate((gt_img_data, pred_img_data), axis1)左侧为 ground truth右侧为预测结果showTrue时忽略所有后端直接弹窗指定out_file时用mmcv.imwrite(mmcv.rgb2bgr(drawn_img), out_file)落盘否则交给add_image写入后端。_draw_sem_seg(image, sem_seg, classes, palette, with_labelsTrue)按palette把每个类别的像素填充为对应颜色生成彩色掩码再与原始图像按color_seg image * (1 - self.alpha) mask * self.alpha融合alpha默认 0.8即掩码透明度随后为每个类别调用_get_center_loc计算该类连通区域的中心位置用 OpenCV 绘制类别名称文本标签字号随图像尺寸自适应缩放小图thickness1大图thickness2。set_dataset_meta(classes, palette, dataset_name)当未显式传入classes/palette时会以dataset_name默认cityscapes为键从 mmseg/utils/class_names.py 的get_classes/get_palette中自动获取类名与调色板并写入self.dataset_meta。从上述实现可以推断alpha直接控制分割掩码与原始图像的叠加透明度with_labels控制是否在掩码上绘制类别名而step参数用于标记写入后端时的迭代步数在验证钩子中即取当前迭代号。3.2 数据载体SegDataSample与PixelDataSegDataSample定义于 mmseg/structures/seg_data_sample.py继承自 MMEngine 的BaseDataElement是 MMSegmentation 各组件之间传递数据的接口主要字段包括gt_sem_segPixelData语义分割的 ground truthpred_sem_segPixelData语义分割的预测结果seg_logitsPixelData预测的 logits。其中PixelData是 MMEngine 中专门描述像素级标注/预测的数据结构承载(1, H, W)的类别索引张量。这也是 2.2 节脚本中PixelData(**gt_sem_seg_data)与data_sample.gt_sem_seg gt_sem_seg两行代码的意义所在。3.3 类名与调色板class_names.pyget_classes(dataset)与get_palette(dataset)位于 mmseg/utils/class_names.py内部通过dataset_aliases字典把数据集别名如cityscapes、ade20k、coco_stuff164k、isaid等映射到标准名称再调用对应的xxx_classes()/xxx_palette()函数例如cityscapes_classes()返回 19 个类名road、sidewalk、building……bicyclecityscapes_palette()返回一一对应的 19 组 RGB 颜色——这正是 2.2 节脚本中手写dataset_meta的等价来源传入无法识别的数据集名称时抛出ValueError传入非字符串类型时抛出TypeError。因此在大多数场景下你并不需要手写palette直接通过SegLocalVisualizer(dataset_namecityscapes)即可自动加载显式传入的classes/palette优先级更高。3.4 钩子与可视化器的协同以测试验证SegVisualizationHookmmseg/engine/hooks/visualization_hook.py在__init__中通过Visualizer.get_current_instance()拿到配置中声明的SegLocalVisualizer单例验证时按interval采样、测试时逐样本调用add_datasample把SegDataSample含 GT 与预测交给可视化器统一渲染。这一链路在仓库测试中也有覆盖tests/test_visualization/test_local_visualizer.py验证SegLocalVisualizer的构造、dataset_meta设置、add_datasample绘制与保存行为tests/test_engine/test_visualization_hook.py验证钩子在不同draw/interval/show组合下的行为如drawFalse时不产生输出。如果你需要阅读官方提供的第二个可视化示例可以参考仓库中另一篇进阶文档 docs/zh_cn/user_guides/visualization_feature_map.md它演示了如何使用SegLocalVisualizer绘制特征图而本文所述方法与 docs/zh_cn/user_guides/4_train_test.md训练与测试、docs/zh_cn/user_guides/3_inference.md推理配合使用可以覆盖从训练监控到结果分析的全流程可视化需求。四、小结MMSegmentation 1.x 的可视化体系以SegLocalVisualizer为枢纽、以SegVisualizationHook为自动触发机制、以LocalVisBackend/TensorboardVisBackend为输出通道训练监控在 configs/base/default_runtime.py 的vis_backends中加入TensorboardVisBackend训练后用tensorboard --logdir查看标量曲线验证/测试自动化可视化在default_hooks中配置SegVisualizationHook(drawTrue, interval...)结果自动落盘到$WORK_DIRS/vis_data/vis_image也可在 TensorBoard IMAGES 面板查看单样本可视化用SegLocalVisualizer配合SegDataSample与dataset_meta编程式渲染控制show/out_file/alpha/with_labels等参数即可灵活输出。掌握这套可视化工具链可以显著提升训练排障与结果分析的效率损失曲线异常时查看标量趋势分割边界模糊时直接查看预测图与 GT 的并排对比从而快速定位模型与数据的问题。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考