社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

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

深度学习基础与进阶 • 6 月前 • 374 次点击  

直线检测是经典的底层视觉任务,对一些视觉任务,如自动驾驶、场景3D建模、无人机地平线检测等不可或缺。我们熟知的霍夫变换,就是解决直线检测问题的经典算法。然而,传统算法缺乏鲁棒性,只能受限于简单的应用场景。如今在充分的标注数据支持下,基于神经网络的直线检测算法对检测精度和鲁棒性有了很大提升。在数据驱动下,通过神经网络解决底层视觉任务,效果一般会更好。

传统算法

经典的霍夫变换算法,其一般流程是:提取图像边缘,并将边缘点坐标变换到霍夫空间。霍夫空间中每个点都代表一条直线,图像中同一直线上的点在霍夫空间会产生交点。在单位面积的霍夫空间中进行包含的像素点数统计,倘若高于设定阈值的,则认为包含一条直线。霍夫直线检测结果受阈值、霍夫空间分辨率等的影响,同时只能检测边缘直线,无法检测多个像素宽度的"粗直线"。但霍夫变换应用广泛,还可以应用于圆、椭圆等几何形状的检测。

LSD(line segment detection)也是传统的直线检测方法。它是一种“感知聚类”方法,依赖于精心设计的图像特征和检测策略,其精度、算法复杂度等都要好于霍夫直线检测。其主要思想是基于梯度构建每个像素点的特征,来表征这一点可能处于什么方向的直线上。随后对这些特征依据邻近程度、方向相似度等进行聚类,得到可能的直线区域。最后对这些区域进行筛选、后处理等,得到最终的直线检测结果。整个检测过程很复杂,为了得到较好的检测结果,需要精心调节多个算法参数。

LSD算法

上述算法均集成在了opencv中,除此以外opencv还包含了一些其他的传统直线检测算法,具体可以参考这篇博文:opencv直线检测算法汇总

深度学习算法

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

wireframe数据集

有了数据集的支持,近些年有不少直线检测顶会论文发表。

Wireframe 【CVPR 18】

wireframe是随数据集提出的直线检测网络。其思路是,一路检测直线的两个端点(junction),一路对直线像素做分割。其中,junction路需要去回归端点的位置(junction center decoders)和端点对应的直线方向、置信度信息(junction branch decoders),而line路则是要判断每个点是否是直线像素。

wireframe架构

对于端点,需要注意其所对应的直线不一定只有一条,(如矩形顶点都对应两条边)。对此,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网络架构

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还会保证一些难样本(如一些与正样本有重合部分的负样本)的数目,来增加鲁棒性。

TP-LSD【 ECCV 20】

TP-LSD 是单阶段的直线检测网络。TP表示“Tri-points”,表示其对直线的三点式建模方式,这也是它能做到single stage的原因。

不同的直线建模方式

将直线表示成中点及到两端点的方向和距离,就可以同时去回归中点位置、直线方向、中点到两侧的距离。如此一来,就可以避免预测端点,再对端点两两组合预测分数的过程。

TP-LSD网络架构

从其网络架构看出,它也是先利用通用的特征提取器提取多尺度特征,随后通过不同的解码层,分别进行直线像素语义分割、中点检测,中点到两端点的位移向量预测。直线语义分割作为辅助信息,帮助中点定位,位移向量求解以及最终的融合。一般来说,在detection任务中做segmentation分支,都能提升检测效果。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/169996
 
374 次点击