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

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

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


啥是直线检测

直线检测是经典的底层视觉任务,对一些视觉任务,如自动驾驶、场景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,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐