车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet

车道线检测是自动驾驶中的一个基础模块,车道保持,自适应巡航,自动变道;对于全自动驾驶汽车后续的车道偏离或轨迹规划决策也很重要。

目前车道线检测主要有两种方案:传统方法深度学习

1.传统方法

(1)边缘检测+霍夫变换
方法流程:彩色图像转灰度,模糊处理,边缘检测,霍夫变换
这种方法一般能够检测出简单场景下的车辆目前行驶的两条车道线,以及偶尔的相邻车道(依赖前视相机的角度)。该方法可以利用霍夫变换的结果(线的斜率),进一步过滤出左右车道线。不过同时,该方法也依赖于边缘检测的结果,所以调参(边缘检测、霍夫变换)以及其他的trick(ROI选取等)很重要。

(2)颜色阈值
方法流程:将图像转颜色空间(一般HSV),对新的color space中的各个通道设置阈值(大于阈值取值为1,小于取值为0),得到结果。
该方法依赖于各通道的阈值的选取,只需要调整几个阈值参数,但有时候鲁棒性会较差,例如当前车辆前方的车辆可能会被全部置1。

(3)透视变换
方法流程:获取透视变换矩阵,透视变换,车道线检测
该方法的优点是将前视摄像头抓拍的图像转为鸟瞰图,能够检测到多条线。其关键在于透视变换矩阵的准确性(不考虑转换后的车道线检测),对于转换后的鸟瞰图,可以通过上述两种方式检测车道线。
车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第1张图片
车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第2张图片

边缘检测、k-Means、高斯概率模型

(1)Udacity车道线检测

  • 相机标定、openCV

原因:sensor制造误差、非线性径向畸变、切向畸变

参考:https://zhuanlan.zhihu.com/p/87334006; https://blog.csdn.net/a083614/article/details/78579163

  • ROI选取,图像透视变换,把图像转换为俯视图
  • 二值化并且找到车道线

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第3张图片
车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第4张图片

滑动窗口与多项式拟合

  • 最小二乘法拟合中心点形成车道线

(2)基于投影的车道线检测

  • 图片标定、ROI透视

原图:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第5张图片

二值化:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第6张图片

  • 把二值化的点投影到横坐标上

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第7张图片

选取对应的最大值:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第8张图片

  • Ransac(随机抽样一致性算法)多项式拟合附近的点

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第9张图片

投影回原图效果:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第10张图片

在实际场景中,传统方法的鲁棒性不好,除去光照和邻近车辆的影响外,车道中间的指示箭头和人行道也是此类算法很难处理的挑战。

2.深度学习

深度学习的浪潮使车道线检测有了很大进步

车道线检测工作的局限性(持续,即目前为止普遍存在):

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第11张图片

车道线检测工作的baseline并不明确,不同的方法与不同的场景应用都有各自的局限性。例如:

  • 输出类型:mask掩码/点集/矢量线条
  • 实例化:每个车道线是否形成实例
  • 分类:是否对车道线进行了分类(单白、双黄等)
  • 提前定义的参数:是否只能检测固定数量的车道线
  • 车道标记:是否对车道上的行车标记也做了检测

这会影响到数据的标注和网络的输出形式,而且最终需要的是车道线在世界坐标系下的方程。而神经网络更适合提取图像层面的特征,直接回归方程参数有较多限制。所以,网络推理输出后需要相对复杂的后处理去解决真实坐标的问题。

车道检测问题通常被表述为一个分割任务,其中,给定一个输入图像,输出是一个具有每个像素预测的分割图。

性能指标:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第12张图片

在评判Ture或False时,主要有两种方式:

  • end point:通过判断线的端点间的距离及其包围面积是否超过阈值
  • IOU:直接计算IOU的重叠面积

IOU=(A∩B)/(A∪B)

IOU=SI/(SA+SB-SI)

工作pipeline:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第13张图片

目前的主流方法pipeline分为多阶段与单阶段。

  • 多阶段可以分为两个部分,二值语义分割产生掩码图和对掩码图进行线的拟合。其中,二值语义分割主要采用CNN方法,并通过SCNN(Spatial As Deep: Spatial CNN for Traffic Scene Understanding)、CNN+RNN(Robust Lane Detection from Continuous Driving Scenes Using Deep Neural Networks)、GAN(EL-GAN:Embedding Loss Driven Generateive Adversarial Networks for Lane Detection)等方法来提高语义分割精度。而对掩码图的线的拟合,有采用学习到的转换矩阵先将分割结果转换为鸟瞰图视角,然后,采用均匀取点+最小二乘法拟合,拟合方程可选三次方程。
  • 对于单阶段方法,即是直接回归出线的参数,即在CNN上修改分支,使用特殊层将参数输出。

datasets:

  • 需要各场景类别的数据平衡,比如高速公路,辅路,盘山路,夜晚,雨天等数据
  • 检查筛选出质量较好的图片,比如高速公路夜间的数据和雨中驾驶的视频较为模糊
  • 相近的图片抽帧标注,可以每10张抽取1张,比如低速的多张图片相似会造成准确率虚高
  • 增广小类别的图片,比如查看车道线系数直方图,再小幅度旋转使每个系数分布更为合理
  • 缩放并归一化数据,加速收敛

常用的车道线检测数据集包括TuSimple, CULane, BDD100K等。其中TuSimple数据集共有7K张图片,场景为美国高速公路数据。CULane共有133K张数据,场景包含拥挤、黑夜等八种难以检测的情况,数据在北京采集。BDD100K共有120M张图片,数据集包含多种自动驾驶感知任务,数据集较新,算法采用度不高。(数据更新)

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第14张图片

papers with code https://paperswithcode.com/task/lane-detection/latest#code

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第15张图片

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第16张图片
车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第17张图片

论文1:《LaneATT——Keep your Eyes on the Lane: Real-time Attention-guided Lane Detection》实时注意力引导车道检测

论文地址:

https://arxiv.org/pdf/2010.12035.pdf

Github地址:

https://github.com/lucastabelini/LaneATT

现有方法的不足之处:maintaining real-time efficiency

LaneATT:一种基于锚点的深车道单阶检测模型,它类似于其他一般的深目标检测器,使用锚点进行特征池化步骤

从安装在车辆上的前置摄像头接收作为输入的RGB图像:
在这里插入图片描述
输出是车道边界线(车道),为了生成这些输出,卷积神经网络(CNN),即主干,生成一个特征映射,然后合并该特征映射来提取每个锚点的特征。那些特征结合一组由注意力模块产生的全局特征。通过结合局部和全局特征,该模型可以更容易地使用来自其他车道的信息,这在闭塞或没有可见车道标志等情况下可能是必要的。最后,将组合的特征传递到全连接层,以预测最终的输出通道。

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第18张图片

骨干网络从输入图像生成特征映射。随后,每个锚被投影到特征映射上。这个投影被用于聚合与注意力模块中创建的另一组特征相连接的特征。最后,使用得到的特征集,两个层,一个用于分类,另一个用于回归,进行最后的预测。

Reproducibility:

衡量模型效率:乘法累积操作(multiply-accumulate operations, mac)和帧数每秒(frames-per-second, FPS)

结论:

Tusimple:该方法获得了第二高的F1(仅0.02%的差异),同时比顶级F1方法(171 vs 30 FPS)快得多;

CULane:该方法在速度和准确性方面都在实时方法中达到高水平(与最先进的方法相比,前者的速度约为170 FPS);

在LLAMAS基准测试中获得了较高的F1(+93%)。

论文2:《Towards End-to-End Lane Detection: an Instance Segmentation Approach》面向端对端的车道检测 一种实例分割

论文地址:

Towards End-to-End Lane Detection: an Instance Segmentation Approach

Github地址:

https://github.com/MaybeShewill-CV/lanenet-lane-detection

  1. LaneNetH-Net两个网络模型

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第19张图片

LanNet 是一种将语义分割和对像素进行向量表示结合起来的多任务模型,最后利用聚类完成对车道线的实例分割。H-Net 是有个小的网络结构,负责预测变换矩阵 H,使用转换矩阵 H 对同属一条车道线的所有像素点进行重新建模(使用 y 坐标来表示 x 坐标)。

LaneNet

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第20张图片

实例分割任务→语义分割(LanNet 一个分支)和聚类(LanNet一个分支提取 embedding express, Mean-Shift 聚类)

Embedding branch :对像素进行嵌入式表示

Segmentation branch:二分类,判断像素属于车道线还是背景

训练得到 embedding 向量用于聚类

设计语义分割模型

1.处理遮挡问题:对车辆遮挡的车道线和虚线进行还原(估计);

2.解决样本分布不均衡问题(属于车道线的像素远少于属于背景的像素):使用了 bounded inverse class weight 对 loss 进行加权:
在这里插入图片描述

p 为对应类别在总体样本中出现的概率,c 是超参数(论文中是1.02)《A Deep Neural Network Architecture for Real-Time Semantic Segmentation》

像素embedding:

为了区分车道线上的像素属于哪条车道,embedding_branch 为每个像素初始化一个 embedding 向量,并且在设计 loss 时,使属同一条车道线的表示向量距离尽可能小,属不同车道线的表示向量距离尽可能大。

这部分的 loss 函数是由三部分组成:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C:车道线数量;Nc:属同一条车道线的像素点数量;μc :车道线的均值向量;xi 是像素向量(pixel embedding);[x]+=max(0,x)。

H-Net:

LaneNet的输出是每条车道线的像素集合,还需要根据这些像素点回归出一条车道线。传统的做法是将图片投影到 bird’s-eye view 中,然后使用 2 阶或者 3 阶多项式进行拟合。在这种方法中,变换矩阵 H 只被计算一次,所有的图片使用的是相同的变换矩阵,这会导致地平面(山地,丘陵)变化下的误差。

为了解决这个问题,论文训练了一个可以预测变换矩阵 H 的神经网络 H-Net,网络的输入是图片,输出是变换矩阵 H:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第21张图片

通过置 0 对转置矩阵进行约束,即水平线在变换下保持水平。(即坐标 y 的变换不受坐标 x 的影响)

转置矩阵 H 只有6个参数,因此H-Net的输出是一个 6 维的向量。H-Net 由 6 层普通卷积网络和一层全连接网络构成,其网络结构如图所示:

车道线检测传统方法&深度学习方法概览+两篇论文领读LaneATT+LaneNet_第22张图片

结论:

H-Net比用固定的转换矩阵要好,用3阶多项式拟合要比2阶好,用了透视变换比不用好。

车道线识别深度学习面临的挑战:

(1)车道线这种细长的形态结构,需要更加强大的高低层次特征融合,来同时获取全局的空间结构关系,和细节处的定位精度。

(2)车道线的形态有很多不确定性,比如被遮挡,磨损,以及道路变化时本身的不连续性。需要网络针对这些情况有较强的推测能力。

(3)车辆的偏离或换道过程会产生自车所在车道的切换,车道线也会发生左/右线的切换。一些提前给车道线赋值固定序号的方法,在换道过程中会产生歧义的情况。

你可能感兴趣的:(算法,计算机视觉,自动驾驶)