语义分割:基于openCV和深度学习(二)_环球速看料
语义分割:基于openCV和深度学习(二)
Semantic segmentation in images with OpenCV
【资料图】
开始吧-打开segment.py归档并插入以下代码:
Semantic segmentation with OpenCV and deep learning
import numpy as np
import argparse
import imutils
import time
import cv2
从输入必要的依赖包开始。对于这个脚本,推荐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
if args[“colors”]:
COLORS = open(args[“colors”]).read().strip().split("\n")
COLORS = [np.array(c.split(",")).astype(“int”) for c in COLORS]
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)) in enumerate(zip(CLASSES, COLORS)):
draw the class name + color on the legend
color = [int© for c in color]
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.2100 seconds
图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.1989 seconds
在这里插入图片描述
图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.1992 seconds
上图是一个更复杂的场景,但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.1916 seconds
通过ENet发送的最终图像显示了模型如何在道路、人行道、树叶、人物等其他场景类别中清晰地分割卡车与汽车。
标签:
相关推荐:
最新新闻:
- 世界热文:c语言餐桌游戏有哪些?教会你这十款酒桌游戏让你在朋友圈稳站“C”位!
- 电脑默认网关如何查询?电脑默认网关查询的小技巧
- IE浏览器不见了怎么办?IE浏览器不见了解决方法
- Win7专业版与Win7旗舰版如何区分?Win7专业版与Win7旗舰版区分方法
- Win7系统安装声卡驱动失败怎么办?声卡驱动安装失败解决方法
- mysql置疑原因是什么?数据库置疑的处理办法
- 百度快照如何彻底删除?百度快照正确的删除方法
- 禁用宏则关闭excel文件怎么弄?设置流程_天天速递
- 英雄联盟无法全屏显示如何解决?英雄联盟无法全屏显示解决方法
- 如何解决IE浏览器网页图片显示红叉问题?IE浏览器网页图片显示红叉解决方法
- 语义分割:基于openCV和深度学习(二)_环球速看料
- Win7系统安装CAD软件提示缺少dfst.dll怎么办?解决方法
- 【世界快播报】CSS:好玩的‘伪类’系列之——(:only-child与:only-of-type) 例子说明
- 内网端口映射怎么设置?内网端口映射定义及设置方法
- 美拍是什么?美拍怎么用?
- 怎么关闭微信的扫脸支付功能?微信的扫脸支付功能关闭步骤
- 天天热点!专升本英语重要知识点补充 英语全部知识点详情介绍
- 基础版本的基础版本 直方图均衡化系列
- 天天要闻:图片或手写签名转电子签名怎么转?手写签名转电子签名教程
- 观点:颜料墨水和染料墨水的区别是什么?颜料墨水和染料墨水简介
- 每日看点!用VC6.0怎么实现上位机串口通信?位机串口通信的设置方法
- ssm大学生兼职论坛是什么?大学生兼职有哪些?:每日观察
- java中flypaper怎么使用?Java 基础接口fly_全球快播报
- 许多推倒重建正在发生 | 独家对话索尼互娱中国总裁
- 会议panel是什么意思?医学术语中的panel到底是指什么?
- 浪漫主义时期的音乐有哪些?浪漫主义乐派是什么?-当前独家
- 今日视点:怎么设置交换机?计算机交换机连接设置方法
- 优麒麟社区懒人版本(含软件全家桶) 怎么一键安装?_当前速读
- Android中LayoutParams是什么?Android中LayoutParams总结和用法
- 摄氏度和开氏度的换算 开氏度和摄氏度的换算公式 天天亮点
- PSVR2首发获两款老游戏强化!可4K、90帧运行
- 天天速递!粘胶短纤维市场现状是什么?粘胶短纤维的未来发展趋势
- 今日热门!数据结构试题有哪些?数据结构试题及评分解析
- 传英伟达RTX 4070Ti首发价899美元 约合RMB 6268元|环球资讯
- 关注:《铁拳8》TGA预热视频 2023年发售
- 天天速看:CDP警告员工《巫师》AR手游停服后将会进行裁员
- 二代接班,一场父与子的「明争暗战」 全球新动态
- 世界观点:看不起英特尔独显?一个驱动更新游戏帧数提升80%
- 游戏玩家抓紧更新!Win 11修复重大性能BUG 帧率显著提升
- 【新要闻】育碧:《纪元1800》于今日返回Steam平台
- 朴叙俊将加盟《惊奇队长2》 演惊奇队长丈夫|当前头条
- 《高达 水星魔女》一阶段最终话暂停 明年1月8日续播
- 泛娱乐出海拉美,茄子科技(海外SHAREit Group)助力企业有效获客
- 《暗黑4》新预告片将在明早1点公开_每日聚焦
- 全球视讯!《微软飞行模拟》玩家达到了1000万
- 【环球时快讯】一起教育科技发布2022年三季度财报:连续四个季度实现盈利
- 国产处理器龙芯发威了 下一代单核性能提升68%
- 在云南沙溪,这群年轻人每天做的事是「什么也不做」 每日视讯
- 2部国产动画获奥斯卡参评资格:豆瓣分别7.0分、5.8分 今日关注
- 【全球聚看点】全球首款8000MHz频率内存开卖 32GB售价4888元
- 国产处理器龙芯发威了 下一代单核性能提升68%
- 4999元 你能买到的最低价12代标压i5+RTX3050游戏本来了|当前报道
- 【全球聚看点】全球首款8000MHz频率内存开卖 32GB售价4888元
- 普京表示核战争的风险正在上升,没有继续进行动员的必要
- 【环球新视野】抢跑美联储的加拿大央行进一步接近转向:首次暗示可能暂停加息
- VR游戏《进击的巨人VR:牢不可破》明年夏季上市_全球动态
- RTX 4080全球销售低迷 网友:太贵了 我再等等_世界速递
- 当前关注:特斯拉比亚迪等怕吗?苹果汽车曝光:70万元
- 当前快讯:秒杀价3499元 双12临近华硕无畏二合一OLED屏笔记本疯狂促销
- 焦点热议:想要畅玩《老头环》?高颜值游戏本双十二杀到7599元
- 世界速看:玩家注意升级:Win11更新补丁修复游戏性能问题
- 万代南梦宫注册《破晓传说》《块魂》新商标
- 系列制作人确认《勇者斗恶龙3HD》新消息很快公布:当前通讯
- 【全球时快讯】《战神:诸神黄昏》花絮第八集 死亡之境尼福尔海姆
- 天天通讯!PSVR2首发获《莫斯》和《莫斯2》强化支持
- 视频演示创建《暗黑破坏神4》野蛮人法师角色
- 苹果APP定价规则大改!最低0.29美元最高1万美元-每日快看
- 小牛电动车创始人造车失败 汽车圈真不是谁都能进!
- 世界通讯!传说中的苹果电车:不是全自动驾驶了!
- 竞猜赢大礼:2022世界杯竞猜 惊喜大礼等你拿
- 全球聚焦:《木卫四协议》发布PC性能补丁 减少卡顿
- PlayStation联机免费周末来了!《艾尔登法环》斗技场PVP玩家别急开会员
- 观速讯丨我们在监狱里做了一个行为经济学实验
- 《狂野之心》公开全新概念图 将出席TGA|环球最资讯
- 全球动态:《神秘海域》新作或在开发中 顽皮狗只做协助
- 《死亡空间》原版与重制版早期图像对比视频 全球热门
- 微软表示《微软飞行模拟》已突破1000万玩家-全球热点
- 全新VR农场模拟游戏《横跨山谷》公布
- 快看点丨华尔街裁员潮加速蔓延!摩根士丹利裁员1600人
- 入冬最销魂的一口,莫过于它
- 主动“走失”又归来的小镇少年们
- 2022日本东京大学校花冠军出炉 甜美可爱的学霸妹子-世界头条
- 《刺客信条:英灵殿》Steam遇冷 峰值只有3527人
- 【世界报资讯】网飞联席CEO:还没看到体育赛事直播的盈利模式
- 《毁灭全人类2》公布节日皮肤 免费更新_全球资讯