自动驾驶建图--道路边缘生成方案探讨
自动驾驶建图–道路边缘生成方案探讨

一、背景
对于自动驾驶来说,建图是必不可少的,目前主流厂商技术都在从HD到"无图"进行过渡筹备中,不过想要最终实现真正的"无图"还是有很长的一段路要走。 对于建图来说,包含了很多的道路元素,车道线,停止线,斑马线,导流属性,道路边缘以及中心线(包含引导线)等。这里,中心线的预测通常是根据轨迹,通过数学公式进行拟合,目前学术上逐渐采用模型进行预测,但是对于下游(PNC)来说,还是存在不够平滑,曲率不够精准等问题,不过这个不在本次方案讨论范围内,先忽略,以后有空可以写一写。 道路边界对于PNC来说也是至关重要,约束车辆行驶范围,避免物理碰撞发生。通常道路边界的生成有几种方法,一种是当做车道线的一部分,跟着模型一起输出,但是没有车道线的特征明显,容易漏检,而且道路边界是异形的,基于分割的方案会比基于Anchor的方案效果稳定一些。另一种是HD的方法,根据处理后的车道线,按照距离和规则等虚拟出道路边界线。本文给出一种新的解决方案,略微繁琐,但是优点是可以延用已有的公开数据集进行处理生成,快速落地验证,缺点是本方案不具备时效性,是离线的方法。
二、方案
数据集&模型 整个方案的pipline如上图所示,为了快速验证效果,所以直接采用了公开的数据集BDD100k,这个数据集主要是用于可行驶区域, 车道线以及全景分割等。它的车道线有标边线,但是没有区分类别,没办法直接用,所以采用freespace来进行验证。模型方面,理论上采用任何一个分割都可以,这里采用的是YOLOPv2, 模型提供了训练好的权重和推理脚本,输出如下所示。

YOLOPv2输出
差异性 这个数据集存在一个与建图的需求有所差异的问题,刚才提到这个方案是基于freespace做的,但是freespace是以实际能看到的边界作区分的而不是道路的边界,所以和实际建图的需求有一些diff,上面图里面能看到绿色的就是freespace的结果,被左边的车挡住了道路的边界,所以freespace就会以车辆边界作为自身的界限。如果是实时的没有什么问题,但是离线的话会产生diff,如果第一天有车,建图后,第二天发现没有车,那么可通行的范围就被压榨了。所以后续如果实际使用,需要以道路的边界作为freespace的边界线。

overview
整体方案 整个方案的pipline如上所示,对前视摄像头得到的图像进行畸变矫正后,喂进模型,输出对应的freespace,由于IPM对于边界以及远处的投影效果不好的问题,所以只选取车前15m,左右20m的范围,得到的freespace根据内外参以及自车位置投影到世界坐标系下。通过连续帧的叠加,可以生成世界坐标系下的2d点云。实际上需要的是边缘,所以还需要对点云进行处理得到道路的边缘,这里有尝试过PCL以及AlphaShape等点云处理方法,能解决部分case的提取,但是还是依赖于调参,没办法自动化处理,下面有一些bad case示例。
- 世界坐标系2d点云

2d点云
- PCL

pcl滤波+边缘提取结果
- AlphaShape

alphashape提取结果
针对上面的问题,首先对世界坐标系的点云进行投影映射,我这里设置的是1个像素表示0.05m,因为一个车道线大概15-20cm宽,所以这一点点的误差不影响反投影回去的结果。映射后,可以得到栅格的点云,由于从uv到世界坐标系转换中,远处的点会发散,所以在栅格图像中需要对其进行过滤和填充处理,处理前后如下图所示。

栅格处理
然后可以用图像处理的方法得到整个栅格图的边缘并根据映射关系反投影到世界坐标系下,根据下游的需求对矢量化的点进行稀疏采样或者插值处理,结果如下所示。

边缘处理
接下来一步,就是需要根据RTK信息来对边缘的两端进行截断(不然封闭的区域车也没发行驶),此步骤略微繁琐,逻辑简化如下: - 根据属性判断是否是直行,转弯还是掉头路口等 - 根据不同的属性,设置不同的切分逻辑 - 直行|转弯,采用双头切分,分别根据起始和终止RTK位置,通过设置距离参数来找训左右两端的切分点进行切分。 - 掉头,采用单头切分,选定起始位置后定位关键点,通过设置较长的距离来贯穿整个掉头路口,定位4个点进行切分。 - 过滤异常点,平滑处理。

切分前后效果,这里蓝色是切分后的边缘
最后,就是不断的优化和迭代的逻辑了,模型效果不好那就优化模型,逻辑不够鲁邦就优化逻辑。之前有提到数据集中的freespace不是以实际道路边缘边界区分的,所以后面还需要标数据进行模型优化。
为了验证精度是否够高,可以拼接到HD上进行对比

底图是hd提供的车道线和参考线,红色是路口的道路边界
最后的最后,PNC实际上用不了这种异形的边缘的,事实证明了,一切的一切还是要向HD看齐,所以还要根据生成的边缘来做二次约束进行曲线平滑优化处理。这里就不展开讲了,又是一个非常复杂的数学问题。

基于边缘约束优化后效果
三、结论
本方案只是提供了一种快速落地的思路,里面实际上还有很多的细节问题需要进行优化。不过基于freespace的方案相比于只去预测道路边缘的方案来说,泛化能力相对来说会强一点,同时可以一份标注数据多种用途。不过速度上需要注意,离线可以满足要求,在线实时还是要看优化的效率。
有想要交流的可以在评论区留言或者私信我
倾囊相授自动驾驶学习资料和落地经验:链接
相关文章:
自动驾驶建图--道路边缘生成方案探讨
自动驾驶建图–道路边缘生成方案探讨 一、背景 对于自动驾驶来说,建图是必不可少的,目前主流厂商技术都在从HD到"无图"进行过渡筹备中,不过想要最终实现真正的"无图"还是有很长的一段路要走。 对于建图来说,…...
图片编辑器中实现文件上传的三种方式和二进制流及文件头校验文件类型
背景 最近在 vue-design-editor 开源项目中实现 psd 等多种文件格式上传解析成模板过程中, 发现搞定设计文件上传没有使用 input 实现文件上传, 所以我研究了一下相关技术, 总结了以下三种文件上传方法 input 文件选择window.showOpenFilePicker 和 window.showDirectoryPicke…...
深度学习,CRNN+CTC和Attention OCR你更青睐哪一种?
深度学习在OCR领域的应用已经取得了瞩目的成果,而选择合适的算法对于提升OCR的识别准确率至关重要。在众多算法中,CRNN和Attention OCR犹如两颗璀璨的明珠,备受瞩目。 CRNN,这位结合了卷积神经网络(CNN)和…...
飞桨AI应用@riscv OpenKylin
在riscv编译安装飞桨PaddlePaddle参见: 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨,就可以用飞桨进行推理了。刚开始计划用ONNX推理,但是在算能云没有装上,所以最…...
在MongoDB建模1对N关系的基本方法
“我在 SQL 和规范化数据库方面拥有丰富的经验,但我只是 MongoDB 的初学者。如何建立一对 N 关系模型?” 这是我从参加 MongoDB 分享日活动的用户那里得到的最常见问题之一。 我对这个问题没有简短的答案,因为方法不只有一种,还有…...
C++基础之运算符重载(十一)
首先为什么要对运算符进行重载?因为C内置的运算符只能作用于一些基本数据类型,而对类和结构体这种自定义数据类型是不管用的。所以这时我们需要对运算符进行重新定义满足一定的运算规则。 运算符重载的三种形式 1.以普通的函数进行重载 #include <…...
初始Java篇(JavaSE基础语法)(2)(逻辑控制)
个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …...
家用路由器和企业路由器的区别?
一、家用路由器 家用路由器路由器交换机 它只有一个WAN口和一个LAN口,WAN口接公网一个地址,LAN口接你电脑一个IP地址,完全符合路由器的设计,而因为家里如果用了,说明要接多个电脑,那么如果还需要对每个接口…...
Gin简介(Go web基础知识)
Gin简介 https://geektutu.com/post/quick-go-gin.html我是从这个网站上面摘录的,就是做个笔记,仅分享。膜拜极客兔兔大佬 Go特性: 快速:路由不使用反射,基于Radix树,内存占用少。 中间件:HT…...
HBase的Bulk Load流程
目录 1. 数据准备 2. 文件移动 3. 加载数据 4. Region处理 5. 元数据更新 6. 完成加载 7. 清理 8. 异常处理 LoadIncrementalHFiles(也称为Bulk Load)是HBase中一种将大量数据高效导入到HBase表的机制。以下是LoadIncrementalHFiles的主要流程步…...
vue中图片替换 遇到问题
问题: 在img标签里动态绑定路径:<img v-bind:src"imgSrc" /> data里这样写是错误的:imgSrc:xx/xx.png 这样渲染的路径会有问题,导致出不来图片 解决了 是这样的 data(){return(){imgSrc:require("../…...
Android 观察者模式
在Android中,观察者模式(Observer Pattern)是一种常用的设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Android开发中࿰…...
阿里云部署MySQL、Redis、RocketMQ、Nacos集群
文章目录 🔊博主介绍🥤本文内容MySQL集群配置云服务器选购CPU选择内存选择云盘选择ESSD AutoPL云盘块存储性能(ESSD) 镜像选择带宽选择密码配置注意事项 安装docker和docker-compose部署MySQL三主六从半同步集群一主二从同步集群规…...
day05-店铺营业状态设置
1. Redis入门 1.1 Redis简介 Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网: https://redis.io 中文网: https://www.redis.net.cn/ 主要特点: 基于内存存储,读写性能高…...
哈希表(c++)
1、介绍 哈希表,也称为散列表,是一种非常高效的数据结构。它通过将键(Key)映射到数组的特定位置来快速查找、插入和删除数据。这个映射过程由哈希函数(Hash Function)完成,该函数将键转化为一个…...
C#基础-标识符命名规则
目录 1、标识符定义 2、遵循规则 3、标识符的例子 4、MSDN中英文解释 英文...
Zabbix Web界面中文汉化
要想达到上图的效果,第一步先查看 /usr/share/zabbix/assets/fonts/ [rootservice yum.repos.d]# ll /usr/share/zabbix/assets/fonts/ 总用量 0 lrwxrwxrwx. 1 root root 33 3月 23 16:58 graphfont.ttf -> /etc/alternatives/zabbix-web-font 继续查看graph…...
esp32CAM环境搭建(arduino+MicroPython+thonny+固件)
arduino ide 开发工具 arduino版本:1.8.19 arduino ide 中文设置: file >> preferences >> arduino IDE 获取 ESP32 开发环境:打开 Arduino IDE ,找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…...
Spring Boot从入门到实战
课程介绍 本课程从SpringBoot的最基础的安装、配置开始到SpringBoot的日志管理、Web业务开发、数据存储、数据缓存,安全控制及相关企业级应用,全程案例贯穿,案例每一步的都会讲解实现思路,全程手敲代码实现。让你不仅能够掌Sprin…...
Spring Boot(七十一):整合RateLimiter实现接口限流
1 简介 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证。一旦获取到许可证,不需要再释放许可证。 RateLimiter使用的是一种叫令牌桶的流控算法,RateLimiter会按照一定的频率…...
快速上手:CYBER-VISION零号协议Node.js后端服务集成指南
快速上手:CYBER-VISION零号协议Node.js后端服务集成指南 你是不是已经部署好了CYBER-VISION零号协议模型,看着那个命令行界面,心里琢磨着:“这玩意儿怎么才能接到我的Web应用里去?” 别急,这正是我们今天要…...
StructBERT情感分类镜像保姆级教程:GPU加速中文情感分析快速上手
StructBERT情感分类镜像保姆级教程:GPU加速中文情感分析快速上手 10分钟学会部署和使用专业级中文情感分析模型,让AI帮你读懂用户情绪 1. 前言:为什么要用StructBERT做情感分析? 你有没有遇到过这些情况? 电商平台上…...
SEO_本地商家必备的SEO实战方法
SEO对本地商家的重要性 在当今数字化时代,为了在竞争激烈的市场中脱颖而出,本地商家必须掌握一些SEO(搜索引擎优化)技巧。SEO不仅可以提升网站的搜索引擎排名,还能够有效地吸引更多的本地客户。本文将详细探讨本地商家…...
OpenClaw+Qwen3-14b_int4_awq:自动化文档生成工具
OpenClawQwen3-14b_int4_awq:自动化文档生成工具 1. 为什么需要自动化文档生成 作为一名技术写作者,我经常面临一个困境:代码写完了,文档却迟迟无法完成。每次面对空白的Markdown文件,总有种无从下笔的感觉。更糟糕的…...
推荐6款AI论文降重工具,智能改写提升原创度,减少重复率。
开头总结工具对比(技能4) �� 根据实际使用案例分析,从处理效率、降重能力和核心功能三个关键指标对六款主流AI论文辅助平台进行横向评测,结果显示各平台在文本处理速度、重复率降低幅度及特色功能方面存在显…...
培养孩子批判性思维5W1H,从学会提问开始
1. 何为批判性思维?在《单向度的人》中,哲学家马尔库赛说:人类有两种思维,一种肯定,一种批判,缺乏任何一种都不算是健全的。 简单来讲,批判性思维就是一种理性的能力,当面对权威发出…...
SEO优化推广的具体流程是什么
SEO优化推广的具体流程是什么 在当今互联网时代,SEO优化推广已成为网站流量获取的关键手段。具体的SEO优化推广流程是什么呢?本文将详细介绍SEO优化推广的具体流程,帮助你更好地了解和实践这一重要的数字营销技能。 一、前期准备 在开始SE…...
07-opencode 代码分析与重构
07-代码分析与重构 掌握 OpenCode 的代码分析和重构功能,实现批量编辑、智能分析和代码库问答。 一、代码分析概述 1.1 分析能力 OpenCode 可以分析整个代码库,提供: 结构分析:模块依赖、调用关系质量分析:代码规范…...
SQL删除视图会删掉原数据吗_DROP VIEW的安全性分析
DROP VIEW仅删除视图定义而非数据,不影响基表;它不校验下游依赖,删后应用调用会报错;真正删数据的是DROP TABLE或DELETE等操作。DELETE、TRUNCATE 和 DROP VIEW 的作用对象完全不同不会删原表数据。DROP VIEW 只是删掉一个「查询的…...
EXE Ver 适用于 未安装Python 以及包的Windows OS
上图~EXE Ver END...
