语义分割中图片和mask的可视化

2023-11-04

其实取标题一直以来都是一件麻烦的事,但是如果你要看下去,我想你得有一点语义分割的见解。

用平常的语言描述该问题就是:语义分割出我们感兴趣的目标物,然后输出该目标物的轮廓点做语义分割其实有很多种方法,你可以用不同的模型去train你的dataset,但是刚接触语义分割的朋友们可能会说,我该怎么分割出我想要的目标物,而不对其它部分的像素做修改?其实这件事并不复杂,一个很直觉的想法是:修改像素对应的RGB值。那怎么修改对应像素的RGB值呢?举例来说,假设你在mmsegmentation框架下用的是SegFormer模型,你应该在class_names.py文件中修改cityscapespalette(如上图)

问题的前半段很好解决,那如何解决输出目标物轮廓点这件事情呢?一种比较直觉的想法是:将分割好的图片转为二值图,然后在转为灰度图,之后利用cv2.findContours()函数寻找轮廓点,为了验证轮廓点的准确性,再用cv2.drawContours()函数做可视化处理。这样的处理对一些简单的图片是一种策略,但是对于已经语义分割好的图片,再这样处理会不会有一些“脱裤子放屁——多此一举”呢?答案是肯定的。你想想看,你是怎么将一幅图片语义分割出来的呢?是根据每个像素的类别逐一“上色”的对吧。那这么说来,其实要做输出轮廓点这件事,只要让模型输出一张分割后的二maskt图片,然后转为灰度图,再重复上面说的cv2.findContours()cv2.drawContours()的操作就可以了吧?

那这里有一个前提,什么前提呢?前提是你已经知道如何修改像素值这件事情。所以在SegFormer里面,你可以在base.py文件中进行修改,一些注释我已经写在代码里面:

    def show_result(self,
                    img,
                    result,  # 这里的result就是每个像素的类别,它的大小应该与你的图片大小有关
                    palette=None,
                    win_name='',
                    show=False,
                    wait_time=0,
                    out_file=None):
        """Draw `result` over `img`.

        Args:
            img (str or Tensor): The image to be displayed.
            result (Tensor): The semantic segmentation results to draw over
                `img`.
            palette (list[list[int]]] | np.ndarray | None): The palette of
                segmentation map. If None is given, random palette will be
                generated. Default: None
            win_name (str): The window name.
            wait_time (int): Value of waitKey param.
                Default: 0.
            show (bool): Whether to show the image.
                Default: False.
            out_file (str or None): The filename to write the image.
                Default: None.

        Returns:
            img (Tensor): Only if not `show` or `out_file`
        """
        img = mmcv.imread(img)
        img = img.copy()
        seg = result[0]
        if palette is None:
            if self.PALETTE is None:
                palette = np.random.randint(
                    0, 255, size=(len(self.CLASSES), 3))
            else:
                palette = self.PALETTE
        palette = np.array(palette)
        assert palette.shape[0] == len(self.CLASSES)
        assert palette.shape[1] == 3
        assert len(palette.shape) == 2
        color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)
        for label, color in enumerate(palette):
            color_seg[seg == label, :] = color  # 注意数组的特别用法
        # convert to BGR
        color_seg = color_seg[..., ::-1]

        # from IPython import embed; embed(header='debug vis')
        # img = img * 0.5 + color_seg * 0.5  # 这两步是修改的地方
        # img = img.astype(np.uint8)


        # if out_file specified, do not show image in window
        if out_file is not None:
            show = False

        if show:
            mmcv.imshow(img, win_name, wait_time)
        if out_file is not None:
            mmcv.imwrite(img, out_file)

        if not (show or out_file):
            warnings.warn('show==False and out_file is not specified, only '
                          'result image will be returned')
            return color_seg  #这一步也是修改的地方,原来是return img,这样就是分割出输出,为不是mask后的图输出

 有了输出的mask图像(与原始图片的一一对应),就可以很方便的在原图进行可视化操作:

result = inference_segmentor(model_seg, p)  # 前向推理,得到每个像素的类别
img_seg = show_result_pyplot(model_seg, p, result, get_palette(opt.palette))  # 得到分割后的mask
img = cv2.imread(p)  # 这一步是为了轮廓在原图中显示,我这里的p实际上是我的图片路径
gray_img = cv2.cvtColor(img_seg, cv2.COLOR_BGR2GRAY)  # 转为灰度图
contours, _ = cv2.findContours(gray_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # 寻找轮廓点
res = cv2.drawContours(img, contours, -1, (0, 0, 255), 1)  # 绘制轮廓点

可视化后的效果(mask——原图——轮廓):

当然,轮廓检测的方法还有很多,希望你不会因此局限。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语义分割中图片和mask的可视化 的相关文章

  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain

    本文介绍了 LangChain 框架 它能够将大型语言模型与其他计算或知识来源相结合 从而实现功能更加强大的应用 接着 对LangChain的关键概念进行了详细说明 并基于该框架进行了一些案例尝试 旨在帮助读者更轻松地理解 LangChai
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 用CHAT写一份标题为职业教育教师教学能力提升培训总结

    CHAT回复 标题 职业教育教师教学能力提升培训总结 一 活动概述 本次由学校组织的职业教育教师教学能力提升培训于8月15日至8月20日顺利进行 来自全校的60位职业教育教师参与了此次培训 主讲人为享有盛名的教育专家马丁先生 二 培训内容与
  • 利用CHAT写实验结论

    问CHAT 通过观察放置在玻璃表面上的单个水滴 人们可以观察到水滴充当成像系统 探究这样一个透镜的放大倍数和分辨率 CHAT回复 实验报告标题 利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率 一 实验目的 通过对比和测量 研究和探索玻
  • 活动日程&直播预约|智谱AI技术开放日 Zhipu DevDay

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 直播预约通道 关于AI TIME AI TIME源起于2019年 旨在发扬科学思辨精神 邀请各界人士对人工智能理论 算法和场景应用的本质问题进行探索 加强思想碰撞 链接全球AI学
  • 毕业设计:基于卷积神经网络的图像分类系统 python人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 卷积神经网络 2 2 SVM算法 三 检测的实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • 强烈推荐收藏!LlamaIndex 官方发布高清大图,纵览高级 RAG技术

    近日 Llamaindex 官方博客重磅发布了一篇博文 A Cheat Sheet and Some Recipes For Building Advanced RAG 通过一张图给开发者总结了当下主流的高级RAG技术 帮助应对复杂的生产场
  • 2023最新pytorch安装(超详细版)

    前言 一 判断是否有Nvidia 英伟达显卡 二 CPU版 2 1 安装Anaconda 2 2 创建虚拟环境 2 3安装pytorch 2 4 验证pytorch是否安装成功 三 GPU版 3 1 安装Anaconda 3 2 创建虚拟环
  • 不要再苦苦寻觅了!AI 大模型面试指南(含答案)的最全总结来了!

    AI 大模型技术经过2023年的狂飙 2024年必将迎来应用的落地 对 IT 同学来讲 这里蕴含着大量的技术机会 越来越多的企业开始招聘 AI 大模型岗位 本文梳理了 AI 大模型开发技术的面试之道 从 AI 大模型基础面 AI 大模型进阶
  • 人工智能 AI 如何让我们的生活更加便利

    每个人都可以从新技术中获益 一想到工作或生活更为便利 简捷且拥有更多空余时间 谁会不为之高兴呢 借助人工智能 每天能够多一些空余时间 或丰富自己的业余生活 为培养日常兴趣爱好增添一点便利 从电子阅读器到智能家居 再到植物识别应用和智能室内花
  • AI帮助终结全球饥饿问题

    全球饥饿问题是牵动人心的头等大事 5月28日是 世界饥饿日 这一问题更值得关注 让人人都能吃饱的想法不仅令人向往 而且很快就会变成现实 与大多数新事物引进一样 对于在控制世界粮食供应这样复杂的任务中AI究竟应该发挥多大的作用 人们还踟蹰不前
  • 回望计算机视觉会议ICCV的31年

    作者 原野寻踪 编辑 汽车人 原文链接 https zhuanlan zhihu com p 670393313 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 本文只做
  • 史上最全自动驾驶岗位介绍

    作者 自动驾驶转型者 编辑 汽车人 原文链接 https zhuanlan zhihu com p 353480028 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 本
  • 开始弃用NeRF?为什么Gaussian Splatting在自动驾驶场景如此受欢迎?(浙江大学最新)...

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 今天自动驾驶之心为大家分享浙大刚刚出炉的3D Gaussian Splatting综述 文章首先回顾了3D Gaussian的原理和应用 借着全面比较了3D GS在静态
  • 15天学会Python深度学习,我是如何办到的?

    陆陆续续有同学向我们咨询 Python编程如何上手 深度学习怎么学习 如果有人能手把手 一对一帮帮我就好了 我们非常理解初学者的茫然和困惑 大量视频 书籍 广告干扰了大家的判断 学习Python和人工智能 成为内行人不难 为此 我们推出了
  • 深度学习(5)--Keras实战

    一 Keras基础概念 Keras是深度学习中的一个神经网络框架 是一个高级神经网络API 用Python编写 可以在TensorFlow CNTK或Theano之上运行 Keras优点 1 允许简单快速的原型设计 用户友好性 模块化和可扩
  • 自动驾驶离不开的仿真!Carla-Autoware联合仿真全栈教程

    随着自动驾驶技术的不断发展 研发技术人员开始面对一系列复杂挑战 特别是在确保系统安全性 处理复杂交通场景以及优化算法性能等方面 这些挑战中 尤其突出的是所谓的 长尾问题 即那些在实际道路测试中难以遇到的罕见或异常驾驶情况 这些问题暴露了实车
  • 两个月进口猛增10倍,买近百台光刻机,难怪ASML不舍中国市场

    据统计数据显示 2023年11月和12月 中国从荷兰进口的光刻机设备同比猛增10倍 进口金额超过19亿美元 让ASML赚得盆满钵满 ASML早前表示中国客户在2023年订购的光刻机全数交付 2023年11月中国进口的光刻机达到42台 进口金
  • Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

    文章目录 摘要 1 问题的提出 引出当前研究的不足与问题 KGC方法 LLM幻觉现象 解决方案 2 数据集和模型构建

随机推荐

  • stm32矩阵键盘c语言程序,stm32矩阵键盘原理图及程序介绍

    STM32F0 系列产品基于超低功耗的 ARM Cortex M0 处理器内核 整合增强的技术和功能 瞄准超低成本预算的应用 该系列微控制器缩短了采用 8 位和 16 位微控制器的设备与采用 32 位微控制器的设备之间的性能差距 能够在经济
  • 大话数据结构1 - 概念、线性表

    程序设计 数据结构 算法 数据 数据元素 数据项 数据对象 数据结构 逻辑结构 集合结构 线性结构 树形结构 图形结构 物理结构 顺序存储结构 链式存储结构 空间优势 数据类型 抽象数据类型 ADT abstract data type 算
  • Python工业项目实战01:项目介绍及环境构建

    知识点01 课程目标 项目目标 项目1 在线教育 学习如何做项目 项目中大数据工程师要负责实现的内容和流程 学习数仓基础理论 建模 分层 项目2 一站制造 企业中项目开发的落地 代码开发 代码开发 SQL DSL SQL SparkCore
  • 免费的插画素材网站有哪些?

    面对紧急设计项目 设计师会选择使用外力来完成项目 免费插图网站可以帮助我们在这个时候解决问题 但大多数插图网站都是收费的 需要版权或特别丑陋的 基本上很少有免费的没有版权的好插图 但今天我想推荐一个免费的插图网站 即时设计资源社区 即时设计
  • 程序员是否可以在家办公——在家办公的利与弊

    对软件技术工作者来说 办公的场所对工作效率似乎并没有大的影响 毕竟 大部分软件工程师给人的印象是埋头于电脑前 似乎只要给他们一 台能够连上Internet或是公司VPN的电脑 他们就能产出我们期望的代码 在理想情况下 公司还能通过这样的方式
  • 马尔可夫链模型的信贷风险分析与预测

    今天为大家介绍马尔科夫链模型 信贷中计算风险分析与预测的一个重要模型 马尔科夫链模型是啥 数学模型中的一个重要的模型 是属于一类重要的随机过程 马尔可夫链模型 由俄国数学家 马尔可夫于1907年提出 人们在实际中常遇到具有下述特性的随机过程
  • 条件分支if和else的使用详解

    顺序结构没什么好讲的 就是从上到下的写代码 所以接下来 壹哥就直接带各位来学习分支结构里的条件分支 我们在前面说过 分支结构 或者叫做条件分支 其实有两种情况 一种是if else 类型的条件分支 一种是switch case 类型的条件分
  • 链表反转全家桶(一):动画详解单链表反转

    单链表的反转是一个easy级别的题目 这个题目在力扣上的提交次数达到47万次 而且在面试中也频频出现 可谓是大受欢迎 它的兄弟们也跟着风光了 这道题本身是比较简单的 而它的 难兄难弟 就不是那么简单了 今天这篇文章先从简单开始 分析单链表的
  • Navicat运行sql文件导入数据不全或导入失败

    前言 我们平时想把数据从一个数据库中导入另外一个数据库中的时候 一般都是把所需的数据表进行转储sql文件 然后再运行sql文件 导入新的数据库中 这么做 数据少的时候一般不会出现什么错 但是如果数据量比较大 表比较多 就会出现缺少数据表 或
  • Android自定义控件-----放大镜

    public class ShaderView extends View private final Bitmap bitmap private final ShapeDrawable drawable 放大镜的半径 private sta
  • 转载:原文http://www.cnblogs.com/gao241/p/3522143.html

    shell实例手册 0说明 手册制作 雪松 更新日期 2013 12 06 欢迎系统运维加入Q群 198173206 请使用 notepad 打开此文档 alt 0 将函数折叠后方便查阅 请勿删除信息 转载请说明出处 抵制不道德行为 错误在
  • 常见的图像滤波算法

    本文介绍五种常见的图像滤波方式 线性滤波 方框滤波 均值滤波 高斯滤波 非线性滤波 中值滤波 双边滤波 提醒 本文主要是算法公式 没有具体完整的代码 一 线性滤波 总的来说 这三种线性滤波原理 每个像素的输出值是输入像素的加权和 其处理方式
  • mysql通过二进制日志回复数据_详解如何通过Mysql的二进制日志恢复数据库数据...

    经常有网站管理员因为各种原因和操作 导致网站数据误删 而且又没有做网站备份 结果不知所措 甚至给网站运营和盈利带来负面影响 所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志 binlog 来恢复数据 系统环境 操作系统 Ce
  • Apache HTTPD 换行解析漏洞(CVE-2017-15715)

    简介 HTTPD就是平常大家说的apache服务器 HTTPD才是他的真实名字 环境搭建 使用vulhub里现成的环境部署即可 进入vulhub下的httpd CVE 2017 15715 docker compose build dock
  • 【python办公自动化】使用PysimpleGUI实现AHP指标的添加和删除及编号重新排序

    使用PysimpleGUI实现AHP指标的添加和删除 1 运行界面 2 添加指标 3 删除指标 4 编码重新排序 5 全部代码 1 运行界面 2 添加指标 输入框中输入内容 点击 添加指标 按钮 然后就会自动添加到上方列表中 3 删除指标
  • 浩鲸科技2020届c++

    1 C 是类型安全的 Java c 语言是类型安全的 除非强制类型转换 C语言不是类型安全的 因为同一段内存可以用不同的数据类型来解释 比如1用int来解释就是1 用boolean来解释就是true 2 float a b c 那么可以如下
  • 记一次SpringBoot打包Jar引入第三方jar包,部署出现ClassNotFound的现象

    心有猛虎 细嗅蔷薇 最近公司和第三方项目进行 于是需要引入第三方的SDK来调用一些东西 引入进来什么都是很好的 但是发布出去就出现各种ClassNotFuoundException等问题 然后看下测试环境的log发现了第三方的SDK中的类不
  • 关于hive的启动和连接

    目录 一 前言 二 hive的启动与连接 2 1 启动hadoop 2 2 启动hive 2 3 一些注意事项 一 前言 太久没用hive了 今天想重新熟悉一下 结果发现自己甚至忘记了怎么启动 于是特此记录篇笔记 便于以后忘记时查阅 不会写
  • hadoop实践(五)win10+eclipse+hadoop2.6.4 开发环境

    本人环境为win10 才从win7升级 eclipse是 Kepler Service Release 1 在win10下 安装了vm workstation 其上安装了centos6 5 并在上面部署了hadoop2 6 4的伪分布式安装
  • 语义分割中图片和mask的可视化

    其实取标题一直以来都是一件麻烦的事 但是如果你要看下去 我想你得有一点语义分割的见解 用平常的语言描述该问题就是 语义分割出我们感兴趣的目标物 然后输出该目标物的轮廓点 做语义分割其实有很多种方法 你可以用不同的模型去train你的data