在 2019年7月21日 上张贴 由 hotdog发表回复
边缘检测 使用 OpenCV 和 深度学习 进行整体嵌套 边缘检测
在本教程中,您将学习如何使用OpenCV和深度学习应用整体嵌套 边缘检测(HED)。我们将对图像和视频流应用整体嵌套 边缘检测,然后将结果与 OpenCV 的标准 Canny 边缘检测器进行比较。
边缘检测使我们能够找到图像中对象的边界, 并且是图像处理和计算机视觉的首批应用用例之一。
使用OpenCV进行边缘检测时,您最有可能使用Canny边缘检测器 ; 但是,Canny边缘检测器存在一些问题,即:
整体嵌套 边缘检测(HED)试图通过端到端深度神经网络解决Canny边缘检测器的局限性。
该网络接受RGB图像作为输入,然后生成边缘图作为输出。此外,HED生成的边缘图在保留图像中的对象边界方面做得更好。
要了解有关使用OpenCV进行整体嵌套 边缘检测的更多信息,请继续阅读!
寻找这篇文章的源代码?
跳到下载部分。
使用OpenCV和深度学习进行整体嵌套边缘检测
在本教程中,我们将学习使用OpenCV和深度学习的整体嵌套边缘检测(HED)。
我们首先讨论整体嵌套边缘检测算法。
从那里我们将审查我们的项目结构,然后利用HED在图像和视频中进行边缘检测。
让我们继续吧!
什么是整体嵌套边缘检测?
我们今天在这里使用的算法来自谢和图的2015年论文,整体嵌套边缘检测,或简称为“HED”。
Xie和Tu的工作描述了一种深度神经网络,能够自动学习能够确定图像中对象的边缘/对象边界的丰富的分层边缘图。
该边缘检测网络能够在Berkely BSDS500和NYU Depth数据集上获得最先进的结果 。
有关本文范围之外的网络架构和算法的完整评论,请参阅官方出版物了解更多详情。
项目结构
继续抓住今天的 “下载”并解压缩文件。
从那里,您可以使用以下命令检查项目目录
我们的HED Caffe模型包含在 hed_model / 目录中。
我提供了一些样本 图像/ 包括我自己,我的狗和我在互联网上找到的样本猫图像。
今天我们将查看 detect_edges_image .py 和 detect_edges_video .py 脚本。两个脚本共享相同的边缘检测过程,因此我们将大部分时间花在HED图像脚本上。
图像中的整体嵌套边缘检测
我们今天回顾的Python和OpenCV整体嵌套边缘检测示例与OpenCV官方仓库中的HED示例非常相似。
我在这里的主要贡献是:
让我们继续并开始 – 打开 detect_edge_image .py文件
在2-4行进行导入包,我们将"https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/">argparse用于解析命令行参数。通过cv2 导入访问OpenCV函数和方法 。我们的 os 导入将允许我们构建文件路径,而不管操作系统如何。
此脚本需要两个命令行参数:
让我们定义 CropLayer 类
为了利用OpenCV的Holistically-Nested Edge Detection模型,我们需要定义一个自定义图层裁剪类 – 我们适当地命名这个类 CropLayer 。
在这个类的构造函数中,我们分别存储裁剪开始和结束的起始和结束(x,y)坐标(第15-21行)。
将HED与OpenCV一起应用时,下一步是定义 getMemoryShapes函数,该函数负责计算输入的卷大小
第27行导出输入体积的形状以及目标形状。
第28行也从输入中提取批量大小和通道数 。
最后,第29行分别提取目标形状的高度和宽度。
给定这些变量,我们可以计算第32-35行的起始和结束作物(x,y) –坐标。
然后,我们将卷的形状返回到第39行的调用函数。
我们需要定义的最终方法是 前向函数。此功能负责在网络的正向传递(即推断/边缘预测)期间执行裁剪
第43和44行利用了Python和NumPy方便的列表/数组切片语法。
鉴于我们的 CropLayer类,我们现在可以从磁盘加载我们的HED模型并使用 net注册CropLayer
我们的prototxt路径和模型路径是使用args [ “edge_detector” ] 提供的 – edge -detector命令行参数 建立的 (第48-51行)。
从那里开始, protoPath 和 modelPath 都用于在第52行加载和初始化我们的Caffe模型 。
让我们继续加载我们的输入 图像
加载我们的原始 图像,并在第58和59行提取空间尺寸(宽度和高度) 。
我们还计算了Canny边缘图(第64-66行),因此我们可以将边缘检测结果与HED进行比较。
最后,我们准备申请HED了
要使用OpenCV和深度学习应用整体嵌套边缘检测(HED),我们:
最后,我们将展示:
图像和HED结果
要使用OpenCV将整体嵌套边缘检测应用于您自己的图像,请确保使用本教程的“下载”部分来获取源代码,经过培训的HED模型和示例图像文件。从那里,打开一个终端并执行以下命令$ python detect_edges_image.py --edge-detector hed_model --image images/cat.jpg
在左边 我们有输入图像。
在中心, 我们有Canny边缘探测器。
而在右边,是我们全面地应用套式边缘检测后的最终输出。
注意Canny边缘探测器如何不能保留猫,山脉或猫所坐的岩石的物体边界。
另一方面,HED能够保留所有这些对象边界。
我们试试另一张图片$ python detect_edges_image.py --edge-detector hed_model --image images/guitar.jpg
在上面的图3中,我们可以看到自己弹吉他的示例图像。使用Canny边缘检测器时,地毯的纹理和图案会产生很多“噪点” – HED,相反,没有这样的噪音。
此外,HED在抓住我的衬衫,牛仔裤(包括牛仔裤上的洞)和吉他的物体边界方面做得更好。
让我们做一个最后的例子
$ python detect_edges_image.py --edge-detector hed_model --image images/janie.jpg
这张照片中有两个物体:(1)狗,和(2)她身后的椅子。
Canny边缘探测器(中心)做了一个合理的工作,突出了椅子的轮廓,但无法正确捕捉狗的物体边界,主要是由于她的外套中的明/暗和暗/光过渡。
HED(右)能够更轻松地捕捉Janie的整个轮廓。
视频中的整体嵌套边缘检测
我们已将Openrally-Nested Edge Detection应用于使用OpenCV的图像 – 是否可以对视频执行相同的操作?
我们来看看。
打开 detect_edges_video .py文件1
我们的视频脚本需要三个额外的导入:
第10-15行的两个命令行参数 非常相似:
我们的 CropLayer 类与我们之前定义的类相同
在定义了我们相同的 CropLayer 类之后,我们将继续初始化我们的视频流和HED模型
无论我们选择使用我们的 网络摄像头 还是视频文件,脚本都将动态地工作(第51-62行)。
我们的HED模型已加载, CropLayer 已在第65-73行注册 。
让我们在循环中获取帧并应用边缘检测!
我们开始循环第76-80行的帧 。如果我们到达视频文件的末尾(当帧为无时发生 ),我们将从循环中断开(第84和85行)。
第88和89行调整框架的大小,使其宽度为500像素。然后我们在调整大小后抓住框架的尺寸。
现在让我们来处理框架 正好在我们前面的脚本
在输入帧上计算Canny边缘检测(第93-95行)和HED边缘检测(第100-106行)。
从那里,我们将显示边缘检测结果
我们的三个输出帧显示在110-112行:(1)原始的,调整大小的帧,(2)Canny边缘检测结果,以及(3)HED结果。
通过113号线捕获了键盘输入。如果 按下“q”,我们将从循环和清理中断开(第116-128行)。
视频和HED结果
那么,整体嵌套边缘检测如何与OpenCV实时执行?
我们来看看。
请务必使用此博客文章的“下载”部分下载源代码和HED模型。
从那里,打开一个终端并执行以下命令$ python detect_edges_video.py --edge-detector hed_model
在上面的简短GIF演示中,您可以看到HED模型的演示。
请特别注意使用Canny边缘检测器时背景灯的边界是如何完全丢失的; 但是,当使用HED时,边界将被保留。
在性能方面,我在收集上面的演示时使用了我的3Ghz Intel Xeon W. 我们使用HED模型在CPU上获得接近实时的性能。
要获得真正的实时性能,您需要使用GPU; 但是,请记住,对OpenCV的“dnn”模块的GPU支持特别有限(特别是目前不支持NVIDIA GPU)。
与此同时,如果您需要实时性能,可能需要考虑使用Caffe + Python绑定。
摘要
在本教程中,您学习了如何使用OpenCV和深度学习执行整体嵌套边缘检测(HED)。
与Canny边缘检测器不同,Canny边缘检测器需要预处理步骤,手动调整参数,并且通常在使用不同光照条件捕获的图像上表现不佳,Holistic-Nested Edge Detection旨在创建端到端深度学习边缘检测器。
正如我们的结果所示,HED生成的输出边缘图比简单的Canny边缘检测器更好地保留了对象边界。整体嵌套边缘检测可以在环境和光照条件可能未知或根本无法控制的应用中取代Canny边缘检测。
缺点是,HED是显著比 Canny 更计算昂贵。Canny边缘检测器可以在CPU上以超实时方式运行; 但是,HED的实时性能需要GPU。
我希望你喜欢今天的帖子
文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Holistically-Nested Edge Detection with OpenCV and Deep Learning/,2009年7月21日访问
相关文章
张贴在技术博客、opencv标签:opencv、深度学习、边缘检测、整体潜逃编辑