传统直线检测算法与基于深度学习的直线检测算法

2023-11-15

传统直线检测算法与基于深度学习的直线检测算法

提示:科大讯飞算法面试题

加入一个图像有一条很明显的直线划痕,怎么用传统图像处理去掉划痕;就是直线检测


啥是直线检测

直线检测是经典的底层视觉任务,对一些视觉任务,如自动驾驶、场景3D建模、无人机地平线检测等不可或缺。

我们熟知的霍夫变换,就是解决直线检测问题的经典算法。

然而,传统算法缺乏鲁棒性,只能受限于简单的应用场景。

如今在充分的标注数据支持下,基于神经网络的直线检测算法对检测精度和鲁棒性有了很大提升。
在数据驱动下,通过神经网络解决底层视觉任务,效果一般会更好。


传统算法:霍夫变换法检测直线

经典的霍夫变换算法,

其一般流程是:提取图像边缘,并将边缘点坐标变换到霍夫空间。

霍夫空间中每个点都代表一条直线,图像中同一直线上的点在霍夫空间会产生交点

单位面积的霍夫空间中进行包含的像素点数统计
倘若高于设定阈值的,则认为包含一条直线。

霍夫直线检测结果受阈值、霍夫空间分辨率等的影响,
同时只能检测边缘直线,无法检测多个像素宽度的"粗直线"

但霍夫变换应用广泛,还可以应用于圆、椭圆等几何形状的检测
在这里插入图片描述

效果:
在这里插入图片描述
该算法最大的缺点就是需要根据图片去调节参数,关键的参数是lines = cv2.HoughLines(edges,1,np.pi/180, 200) 中的200,该值设置的越大图片中检测出来的直线数量会越少,你需要根据你自己的测试场景进行调节。

传统算法:LSD(line segment detection)也是传统的直线检测方法

LSD快速直线检测算法是由Rafael Grompone、Jeremie Jackbowicz、Jean-Michel Morel于2010年发表在PAMI上的文献《LSD:a Line Segment Dectctor》中提出的,该算法时间复杂度较霍夫变换低。

LSD算法通过对图像局部分析,得出直线的像素点集,
再通过假设参数进行验证求解,将像素点集合与误差控制集合合并,进而自适应控制误检的数量 。

一般来说,要检测图像中的直线,最基本的思想是检测图像中梯度变化较大的像素点集,LSD算法也正是利用梯度信息和行列线(level-line)来进行直线检测的。

它是
一种**“感知聚类”**方法,依赖于精心设计的图像特征和检测策略,
其精度、算法复杂度等都要好于霍夫直线检测。

其主要思想是基于梯度构建每个像素点的特征,来表征这一点可能处于什么方向的直线上。
随后对这些特征依据邻近程度、方向相似度等进行聚类,得到可能的直线区域。
最后对这些区域进行筛选、后处理等,得到最终的直线检测结果。

整个检测过程很复杂,为了得到较好的检测结果**,需要精心调节多个算法参数。**
在这里插入图片描述
效果:
在这里插入图片描述
上图展示了一些LSD算法的直线检测效果。

通过观察上面的结果,我们可以发现该算法的检测结果远远优于Hough和HoughP算法;

除此之外,上述的检测结果都是使用LSD算法的默认参数进行执行,
如果针对特定的参数进行调节,可以取得更好的结果,
这种情况一般是在你的特定需求场景中对默认的一些参数进行微调操作,往往能获得意想不到的结果。

FLD直线检测算法

4.1 FLD算法简介
  FLD直线检测算法是在该论文中被引入的,

《EDLines: A real-time line segment detector with a false detection control》

该论文中尝试着使用直线特征来代替原始的SURF点特征进行建筑物识别。

与点特征进行相比,线特征具有更容易发现和更好的鲁棒性,
线特征基本上不会受到光照、遮挡、视角变化的影响。

下面展示了该算法的直线检测效果,从图中我们可以看出,线特征比点特征更好一些。
  在这里插入图片描述
  上图展示了FLD直线检测算法的检测效果。

通过观察我们可以发现该算法具有很好的检测效果,
基本上可以检测出图中所有的直线,和LSD的性能类似,
具体使用哪种算法需要你根据自己的应用场景去进行选择。

EDlines直线检测算法

EDlines直线检测算法是在该论文中提出的。

本文提出了一个**快速、无参数的线段检测器,**命名为EDLines (Akinlar and Topal, 2011),
它产生强大的和准确的结果,比最快的已知线段检测器速度更快,达到11倍;
换句话说,the LSD by Grompone von Gioi et al. (2008a,b, 2010).
我们的探测器还包括一个线的验证步骤定于亥姆霍兹原理Helmholtz principle (Desolneux et al., 2008),这让它控制错误检测的数量。 EDLines得到的结果,我们看到的是,LSD非常相似,有所有主要的线段检测,并有极少数误报
此外, EDLines运行实时以炫目的速度为9.45毫秒,约10倍的速度比LSD对给定的图像。

5.2 EDlines算法实现步骤
步骤1-首先,给定一个灰度图像,运行新的边缘检测、边缘绘制(ED)算法,产生一套干净的,像素相邻的链,我们称之为边缘。边缘线段直观地反应对象的边界。
步骤2-然后,利用直线度准则,即最小二乘直线拟合法,从生成的像素链中提取线段。
步骤3-最后,线的验证步骤定于亥姆霍兹原理Helmholtz principle (Desolneux et al., 2008; Grompone von Gioi et al.,2008a)是用来消除虚假线段的检测。
在这里插入图片描述
上图展示了EDlines直线检测算法的检测效果。通过上面的观察,我们可以发现:
1)该算法能获得和LSD类似的检测结果;
2)该算法抑制了一部分小的误检的直线;
3)该算法具有更快的运行速度,是LSD的10倍左右。


深度学习算法检测直线:需要数据集

神经网络离不开数据支持,直线检测网络的发展离不开wireframe数据集【CVPR 2018】的公布。
该数据集包含了多种场景下的5000多张包含线段标注的图像。
在这里插入图片描述

Wireframe 【CVPR 18】
wireframe是随数据集提出的直线检测网络。

其思路是,一路检测直线的两个端点(junction),一路对直线像素做分割

其中,junction路需要去回归端点的位置(junction center decoders)和端点对应的直线方向、置信度信息(junction branch decoders),
line路则是要判断每个点是否是直线像素。

在这里插入图片描述
对于端点,需要注意其所对应的直线不一定只有一条,(如矩形顶点都对应两条边)。

对此,wireframe首先将可能的方向分为K份,每份360/K度,作为一个bin。
文章假设在端点每个bin的方向上,只包含一条线段。
因此,网络需要预测端点在K个方向上有直线的概率,同时对直线的精确角度进行回归(精确角度为相对bin起点的角度偏移量)。

另一方面,对于直线像素的分割,wireframe采用级联沙漏网络(Stacked Hourglass Networks)作为backbone。
级联沙漏网络最初应用于人体姿态检测任务,其名称由来是在网络架构上,不断地将bottom-up,top-down的沙漏型结构子网络级联,从而不断地整合全局和局部信息,有利于对人体关节、四肢、人体位置等各个尺度上的信息进行整合。

直线检测任务与人体姿态检测任务在全局、局部信息的利用上是类似的,
从直线跨度上看是宏观的,
但从直线像素本身的定位来看则是微观的,因此也需要不断整合各个尺度上的信息。

wireframe网络**并非端到端的网络,**其需要后处理来将分割结果和端点检测结果进行融合,才能得到最终检测结果。
之后提到的几篇文章都是端到端的检测网络。

LCNN 【ICCV 19】

LCNN(Line-CNN)是双阶段的检测网络,它可以看成是RCNN从二维到一维上的迁移。(名字和网络架构都可体现)
在这里插入图片描述
LCNN首先进行特征提取,采用的backbone也是级联沙漏网络。

随后,得到的特征图送入junction header,来预测可能的端点位置。

在推理时,对预测的所有端点,两两生成一个line proposal(类比RCNN region proposal),
随后通过proposal的两个端点位置,去特征图上采样得到该proposal对应的特征向量(line feature),采样的过程为LoI Pooling(类比RCNN RoI pooling)。
最终,将line feature送入全连接层,得到该proposal的分数,从而判定是否为一条直线。

值得注意的是,由于边的数目是远小于所有端点的两两组合数的,因此proposal中会生产大量的负样本,造成正负样本数的严重不平衡,会影响后续网络的训练。
因而在训练时,Line Sampler并非生成所有的proposal,而是分别从正负样本中采样数目相等的proposal进行训练。
同时,Line Sampler还会保证一些难样本(如一些与正样本有重合部分的负样本)的数目,来增加鲁棒性。

P-LSD【 ECCV 20】

TP-LSD 是单阶段的直线检测网络。
TP表示“Tri-points”,表示其对直线的三点式建模方式,这也是它能做到single stage的原因。
在这里插入图片描述
将直线表示成中点及到两端点的方向和距离,
就可以同时去回归中点位置、直线方向、中点到两侧的距离。
如此一来,就可以避免预测端点,再对端点两两组合预测分数的过程。

在这里插入图片描述
从其网络架构看出,它也是先利用通用的特征提取器提取多尺度特征,
随后通过不同的解码层,分别进行直线像素语义分割、中点检测,中点到两端点的位移向量预测

直线语义分割作为辅助信息,帮助中点定位,位移向量求解以及最终的融合。

一般来说,在detection任务中做segmentation分支,都能提升检测效果。


总结

提示:重要经验:

1)从霍夫变换算法到经典的LSD传统算法,后来改进很多,但是效果都和LSD差不多,而LSD又比霍夫变换牛
2)2018年开源了一个直线检测的数据集wireframe,从此很多关于端点预测的2阶段,和2阶段网络设计出来,预测端点,或预测中点,方向和距离啥的。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

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

传统直线检测算法与基于深度学习的直线检测算法 的相关文章

  • React的函数编程

    函数式编程的好处是什么 函数式编程是一种编程模式 在这种编程模式种最常用函数和表达式 函数式编程把函数作为一等公民 强调从函数的角度考虑问题 函数式编程倾向用一系列嵌套的函数来解决问题 函数式编程让我们的代码更清晰 每个功能都是一个函数 函

随机推荐

  • 「分享」最全AI合集 全是好玩意!

    哈喽 大家好 木易巷这次给大家带来了最全的AI合集 每一个都功能强大 总有一个是你需要的 话不多说 直接上 1 学英语 Replika 2 Al生成乐曲 AmperMusic IBM Watson Music 3 Al换脸 Deepfake
  • 一款好用的基于vue的录屏插件recordrtc,拿走不谢

    第一步 下载安装包 npm i recordrtc 第二步 复制代码 即可使用
  • c语言--unsigned修饰符

    在C语言中 unsigned是一种无符号整数修饰符 它可以与多个整数类型 如int short long等 结合使用 表示该整数类型只包含非负数值 unsigned修饰的整数类型不保存正负号位 因此可以用来表示更大的正整数范围 例如 uns
  • 静态代码扫描(四)——Java资源关闭研究

    最近一直在研究java资源关闭的检查规则 发现市面上开源的工具针对资源关闭的检测都存在一定不足 同时也无法满足我们业务的需求 所以火线团队针对资源关闭进行了深度的研究 取得了一些不错的进展 但是过程的艰辛也远超了我们的预料 现在就跟大家聊聊
  • 爬虫中连接数据库,两种获取网页内容的方式,BeautifulSoup, 正则表达式的使用,爬json格式文件

    一 连接数据库 1 连接MySQL import pymysql conn pymysql connect host localhost port 3306 user root passwd db charset utf8 cur conn
  • Multi-Camera Support

    Android 9 introduces API support for multi camera devices via a new logical camera device composed of two or more physic
  • 豪斯多夫距离-- Hausdorff distance of convex polygons

    蒙特利尔的麦吉尔大学的计算几何课程资料 原文链接 http cgm cs mcgill ca godfried teaching cg projects 98 normand main html 1 Introduction When ta
  • 总结 图(有向图、无向图、权、度、存储结构、邻接矩阵、领接表 概念)

    20171124 图的概念 图的基本性质 无向图 有向图 连通图 图的权 有些图的边或者狐剧有与他相关的数字 这种与图的边或者狐相关的数叫做权 图的度 无向图顶点的边数叫度 有向图顶点的边数叫出度和入度 图的数据存储结构 邻接矩阵 带权邻接
  • qt 获取当前程序运行路径_linux设置软件运行时动态库查找路径

    用习惯了windows 在linux下写代码 涉及到动态库 总是要复制到 usr lib里 觉得不方便 特别是调试的时候 不想复制过 特地找了一下怎么设置动态库查找路径 这里记录一下 程序是通过环境变量LD LIBRARY PATH的路径来
  • Exception in thread “main“ ExitCodeException exitCode=-1073741515

    Exception in thread main ExitCodeException exitCode 1073741515 今天在本地使用Mapreduce执行单词计数时出现了问题 在网上进行方法查找方法 首先 我先尝试将hadoop安装
  • linux信号介绍

    信号介绍 信号的概念 信号是信息的载体 Linux UNIX 环境下 古老 经典的通信方式 现下依然是主要的通信手段 信号在我们的生活中随处可见 例如 古代战争中摔杯为号 现代战争中的信号弹 体育比赛中使用的信号枪 信号的特点 简单 不能携
  • 【扩展KMP】POJ_3450| HDU_2328 Corporate Identity

    原题直通车 POJ 3450 Corporate Identity HDU 2328 Corporate Identity 题意概述 找出N个串中最长公共子串 分析 一 可以直接枚举其中一个串的所有字串 跟所有串进行匹配找到结果 二 用其中
  • IDEA(Ultimate版本)安装全程照着箭头指示

    只需动手跟着箭头指示安装即可 安装包的链接 https pan baidu com s 12hSGc7PDpbcaV UxCL5NSQ 提取码 zx1x 下载后解压自己想要的位置 安装完后可删除 以上就是安装全过程 如有问题可在评论区留言
  • 2023-05-19 题目

    1 java的三大特性 亦或者四大特性 继承 继承是从已有类得到继承信息创建新类的过程 提供继承信息的类被称为父类 超类 基类 得到继 承信息的类被称为子类 派生类 继承让变化中的软件系统有了一定的延续性 同时继承也是封装程序中可变因素的
  • <<计算机视觉CVPR>>2022:Grounded Language-Image Pre-training

    收录情况 CVPR 2022 论文链接 https arxiv org abs 2112 03857 代码链接 https github com microsoft GLIP 文章目录 简介 问题 方案 主要贡献 相关工作 方法 Groun
  • 12款开源或免费的3D建模软件

    1 Blender Blende是一款系统全面的3D建模套件 它提供了大量专业级功能和模块 跨平台支持所有的主要操作系统 目前并已成为免费3D软件的代名词 Blender通常被称为TheBlenderProject 因为它不仅仅是一个软件
  • Python 基础合集13:错误的调试和处理

    一 前言 本小节介绍了错误的调试和处理 包含了寻找出现bug的代码的方法 以及处理bug的方法 另外还附加了一些错误类型 环境说明 Python 3 6 windows11 64位 二 调试 找出错误 之前看到一句话 很在理 出错并不可怕
  • 汇编, 立即数, 有符号与无符号数

    汇编 立即数 有符号与无符号数 386 model flat stdcall option casemap none includelib msvcrt lib printf proto c ptr sbyte vararg data sz
  • C++语法总结

    1 const 与volatile 的用法 1 const include
  • 传统直线检测算法与基于深度学习的直线检测算法

    传统直线检测算法与基于深度学习的直线检测算法 提示 科大讯飞算法面试题 加入一个图像有一条很明显的直线划痕 怎么用传统图像处理去掉划痕 就是直线检测 文章目录 传统直线检测算法与基于深度学习的直线检测算法 TOC 文章目录 啥是直线检测 传