车道线检测-Eigenlanes 论文学习笔记

article/2025/10/2 0:41:53

论文:《Eigenlanes: Data-Driven Lane Descriptors for Structurally Diverse Lanes》

代码:https://github.com/dongkwonjin/Eigenlanes

核心:在 Eigenlane Space 中检测车道线

创新点
  • Eigenlane:数据驱动的车道描述符,在特征车道空间中紧凑地表示结构多样化的车道;
  • SIIC-Net:高效地检测和回归特征车道空间中的道路车道;
  • SDLane数据集:比现有数据集更真实地表示真实驾驶环境中结构多样化和复杂的车道;

0、结构

在这里插入图片描述

1、Eigenlanes

用车道线在训练集中的分布来表示车道线。

  • 车道线: x = [ x 1 , x 2 , . . . , x N ] T \pmb{x}=[x_1,x_2,...,x_N]^T x=[x1,x2,...,xN]T (横坐标)
  • 车道线矩阵: A = [ x 1 , x 2 , . . . , x L ] \pmb{A}=[\pmb{x}_1,\pmb{x}_2,...,\pmb{x}_L] A=[x1,x2,...,xL](训练集中的所有车道线)
  • 使用 Frobenius 泛数 ∣ ∣ A − A M ∣ ∣ F ||\pmb{A}-\pmb{A}_M||_F ∣∣AAMF ,其在被最小化时, A \pmb{A} A 的最佳 M M M 阶逼近为:
    A M = [ x ~ 1 , x ~ 2 , . . . , x ~ L ] = σ 1 u 1 v 1 T + ⋯ + σ M u M v M T \pmb{A}_M=[\pmb{\tilde{x}}_1,\pmb{\tilde{x}}_2,...,\pmb{\tilde{x}}_L]=\sigma_1 \pmb{u}_1 \pmb{v}^T_1+\cdots+\sigma_M \pmb{u}_M \pmb{v}^T_M AM=[x~1,x~2,...,x~L]=σ1u1v1T++σMuMvMT
    其中:
    • U M = [ u 1 , . . . , u M ] \pmb{U}_M=[\pmb{u}_1,...,\pmb{u}_M] UM=[u1,...,uM] U = [ u 1 , . . . , u N ] \pmb{U}=[\pmb{u}_1,...,\pmb{u}_N] U=[u1,...,uN] 的前 M 个左奇异向量;
    • V M = [ v 1 , . . . , v M ] \pmb{V}_M=[\pmb{v}_1,...,\pmb{v}_M] VM=[v1,...,vM] V = [ v 1 , . . . , v L ] \pmb{V}=[\pmb{v}_1,...,\pmb{v}_L] V=[v1,...,vL] 的前 M 个右奇异向量;
    • Σ M = [ σ 1 , . . . , σ M ] \pmb{\Sigma}_M=[\pmb{\sigma}_1,...,\pmb{\sigma}_M] ΣM=[σ1,...,σM] Σ \pmb{\Sigma} Σ 的前 M 个奇异值( Σ \pmb{\Sigma} Σ 中的奇异值经过了由大到小的排序,均大于0,且最小值为 σ r \sigma_r σr,r 是 A 的秩);
    • U \pmb{U} U V \pmb{V} V 以及 Σ \pmb{\Sigma} Σ 是通过奇异值分解 A = U Σ V \pmb{A}=\pmb{U}\pmb{\Sigma}\pmb{V} A=UΣV 得到的。
    • 由此可知:
      • x ~ i = U M c i = [ u 1 , . . . , u M ] c i \tilde{x}_i=\pmb{U}_M \pmb{c}_i=[\pmb{u}_1,...,\pmb{u}_M]\pmb{c}_i x~i=UMci=[u1,...,uM]ci
      • 定义 Eigenlanes u 1 , . . . , u M \pmb{u}_1,...,\pmb{u}_M u1,...,uM
      • 定义 Eigenlanes 空间:由 { u 1 , . . . , u M } \{\pmb{u}_1,...,\pmb{u}_M\} {u1,...,uM} 张成的空间
  • 给定车道线 x \pmb{x} x,将其映射到 Eigenlanes 空间: x ~ = U M c \tilde{\pmb{x}}=\pmb{U}_M \pmb{c} x~=UMc,其中 c = U M T x \pmb{c}=\pmb{U}_M^T \pmb{x} c=UMTx

在 Eigenlanes 空间生成候选车道线

在低维空间进行聚类,效果更佳。

在这里插入图片描述

Algorithm 1 Lane candidate generation in eigenlane space
Input: Set of training lanes { x 1 , x 2 , . . . , x L } \{x_1,x_2,...,x_L\} {x1,x2,...,xL}, M = # M=\# M=# of eigenlanes, K = # K=\# K=# of lane candidates

  1. Construct the lane matrix A and perform SVD in A = U Σ V \pmb{A}=\pmb{U}\pmb{\Sigma}\pmb{V} A=UΣV;
  2. Transform each lane x i x_i xi to c i c_i ci via c = U M T x \pmb{c}=\pmb{U}_M^T \pmb{x} c=UMTx;
  3. Apply the K-means algorithm to { c 1 , c 2 , . . . , c L } \{c_1,c_2,...,c_L\} {c1,c2,...,cL} to obtain K centroids c 1 , c 2 , . . . , c K c^1,c^2,...,c^K c1,c2,...,cK
  4. Generate the lane candidate l k = U M c k \pmb{l}_k=\pmb{U}_M\pmb{c}^k lk=UMck by inversely transforming each centroid c k \pmb{c}^k ck

Output: Set of lane candidates { l 1 , . . . , l K } \{l_1,...,l_K\} {l1,...,lK}

在 Eigenlanes 空间上,(通过最近邻)检测到 l = U M c \pmb{l}=\pmb{U}_M\pmb{c} l=UMc 之后,再用一个回归器回归出 Δ c \Delta \pmb{c} Δc,这样有:

l + Δ l = U M ( c + Δ c ) \pmb{l}+\Delta\pmb{l}=\pmb{U}_M(\pmb{c}+\Delta \pmb{c}) l+Δl=UM(c+Δc)
在这里插入图片描述
在这里插入图片描述

2、SIIC-Net

整体结构

在这里插入图片描述

Encoder:ResNet50

Decoder:Binary Segmentation Map

2.1、SI 模块(Self-lane Identification)

预测:车道线概率、位置偏移、最顶处点的高度

输入:Squeezed Feature Map X s X_s Xs、候选车道线 l k l_k lk

输出 P = σ ( f 1 ( Y ) ) , H = σ ( f 2 ( Y ) ) , O = f 3 ( Y ) P=\sigma(f_1(Y)),\ H=\sigma(f_2(Y)),\ O=f_3(Y) P=σ(f1(Y)), H=σ(f2(Y)), O=f3(Y)

其中, Y s = [ Y s 1 , Y s 2 , . . . , Y s C 2 ] ∈ R K × C 2 Y_s=[Y^1_s,Y^2_s,...,Y^{C_2}_s]\in \mathbb{R}^{K\times C_2} Ys=[Ys1,Ys2,...,YsC2]RK×C2 是沿着候选车道线 l k \pmb{l}_k lk 做均值:

Y s c = 1 ∣ l k ∣ Σ p ∈ l k X s c ( p ) Y_s^c=\frac{1}{|\pmb{l}_k|}\Sigma_{p\in \pmb{l}_k}X^c_s(p) Ysc=lk1ΣplkXsc(p)

f i f_i fi 分别是 C 2 × 2 C_2\times 2 C2×2 C 2 × R C_2\times R C2×R C 2 × M C_2\times M C2×M 的全连接层。 O k O_k Ok 就是前面提到的偏移量 Δ c k \Delta c_k Δck

SI 模块之后,应用 NMS T 次,以选出 T 条有价值的车道线。

2.2、IC 模块(Inter-lane Correlation)

利用了车道线之间的 相关性

  1. 相邻车道等间距
  2. 透视变换下,车道线交于 Vanishing Point

输入:Aggregated Feature Map X a X_a Xa、候选车道线 l k l_k lk、前段 NMS 输出的 T 条车道线;

输出:相应两条车道线对的匹配度 R = ϕ 1 ( Y a ) × ϕ 2 ( Y a ) T R=\phi_1(Y_a)\times\phi_2(Y_a)^T R=ϕ1(Ya)×ϕ2(Ya)T

其中,

  • Y a Y_a Ya 使用 X a X_a Xa 计算得到,计算方式与 Y s Y_s Ys 类似,它是 T × C 1 T\times C_1 T×C1 的矩阵
  • R R R T × T T\times T T×T 的矩阵, R i j ∈ [ − 1 , 1 ] R_{ij}\in [-1,1] Rij[1,1]
  • ϕ 1 \phi_1 ϕ1 ϕ 2 \phi_2 ϕ2 是用卷积与 l 2 l_2 l2 泛数实现的特征变换。

2.3、MWCS 模块

这是一种图优化技术,可见论文:《Harmonious Semantic Line Detection via Maximal Weight Clique Selection》

主要有两步操作:

  1. 寻找可以修正的最佳车道线 clique;
  2. 通过删除 y 坐标比 H v i H_{v_i} Hvi 大的点,修正了每条车道线的高度;(后面不再赘述
寻找可以修正的最佳车道线 clique

构建完全图

  • G = ( V , E ) G=(\mathcal{V},\mathcal{E}) G=(V,E)
  • V = { v 1 , v 2 , . . . , v T } \mathcal{V}=\{v_1,v_2,...,v_T\} V={v1,v2,...,vT} 是 NMS 输出的车道线
  • E = { ( v i , v j ) : i ≠ j } \mathcal{E}=\{(v_i,v_j):i\ne j\} E={(vi,vj):i=j},每条边上有个权重 w ( v i , v j ) = 1 2 ( R i j + R j i ) w(v_i,v_j)=\frac{1}{2}(R_{ij}+R_{ji}) w(vi,vj)=21(Rij+Rji)

定义匹配度

  • θ \theta θ 为车道线 clique,由图节点的序号构成;
  • θ \theta θ 上的匹配度 E c o m p a t i b l e ( θ ) E_{compatible}(\theta) Ecompatible(θ)

E c o m p a t i b l e ( θ ) = Σ i ∈ θ Σ j ∈ θ , j > i w ( v i , v j ) E_{compatible}(\theta)=\Sigma_{i\in\theta}\Sigma_{j\in\theta,j>i}w(v_i,v_j) Ecompatible(θ)=ΣiθΣjθ,j>iw(vi,vj)

选 clique θ ∗ \theta^* θ

θ ∗ = arg ⁡ max ⁡ θ E c o m p a t i b l e ( θ ) \theta^*=\arg\max_\theta E_{compatible}(\theta) θ=argθmaxEcompatible(θ)

其中,限定 w ( v i , v j ) > κ w(v_i,v_j)>\kappa w(vi,vj)>κ

如果没有满足约束的 clique,则选择最大的单节点 clique: θ ∗ = { i ∗ } \theta^*=\{i^*\} θ={i},其中 i ∗ = arg ⁡ max ⁡ i P v i i^*=\arg\max_i P_{v_i} i=argmaxiPvi

调整候选车道线

使用 U ( c v i + Δ c v i ) \pmb{U}(\pmb{c_{v_i}}+\Delta\pmb{c_{v_i}}) U(cvi+Δcvi) 调整 θ ∗ \theta^* θ 中的车道线,其中 Δ c v i \Delta\pmb{c_{v_i}} Δcvi 是 SI 模块的输出。


http://chatgpt.dhexx.cn/article/RLyb0OqK.shtml

相关文章

OpenCV的车道线检测

资源下载地址:https://download.csdn.net/download/sheziqiong/85604275 资源下载地址:https://download.csdn.net/download/sheziqiong/85604275 final_mark.py是最终,前面的都是一部分一部分测试的功能,用的是霍夫变换拟合&…

动手学无人驾驶(7):车道线检测

最近在研究视觉语义地图,需要进行车道线检测,发现这篇车道线检测论文效果蛮好的 (Ultra Fast Structure-aware Deep Lane Detection)。论文作者在知乎上已经介绍过了:https://zhuanlan.zhihu.com/p/157530787&#xff…

高级车道线检测

基于图像处理相关技术的高级车道线检测(可适用于弯道,车道线颜色不固定,路面阴影,亮光) pipeline: 1.校准摄像头的畸变,使拍摄照片能够较完整的反映3D世界的情况 2.对每一帧图片做透视转换(pers…

传统方法车道线标注及相关知识

目录 一、图像二值化处理 1.Sobel算子绝对值 2.Sobel算子 3.倾斜角度 4.HLS颜色空间 5.二值图结合 二、车道线分割 1.仿射变换 2.车道线直方图 3.滑动窗口寻找车道线 4.车道线拟合 5.车道线区域标注 一、图像二值化处理 主要目的是通过二值化图像,使得车…

学习笔记之车道线相关记录

一. 车道线相关的知识 &&1.标线的分类 以下分类来自于百科: 按照道路交通标线的功能划分为:指示标线、警告标线和禁止标线。 按标划方法可分为:白色虚线、白色实线、黄色虚线、黄色实线、双白虚线、双白实线、双黄虚线和双黄实线…

关于python 最简单封装实例

一、 #定义一个类 class Person: #init是定义类实例初始化函数 ,没有返回return def __init__(self,name,area): self.name name self.area area #类里面定义方法 def run(self): print(self.name) …

Python软件封装打包

作者:Naples 链接:https://www.zhihu.com/question/32703639/answer/165326590 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Python Tkinter打包封装的方法有:PyInstaller, py…

Python封装、继承和多态

Python 语言在设计之初,就定位为一门面向对象的编程语言,“Python 中一切皆对象”。同时,Python 也支持面向对象的三大特征:封装、继承和多态。 一、封装 封装(Encapsulation),即在设计类时&am…

python程序封装

python程序封装1 报错请执行pip install --upgrade setuptools 和 pip install --upgrade wheel 步骤如下: (1)安装pyinstaller,可以直接在cmd命令行中,输入命令“pip install pyinstaller”,安装pyinsta…

python封装程序

#终端/cmd命令下: 1.安装python Welcome to Python.org 2.安装pip pip PyPI 下载get-pip.py 在cmd窗口下执行,python */*/get-pip.py(*为文件所在位置) *如果安装好后出现 不是内部命令的情况 需要在环境中添加&#xff…

制作python包,封装成可用模块

制作python包,封装成可用模块 首先编写py程序: printtest.py #coding: utf-8 def test():print(print test)if __name__ __main__:test() 将以上.py文件做成python模块,需要在相同目录下创建setup.py文件,setup.py中输入配置信息: #cod…

Python 程序封装-打包成exe程序

Python 程序封装-打包成exe程序 前言一、 Python 打包工具—Pyinstaller二、打包具体过程1. 打包成仅包含一个独立的exe程序2. 打包成包含文件夹的程序,内有相关的依赖库(推荐)3. 其他的打包命令 三、注意事项 欢迎学习交流! 邮箱…

怎么python程序封装?此文详解

python程序封装1 步骤如下: (1)安装pyinstaller,可以直接在cmd命令行中,输入命令“pip install pyinstaller”,安装pyinstaller (2)进入py代码的保存目录,这里py代码放在“E:\python学习\python_work” (3)cmd,输入命令:e:,进入e盘 (4)继续输入:E:\pytho…

Python封装

在用新电脑做python的封装的时候,出现了一系列的问题。在这里简单写一下Python的封装的一些流程以及可能出现的问题和解决方法吧。 封装我选择的是pyinstaller 首先是安装pyinstaller:Python 默认并不包含 PyInstaller 模块,因此需要自行安…

python之类的封装

博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞&#xff…

Python入门——函数封装

当工程量比较大时,我们可以采取“函数封装”的方法实现函数的重复使用,避免“重复造轮子”。 步骤 手动创建一个包,只需进行以下 2 步操作: 新建一个文件夹,文件夹的名称就是新建包的包名;在该文件夹中&…

Python学习基础笔记五十八——封装

封装:广义上的面向对象封装。代码的保护。面向对象的思想本身就是一种封装,只让自己的对象能调用自己类中的方法。 狭义的封装概念:面向对象的三大特性之一:让属性和方法都藏起来,不让你看见。 例1: clas…

Python必备封装基本代码~Python函数

大家好,我是辣条 最近不少粉丝通过文末找到辣条让我分享一些代码封装这一块的内容,今天他来了~ 一遍看不懂就收起来慢慢看,我写的还是很详细的,一定是能轻松拿捏住Python函数的,不过还请记得多多支持辣条,…

PMP学习笔记顺口溜

区分几种组织结构 老板项目为系统; 只有职能为职能; 多个部门多部门, 多个项目为项目 职能项目为矩阵,项强为强,项弱为弱; 项目职能一般大 :平衡 网络分散为虚拟

PMP学习笔记 零 启动

PMP 学习笔记 零 启动 我为什么要学习PMP 我是一个程序猿,别人让我做什么,我就去做什么,提出什么需求我就完成,但是渐渐的我不满足成为一个工具人,就开始也开始设计功能,和抛开产品经理独自完成一些需求&…