ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MMSegmentation 可视化完全指南:TensorBoard 训练监控、验证结果与单样本可视化

MMSegmentation 可视化完全指南:TensorBoard 训练监控、验证结果与单样本可视化 MMSegmentation 可视化完全指南TensorBoard 训练监控、验证结果与单样本可视化【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentationMMSegmentation 1.x 内置了一整套可视化能力覆盖模型开发全流程训练期间借助 TensorBoard 实时监控学习率、损失与指标曲线验证与测试阶段通过SegVisualizationHook自动保存网络预测结果并支持用SegLocalVisualizer对单张图像进行精细化的语义分割可视化。本文以官方用户指南为骨架结合仓库源码逐层剖析可视化组件的配置方式、调用链与底层原理读完即可在自己的训练与推理脚本中直接落地使用。一、MMSegmentation 可视化体系总览在 MMSegmentation 1.x 中可视化功能主要由三个层次构成VisBackend可视化后端定义可视化结果的输出目的地包括保存到本地文件夹的LocalVisBackend、写入 TensorBoard 的TensorboardVisBackend等在配置文件中的vis_backends列表里声明。Visualizer可视化器真正负责画图的组件。MMSegmentation 在 MMEngineVisualizer基础上扩展出SegLocalVisualizer支持绘制语义分割掩膜、深度图与类别标签。Hook钩子在训练/验证/测试流程的特定时机自动触发可视化即SegVisualizationHook挂在default_hooks中。三者配合构成了后端声明输出位置、可视化器负责绘制、钩子自动触发的完整链路。默认配置可见 configs/base/default_runtime.py其中只启用了本地后端vis_backends [dict(typeLocalVisBackend)] visualizer dict( typeSegLocalVisualizer, vis_backendsvis_backends, namevisualizer)二、训练状态监控接入 TensorBoard2.1 安装与配置 TensorBoard 后端MMSegmentation 1.x 使用 TensorBoard 监控训练状态。首先按官方指引安装依赖pip install tensorboardX pip install future tensorboard然后在配置文件的vis_backends中加入TensorboardVisBackend即可同时向本地和 TensorBoard 输出。以 configs/base/default_runtime.py 中的visualizer配置为模板修改为vis_backends [dict(typeLocalVisBackend), dict(typeTensorboardVisBackend)] visualizer dict( typeSegLocalVisualizer, vis_backendsvis_backends, namevisualizer)其中typeSegLocalVisualizer指向 mmseg/visualization/local_visualizer.py 中通过VISUALIZERS.register_module()注册的组件namevisualizer供 Runner 与 Hook 通过Visualizer.get_current_instance()获取全局实例见 mmseg/engine/hooks/visualization_hook.py。2.2 启动训练并定位 vis_data 目录以 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目录中保存的标量文件scalars包括学习率lr、各类损失loss与数据加载耗时data_time等同时也会记录验证指标结果。若需要在日志中输出自定义数据可参考 MMEngine 的 logging 教程在 Hook 中自行记录。2.3 在 TensorBoard 中查看曲线启动 TensorBoard 并指向vis_datatensorboard --logdir work_dirs/test_visual/20220810_115248/vis_data浏览器打开 TensorBoard 默认地址http://localhost:6006后即可在 SCALARS 面板中查看学习率、各损失项与指标随迭代的变化曲线实现对训练过程的实时监控。三、验证/测试期间的结果可视化SegVisualizationHook3.1 Hook 的作用与配置位置MMSegmentation 提供的SegVisualizationHook是一个继承自 MMEngineHook的钩子注册于 mmseg/engine/hooks/visualization_hook.py其职责是在模型验证与测试过程中将输入图像与对应的真值ground truth、预测结果prediction一并绘制并存储。它挂在配置的default_hooks中配合 Runner 的验证/测试循环工作。以下面 configs/base/schedules/schedule_20k.py 中的默认配置为例开启可视化只需给visualization钩子传入drawTruedefault_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))参数说明与 visualization_hook.py 构造函数一一对应drawbool默认 False是否绘制预测结果。为False时钩子直接返回、不产生任何可视化输出为True时才启用存储。源码中若drawFalse会发出 The results will NOT be visualized or stored 的警告。intervalint默认 50预测结果的采样间隔。设置为1时每次网络推理结果都会被保存默认50表示每 50 次迭代保存一次。showbool默认 False若为True则只弹出窗口显示、不存储数据此时钩子会清空vis_backends见源码 visualization_hook.py。wait_timefloat默认 0showTrue时窗口展示的间隔秒。backend_argsdict可选构造文件后端的参数需要 mmcv2.0.0rc4、mmengine0.2.0。3.2 Hook 触发时机与调用链从源码实现看SegVisualizationHook重写了两个生命周期方法after_val_itervisualization_hook.py在每个验证迭代结束后触发。它只可视化批次中的第一张图以val_{图片名}作为窗口名并依据total_curr_iter runner.iter batch_idx判断是否满足interval采样条件满足时调用self._visualizer.add_datasample(...)绘制并存储。after_test_itervisualization_hook.py在每个测试迭代结束后触发会遍历批次内全部data_sample以test_{图片名}命名并依次绘制。两者都会从data_sample.img_path读取原始图像用mmcv.imfrombytes(img_bytes, channel_orderrgb)解码为 RGB 格式再交给SegLocalVisualizer.add_datasample完成掩膜叠加与标签绘制。测试结果的可视化对每一个样本都会执行适合用tools/test.py单独评估模型时查看逐张预测效果。3.3 查看可视化输出启动训练实验后验证循环产生的可视化结果会保存在本地文件夹中单独用tools/test.py评估模型时预测结果同样会存到本地。本地存储位置统一为$WORK_DIRS/vis_data下的vis_image目录例如work_dirs/test_visual/20220810_115248/vis_data/vis_image如果按上文 2.1 节在vis_backends中加入了TensorboardVisBackend也可以直接在 TensorBoard 中查看这些图像tensorboard --logdir work_dirs/test_visual/20220810_115248/vis_dataTensorBoard 的 IMAGES 面板会显示每次采样保存的真值与预测对比图无需人工翻看本地文件。四、单数据样本可视化SegLocalVisualizer 实战4.1 为什么推荐 SegLocalVisualizer当只想可视化单个数据样本例如调试某张图的标注或预测结果时官方建议直接使用SegLocalVisualizer。它是 mmseg/visualization/local_visualizer.py 中定义、继承自 MMEngineVisualizer的子类专为语义分割场景扩展了掩膜绘制能力。其关键构造参数包括name默认 visualizer实例名称。vis_backends后端配置列表决定结果写到本地还是 TensorBoard。save_dir所有存储后端的保存根目录为None时不保存任何数据。classes/palette类别名与对应调色板不传时默认使用cityscapes的类别与调色板。dataset_name数据集名或别名可视化器据此自动获取该类别的元信息显式传入的classes、palette优先级更高。alpha默认 0.8分割掩膜的透明度控制原图与掩膜叠加时的混合比例见 local_visualizer.py 的color_seg image * (1 - alpha) mask * alpha。类别名与调色板的获取逻辑位于 mmseg/utils/class_names.py 的get_classes/get_palette函数两者通过dataset_aliases别名表class_names.py将用户传入的数据集名映射为内部名称再调用对应的xxx_classes()/xxx_palette()返回结果无法识别的数据集名会抛出ValueError。4.2 完整示例可视化一张 Cityscapes 图像的真值掩膜SegDataSample是 MMSegmentation 内部各组件之间传递数据的数据结构包含真值gt_sem_seg、预测pred_sem_seg与预测 logitsseg_logits等字段字段定义见 mmseg/structures/seg_data_sample.py其像素级数据统一存放在 MMEngine 的PixelData中。首先准备示例数据官方提供的 Cityscapes 图像与其labelTrainIds真值标注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然后编写以下 Python 脚本完成可视化import mmcv import os.path as osp import torch # PixelData 是 MMEngine 中定义的像素级标注或预测数据结构 from mmengine.structures import PixelData # SegDataSample 是 MMSegmentation 定义的各组件间数据接口 # 包含语义分割的真值、预测与预测 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) # 数据集的 meta 信息通常包含 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)运行后图像与对应真值的可视化结果将保存在./work_dirs/vis_data/vis_image/下文件名为out_file_cityscapes_0.png。4.3 add_datasample 的行为细节上述脚本的核心是add_datasample方法local_visualizer.py其行为规则如下真值与预测同绘当data_sample同时包含gt_sem_seg与pred_sem_seg且draw_gt、draw_pred均为True时最终结果是一张左右拼接图——左半为真值、右半为预测见 local_visualizer.py 的np.concatenate((gt_img_data, pred_img_data), axis1)。标签绘制with_labelsTrue默认时_draw_sem_seg会在每个类别的连通区域中心位置通过_get_center_loc计算见 local_visualizer.py绘制类别名文本与背景色块字体大小随图像尺寸自适应小图任一维小于 300使用更细的线宽。深度图支持除语义分割外add_datasample还检测gt_depth_map/pred_depth_map字段用_draw_depth_map将深度图以 feature map 形式与原始图像纵向拼接。输出控制showTrue时通过本地窗口显示out_file非空时直接写文件内部经mmcv.rgb2bgr转色否则交给self.add_image(name, drawn_img, step)分发到各vis_backends存储。另外需要注意可视化语义分割结果时dataset_meta中必须提供classes否则_draw_sem_seg会抛出断言错误 class information is not provided when visualizing semantic segmentation resultslocal_visualizer.py同时classes与palette的长度必须一致local_visualizer.py。五、进阶在预测结果中叠加真值对比SegVisualizationHook与SegLocalVisualizer的可视化能力可以组合出更完整的调试工作流。例如在验证或测试阶段SegDataSample会同时携带真值gt_sem_seg与预测pred_sem_segadd_datasample会自动生成左真值、右预测的并排对比图而用tools/test.py单独评估模型时after_test_iter会对每个测试样本逐一保存预测结果便于逐个案例排查模型在特定场景下的分割质量。若希望复用数据集自带的类别与调色板而不手动填写可以直接在配置中通过dataset_meta或构造SegLocalVisualizer时传入dataset_name由get_classes/get_palette自动解析支持 cityscapes、ade20k、voc、cocostuff、isaid、mapillary 等多个内置数据集的别名完整列表见 mmseg/utils/class_names.py 中的dataset_aliases。六、总结MMSegmentation 1.x 的可视化体系可以用三条主线快速上手训练监控在vis_backends中加入TensorboardVisBackend训练后用tensorboard --logdir .../vis_data查看学习率、损失与指标曲线验证/测试自动可视化在default_hooks.visualization中配置SegVisualizationHook(drawTrue, intervalN)结果自动存入vis_data/vis_image也可同步推送到 TensorBoard单样本精细可视化用SegLocalVisualizerSegDataSample手动构造数据样本通过add_datasample输出带类别标签的掩膜叠加图深度图与语义图可同图展示。配合 mmseg/visualization/local_visualizer.py、mmseg/engine/hooks/visualization_hook.py 与 mmseg/utils/class_names.py 三处源码读者既能直接复用官方配置也能在需要定制绘制逻辑如修改透明度、字体、标签样式或增加新数据类型时快速定位修改点。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表