语义分割python教学_语义分割:基于openCV和深度学习(二)

2023-11-16

语义分割:基于openCV和深度学习(二)

Semantic segmentation in images with OpenCV

开始吧-打开segment.py归档并插入以下代码:

Semantic segmentation with OpenCV and deep learning

# import the necessary packages

importnumpy asnp

importargparse

importimutils

importtime

importcv2

从输入必要的依赖包开始。对于这个脚本,推荐OpenCV 3.4.1或更高版本。可以按照一个安装教程进行操作—只要确保在执行步骤时指定要下载和安装的OpenCV版本。还需要安装OpenCV便利功能包imutils-只需使用pip安装该包:

Semantic segmentation with OpenCV and deep learning

$ pip install --upgrade imutils

如果使用的是Python虚拟环境,不要忘记在使用pip安装imutils之前使用work-on命令!接下来,分析一下命令行参数:

Semantic segmentation with OpenCV and deep learning

# construct the argument parse and parse the arguments

ap = argparse.ArgumentParser()

ap.add_argument("-m", "--model", required=True,

help="path to deep learning segmentation model")

ap.add_argument("-c", "--classes", required=True,

help="path to .txt file containing class labels")

ap.add_argument("-i", "--image", required=True,

help="path to input image")

ap.add_argument("-l", "--colors", type=str,

help="path to .txt file containing colors for labels")

ap.add_argument("-w", "--width", type=int, default=500,

help="desired width (in pixels) of input image")

args = vars(ap.parse_args())

此脚本有五个命令行参数,其中两个是可选的:

--模型:深入学习语义分割模型的途径。

--类:包含类标签的文本文件的路径。

--图像:的输入图像文件路径。-

-颜色:颜色文本文件的可选路径。如果没有指定文件,则将为每个类分配随机颜色。

--宽度:可选的所需图像宽度。默认情况下,该值为500像素。

如果不熟悉argparse和命令行参数的概念,一定要阅读这篇深入介绍命令行参数的博客文章。接下来,来分析类标签文件和颜色:

Semantic segmentation with OpenCV and deep learning

# load the class label names

CLASSES = open(args["classes"]).read().strip().split("\n")

# if a colors file was supplied, load it from disk

ifargs["colors"]:

COLORS = open(args["colors"]).read().strip().split("\n")

COLORS = [np.array(c.split(",")).astype("int") forc inCOLORS]

COLORS = np.array(COLORS, dtype="uint8")

# otherwise, we need to randomly generate RGB colors for each class

# label

else:

# initialize a list of colors to represent each class label in

# the mask (starting with 'black' for the background/unlabeled

# regions)

np.random.seed(42)

COLORS = np.random.randint(0, 255, size=(len(CLASSES) - 1, 3),

dtype="uint8")

COLORS = np.vstack([[0, 0, 0], COLORS]).astype("uint8")

从提供的文本文件中将类加载到内存中,该文件的路径包含在命令行args字典(第23行)中。

如果文本文件中为每个类标签提供了一组预先指定的颜色(每行一个),将它们加载到内存中(第26-29行)。否则,为每个标签随机生成颜色(第33-40行)。

出于测试目的(并且由于有20个类),使用OpenCV绘图函数创建一个漂亮的颜色查找图例:

Semantic segmentation with OpenCV and deep learning

# initialize the legend visualization

legend = np.zeros(((len(CLASSES) * 25) + 25, 300, 3), dtype="uint8")

# loop over the class names + colors

for(i, (className, color)) inenumerate(zip(CLASSES, COLORS)):

# draw the class name + color on the legend

color = [int(c) forc incolor]

cv2.putText(legend, className, (5, (i * 25) + 17),

cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

cv2.rectangle(legend, (100, (i * 25)), (300, (i * 25) + 25),

tuple(color), -1)

生成一个图例可视化,就可以很容易地可视化地将类标签与颜色关联起来。图例由类标签及其旁边的彩色矩形组成。这是通过创建画布(第43行)和使用循环动态构建图例(第46-52行)快速创建的。本文中介绍了绘画基础知识。

结果如下:

Figure 2:Our deep learning semantic segmentation class color legend generated with OpenCV.

下一个区块将进行深度学习细分:

Semantic segmentation with OpenCV and deep learning

# load our serialized model from disk

print("[INFO] loading model...")

net = cv2.dnn.readNet(args["model"])

# load the input image, resize it, and construct a blob from it,

# but keeping mind mind that the original input image dimensions

# ENet was trained on was 1024x512

image = cv2.imread(args["image"])

image = imutils.resize(image, width=args["width"])

blob = cv2.dnn.blobFromImage(image, 1/ 255.0, (1024, 512), 0,

swapRB=True, crop=False)

# perform a forward pass using the segmentation model

net.setInput(blob)

start = time.time()

output = net.forward()

end = time.time()

# show the amount of time inference took

print("[INFO] inference took {:.4f} seconds".format(end - start))

为了使用Python和OpenCV对图像进行深入的语义分割:

加载模型(第56行)。构造一个blob(第61-64行),在这篇博客文章中使用的ENet模型是在1024×512分辨率的输入图像上训练的,将在这里使用相同的方法。可以在这里了解更多关于OpenCV的blob是如何工作的。将blob设置为网络的输入(第67行),并执行神经网络的前向传递(第69行)。用时间戳将forward pass语句括起来。将经过的时间打印到第73行的终端。

在脚本的其余行中,将生成一个颜色映射,覆盖在原始图像上。每个像素都有一个对应的类标签索引,能够在屏幕上看到语义分割的结果。

首先,需要从输出中提取卷维度信息,然后计算类图和颜色掩码:

Semantic segmentation with OpenCV and deep learning

# infer the total number of classes along with the spatial dimensions

# of the mask image via the shape of the output array

(numClasses, height, width) = output.shape[1:4]

# our output class ID map will be num_classes x height x width in

# size, so we take the argmax to find the class label with the

# largest probability for each and every (x, y)-coordinate in the

# image

classMap = np.argmax(output[0], axis=0)

# given the class ID map, we can map each of the class IDs to its

# corresponding color

mask = COLORS[classMap]

在第77行确定输出体积的空间维度。接下来,让找到输出卷的每个(x,y)-坐标的概率最大的类标签索引(第83行)。这就是现在所知道的类映射,它包含每个像素的类索引。给定类ID索引,可以使用NumPy数组索引“神奇地”(更不用说超级高效地)查找每个像素(第87行)对应的可视化颜色。彩色mask版将透明地覆盖在原始图像上。让完成脚本:

Semantic segmentation with OpenCV and deep learning

# resize the mask and class map such that its dimensions match the

# original size of the input image (we're not using the class map

# here for anything else but this is how you would resize it just in

# case you wanted to extract specific pixels/classes)

mask = cv2.resize(mask, (image.shape[1], image.shape[0]),

interpolation=cv2.INTER_NEAREST)

classMap = cv2.resize(classMap, (image.shape[1], image.shape[0]),

interpolation=cv2.INTER_NEAREST)

# perform a weighted combination of the input image with the mask to

# form an output visualization

output = ((0.4* image) + (0.6* mask)).astype("uint8")

# show the input and output images

cv2.imshow("Legend", legend)

cv2.imshow("Input", image)

cv2.imshow("Output", output)

cv2.waitKey(0)

调整掩码和类映射的大小,使它们与输入图像(第93-96行)具有完全相同的维度。为了保持原始的类id/mask值,使用最近邻插值而不是三次、二次等插值是非常重要的。现在大小是正确的,创建了一个“透明的颜色覆盖”,通过覆盖的原始图像(第100行)的遮罩。这使能够轻松地可视化分割的输出。关于透明覆盖层以及如何构建它们的更多信息,可以在本文中找到。最后,图例和原始+输出图像显示在第103-105行的屏幕上。

单图像分割结果

在使用本节中的命令之前,请确保获取此博客文章的“下载”。为了方便起见,在zip文件中提供了模型+相关文件、图像和Python脚本。在终端中提供的命令行参数对于复制结果很重要。如果不熟悉命令行参数,请在此处了解它们。准备好后,打开一个终端并导航到项目,然后执行以下命令:

Semantic segmentation with OpenCV and deep learning

$ python segment.py --model enet-cityscapes/enet-model.net \

--classes enet-cityscapes/enet-classes.txt \

--colors enet-cityscapes/enet-colors.txt \

--image images/example_01.png

[INFO] loading model...

[INFO] inference took 0.2100seconds

图3: OpenCV的语义分割显示了道路、人行道、人、自行车、交通标志等等!

注意分割的精确程度-它清楚地分割类并准确地识别人和自行车(自动驾驶汽车的安全问题)。道路,人行道,汽车,甚至树叶都被识别出来了。

尝试另一个示例,只需将--image命令行参数更改为不同的图像:

Semantic segmentation with OpenCV and deep learning

$ python segment.py --model enet-cityscapes/enet-model.net \

--classes enet-cityscapes/enet-classes.txt \

--colors enet-cityscapes/enet-colors.txt \

--image images/example_02.jpg

[INFO] loading model...

[INFO] inference took 0.1989seconds

图4中的结果展示了这个语义分割模型的准确性和清晰性。汽车、道路、树木和天空都有清晰的标记。下面是另一个例子:

Semantic segmentation with OpenCV and deep learning

$ python segment.py --model enet-cityscapes/enet-model.net \

--classes enet-cityscapes/enet-classes.txt \

--colors enet-cityscapes/enet-colors.txt \

--image images/example_03.png

[INFO] loading model...

[INFO] inference took 0.1992seconds

上图是一个更复杂的场景,但ENet仍然可以分割走在车前的人。不幸的是,该模型错误地将道路分类为人行道,但可能是因为人们在人行道上行走。最后一个例子:

Semantic segmentation with OpenCV and deep learning

$ python segment.py --model enet-cityscapes/enet-model.net \

--classes enet-cityscapes/enet-classes.txt \

--colors enet-cityscapes/enet-colors.txt \

--image images/example_04.png

[INFO] loading model...

[INFO] inference took 0.1916seconds

通过ENet发送的最终图像显示了模型如何在道路、人行道、树叶、人物等其他场景类别中清晰地分割卡车与汽车。

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

语义分割python教学_语义分割:基于openCV和深度学习(二) 的相关文章

  • CSR867x — 蓝牙音频发射器方案(支持USB、模拟和SPDIF)

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 或进群 471144274 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就
  • 傅里叶变换公式整理

    1 一维傅里叶变换 1 1 一维连续傅里叶变换 正变换 F
  • RS485(Modbus RTU)协议

    Modbus是啥 Modbus 是一种串行通信协议 是施耐德电气为使用可编程逻辑控制器 PLC 通信而发布 是工业领域通信协议的业界标准 并且是工业电子设备之间常用的连接方式 读完好像还是不知道是啥 没关系 你只要记住一点 Modbus是与
  • LeetCode初级算法-,买卖股票数组算法

    题目 给定一个数组 prices 其中 prices i 是一支给定股票第 i 天的价格 设计一个算法来计算你所能获取的最大利润 你可以尽可能地完成更多的交易 多次买卖一支股票 JAVA class Solution public int
  • DNS的解析流程,DNS主从配置,使用httpd服务演示安全上下文值的设定(selinux),使用web服务端口的改变来演示端口的设定(selinux)

    DNS的解析流程 一 DNS的解析方式 1 正向解析 正向解析文件中存储的记录称为A记录 A记录记录着域名和IP的映射关系 2 反向解析 反向解析文件中存储的记录称为PTR指针 PTR记录着IP和域名的映射关系 二 DNS域名的分层结构 国
  • OpenCV 二维码定位与识别

    因为二维码本身含有信息 因此可以作为产品的信息载体 如 产品特征 在工业领域常用在产品入库 分拣和包装上 但常常会因为二维码图像污点 光照不均匀以及二维码图像倾斜等原因 使得二维码的识别正确率低 针对这些问题 通过学习贾老师OpenCV课程
  • 数据库查询,返回前5、10行数据

    1 SQLServer sqlserver 支持top关键字 返回前若干条数据 select top 5 from table 返回前5行数据 2 MySQL mysql 支持 limit 只能适用于mysql limit 子句用于强制 s
  • 数据分析学习

    前言 数据分析已经是我们工作离不开的一个东西 其本质上还是基于数据算法对于数据的多维度计算 数据分析概念 数据分析方法
  • Android--- UI组件AdapterView and 适配器Adapter

    Android AdapterView and Adapter 适配器 Adapter UI控件 AdapterView ListView 简单的ListView实现 图文ListView实现 ListView的监听函数 GridView
  • socket的fd是什么?fd是啥的缩写?

    socket的fd是什么 fd是啥的缩写 fd 是 file descriptor 这种一般是BSD Socket的用法 用在Unix Linux系统上 在Unix Linux系统下 一个socket句柄 可以看做是一个文件 在socket
  • 7-7

    思路 在整个二维数组上下各加上一行0 然后从左到右 一列一列进行判断 判断的是数字改变次数 这里一列一列的找是因为可以把1 6 8分解成一片一片的元素 而且1 lt 8 lt 6 不知道能看懂不 代码里去掉 输入例子 可以得到 0 0 0
  • C#Tcp服务端主动断开,客户端无法感知问题

    服务端使用tcplistener接收连接请求 客户端使用tcpclient connect主动连接 在一对一的情况下 1个服务端只连接1个客户端时 服务端调用client Close 主动关闭连接后 客户端接收函数 revString br
  • Helm & Kubernetes Offline Deploy Rancher v2.7.5 Demo (helm 离线部署 rancher 实践)

    文章目录 1 简介 2 预备条件 3 选择 SSL 配置 4 离线安装的 Helm Chart 选项 5 下载介质 6 生成证书 7 镜像入库 8 安装 rancher 9 配置 nodeport 10 配置 ingress 11 界面访问
  • [1168]OSS ossutil64安装及使用

    文章目录 下载和安装 Linux系统安装 Windows系统安装 使用 oss下载到指定文件夹 从指定文件夹上传到oss相应的bucket下 设置ossutil的语言 clearOssData sh 下载和安装 下载地址 https hel
  • 一道有趣的面试:Trie 树及其改进

    0x00 导言 Trie 树是一种常见的数据结构 用以解决在给定单词在字典中是否存在的问题 而且支持动态的增删词典内容 常见的实现结构如下 struct node bool is word struct node 26 对于任意词典 查找给
  • 木马制作——图片木马制作

    木马制作 图片木马制作 一 简单说明 图片木马指的是图片格式的文件木马 图片格式包括jpg png等 原理是将木马程序和图片捆绑在一起 达到伪装的目的 程序可以是脚本语言或者编译语言 在web渗透中 通常将脚本编写的webshell和图片合
  • janus以及coturncentos8的配置_排错填坑完结篇

    前言 查阅了不少资料 网上对janus以及coturn的配置比比皆是 不过 我发现了一个问题 那就是 janus要直接对接coturn作为turn服务器吗 为什么 janus的demo例子 譬如 video room 能不能在手机4g网络上
  • netty文件上传断点续传的演示

    Netty文件上传断点续传的演示 一 理论和协议规范和工具类等 1 实现原理 netty文件上传采用自定义的协议方式实现 断点续传主要是依据RandomAccessFile类的随机读写能力 主要流程是客户端发起请求 将需要上传文件名称 路径
  • Leetcode[数组] 分发饼干 -- 贪心算法

    0 题目描述 leetcode原题链接 分发饼干 1 预排序 双指针 利用贪心算法的思想 每次都先满足胃口最小的孩子 直到有效饼干分完 或者小胃口孩子都被满足则停止分发 class Solution def findContentChild

随机推荐

  • 区块链浏览器搭建

    嗨喽 大家好 不知道大家是否遇见过类似的问题 自己使用以太坊源代码搭建了一个开发网私链时 缺少了主网或者测试网的区块链浏览器这种区块链数据直观展示的工具 那么今天就带大家一起搭建一个适合自己的区块链浏览器使用 文章目录 一 环境准备 1 1
  • 利用BFD协议提高SD-WAN网络的故障收敛时间

    BFD简介 为了减小设备故障对业务的影响 提高网络的可用性 设备需要能够尽快检测到与相邻设备间的通信故障 以便能够及时采取措施 从而保证业务继续进行 现有的故障检测方法主要包括以下几种 1 硬件检测 例如通过SDH Synchronous
  • 第三章 C++之面向对象

    C 基础进阶系列文章 目录 第一章 C 之函数 第二章 C 之引用实现游戏对话框显示 第三章 C 之面向对象 第二章 C 之面向对象 C 基础进阶系列文章 前言 一 什么是面向对象 二 抽象与类 1 C 中的类 2 类的声明 3 创建第一个
  • Java基础知识总结(史上最全)

    Java基础知识总结 写代码 1 明确需求 我要做什么 2 分析思路 我要怎么做 1 2 3 3 确定步骤 每一个思路部分用到哪些语句 方法 和对象 4 代码实现 用具体的java语言代码把思路体现出来 学习新技术的四点 1 该技术是什么
  • openssl编程指南

    openssl编程指南 对于openssl应用编程这方面的详细文档很少 我是通过认真分析openssl源码包中的示例代码来学习并结合man文档来理解它的基本结构的 SSL通讯模型为标准的C S结构 除了在TCP层之上进行传输之外 与一般的通
  • ubuntu18.04使用jlnk下载程序

    ubuntu使用JLink下载程序 JLink安装 JLink官网下载最新的JLink驱动程序 ubuntu使用的是deb包 下载时选J Link Software and Documentation Pack下面的链接 使用sudo dp
  • 基于梯度下降的线性回归(Gradient Descent For Linear Regression)

    概述 梯度下降是很常用的算法 它不仅被用在线性回归上和线性回归模型 平方误差代价函数 在本次 我们要将梯度下降和代价函数结合 我们将用到此算法 并将其应用于具体的拟合直线的线性回归算法里 梯度下降算法和线性回归算法比较如图 左边梯度下降 右
  • Python 队列(Queue)用法

    一 队列 Queue Python的Queue模块中提供了同步的 线程安全的队列类 包括FIFO 先入先出 队列Queue LIFO 后入先出 队列LifoQueue 和优先级队列PriorityQueue 这些队列都实现了锁原语 能够在多
  • Win32程序之进程的原理

  • 面试题更新之-使用 base64 编码的优缺点

    文章目录 base64 编码是什么 使用 base64 编码的优缺点 base64 编码是什么 Base64编码是一种将二进制数据转换为ASCII字符的编码方式 它将三个字节的二进制数据分割成四组 每组6个比特 然后将这些6个比特转换为可打
  • IP有效性检查(C language)

    STATUS ip valid check const char v p Str int i int tmp char p NULL if strlen v p Str gt 15 return ERROR p char v p Str t
  • 基于Logistic回归和Sigmoid函数的分类【机器学习】

    一 认识Logistic回归 LR 分类器 首先 Logistic回归虽然名字里带 回归 但是它实际上是一种分类方法 主要用于两分类问题 利用Logistic函数 或称为Sigmoid函数 自变量取值范围为 INF INF 自变量的取值范围
  • poll方法01

    p select poll 功能 创建poll对象 返回值 poll对象 p register fd event 功能 注册关注的io事件 参数 fd 要关注的IO event 要关注的io事件类型 通用类型 POLLIN 读io事件 po
  • iphone邮箱看不到已发送_不看不知道 教你如何设置iPhone邮箱

    电子邮件是我们日常生活中必不可少的实用工具 尤其是在商务发面发挥着重要的作用 所以 这次我要教大家怎样设置与使用iPhone的电子邮箱功能 电子邮件是我们日常生活中必不可少的实用工具 尤其是在商务发面发挥着重要的作用 所以 这次我要教大家怎
  • Linux Cobbler自动部署装机

    Cobbler自动部署装机 一 实验准备 二 Cobbler自动装机服务搭建步骤 1 导入epel源 2 安装Cobbler以及其相关服务软件包 3 修改cobbler主配置文件 4 使用cobbler check 命令对Cobbler做检
  • ztree实现异步加载(点击节点,请求后台数据,添加数据到对应节点)真正实现了异步树加载数据

    ztree实现异步加载 首先说一下这篇文章和我写的上一篇异步树的区别 上一篇的我实现的是其实是个伪异步加载 因为我实际是把异步的操作写在了节点上面 点击节点时 获取当前节点的ID 取回子节点的数据 然后手动拼接到当前节点下面 真正的异步其实
  • Linux中挖矿病毒清理通用思路

    目录 前言 清理流程 检查修复DNS 停止计划任务 取消tmp目录的可执行权限 服务排查 进程排查 高CPU占用进程查杀 计划任务清理 预加载劫持清理 系统命令变动排查 中毒前后可执行文件排查 系统配置文件排查 小结 前言 在被植入挖矿病毒
  • 制作USB多系统启动盘

    制作USB多系统启动盘 背景 现在的操作系统更新越来越频繁了 如果用刻录光盘来安装系统的话 会导致大量的浪费 而且光盘寿命太短 一旦划伤 基本上就用不了了 所以想办法使用USB来做为启动盘 利用ISO直接安装系统 这样方便 而且更为灵活 想
  • MySQL--彻底删除数据, 修改/设置密码

    目录 MySQL彻底卸载的方法 修改 设置密码 1 使用 SET PASSWORD 命令 2 使用mysqladmin修改密码 3 UPDATE直接编辑user表 4 忘记密码 此文的背景是 昨天反复安装了几次 刚开始一直无法正常启动使用
  • 语义分割python教学_语义分割:基于openCV和深度学习(二)

    语义分割 基于openCV和深度学习 二 Semantic segmentation in images with OpenCV 开始吧 打开segment py归档并插入以下代码 Semantic segmentation with Op