一文解决3D车道线检测:最新单目3D车道线检测综述
前言
场景理解是自动驾驶中极具挑战的任务,尤其是车道检测。车道是道路分割的关键,对车辆安全高效行驶至关重要。车道检测技术能自动识别道路标记,对自动驾驶车辆至关重要,缺乏这项技术可能导致交通问题和事故。车道检测面临多种挑战,包括车道标记的小尺寸、广泛分布、多种车道类型、光线条件、障碍物和纹理干扰等。
基于摄像头的车道检测方法
可以主要分为二维(2D)和三维(3D)车道检测。

2D车道检测
2D车道检测方法旨在准确描绘图像中车道的形状和位置,主要采用四种不同的方法:基于分割、基于锚点、基于关键点和基于曲线的策略。(1) 基于分割的方法将2D车道检测框定为像素级分类挑战,生成车道掩码。这些方法通过探索有效的语义特征并进行后处理来培养车道分组,但它们的计算成本较高。(2) 基于锚点的方法在2D车道检测中因其简单性和高效性而受到称赞,通常使用线性锚点来回归相对于目标的位置偏移。为了规避线性锚点的限制,使用内在车道空间生成各种车道候选点。启发式设计的行锚点将行像素分类为车道,在中进一步演变为混合(行和列)锚点,以减轻侧车道的定位误差。此外,这种方法显著提高了推理速度。(3) 基于关键点的方法提供了更灵活和稀疏的车道位置建模,首先估计点位置,然后使用各种方案将属于同一车道的关键点关联起来。中的主要策略是通过预定义关键点和回归采样点与预定义点之间的偏移来预测2D车道。尽管这些方法取得了有希望的结果,但由于其固定点设计,缺乏适应复杂车道配置的灵活性。(4) 基于曲线的方法通过各种曲线方程和特定参数拟合车道线,将2D车道检测转化为曲线参数回归挑战,通过检测起点和终点以及曲线参数。尽管在2D车道检测方面取得了有希望的进展,但2D结果与实际应用需求之间仍存在显著差距,特别是精确的3D定位。

3D车道检测
由于2D车道检测本质上缺乏深度信息,将这些检测投影到3D空间可能会导致不准确和鲁棒性降低。因此,许多研究人员将重点转向3D领域内的车道检测。基于深度学习的3D车道检测方法主要分为基于CNN的方法和基于Transformer的方法,首先构建稠密的鸟瞰图(BEV)特征图,然后从这些中间表示中提取3D车道信息。基于CNN的方法主要包括D-LaneNet,它提出了一种双路径架构,利用逆透视变换(IPM)转置特征,并通过垂直锚点回归检测车道。3D-LaneNet+将BEV特征分割为不重叠的单元,通过相对于单元中心的横向偏移、角度和高度偏移解决锚点方向的限制。GenLaneNet首次在虚拟俯视坐标系统中更好地对齐特征,并引入两阶段框架,将车道分割与几何编码分离。BEVLaneDet使用虚拟摄像头确保空间一致性,并通过基于关键点的3D车道表示适应更复杂的场景。GroupLane 在BEV中引入行基分类方法,可容纳任意方向的车道,并与实例组内的特征信息交互。

基于Transformer的方法包括CLGo,提出了一种两阶段框架,能够从图像中估计摄像机姿态,并基于BEV特征进行车道解码。PersFormer使用离线摄像机姿态构建稠密的BEV查询,将2D和3D车道检测统一在一个基于Transformer的框架下。STLanes3D使用融合的BEV特征预测3D车道,并引入3DLane-IOU损失,将横向和高度误差耦合起来。Anchor3DLane,一种基于CNN的方法,基于3D锚点直接从图像特征回归3D车道,显著减少了计算开销。CurveFormer在Transformers中利用稀疏查询表示和交叉注意力机制,有效回归3D车道的多项式系数。LATR在CurveFormer的查询锚点建模基础上,构建了车道感知查询生成器和动态3D地面位置嵌入。CurveFormer++提出了一种不需要图像特征视图变换的单阶段Transformer检测方法,直接从透视图像特征推断3D车道检测结果。

自动驾驶中的单目3D车道检测
3D-LaneNet 是单目3D车道检测领域的开创性工作。3D-LaneNet引入了一个网络,可以直接从单目图像中预测道路场景中的三维车道信息。这项工作是第一个使用车载单目视觉传感器解决三维车道检测任务的。3D-LaneNet引入了两个新概念:网络内特征图反向透视映射(IPM)和基于锚点的车道表示。网络内IPM投影促进了前视图和鸟瞰图中双重表示信息流的传递。基于锚点的车道输出表示支持端到端训练方法,这不同于将三维车道线检测问题等同于目标检测问题的常见启发式方法。3D-LaneNet的概述如图2所示。

受到FCOS和 CenterNet等工作的启发,3D LaneNet+ 是一种无锚点的3D车道检测算法,可以检测任意拓扑结构的3D车道线。3D LaneNet+的作者沿用了3D LaneNet的双流网络,该网络分别处理图像视图和鸟瞰视图,并扩展了支持检测更多拓扑结构的3D车道线。与预测整个车道不同,3D LaneNet+检测位于单元内的小车道段及其属性(位置、方向、高度)。此外,该方法为每个单元学习一个全局嵌入,将小车道段聚类为完整的3D车道信息。在中,Jiang等人设计了一个两阶段3D车道检测网络,其中每个阶段分别进行训练。第一个子网络专注于车道图像分割,而第二个子网络专注于基于第一个子网络的分割输出预测3D车道结构。在每个阶段分别引入了高效通道注意力(ECA)注意力机制和卷积块注意力模块(CBAM)注意力机制,从而提高了分割性能和3D车道检测的准确性。Guo等人提出了Gen-LaneNet,一种通用且可扩展的3D车道检测方法,用于从单一图像中检测3D车道线,如图3所示。作者引入了一种新的几何引导车道锚点表示,并应用特定的几何变换直接从网络输出计算真实的3D车道点。这种锚点设计直观地扩展了3D-LaneNet中的锚点设计。这种方法将锚点坐标与基础鸟瞰视图特征对齐,增强了其在处理不熟悉场景时的鲁棒性。此外,该论文提出了一个可扩展的两阶段框架,使图像分割子网络和几何编码子网络能够独立学习,从而显著减少了训练所需的3D标签数量。此外,该论文还引入了一个高度逼真的合成图像数据集,具有丰富的视觉变化,用于开发和评估3D车道检测方法。

Liu等人提出了CLGo ,一种两阶段框架,用于从单一图像中预测3D车道和相机姿态。其第一阶段专注于相机姿态估计,并引入了辅助3D车道任务和几何约束进行多任务学习。第二阶段则针对3D车道任务,利用先前估计的姿态生成顶视图图像以进行准确的3D车道预测。PersFormer引入了首个基于Transformer的3D车道检测方法,并提出了一种称为Perspective Transformer的新架构,如图4所示。这种基于Transformer的架构实现了空间特征转换,使得3D车道线的检测更加准确。此外,该框架具有同时处理2D和3D车道检测任务的独特能力,提供了一种统一的解决方案。此外,该论文还提出了OpenLane,一个基于Waymo Open数据集构建的大规模3D车道检测数据集。OpenLane是首个提供高质量注释和多样化真实场景的数据集,为推进该领域的研究提供了宝贵的资源。

研究人员引入了最大的真实世界3D车道检测数据集ONCE-3DLanes数据集,并提供了更全面的评估指标,以重新激发对这一任务在真实场景中的兴趣。此外,该论文提出了一种名为SALAD的方法,能够直接从前视图图像生成3D车道布局,而无需将特征图转换为鸟瞰视图(BEV),SALAD的网络架构如图5所示。提出了一种新的损失函数,利用车道在3D空间中的几何结构先验,从局部到全局稳定重建,并提供明确的监督。它引入了一个2D车道特征提取模块,利用顶视图的直接监督,确保最大限度地保留车道结构信息,特别是在远处区域,整体流程如图7所示。此外,该论文提出了一种针对3D车道检测的任务特定数据增强方法,以解决地面坡度和相机姿态的数据分布不平衡问题,增强了在罕见案例中的泛化能力。Bai等人提出了CurveFormer,一种基于Transformer的3D车道检测算法。在这篇论文中,研究人员将解码器层中的查询形式化为动态锚点集,并利用曲线交叉注意模块计算查询与图像特征之间的相似性。此外,他们还引入了上下文采样单元,通过结合参考特征和查询来预测偏移,指导采样偏移的学习。Ai等人提出了WS-3D-Lane ,首次提出了一种仅使用2D车道标签的弱监督3D车道检测方法,并在评估中超越了之前的3D-LaneNet方法。此外,作者提出了一种相机俯仰自校准方法,可以实时在线计算相机俯仰角,从而减少由于道路不平造成的相机与地面平面之间俯仰角变化带来的误差。在BEV-LaneDet中,作者引入了虚拟相机的概念,一种用于数据预测处理的新模块,旨在标准化相机的外部参数,并确保数据分布的一致性。此外,他们提出使用关键点表示作为表示3D车道结构的简单而有效的方法。此外,他们提出了MLP基空间转换金字塔,这是一种轻量级架构,旨在将多角度视觉特征转换为鸟瞰特征。Huang等人提出了Anchor3DLane 框架,该框架直接在3D空间中定义锚点,并直接从前视图回归3D车道线,而无需引入顶视图,如图6所示。作者还提出了Anchor3DLane的多帧扩展,以利用对齐良好的时间信息并进一步提高性能。此外,开发了一种全局优化方法,通过利用车道等宽特性来微调车道线。

Li等人提出了一种方法,从前视图图像中直接提取顶视图车道信息,减少了2D车道表示中的结构损失。该方法的整体流程如图7所示。在本文中,作者将3D车道检测视为从2D图像到3D空间的重建问题。他们提出,在训练过程中显式地施加3D车道的几何先验对于充分利用车道内和车道间关系的结构约束以及从2D车道表示中提取3D车道的高度信息至关重要。作者分析了3D车道与其2D表示之间的几何关系,并提出了一种基于几何结构先验的辅助损失函数。他们还证明,显式几何监督可以增强噪声消除、异常值拒绝和3D车道结构保留。

数据集及不同算法表现




未解决的挑战
-
粗略的结构化信息:大多数文献中提到的3D车道检测数据集都是在先进城市的正常和结构良好的基础设施中记录的。
-
不确定性感知决策:车道检测和自动驾驶决策中一个被忽视的重要方面是模型对输入数据的预测信心。
-
弱监督学习策略:当前的深度学习模型主要依赖于全监督学习策略,这对标记数据的需求很高。

未来方向
-
基于视频的自动驾驶3D车道检测:借鉴视频目标检测、语义分割和2D车道检测的进展,结合视频技术显著提高了3D车道检测系统的精度和可靠性。视频方法的核心优势在于它们能够利用时间数据,提供静态图像所缺乏的动态视角。
-
混合方法和多模态技术:通过结合各种传感器输入(如摄像头、LiDAR和雷达),多模态3D车道检测技术的进展显著加快。这一整合为克服现有摄像头系统面临的挑战开辟了前景。
-
主动学习和增量学习:主动学习是指模型在测试阶段和部署后遇到新数据时能够适应和学习的能力。
-
恶劣天气条件:开发基于摄像头的自动驾驶3D车道检测系统的进展显著受到恶劣天气条件的阻碍,这些条件会严重影响能见度。
-
大语言模型(LLM)在3D车道检测中的应用:大语言模型(如ChatGPT)的出现改变了人工通用智能(AGI)领域,展示了它们在通过自定义用户提示或语言指令处理各种自然语言处理任务方面的出色能力。
-
更准确和高效的自动驾驶3D车道检测方法:目前3D车道检测技术的定性性能如表IV所示。我们可以观察到,只有少数方法能够在模型准确性和推理延迟之间取得平衡。
-
基于事件相机的3D车道检测:RGB摄像头受其成像原理的限制,在高速或低光场景中图像质量较差。幸运的是,事件相机可以克服这一限制。事件相机是一种具有高时间分辨率、高动态范围、低延迟和低能耗的视觉传感器。
-
不确定性感知的3D车道检测:在过去的几年里,深度神经网络在众多计算机视觉任务中取得了显著成功,巩固了其作为高效自动感知工具的重要地位。
引用文章
Monocular 3D lane detection for Autonomous Driving: RecentAchievements, Challenges, and Outlooks
关注我的公众号auto_driver_ai(Ai fighting), 第一时间获取更新内容。
相关文章:
一文解决3D车道线检测:最新单目3D车道线检测综述
前言 场景理解是自动驾驶中极具挑战的任务,尤其是车道检测。车道是道路分割的关键,对车辆安全高效行驶至关重要。车道检测技术能自动识别道路标记,对自动驾驶车辆至关重要,缺乏这项技术可能导致交通问题和事故。车道检测面临多种…...
稳中向好,今年新招6000人
团子校招 近日,美团宣布开启面向 2025 届的校园招聘,招聘规模达 6000 人。 虽然相比京东(宣布招聘 16000 人)稍有逊色,但 6000 这个校招规模可一点不少。 要知道,京东是重自营的传统电商,16000 …...
使用kettle开源工具进行跨库数据同步
数据库同步可以用: 1、Navicat 2、Kettle 3、自己写代码 调用码神工具跨库数据同步 -连接 4、其它 实现 这里使用Kettle来同步,主要是开源的,通过配置就可以实现了 Kettle的图形化界面(Spoon)安装参考方法 ht…...
Golang | Leetcode Golang题解之第307题区域和检索-数组可修改
题目: 题解: type NumArray struct {nums, tree []int }func Constructor(nums []int) NumArray {tree : make([]int, len(nums)1)na : NumArray{nums, tree}for i, num : range nums {na.add(i1, num)}return na }func (na *NumArray) add(index, val …...
Golang | Leetcode Golang题解之第301题删除无效的括号
题目: 题解: func checkValid(str string, lmask, rmask int, left, right []int) bool {cnt : 0pos1, pos2 : 0, 0for i : range str {if pos1 < len(left) && i left[pos1] {if lmask>>pos1&1 0 {cnt}pos1} else if pos2 <…...
【Story】《程序员面试的“八股文”辩论:技术基础与实际能力的博弈》
目录 程序员面试中的“八股文”:助力还是阻力?1. “八股文”的背景与定义1.1 “八股文”的起源1.2 “八股文”的常见类型 2. “八股文”的作用分析2.1 理论基础的评价2.1.1 助力2.1.2 阻力 3. 实际工作能力的考察3.1 助力3.2 阻力 4. 面试中的背题能力4.…...
初步了解泛型
目录 泛型的引入 泛型 泛型 泛型类 泛型的上界 泛型的引入 之前学习的数组里面是存放着整型或者自字符串中一种的数组,如果想要在一个数组里面放多种类型数据,我们该怎么去做呢?Object类或许是一个好的解决方法,因为Object类…...
【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据
欢迎来到《小5讲堂》 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…...
C++推荐的oj网站
洛谷 信息学奥赛一本通 C语言网 codeforces 杭电oj...
springmvc处理http请求的底层逻辑
http-nio-8088-Poller线程中在org.apache.tomcat.util.net.NioEndpoint.Poller#run这个函数里循环检测selector,若发现有SocketEvent.OPEN_READ事件则会将SelectionKey.attachment中的内容作为入参包装成runable,然后由org.apache.tomcat.util.threads.T…...
干货满满,从零到一:编程小白如何在大学成为编程大神?
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
前端-如何通过docker打包Vue服务成镜像并在本地运行(本地可以通过http://localhost:8080/访问前端服务)
1、下载安装docker,最好在vs code里安装docker的插件。 下载链接:https://www.docker.com/products/docker-desktop 🎉 Docker 简介和安装 - Docker 快速入门 - 易文档 (easydoc.net) 2、准备配置文件-dockerfile文件和nginx.conf文件 do…...
零基础学习【Mybatis】这一篇就够了
Mybatis 查询resultType使用resultMap使用单条件查询多条件查询模糊查询返回主键 动态SQLifchoosesetforeachsql片段 配置文件注解增删改查结果映射 查询 resultType使用 当数据库返回的结果集中的字段和实体类中的属性名一一对应时, resultType可以自动将结果封装到实体中 r…...
Shell入门(保姆级教学)
Shell是一种命令行解释器,也是一种脚本语言,广泛应用于Unix和类Unix系统中,例如Linux。它是用户与操作系统内核交互的桥梁,通过Shell可以执行系统命令、管理文件系统、处理文本数据等。本文将带你入门Shell编程,涵盖基…...
【JDK11和JDK8并行与切换】
一、JDK11安装 1、下载jdk11,点击.exe安装在:C:\Program Files\Java\jdk-11\ 2、配置JAVA_HOME 变量名为JAVA_HOME 变量值为jdk安装路径 3、配置PATH 找到系统变量里的PATH 双击或者单击后点击编辑 点击右上角的新建 新建两条 %JAVA_HOME%\bin …...
vue大数据量列表渲染性能优化:虚拟滚动原理
前面咱完成了自定义JuanTree组件各种功能的实现。在数据量很大的情况下,我们讲了两种实现方式来提高渲染性能:前端分页和节点数据懒加载。 前端分页小节:Vue3扁平化Tree组件的前端分页实现 节点数据懒加载小节:Element Tree Plu…...
昇思25天学习打卡营第1天|快速入门
目录 昇思MindSpore介绍MindSpore的API来快速实现一个简单的深度学习模型通过资料更深入的了解昇思MindSpore 昇思MindSpore介绍 今天有幸学习了昇思MindSpore,让我们来简单的了解一下它 昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行…...
LinkedList 实现 LRU 缓存
LRU(Least Recently Used,最近最少使用)缓存是一种缓存淘汰策略,用于在缓存满时淘汰最久未使用的元素。 关键: 缓存选什么结构? 怎么实现访问顺序? import java.util.*;public class LRUCac…...
ubuntu安装workon
pip install virtualenvpip install virtualenvwrapper配置virtualenvwrapper。在你的shell配置文件(比如.bashrc,.bash_profile或.zshrc)中添加以下内容:export WORKON_HOME$HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON/…...
(面试必看!)锁策略
文章导读 引言考点一、重量级锁 VS 轻量级锁1、定义与原理2、主要区别3、适用场景 考点二、乐观锁 VS 悲观锁1、悲观锁(Pessimistic Locking)2、乐观锁(Optimistic Locking)3、总结 考点三、读写锁1、读写锁的特性2、读写锁的实现…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
