当前位置: 首页 > news >正文

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构造参数直接支持classespalette

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)

注意classespalette长度必须一致,一一对应;两者优先级高于dataset_name自动查表。

四、结果怎么看:盯住 4 个信号

训练截图里左边是 GT、右边是预测,对着看这 4 个信号:

  1. 边界贴合度:预测掩码边缘明显比 GT 模糊、或整体向内缩了一圈,说明边界学习能力不足,优先怀疑损失函数和输入分辨率,而不是先换网络。
  2. 类别缺失:某个类别的颜色在预测侧完全没出现,而 GT 侧有——大概率是类别不平衡或该类别标注有问题,先查数据再怀疑模型。
  3. 整图单一色:预测侧几乎被一种颜色占满,模型可能在塌缩到多数类,看 loss 时容易漏掉这个信号,图上则一目了然。
  4. 标签对得上吗:打开--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),仅供参考

http://www.cnnetsun.cn/news/4191296.html

相关文章:

  • 【前端知识点总结】Nginx 指南:从开发到生产的完美衔接
  • 具身智能体记忆系统BrainMem:类脑记忆与任务规划实践
  • SwiftUIRefresh API参考:.pullToRefresh()修饰符参数详解、版本演进与使用注意事项
  • PEEU框架:让GUI智能体通过自主探索与事后经验高效学习任务规划
  • Kubetap 命令全解:如何用 on / off / list 快速代理任意 Kubernetes Service,附全部隐藏参数
  • java-reader面试冲刺篇:Java基础+Redis高频面试题,术语化答题模板助你通关
  • SwiftOpenAI图像生成实战:DALL-E与新ImageGen API创建、编辑一步到位
  • vim-toml 开发者指南:如何读懂项目结构并提交你的第一个 PR
  • Shadplay 源码拆解:Bevy Material trait、AsBindGroup 着色器数据绑定与插件注册完整指南
  • UART协议与IP核验证:从波形到寄存器的工程闭环
  • 论文复现升级:随机性、依赖和评测脚本逐项核对
  • 文本摘要评估框架sumeval完全解析:ROUGE/BLEU一站搞定,多语言支持让评测不再头疼
  • 分布式机器学习中激励相容的梯度上报机制设计与收敛性分析
  • REAP项目解析:从生产日志构建真实AI编程助手评测基准
  • Dockerless验证器:AI代码生成时代的高效安全验证方案
  • 网盘直链下载助手使用指南:8 大平台直链解析与下载器配置
  • 数学建模竞赛复盘:从葡萄酒评价赛题看数据分析与机器学习实战
  • 数学建模竞赛中的炉温曲线优化:从传热模型到工艺参数求解
  • cljfmt、clojure-lsp与depot如何依赖rewrite-clj:构建你自己的Clojure代码工具实战手册
  • 马尔可夫链核心原理与应用:从状态转移矩阵到平稳分布
  • Agentic AI故障诊断:构建分类法与系统性解决方案
  • MediaHelp豆瓣推荐与TMDB智能集成:零配置API密钥,快速构建私人媒体库
  • C++模板类中友元机制深度解析:从语法陷阱到工程实践
  • 手机硬件研发全链路:从SoC选型到量产良率的硬核实践
  • Songloft完整使用指南:从扫描曲库到手机播放的6步快速上手
  • TypeGo:面向具身智能体的类型安全实时操作系统运行时
  • Executor执行内核揭秘:QuickJS WASM沙箱如何安全运行LLM生成的代码
  • Tomcat Docker 官方镜像 JDK 与 JRE 变体揭秘:同一 Tomcat 为何体积能省一半?
  • 没有调音台也能开唱:KaraokeEternal推荐的音频与麦克风连接方案
  • 数学建模竞赛获奖名单解读:从能力培养到职业发展的核心价值