车道线检测是自动驾驶中的一个基础模块,车道保持,自适应巡航,自动变道;对于全自动驾驶汽车后续的车道偏离或轨迹规划决策也很重要。
目前车道线检测主要有两种方案:传统方法与深度学习。
(1)边缘检测+霍夫变换
方法流程:彩色图像转灰度,模糊处理,边缘检测,霍夫变换
这种方法一般能够检测出简单场景下的车辆目前行驶的两条车道线,以及偶尔的相邻车道(依赖前视相机的角度)。该方法可以利用霍夫变换的结果(线的斜率),进一步过滤出左右车道线。不过同时,该方法也依赖于边缘检测的结果,所以调参(边缘检测、霍夫变换)以及其他的trick(ROI选取等)很重要。
(2)颜色阈值
方法流程:将图像转颜色空间(一般HSV),对新的color space中的各个通道设置阈值(大于阈值取值为1,小于取值为0),得到结果。
该方法依赖于各通道的阈值的选取,只需要调整几个阈值参数,但有时候鲁棒性会较差,例如当前车辆前方的车辆可能会被全部置1。
(3)透视变换
方法流程:获取透视变换矩阵,透视变换,车道线检测
该方法的优点是将前视摄像头抓拍的图像转为鸟瞰图,能够检测到多条线。其关键在于透视变换矩阵的准确性(不考虑转换后的车道线检测),对于转换后的鸟瞰图,可以通过上述两种方式检测车道线。
边缘检测、k-Means、高斯概率模型
原因:sensor制造误差、非线性径向畸变、切向畸变
参考:https://zhuanlan.zhihu.com/p/87334006; https://blog.csdn.net/a083614/article/details/78579163
滑动窗口与多项式拟合
原图:
二值化:
选取对应的最大值:
投影回原图效果:
在实际场景中,传统方法的鲁棒性不好,除去光照和邻近车辆的影响外,车道中间的指示箭头和人行道也是此类算法很难处理的挑战。
深度学习的浪潮使车道线检测有了很大进步
车道线检测工作的局限性(持续,即目前为止普遍存在):
车道线检测工作的baseline并不明确,不同的方法与不同的场景应用都有各自的局限性。例如:
这会影响到数据的标注和网络的输出形式,而且最终需要的是车道线在世界坐标系下的方程。而神经网络更适合提取图像层面的特征,直接回归方程参数有较多限制。所以,网络推理输出后需要相对复杂的后处理去解决真实坐标的问题。
车道检测问题通常被表述为一个分割任务,其中,给定一个输入图像,输出是一个具有每个像素预测的分割图。
性能指标:
在评判Ture或False时,主要有两种方式:
IOU=(A∩B)/(A∪B)
IOU=SI/(SA+SB-SI)
工作pipeline:
目前的主流方法pipeline分为多阶段与单阶段。
datasets:
常用的车道线检测数据集包括TuSimple, CULane, BDD100K等。其中TuSimple数据集共有7K张图片,场景为美国高速公路数据。CULane共有133K张数据,场景包含拥挤、黑夜等八种难以检测的情况,数据在北京采集。BDD100K共有120M张图片,数据集包含多种自动驾驶感知任务,数据集较新,算法采用度不高。(数据更新)
papers with code https://paperswithcode.com/task/lane-detection/latest#code
论文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),即主干,生成一个特征映射,然后合并该特征映射来提取每个锚点的特征。那些特征结合一组由注意力模块产生的全局特征。通过结合局部和全局特征,该模型可以更容易地使用来自其他车道的信息,这在闭塞或没有可见车道标志等情况下可能是必要的。最后,将组合的特征传递到全连接层,以预测最终的输出通道。
骨干网络从输入图像生成特征映射。随后,每个锚被投影到特征映射上。这个投影被用于聚合与注意力模块中创建的另一组特征相连接的特征。最后,使用得到的特征集,两个层,一个用于分类,另一个用于回归,进行最后的预测。
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
LanNet 是一种将语义分割和对像素进行向量表示结合起来的多任务模型,最后利用聚类完成对车道线的实例分割。H-Net 是有个小的网络结构,负责预测变换矩阵 H,使用转换矩阵 H 对同属一条车道线的所有像素点进行重新建模(使用 y 坐标来表示 x 坐标)。
LaneNet
实例分割任务→语义分割(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:
通过置 0 对转置矩阵进行约束,即水平线在变换下保持水平。(即坐标 y 的变换不受坐标 x 的影响)
转置矩阵 H 只有6个参数,因此H-Net的输出是一个 6 维的向量。H-Net 由 6 层普通卷积网络和一层全连接网络构成,其网络结构如图所示:
结论:
H-Net比用固定的转换矩阵要好,用3阶多项式拟合要比2阶好,用了透视变换比不用好。
车道线识别深度学习面临的挑战:
(1)车道线这种细长的形态结构,需要更加强大的高低层次特征融合,来同时获取全局的空间结构关系,和细节处的定位精度。
(2)车道线的形态有很多不确定性,比如被遮挡,磨损,以及道路变化时本身的不连续性。需要网络针对这些情况有较强的推测能力。
(3)车辆的偏离或换道过程会产生自车所在车道的切换,车道线也会发生左/右线的切换。一些提前给车道线赋值固定序号的方法,在换道过程中会产生歧义的情况。
完