点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
直线检测是经典的底层视觉任务,对一些视觉任务,如自动驾驶、场景3D建模、无人机地平线检测等不可或缺。我们熟知的霍夫变换,就是解决直线检测问题的经典算法。然而,传统算法缺乏鲁棒性,只能受限于简单的应用场景。如今在充分的标注数据支持下,基于神经网络的直线检测算法对检测精度和鲁棒性有了很大提升。在数据驱动下,通过神经网络解决底层视觉任务,效果一般会更好。
传统算法
经典的霍夫变换算法,其一般流程是:提取图像边缘,并将边缘点坐标变换到霍夫空间。霍夫空间中每个点都代表一条直线,图像中同一直线上的点在霍夫空间会产生交点。在单位面积的霍夫空间中进行包含的像素点数统计,倘若高于设定阈值的,则认为包含一条直线。霍夫直线检测结果受阈值、霍夫空间分辨率等的影响,同时只能检测边缘直线,无法检测多个像素宽度的"粗直线"。但霍夫变换应用广泛,还可以应用于圆、椭圆等几何形状的检测。
LSD(line segment detection)也是传统的直线检测方法。它是一种“感知聚类”方法,依赖于精心设计的图像特征和检测策略,其精度、算法复杂度等都要好于霍夫直线检测。其主要思想是基于梯度构建每个像素点的特征,来表征这一点可能处于什么方向的直线上。随后对这些特征依据邻近程度、方向相似度等进行聚类,得到可能的直线区域。最后对这些区域进行筛选、后处理等,得到最终的直线检测结果。整个检测过程很复杂,为了得到较好的检测结果,需要精心调节多个算法参数。
上述算法均集成在了opencv中,除此以外opencv还包含了一些其他的传统直线检测算法,具体可以参考这篇博文:opencv直线检测算法汇总
深度学习算法
神经网络离不开数据支持,直线检测网络的发展离不开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还会保证一些难样本(如一些与正样本有重合部分的负样本)的数目,来增加鲁棒性。
TP-LSD【 ECCV 20】
TP-LSD 是单阶段的直线检测网络。TP表示“Tri-points”,表示其对直线的三点式建模方式,这也是它能做到single stage的原因。
将直线表示成中点及到两端点的方向和距离,就可以同时去回归中点位置、直线方向、中点到两侧的距离。如此一来,就可以避免预测端点,再对端点两两组合预测分数的过程。
从其网络架构看出,它也是先利用通用的特征提取器提取多尺度特征,随后通过不同的解码层,分别进行直线像素语义分割、中点检测,中点到两端点的位移向量预测。直线语义分割作为辅助信息,帮助中点定位,位移向量求解以及最终的融合。一般来说,在detection任务中做segmentation分支,都能提升检测效果。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~