All in One | 一文彻底搞懂车道线检测任务的前世今生

添加小助理微信AIDriver004,加入近30+自动驾驶技术方向交流群!更多行业咨询与技术分享,欢迎加入『自动驾驶之心知识星球』,国内最大的自动驾驶技术交流社区,你想要的这里都有。

论文作者 | 三金

编辑 | 自动驾驶之心

Implementing lane detection is the first, essential task when building a self-driving car.
—— Sebastian Thrun (godfather of self-driving cars)

写在前面

在自动驾驶和智能交通系统的发展中,车道线检测作为其中至关重要的一环,扮演着无可替代的角色。车道线不仅是道路交通标记的重要组成部分,更是车辆导航、路径规划和环境感知的基础。因此,准确、稳定的车道线检测系统对于实现安全、高效的智能交通至关重要。

随着深度学习技术的飞速发展,车道线检测技术已经取得了显著的进步。传统的基于图像处理和机器学习的方法逐渐被基于深度学习的端到端模型所取代,使得车道线检测系统在准确性和鲁棒性上都得到了显著提升。

笔者正是从事相关领域的研究和工作,创作这篇文章,主要是想对车道线检测这一细分任务的方法进行一个总结归纳,并且谈谈自己的理解。全文将从传统的检测方法聊到基于深度学习的一些方法,再谈到BEV视角下的检测,最后聊一聊关于大一统的检测方法。可以说是讲述了车道线检测任务的"前世今生",故起了这样一个标题。以下是本文的结构框架:

ce19245d962f8c76389be7930e6e0cf7.png

传统方法

先简单聊聊几个主流的传统车道线检测的方法,主要还是借助于opencv和一些算法来实现:

  1. 颜色阈值:如果只是检测简单的黄色和白色车道线,我们可以用这种方法来实现。把一般常见的RGB通道的图片转化到HSV或者HSL的颜色特征,然后人工设置一个黄色阈值和白色阈值,就能检测出来图像中黄色和白色车道线的位置。

  2. 边缘检测+霍夫变换:灰度图像-->高斯平滑(把图片变模糊,下一步边缘检测就会滤掉一些不重要的线条)-->边缘检测(检测出图像中边缘的点)-->选择ROI(可以选出路面区域)-->霍夫变换(获得车道线的直线参数)-->投影到原图上。
    PS:说说笔者对霍夫变换的理解:将一条直线转换到表征直线的参数空间(可以用斜率m和截距b表征一条直线,那么霍夫空间就是m和b的函数,极坐标表示也类似)。所以经过笛卡尔坐标系下的一个点,可以有无数条直线,即可以有无数种m和b的对应关系,在霍夫空间中,则对应着一条直线。图片上通过边缘检测可以离散得到N个点,而对应的霍夫空间可以表示成N条直线,这N条直线的交点,对应的m和b,即为我们所想要检测的车道线。

  3. 基于拟合的检测: 利用RANSAC等算法拟合车道线。

优点:不需要数据积累
缺点:鲁棒性较差;需要人工手动调参;霍夫变换不能做弯道检测;拟合的方法稳定性较差。

虽然我们要肯定前人的成果,但是不得不说,传统的车道线检测方法需要人工手动地去调整算子和阈值,不仅工作量大且而且鲁棒性也较差,在复杂的环境下,检测结果就不够理想。

基于深度学习方法

与传统的检测算法相比,基于深度学习的车道线检测因其过硬的“实力”,越来越被学术界重视和也被工业界广泛应用:无需手动设计特征提取规则、泛化能力强、适应性强、准确性高。主流的方法分为三种:基于分割的方案(segmentation-based),基于锚的方法(anchor-based),基于参数的方法(parameter-based)。

基于分割的方法(segmentation-based)

顾名思义,把车道线检测的任务当成分割任务来做,通过模型得到图片中哪些pixels属于车道线,哪些不是,并且知道哪些pixels是属于同一条车道线,所以,这其实是一个实例分割(instance segmentation)的任务。

提到这类方法,不得不提它的开山之作——LaneNet!
论文地址:https://arxiv.org/pdf/1802.05591.pdf
github地址:https://github.com/MaybeShewill-CV/lanenet-lane-detection

6a6cb71a13e87e6ed581a0d8d83db9ee.png

作者用用共享的Encoder模型,设计了两个Decoder分支:车道线分割分支车道embedding分支。前者对像素进行二分类,输出哪些pixels是车道线,哪些是背景,使用标准的交叉熵损失函数;后者输出不同的车道实例,每个pixel初始化一个embedding,通过loss的设计,使得属于同一车道的embedding距离尽可能小,属于不同车道的embedding距离尽可能大。

1a35bb653df7063da2f62e4405e9b363.png

C表示车道线数量,Nc表示属于同一条车道线的像素点数量,c表示车道线c的embedding均值,xi表示像素i的embedding。设计Lvar的目标是:如果像素向量xi与车道线c均值向量 c 的距离大于v时,该loss会大于0,反传更新,使得xi 靠近c;设计Ldist的目的是:如果不同车道线均值向量 cA和 cB 之间的距离小于 d 时,该loss会反传更新,使得 cA 与 cB 远离彼此。

得到不同车道的embedding之后,可以通过任意聚类算法来完成实例分割,论文中基于mean-shift来实现的。LaneNet的输出是每条车道线的像素集合,但还需要通过回归来得到完整的车道线。传统方法通常将图像投影到鸟瞰图中,然后使用2阶或3阶多项式进行拟合。然而,这种方法存在一个问题,即变换矩阵H只被计算一次,所有图像都使用相同的变换矩阵,这可能导致在地形变化(如山地或丘陵)的情况下产生误差。为了解决这个问题,论文又设计了一个H-Net网络,它能够训练出能够预测变换矩阵H的模型,其实就是6个参数。H-Net的输入是图像数据,输出是变换矩阵H。通过这个设计,模型能够根据不同的场景和视角,灵活地调整变换矩阵H,从而更好地适应不同地形和环境下的车道线检测任务。

LaneNet算是基于分割的车道线方法的先驱之作,但是除此之外,仍然有效果更棒的文章,比如:

  1. SCNN(论文地址:https://arxiv.org/pdf/1712.06080.pdf)的作者就发现,只用简单的CNN来检测车道线,无法提取pixels之间的空间关系,所以会出现当车道线被遮挡时无法被连续识别的问题。于是提出使用空间CNN(spatial CNN)的方法,来增强pixels之间横纵方向的信息传递,从而提高车道线检测的连续性。

  2. RESA(论文地址: https://arxiv.org/pdf/2008.13719.pdf)的作者为了提取车道线丰富的空间特征,设计了一个REcurrent Feature-Shift Aggregator模块,利用切片特征图的垂直和水平移动来直接信息聚合。

基于锚的方法 (anchor-based)

Anchor这个词翻译成中文叫“锚”,一直让很多CV新人很不解,其实简单的理解就是“预设的参照”。目标检测任务中,模型对“在哪里有什么目标”不太清楚,所以我们会在图像上预先设计好不同大小,不同长宽比的锚框(anchor boxes),任务即变成“在这个锚框中有没有目标,离得有多远”。那么在车道“线”检测的任务中,预设“框”似乎有点不太合适了,而是要设计“锚线”(anchor lines)。

LineCNN的作者就是受到Faster-RCNN的启发,提出了line proposal (LP),其实就是 anchor lines。因为车道线起始点一般都是图像的左、下、右边向外延伸。所以作者的LP都是从特征图上的这三边上的每个点,沿不同的角度,来生成的。每个LP用一个长度为77的向量表示,[负样本的概率, 正样本的概率, 起始坐标y, 起始坐标x, 车道线长度, 72个偏移量]。作者也设计了一款距离,用来计算车道线和LP之间的距离。

该类别的方法下,还有一个非常经典的模型——LaneATT
论文地址:https://arxiv.org/pdf/2010.12035.pdf
代码链接:https://github.com/lucastabelini/LaneATT

0aa4a26e2acf3280acfda896858adedc.png

先用CNN提取特征,然后根据 anchor lines的x和y的坐标,在特征图上挑出固定长度的特征,得到 ailoc,但是这个特征也只是局部特征,如果遇到车道线被遮挡的情况,还需要融合全局的特征来进行预测。所以,作者提出了一个注意力机制,用来获取全局特征aiglob。融合后的特征,用于两个预测分支:分类分支用来预测类别(k个类别车道线和1个背景类别);回归分支基于anchor的起始点s,预测出线的长度L, 以及N个点的坐标与anchor的偏移。

上述两个方法都是从图像的左下右三个边为起始点,去预设anchor lines,但是有的数据,可能因为车前盖的影响,车道线并非从这三边出发。基于此,ADNet(https://arxiv.org/pdf/2308.10481.pdf)的作者就将anchor分解为学习起点和相关方向的heatmap,消除了预设的anchor lines起始点的限制。并提出来大核注意力模块LKA,目的是提高生成anchor的质量,增加感受野。

当然,基于anchor的车道线检测方案,不仅仅局限于anchor lines, 还有一些其它的思路,比如:CondLaneNet (https://arxiv.org/pdf/2105.05003.pdf)就是利用一个 proposal head(作用有点类似Faster-RCNN中的Region Proposal Network),预测车道线起始点的heatmap,然后会对于特征图中的每一行,车道线的点在每一行的位置,和在纵向的pixel会被预测出来,再通过预测一个offset,来得到车道线的点。

基于参数的方法(parameter-based)

车道线说白了,就是线;是线,就可以用多项式拟合!一次多项式、二次多项式、三次多项式……来拟合曲线,都是有一些参数的。常用的三次多项式拟合曲线  就需要4个参数。该类方法的思路就是直接预测这些参数。经典的论文就是——PolyLaneNet
论文地址:https://arxiv.org/pdf/2004.10924.pdf
github地址:https://github.com/lucastabelini/PolyLaneNet

cbd74ed1cbc1fb67fd892efb2eeb9ba7.png

作者设计了多项式曲线回归(deep polynomial regression),输出表示图像中每个车道线的多项式。好处是可以学习整体车道表示,推理速度较快,但实际上这种方法在准确度上并不高。

BEV视角下车道线检测

近几年,BEV视角下的视角感知,一直发展迅速,各家公司都有自己的BEV方案。传统的方案,就是通过多视角的相机参数标定,得到相机平面与地面的单应性矩阵,利用逆透视变换(IPM),实现从相机平面到大地平面的转换,再把多视角的图片拼接。但是这样的方法最大的问题就是需要假设地面是平坦的,这在泊车场景下,应用的比较多,但是在开放路段,对于路面不平或者稍微远距离一些的检测任务中,就有些吃力了。所以大部分的方案,都还是基于深度学习的方法来做的。笔者没有把这部分方法归到上面的类别中,主要是因为这部分近几年比较火热,思路也与之不同。

目前比较主流的方法大体可以分为以下两种:

  1. 显式估计图像的深度信息,完成BEV视角的构建,e.g., LSS;

  2. 与transformer结合,利用BEV Query查询构建BEV特征, e.g., BEVformer;

  3. 作为 HD map构建的一个子任务,e.g., MapTR。

先来讲讲BEV的开山之作——Lift,Splat,Shoot(LSS)。
论文链接:https://arxiv.org/pdf/2008.05711.pdf
github链接:https://github.com/nv-tlabs/lift-splat-shoot

bd17e41ea3a06148542cc5e009f84e33.png

主要分为以下几步:
第一步:生成视锥,得到的是从特征图上的点,与原图上的点的映射,并根据相机内外参将视锥中的点投影到车身坐标系中;
第二步:提取图像特征,利用深度概率密度和语义信息构建图像特征点云;
第三步:将第一步得到的车身坐标系下的点与图像特征点云利用Voxel Pooling,压平构建BEV特征;
第四步:对生成的BEV features利用ResNet-18进行多尺度特征提取,再进一步的特征融合;
第五步:利用特征融合后的BEV特征完成车道线语义分割任务,做交叉熵损失;

当然,基于LSS的很多变式都有不错的效果,但是这种范式对深度的分布非常敏感,于是另一种思路诞生了,让模型自己学习如何将图像的特征转化到BEV空间,来实现车道线检测和目标检测等任务。BEVFormer,即是如此。

论文链接:https://arxiv.org/pdf/2203.17270.pdf

582dc5b498d50cbbeb67406b42af8ea5.png

BEVFormer最吸引人的地方就是Encoder layers的设计,包含:BEV Queries, Spatial cross-attention 和Temporal self-attention。BEV Queries可以理解为可学习参数,通过attention机制在多视角图像中查询特征。Spatial cross-attention以BEV Queries作为输入的注意力层,负责获取来自多视角的特征;Temporal self-attention则是负责聚合时间维度上特征,指来自上一帧的BEV特征。

第三个部分聊一聊 HD map。传统的SLAM离线建图,成本比较昂贵,流程也比较复杂,行业里大家都在做无图NOA,但是map的信息对自动驾驶的规划及其重要的,所以,在线构建地图信息,也得到越来越多的关注,车道线、斑马线、道路路沿等等。而车道线检测可以认为是map构建的一个子任务,这也是笔者想在这里提一下的原因。MapTR 就是一种高效在线矢量化地图构建的方法。
论文链接:https://arxiv.org/pdf/2208.14437.pdf
github链接:https://github.com/hustvl/MapTR

aad24d7c9884c715e83142dab22c6246.png

地图元素有开放(e.g., 路沿)和闭合(e.g., 斑马线)两种形状,在几何上,可以表示为多边形和折线。而这两种形状,都可以被表示为一些有序的点集。但问题是点集的排列并不是唯一的,比如以矢量相连一些点,构成封闭多边形,也有顺时针和逆时针两种方式。既然如此,把点的排列顺序也作为表征地图元素的一部分就好了,于是 MapTR 的作者用  来表示一个地图元素。V =  表示点集,表示点的个数; 表示点集V的所有排列(见上图)。

这样,真值可以表示成 N 个地图元素的集合,每个元素 , 表示该元素的类别。预测的元素 , 其中  和 分别是预测的分类置信度和预测点集。为了实现结构化的地图元素建模和学习,MapTR 引入了层次双分图匹配(hierarchical bipartite matching),即按顺序进行实例级别的匹配和点级别的匹配。

实例级别的匹配会考虑到 元素的类别的 和 点的位置的两个方面,会通过匈牙利算法最优的实例级别的分配 :

b1a4e2b90c30bca2620667e402b77fd5.png 3af992910c12262fb7aa6e6e1a8a0aff.png

在这之后,每个预测的地图元素  都会被分配给一个真值 ,对于每个被分配正标签(类别标签不为空)的预测元素,开始进行点级别匹配,以找到预测点集 和真值点集  之间的最优点对点分配 。

a2b02db217ebf0d847ca00fb55558650.png

训练时的损失函数也是基于这两种分配,设计出了三个部分:classfication loss(监督地图元素类别)、point2point loss(监督每一个预测点的位置)、edge direction loss(监督相邻两点连线的方向)。

1800671425f81a3186ddd8ec2913e63a.png

大一统方法

笔者前几天闲逛看到了一篇很有趣的论文(CVPR2024):Lane2Seq
论文链接:https://arxiv.org/pdf/2402.17172.pdf

a61178ebc80e1eeab39600907038c401.png

上面提到的多个车道线检测的方法类别:segmentation-based, anchor-based, parameter-based, 但是Lane2Seq的作者,觉得这太麻烦了,要精心设计的特定于任务的头部网络和相应的损失函数。基于此,他把通过将车道检测作为序列生成任务来统一各种车道检测格式 Lane2Seq仅采用简单的基于Encoder-Decoder的Transformer架构,具有简单的交叉熵损失。

对于Segmentation序列,并不是作pixel-wise的学习,而是作为多边形(polygon)来学习,一个polygon的序列可以被表示成 [x1, y1, x2, y2, ..., x28, y28,<Lane>], 这里的 <Lane> 是一个类别的token;对于Anchor序列,会作为关键点(keypoint)的学习,一个keypoint序列可以表达成[x1, y1, x2, y2, ..., x14, y14,<Lane>];而对于Paramter序列,比如一个parameter序列可以被表示成 [a1, a2, a3, a4, a5, s, <Lane>], 这里的s是一个纵向的offset。

虽然说, Lane2Seq 不包含特定于任务的组件(指的是segmentation, anchor, parameter),但这些组件中包含的特定于任务的知识可以帮助模型更好地学习车道的特征。所以,作者提出了一种基于强化学习 (MFRL) 的多格式模型调整方法,将特定于任务的知识融入模型中,而无需改变模型的架构。受到 Task-Reward 的启发,MFRL 将整合特定于任务的知识的评估指标作为奖励,并使用 REINFORCE 算法来调整 Lane2Seq。作者也根据任务特定知识,为分割、锚点和参数格式提出了三种新的基于评估指标的奖励。

投稿作者为『自动驾驶之心知识星球』特邀嘉宾,欢迎加入交流!

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署大模型与自动驾驶Nerf语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

31420e855e6d4fbebb1c7913d8f0947e.png 网页端官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

国内最大最专业,近3000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型、端到端等,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

30499d8cbc27d418fc6379051f945381.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦感知、定位、融合、规控、标定、端到端、仿真、产品经理、自动驾驶开发、自动标注与数据闭环多个方向,目前近60+技术交流群,欢迎加入!

自动驾驶感知:目标检测、语义分割、BEV感知、毫米波雷达视觉融合、激光视觉融合、车道线检测、目标跟踪、Occupancy、深度估计、transformer、大模型、在线地图、点云处理、模型部署、CUDA加速等技术交流群;

多传感器标定:相机在线/离线标定、Lidar-Camera标定、Camera-Radar标定、Camera-IMU标定、多传感器时空同步等技术交流群;

多传感器融合:多传感器后融合技术交流群;

规划控制与预测:规划控制、轨迹预测、避障等技术交流群;

定位建图:视觉SLAM、激光SLAM、多传感器融合SLAM等技术交流群;

三维视觉:三维重建、NeRF、3D Gaussian Splatting技术交流群;

自动驾驶仿真:Carla仿真、Autoware仿真等技术交流群;

自动驾驶开发:自动驾驶开发、ROS等技术交流群;

其它方向:自动标注与数据闭环、产品经理、硬件选型、求职面试、自动驾驶测试等技术交流群;

扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

dacce9df7333a15b8a46403e09a56244.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

e90dcb4e423606fc32c84c940b421c9b.jpeg

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值