3 步跑通 mmsegmentation 语义分割可视化:把训练状态看得一清二楚
3 步跑通 mmsegmentation 语义分割可视化:把训练状态看得一清二楚
【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation
训练完语义分割模型,你盯着 loss 曲线看了半天,却说不出模型到底学到哪了;推理之后拿到的是一张"标签索引的彩色噪点图",到底哪块是路、哪块是建筑,谁也说不清。mmsegmentation(OpenMMLab 出品的语义分割工具箱)内置了一套语义分割可视化机制,把预测结果和真实标注直接渲染成带颜色、带文字的可读掩码图——单张图像推理看图、训练过程定期截图,两种用法下面都给你讲明白。
一、它到底能帮你做什么?
先给结论:这套可视化的核心是把"像素级的类别索引"翻译成"人眼能直接看懂的图",一共 5 个核心能力:
| 能力 | 说人话解释 | 典型用法 |
|---|---|---|
| GT 与预测并排对比 | 左图真实标注、右图模型预测,一眼看出差在哪 | 训练钩子 /add_datasample |
| 掩码透明度调节 | alpha/opacity控制掩码遮不遮原图 | 推理 demo、配置文件 |
| 类别名标签叠加 | 掩码上直接写 "car""road",不用查色卡 | 推理时加--with-labels |
| 自定义调色板 | 用自己的classes+palette控制每个类别的颜色 | 自建数据集 |
| 深度图可视化 | 把深度估计渲染成热图贴在原图下方 | Adabins 等深度任务 |
其中前四项封装在 mmseg/visualization/local_visualizer.py 的SegLocalVisualizer类里,推理脚本里用的MMSegInferencer也是调它来画图的。
二、三步跑起来:单张图像可视化最快上手
这一步的目标:用现成的 FCN 预训练模型,把一张图切给你看。
第 1 步:拿到代码
git clone https://gitcode.com/GitHub_Trending/mm/mmsegmentation cd mmsegmentation第 2 步:安装
python -m pip install -r requirements.txt python -m pip install -e .第 3 步:运行推理可视化脚本
python demo/image_demo_with_inferencer.py \ demo/classroom__rgb_00283.jpg \ configs/fcn/fcn_r50-d8_4xb2-40k_cityscapes-512x1024.py \ --checkpoint ./weights/fcn_r50-d8_cityscapes.pth \ --out-dir vis_output \ --with-labels \ --opacity 0.7关键参数就 4 个,每个一行注释:
--checkpoint:模型权重文件的本地路径,换成你自己下载好的权重--out-dir:结果图片保存目录,跑完直接去文件夹里看图--with-labels:在掩码上叠加类别名文字--opacity:掩码透明度,范围 (0, 1],默认 0.5,越大越"实"
另外两个容易踩的参数:--dataset-name决定用哪套调色板渲染掩码,默认cityscapes;--device默认cuda:0,没有显卡就改成--device cpu。
三、分场景怎么用?
场景 1:快速验证预训练模型效果
拿几批业务图片批量过一遍image_demo_with_inferencer.py,把--out-dir指到一个目录。判断标准很简单:预测侧掩码里能不能出现你关心的类别、边界贴不贴合物体轮廓。这一步不碰任何训练配置,5 分钟就能判断"这个模型值不值得在你的数据上微调"。
场景 2:训练中定期"抓图"检查模型状态 📊
mmsegmentation 默认配置 configs/base/default_runtime.py 里已经挂了本地可视化后端:
vis_backends = [dict(type='LocalVisBackend')] visualizer = dict( type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer', alpha=0.7)默认每 100 次迭代就会自动渲染一组"左 GT / 右预测"的对比图,存到work_dir/vis_data下,按迭代次数命名。想在本地文件之外同步写进 TensorBoard,就在vis_backends里追加一行dict(type='TensorboardVisBackend'),然后照常python tools/train.py 你的配置.py启动训练,无需额外写钩子代码。
场景 3:自建数据集,自定义类别名和颜色
如果你的数据集类别和 cityscapes 不一样,别去改源码——SegLocalVisualizer构造参数直接支持classes和palette:
visualizer = dict( type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer', classes=['road', 'building', 'vegetation'], # 与标注索引一一对应 palette=[[0, 255, 0], [255, 0, 0], [0, 255, 255]], # 每类一个 RGB 颜色 alpha=0.7)注意classes和palette长度必须一致,一一对应;两者优先级高于dataset_name自动查表。
四、结果怎么看:盯住 4 个信号
训练截图里左边是 GT、右边是预测,对着看这 4 个信号:
- 边界贴合度:预测掩码边缘明显比 GT 模糊、或整体向内缩了一圈,说明边界学习能力不足,优先怀疑损失函数和输入分辨率,而不是先换网络。
- 类别缺失:某个类别的颜色在预测侧完全没出现,而 GT 侧有——大概率是类别不平衡或该类别标注有问题,先查数据再怀疑模型。
- 整图单一色:预测侧几乎被一种颜色占满,模型可能在塌缩到多数类,看 loss 时容易漏掉这个信号,图上则一目了然。
- 标签对得上吗:打开
--with-labels,核对文字标签和掩码颜色是否匹配,不匹配说明classes/palette配置顺序错了,结果再"好看"也是错的。
五、避坑指南 ⚠️
- 颜色全错或一片同色:
--dataset-name默认是cityscapes,拿它渲染自建数据集必然对不上。显式传--dataset-name 你的数据集,或在配置里写classes/palette。 - 服务器上
--show没反应:--show依赖本地 GUI 窗口,无头环境会静默失败。改用--out-dir保存图片,看文件最稳。 - CPU 机器直接报 CUDA 错误:
--device默认cuda:0,纯 CPU 环境记得加--device cpu,推理会慢但能跑通。 opacity调到 1 后找不到原图:掩码会完全盖住原图。想对比细节就调低到 0.3~0.5;想看清掩码轮廓就调高到 0.7 左右。
写在最后
一句话总结:推理时用image_demo_with_inferencer.py看图、训练时盯vis_data目录里的对比图,语义分割训练就不再是黑盒。下一步建议:先用上面"4 个信号"检查一遍你手头模型的可视化截图,确认问题出在数据还是结构,再去动配置。更多入门内容可参考官方文档:docs/zh_cn/get_started.md。
【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
