2D车道线检测算法总结

news2024/10/6 2:26:08

关于2D车道线检测算法的总结主要分为两类:一类基于语义分割来做,一类基于anchor和关键点来做。还有基于曲线方程来做的,但是落地的话还是上面两种为主。

一、基于语义分割的车道线检测算法

1.LaneNet

论文创新点:

1.将车道线检测看作一个实例分割问题,在网络里除了语义分割头,还有一个embedding头用来聚类实例的。

2.通过embedding向量和聚类的后处理,使得模型可以检测很多车道线(没有先验个数限制)。

 模型结构

backbone+2个head,一个是语义分割头,一个是聚类头。根据语义分割得到哪些像素是车道线,然后再根据聚类头的向量,使用聚类算法对车道线像素进行实例化。得到实例化后进行拟合。论文里使用的聚类算法是meanshift,后续开源代码里有用DBSCAN的,但是他们的耗时都很多,无法满足上车需求。

LOSS的使用

为了均衡正负样本比例,语义分割loss使用的加权交叉熵损失计算。

聚类分支loss使用的var loss和dist loss组成,var使得同类之间靠拢,dist使得不同类的中心相互远离彼此。

2.SCNN

传统的网络是在层与层之间进行卷积,长宽同样的进行信息聚集,并没有很好的利用车道线的形状先验。本论文提出了Spatial CNN,其在一层特征图上按照上下左右的方向有顺序的进行切片卷积,从而使网络可以更好地提取车道线特征。

 

 上图中(a)是训练流程,(b)是推理流程。看到论文里假设最多有四条车道线。对于存在值大于0.5的每个车道标记,我们每隔20行搜索相应的概率图,以获得响应最高的位置。然后通过三次样条函数连接这些位置,这是最终的预测。

代码分析

    def message_passing_forward(self, x):
        self.message_passing = nn.ModuleList()
        # 从上到下,使用 1*8的卷积。
        self.message_passing.add_module('up_down', nn.Conv2d(128, 128, (1, ms_ks), padding=(0, ms_ks // 2), bias=False))
        # 从下到上也是 1*8
        self.message_passing.add_module('down_up', nn.Conv2d(128, 128, (1, ms_ks), padding=(0, ms_ks // 2), bias=False))
        self.message_passing.add_module('left_right',
                                        nn.Conv2d(128, 128, (ms_ks, 1), padding=(ms_ks // 2, 0), bias=False))
        self.message_passing.add_module('right_left',
                                        nn.Conv2d(128, 128, (ms_ks, 1), padding=(ms_ks // 2, 0), bias=False))
        Vertical = [True, True, False, False]
        Reverse = [False, True, False, True]
        # 对四个方向进行遍历
        for ms_conv, v, r in zip(self.message_passing, Vertical, Reverse):
            x = self.message_passing_once(x, ms_conv, v, r)
        return x

    def message_passing_once(self, x, conv, vertical=True, reverse=False):
        """
        Argument:
        ----------
        x: input tensor
        vertical: vertical message passing or horizontal
        reverse: False for up-down or left-right, True for down-up or right-left
        """
        nB, C, H, W = x.shape
        if vertical: #如果是竖直方向,则沿着H进行切片
            # 得到一个长为H的数组,里面的元素维度[B, C, 1, W]
            slices = [x[:, :, i:(i + 1), :] for i in range(H)]
            dim = 2
        else: #如果是横向,则沿着W进行切片,得到一个长为W的数组,里面的元素维度[B, C, H, 1]
            slices = [x[:, :, :, i:(i + 1)] for i in range(W)]
            dim = 3
        if reverse:
            slices = slices[::-1]
 
        out = [slices[0]] #第一个切片不操作
        for i in range(1, len(slices)):
            out.append(slices[i] + F.relu(conv(out[i - 1]))) #当前切片 等于当前值+前一个切片卷积完的结果
        if reverse:
            out = out[::-1]
        return torch.cat(out, dim=dim)

通过代码分析我们看到,其对切片进行遍历,当前切片的特征是由前一层切片卷积后+当前切片的原始特征得到的,所以是顺序执行的,这样的计算非常耗时。于是引出下一篇文章RESA。

3.RESA

(91条消息) RESA车道线路沿检测_CVplayer111的博客-CSDN博客

这个代码里RESA采用的并行计算,所有切片同时+前面的切片卷积激活结果。这样直接x[...,idx,.]就行,不用像SCNN里生成切片数组。一个一个顺序进行。同时还提出了双边上采样结构,upsample双线性插值得到粗粒度特征,转置卷积得到细粒度特征。

4.LaneAF

(91条消息) LaneAF论文解读和代码讲解_CVplayer111的博客-CSDN博客

将传统聚类后处理去掉,根据模型预测的方向向量来实例化像素点,生成的一维HAF进行行像素分类,然后根据二维的VAF进行不同行之间的关联。

二、基于anchor和关键点的车道线检测算法

1. UFSA

首先论文分析了当前基于语义分割算法的痛点,每个点都预测分辨率太大,耗时严重导致速度慢,同时其感受野有限,只有局部的感受野,对于车道线模糊,遮挡问题不好。

论文将车道线检测问题转化为Row anchors上的分类问题,Row anchors是预定的行位置,论文里是18个行anchor。每一行都被划分为许多单元格,车道线检测就变为在行anchor上选择单元格。

 其中h表示行数,w表示每行多少个网格,都是人为设定的。远小于原图像的H*W,所以计算效率大大提升。比如我们设定网络可以检测c个车道线,那么语义分割的复杂度是 (c+1)*H*W,而我们的是(w+1)*c*h.  

损失函数方面,加入了结构损失,用相邻行差值来约束车道线的光滑性,用二阶差分来约束车道线是直线。 

 网络结构如图所示,加入了语义分割的辅助分支,在推理的时候去掉,主要为了实现主干网络全局和局部信息的聚合。骨干网络后加入FC层,然后再reshape成h*w的形状进行预测。

算法缺陷:只能预测固定的数量车道线,同时只能检测纵向的车道线,其他方向就不行,因为结构损失约束。

2.FOLOLane

是一种基于关键点检测的方法,将车道线检测看作局部的几何建模。论文指出以往的聚类后处理使得推理非常复杂,同时像素级的曲线拟合是冗余的和有噪声的。

 图片经过CNN处理,得到四个特征图,一个heatmap用来预测关键点出现的概率,其余三个用来预测当前点,上面的,下面的三个关键点的x偏移。在训练时,将每个车道线标注的点插值成连续的像素点,使用未归一化的高斯核对这些点周围的像素点处理。计算focalloss时,只有等于1的才是正样本。此时把图像沿着高度方向等间距画线,距离为固定值y,,等分线与刚才插值得到的像素点的交点称为关键点,对于这个关键点来说,模型预测三个偏移值,一个是这个关键点的偏移,另外两个是与其间隔y的两个点的偏移。已知当前关键点,就可以求出上下两个关键点。上下关键点偏移的loss计算是:

 相当于根据P关键点的坐标+与其预测的间隔y的两个关键点偏移,得到这两个点的预测坐标,求预测坐标与GT坐标的x偏移。对于当前点的x偏移loss公式如下:

 这个我不太懂啥意思,到时候看代码。

有了上面的预测结果,如何来解码全局的车道线结构。论文中给了两种方法,一种是精细的计算方法,耗时,一种是简单的计算方法。我主要介绍简单的计算方法。

1.先以等间距y画好线,所有线上具有最高响应的点组成current key_point

2.根据三个偏移计算相关点

3.current key_point集合内部建立相关性,根据当前行关键点预测的上下行的关键点与上下行的current key_point求距离,离的最近就是关联的。

4.从具有最多current key_point的行开始,根据3建立相关性,不断的向两边关联,组成一个group,然后再根据x横向偏移对关键点的x坐标进行修正。

3.LaneATT

4.CLRNet

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软考数据库】第十五章 知识产权和标准化

目录 15.1 知识产权概述 15.2 保护期限 15.3 知识产权人的确定 15.4 侵权判断 15.5 标准划分 前言: 笔记来自《文老师软考数据库》教材精讲,精讲视频在b站,某宝都可以找到,个人感觉通俗易懂。 15.1 知识产权概述 知识产权是…

RN_iOS项目部署流程实例

文章目录 1、环境配置1.1 安装node1.2 安装Watchman1.3 安装npm1.4 安装cocoapods 2、百家云demo下载3、运行百家云demo3.1 顺利的话3.2 踩过的坑(按这个目录流程走)3.2.1 npm install -g react-native-cli3.2.2 安装:npm install3.2.3 npm降…

新一代智能柔性换层跨巷道多车调度的HEGERLS托盘四向穿梭车物流解决方案

随着电子商务和智能制造技术的快速发展,对自动化仓储、密集仓储、自动搬运系统、自动识别、无线通信等多系统集成的需求也在不断增加,物流设备系统的密集化、自动化、智能化等技术也在不断完善。密集存储技术的优势是空间可用性高、运行模式高效、工作人…

Docker-Compose 入门到实战详尽笔记

本文首发自「慕课网」(www.imooc.com),想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"或慕课网公众号! 作者:暮闲 | 慕课网讲师 使用过 Docker 的小伙伴们都知道&#xff0…

职场小白如何在工作中快速的升职加薪

缘起 近来连续两个季度很轻松的获得优秀,在这轻松的背后,一定有些原因支撑这领导给了这个评价。坦白说,最近两个季度,无一天加班,因为我们团队不提倡加班;我这边离领导较远,属于两个城市异地办…

一天吃透Java面试八股文

Java的特点 Java是一门面向对象的编程语言。面向对象和面向过程的区别参考下一个问题。 Java具有平台独立性和移植性。 Java有一句口号:Write once, run anywhere,一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已编…

chatgpt赋能Python-pyhton如何安装

Python的安装方法 Python是一种高级编程语言,适用于多种开发需求,从网站构建到机器学习。其易用和灵活的语法使其成为一种非常受欢迎的编程语言。本文将向您介绍如何安装Python。 Python的安装步骤 以下是安装Python的步骤。 步骤1:下载P…

[笔记]初识Burpsuit

文章目录 前言一、安装配置1.1 环境1.2 安装过程1.3 科技过程 二、常用功能2.1 Manual penetration testing features2.2 Advanced/custom automated attacks2.3 Automated scanning for vulnerabilities2.4 Productivity tools2.5 Extensions 三、拓展功能 前言 Burp Suite(b…

【C++】 制作游戏壳

目录 前言 GameFrame游戏壳 搭建游戏壳 游戏初始化 游戏重绘 游戏运行 用回调函数实现游戏运行 关闭窗口,退出程序 测试 增加子类继承游戏壳子 继承 多态 优化 测试 总结 使用方法 常见错误 完整代码 GameFrame.h main.cpp 前言 为了方便以后制…

数据存储梳理记录

目录 1、FMDB-第三方SQLite数据库框架1.1 现状1.2 线程安全问题1.2.1 FMDatabase1.2.2 FMDatabaseQueue1.2.3 FMDatabasePool 2、进程间通信2.1 URL Scheme2.2 keyChain2.3 UIPasteboard2.4 UIDocumentInteractionController2.5 local socket2.6 AirDrop2.7 UIActivityViewCont…

Blender 建模小飞机(基础着色、Cycles渲染引擎)

目录 1. 飞机建模1.1 机身1.2 机身表面细分1.3 机翼1.4 尾翼1.5 尾翼镜像1.6 涡轮1.7 添加经纬球1.8 螺旋桨1.9 螺旋桨调整1.10 柱子1.11 柱子镜像1.12 起落架1.13 轮胎1.14 管1.15 镜像1.16 调整飞机角度 2. 着色 渲染2.1 添加地面2.2 飞机着色2.3 其他材质着色2.4 环境纹理2.…

JSDoc 拥抱 Javascript

JSDoc 在 vs code 已经内置了. 可以在 js 文件的开头添加 // ts-check 即可. 在注释中标注来实现一些 ts 的功能. JSDoc 支持以下注解. Types typeparam (or arg or argument)returns (or return)typedefcallbacktemplate Classes Property Modifiers public, private, p…

Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

大家好,我是煎鱼。 之前写过一篇关于 Go WebAssembly 的相关文章 《一分钟搞明白!快速掌握 Go WebAssembly》,今天带来一则新消息。 想着 Go 过去了那么多年了,只在 Go1.11 支持了 WebAssembly1.0 的部分功能(js/sysca…

一个实际音视频开发问题!

前言: 大家好,今天给大家分享的内容是关于平时在做音频编解码会遇到的一些问题,比如说: 解码播放的时候,播不出来解码播放的时候,画面有条纹编码的时候,修改分辨率大小,没有反应 这三…

深圳先进院李骁健团队:植入式脑机接口技术向医疗器械转化的问题与挑战

近几年植入式脑机接口技术取得了非常显著的进步,从工程实现能力和服务功能场景来说,脑机接口技术已经达到了临床应用的临界点,在实验室科研成果向临床医疗器械转化过程中将会面临新的挑战。本文章由此出发,首先介绍了脑机接口技术…

工程监测无线中继采集仪的常用功能与设置

工程监测无线中继采集仪的常用功能与设置 LoRA 频道与中心频率 无线中继采集发送仪使用频道来设置不同的射频中心频率。 中心频率 MHz 基频 (频道) ,无线中继采集发送仪 的 LoRA 基频已设置为 420 或者 854MHz,可以使用$STRFxxx 重新设置基频。 例如&a…

RT-Thread 1. GD32移植RT-Thread Nano

1. RT-Thread Nano 下载 RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理…

Ansys Zemax | 设计抬头显示器时要使用哪些工具 – 第三部分

本文为使用OpticStudio工具设计优化HUD抬头显示器系统的第三部分,主要包含演示了如何使用OpticStudio非序列模式工具正向分析HUD系统的性能以及后续可能的扩展分析。 上两篇文章中(第一部分点此查看,第二部分点此查看),我们主要介绍了如何以逆…

js 定时去重复显示和隐藏的思路

文章目录 思路一 每秒执行思路二 直接用定时器,但是不每秒思路三 es9 异步迭代异步迭代例子1 直接使用例子2 async await例子3 * yield异步遍历器 --》要想用for await of 必须遍历这个简化 for await of解决1秒出现第一个结果,再过2秒出现第二个&#x…

电脑录屏软件哪个好用?3款屏幕录制大师分享!

案例:如何快速录制电脑屏幕? 【每次录制电脑屏幕都要花费我很多时间,十分影响我工作的效率。有没有什么方法可以帮助我实现电脑快速录屏?蹲一款好用的电脑录屏软件!】 电脑录屏是我们在工作或学习中常常需要使用到的功能&#x…