当前位置: 首页 > news >正文

自动驾驶之—LaneAF学习相关总结

0.前言:
最近在学习自动驾驶方向的东西,简单整理一些学习笔记,学习过程中发现宝藏up 手写AI

1. 概述
Laneaf思想是把后处理放在模型里面。重点在于理解vaf, haf,就是横向聚类:中心点,纵向聚类:利用vaf学到的单位向量去预测下一行中心点与haf预测到的当前中心点做匹配,根据距离error阈值判断是否属于同一个lane id。主要了解标签和decode,decode就是标签制作的逆过程,decode部分主要是cost代价矩阵理解,loss针对正负样本不平衡,可以使用OHEM或者focal loss。
2. 算法结构
在这里插入图片描述
使用DLA-34作为Backbone,网络输出二值的分割结果、Vertical Affinity Field(VAF)和Horizontal Affinity Field(HAF)。其中:Affinity Field. 亲和域
使用HAF、VAF,结合二值分割结果(三个头可以产生一个实例),能够在后处理中对任意数量的车道线进行聚类,得到多个车道线实例。
3. Affinity Field 构建
给定图像中的每个位置 ( x , y ) (x,y) (x,y),HAF和VAF为每个位置分配一个向量,将HAF记作 H → ( ⋅ , ⋅ ) \overset{\rightarrow}H(\cdot,\cdot) H(,),将VAF记作 V → ( ⋅ , ⋅ ) \overset{\rightarrow}V(\cdot,\cdot) V(,)
AF的生成都是从最下面一行往上面扫描
在这里插入图片描述

使用ground truth构建HAF和VAF,将ground truth到HAF和VAF的映射函数分别记作 H → g t ( ⋅ , ⋅ ) \overset{\rightarrow}H_{gt}(⋅,⋅) Hgt(,) V → g t ( ⋅ , ⋅ ) \overset{\rightarrow}V_{gt}(⋅,⋅) Vgt(,)
对于图像第 y y y行中车道线 l l l所包含的每个点 ( x i l , y ) (x_i^l, y) (xil,y),HAF由下式得到:
H → g t ( x i l , y ) = ( x − y l − x i l ∣ x − y l − x i l ∣ , y − y ∣ y − y ∣ ) T = ( x − y l − x i l ∣ x − y l − x i l ∣ , 0 ) T \overset{\rightarrow}H_{gt}(x^l_i , y) = (\frac{{\overset{-} x}^l_y − x^l _i} {|{\overset{-} x}^l_ y − x^ l_ i | }, \frac{y − y}{ |y − y|})^T = (\frac{{\overset{-} x}^l_ y − x^l_i} {|{\overset{-} x}^ l_ y − x ^l _i | }, 0 )^T Hgt(xil,y)=(xylxilxylxil,yyyy)T=(xylxilxylxil,0)T
上式中的 x − y l \overset{-}x^l_y xyl表示第 y y y行中属于车道线 l l l的所有点的横坐标平均值,求解HAF的过程如下图所示:
[Image]
上图中绿色框表示属于车道线 l l l的点,蓝色框表示属于车道线 l + 1 l+1 l+1的点。箭头表示某个位置处HAF中的向量。
对于图像第 y y y行中属于车道线 l l l的每个点 ( x i l , y ) (x^l_i,y) (xil,y),VAF由下式得到:
V → g t ( x i l , y ) = ( x − y − 1 l − x i l ∣ x − y − 1 l − x i l ∣ , y − 1 − y ∣ y − 1 − y ∣ ) T = ( x − y − 1 l − x i l ∣ x − y − 1 l − x i l ∣ , − 1 ) T \overset{\rightarrow}V_{gt}(x^l_i , y) = (\frac{{\overset{-} x}^l_{y-1} − x^l _i} {|{\overset{-} x}^l_ {y-1} − x^ l_ i | }, \frac{y -1− y}{ |y -1− y|})^T = (\frac{{\overset{-} x}^l_ {y-1} − x^l_i} {|{\overset{-} x}^ l_ {y-1} − x ^l _i | }, -1)^T Vgt(xil,y)=(xy1lxilxy1lxil,y1yy1y)T=(xy1lxilxy1lxil,1)T
上式中的 x − y − 1 l \overset{-}x^l_{y-1} xy1l示第 y − 1 y-1 y1行中属于车道线 l l l的所有点的横坐标平均值。求解VAF的过程如下图所示:
在这里插入图片描述
需要注意的是,VAF中每行的向量指向上一行中属于该车道线实例的点的平均位置。

  • HAF parsing
    水平方向的聚类就是逐行根据点的像素判断,直接根据两个邻近像素的HAF是否符合如下规则来判断是否属于同一个群组(cluster), 当然邻近像素如果相隔的位置超过设定的阈值,也会被分配到不同的cluster。
    只有当前面像素指向左并且当前像素指向右时,才会为当前像素重新分配一个cluster,令 H → p r e d \overset{\rightarrow}H_{pred} Hpred表示HAF的预测结果, i i i表示列, y y y表示行。
    c h a f ∗ ( x i f g , y − 1 ) = { C k + 1 i f H ⃗ p r e d ( x i − 1 f g , y − 1 ) 0 ≤ 0 ∧ H ⃗ p r e d ( x i f g , y − 1 ) 0 > 0 , C k otherwise, c_{haf}^*(x_i^{fg},y-1)=\begin{cases}C^{k+1}&\mathrm{if}\quad\vec{H}_{pred}(x_{i-1}^{fg},y-1)_0\leq0\\&\wedge\vec{H}_{pred}(x_i^{fg},y-1)_0>0,\\C^k&\text{otherwise,}&\end{cases} chaf(xifg,y1)= Ck+1CkifH pred(xi1fg,y1)00H pred(xifg,y1)0>0,otherwise,
  • VAF parsing
    那由haf聚类的clusters是怎么在行与行之间进行匹配呢?
    这个时候VAF就派上用场了。前面我们提到过,VAF表示指向上一行车道线实例中心像素的单位向量,那么上一行车道线实例中心像素可以由两种方式计算得到,第一种方式是直接对cluster取平均,另外一种方式就是由active lane里的end points加上向量表示的平移得到,只不过网络预测出来的HAF是单位向量,需要考虑向量的模长而已。那这两种方式计算出来的结果都表示上一行车道线实例中心像素,它们之间的距离即可表示前面的误差。下面公式是在计算每一个线头坐标点结合vaf推算出来的点坐标与当前行的聚类点之间的dist_error。
    d C k ( l ) = 1 N y l ∑ i = 0 N y l − 1 ∣ ∣ ( x ‾ C k , y − 1 ) ⊺ − ( x i l , y ) ⊺ − V ⃗ p r e d ( x i l , y ) ⋅ ∣ ∣ ( x ‾ C k , y − 1 ) ⊺ − ( x i l , y ) ⊺ ∣ ∣ ∣ ∣ \begin{aligned} d^{C^k}(l)=& \frac1{N_y^l}\sum_{i=0}^{N_y^l-1}\left|\left|(\overline{x}^{C^k},y-1)^\intercal-(x_i^l,y)^\intercal\right.\right. \\ &-\vec{V}_{pred}(x_i^l,y)\cdot||(\overline{x}^{C^k},y-1)^\intercal-(x_i^l,y)^\intercal||\bigg|\bigg| \end{aligned} dCk(l)=Nyl1i=0Nyl1 (xCk,y1)(xil,y)V pred(xil,y)∣∣(xCk,y1)(xil,y)∣∣
  • label generate code
    由于网络的AF分支会预测每个像素点的HAF和VAF,因此Affinity Fields需要作为ground truth来监督这一过程。算法流程也很简单,自底向上逐行扫描,在每一行对属于当前车道线实例的像素点按照计算HAF和VAF,即为当前像素点的Affinity Fields编码。
    VAF,HAF,label,模型监督三者,知道三者可以反向求解
    这段代码定义了一个名为generateAFs的函数,它的目的是为输入的车道标签图生成锚帧(AFs)。代码中涉及两种锚帧:垂直锚帧(VAF)和水平锚帧(HAF)。
def generateAFs(label, viz=False):# 创建透视场数组num_lanes = np.amax(label)  # 获取车道线的数量VAF = np.zeros((label.shape[0], label.shape[1], 2))  # 垂直透视场HAF = np.zeros((label.shape[0], label.shape[1], 1))  # 水平透视场# 对每条车道线进行循环处理for l in range(1, num_lanes+1):# 初始化先前的行和列值prev_cols = np.array([], dtype=np.int64)prev_row = label.shape[0]# 从下到上解析每一行for row in range(label.shape[0]-1, -1, -1):# [0] :np.where 返回一个元组,其每一维都是一个数组,表示该维度上满足条件的索引。# 在这里,我们只关心列索引,所以我们取出这个元组的第一个元素cols = np.where(label[row, :] == l)[0]  # 获取当前行的前景列值(即车道线位置)# 为每个列值生成水平方向向量for c in cols:if c < np.mean(cols):HAF[row, c, 0] = 1.0  # 向右指示elif c > np.mean(cols):HAF[row, c, 0] = -1.0  # 向左指示else:HAF[row, c, 0] = 0.0  # 保持不变    # 检查先前的列和当前的列是否都非空if prev_cols.size == 0:  # 如果没有先前的行/列,更新并继续prev_cols = colsprev_row = rowcontinueif cols.size == 0:  # 如果当前没有列,继续continuecol = np.mean(cols)  # 计算列的均值# 为先前的列生成垂直方向向量for c in prev_cols:# 计算方向向量的位置vec = np.array([col - c, row - prev_row], dtype=np.float32)# 单位标准化vec = vec / np.linalg.norm(vec)  # 标准化为单位向量  # 模VAF[prev_row, c, 0] = vec[0]VAF[prev_row, c, 1] = vec[1]  # 具有像两方向的增值# 使用当前的行和列值更新先前的行和列值prev_cols = colsprev_row = row

decode code
cost矩阵:
当提到“建立每条线与头坐标与当前行聚类点之间的cost矩阵”,这很有可能是在一个场景中,例如图像或传感器数据处理,你想要在平面上追踪或匹配多个线对象。让我为你详细解释一下。
背景概念

  • 线对象:这可能是在图像或其他数据源中检测到的直线或曲线。
  • 头坐标:每条线的起始点或参考点。
  • 当前行的聚类点:这可能是在某一特定行(水平方向)上检测到的点,它们可能是由于某种特性(例如颜色、强度等)而被聚类在一起的。
  • 目的:为了确定哪条线与哪个聚类点最为匹配或最为接近,你需要计算每个线与聚类点之间的距离或相似度。Cost矩阵就是用来存储这些计算结果的。
  • 矩阵形状:假设你有m条线和n个聚类点,那么你的cost矩阵将是一个m x n的矩阵。
  • 元素的值:矩阵中的每个元素代表一条线与一个聚类点之间的“cost”。这个“cost”可以是他们之间的距离、差异或其他度量方式。较低的cost意味着线和点之间的匹配度较高;较高的cost意味着匹配度较低。
    应用
    一旦你有了cost矩阵,你可以使用一些优化算法(如匈牙利算法)来确定最佳的匹配方式,这样每条线都将与一个聚类点匹配,以最小化总体的cost。
    简而言之,通过构建一个cost矩阵,你可以量化每条线与每个聚类点之间的关系,并使用这个矩阵来找出最佳的匹配方案。
    在这里插入图片描述
    AF loss
    语义分割图:分类损失+iou 损失;
    AF损失: 回归损失;
    L B C E = − 1 N ∑ i [ w ⋅ t i ⋅ l o g ( o i ) + ( 1 − t i ) ⋅ l o g ( 1 − o i ) ] L_{BCE}=-\frac1N\sum_i\left[w\cdot t_i\cdot log(o_i)+(1-t_i)\cdot log(1-o_i)\right] LBCE=N1i[wtilog(oi)+(1ti)log(1oi)]
    L I o U = 1 N ∑ i [ 1 − t i ⋅ o i t i + o i − t i ⋅ o i ] L_{IoU}=\frac1N\sum_i\left[1-\frac{t_i\cdot o_i}{t_i+o_i-t_i\cdot o_i}\right] LIoU=N1i[1ti+oitioitioi]
    L A F = 1 N f g ∑ i [ ∣ t i h a f − o i h a f ∣ + ∣ t i v a f − o i v a f ∣ ] L_{AF}=\frac1{N_{fg}}\sum_i\left[|t_i^{haf}-o_i^{haf}|+|t_i^{vaf}-o_i^{vaf}|\right] LAF=Nfg1i[tihafoihaf+tivafoivaf]

相关文章:

自动驾驶之—LaneAF学习相关总结

0.前言&#xff1a; 最近在学习自动驾驶方向的东西&#xff0c;简单整理一些学习笔记&#xff0c;学习过程中发现宝藏up 手写AI 1. 概述 Laneaf思想是把后处理放在模型里面。重点在于理解vaf&#xff0c; haf&#xff0c;就是横向聚类&#xff1a;中心点&#xff0c;纵向聚类&…...

软考系统架构之案例篇(Redis相关概念)

案例篇-Redis相关概念 1. Redis与Memcache能力对比2. Redis集群切片的常见方式3. Redis分布式存储方案4. Redis数据分片方案5. Redis持久化 1. Redis与Memcache能力对比 工作MemCacheRedis数据类型简单 key/value 结构丰富的数据结构持久性不支持支持分布式存储客户端哈希分片…...

黑客入门指南,学习黑客必须掌握的技术

黑客一词&#xff0c;原指热心于计算机技术&#xff0c;水平高超的电脑专家&#xff0c;尤其是程序设计人员。是一个喜欢用智力通过创造性方法来挑战脑力极限的人&#xff0c;特别是他们所感兴趣的领域&#xff0c;例如电脑编程等等。 提起黑客&#xff0c;总是那么神秘莫测。在…...

定档11月2日,YashanDB 2023年度发布会完整议程公布

数据库作为支撑核心业务的关键技术&#xff0c;对数字经济的发展有着重要的支撑作用&#xff0c;随着云计算、AI等技术的迅猛发展和数据量的爆发式增长&#xff0c;推动着数据库技术的加速创新。 为了应对用户日益复杂的数据管理需求&#xff0c;赋能行业国产化建设和数字化转型…...

composer安装thinkphp6报错

composer安装thinkphp6报错&#xff0c; 查看是否安装了对应的PHP扩展&#xff0c;我这边使用的是宝塔的环境&#xff0c;全程可以可视化操作 这样就可以安装完成了...

此页面不能正确地重定向

这种是由于条件判断有误&#xff0c;程序不断的重定向到一个页面&#xff0c;而造成的死循环的情况 下面列举一个常出现的场景之一 1、使用过滤器实现登录验证错误处理 解释&#xff1a;当用户访问login.jsp进行登录的时候&#xff0c;这个时候请求会被Filter捕获&#xff0…...

【Apache Flink】实现有状态函数

文章目录 在RuntimeContext 中声明键值分区状态通过ListCheckPonitend 接口实现算子列表状态使用CheckpointedFunction接口接收检查点完成通知参考文档 在RuntimeContext 中声明键值分区状态 Flink为键值分区状态&#xff08;Keyed State&#xff09;提供了几种不同的原语&…...

Android原生项目集成uniMPSDK(Uniapp)遇到的报错总结

uni小程s序SDK 集成到Android原生项目:老项目中用到的库较多&#xff0c;会出现几种冲突问题&#xff0c;总结如下&#xff1a; 报错1&#xff1a; Execution failed for task :app:processDebugManifest. > Manifest merger failed with multiple errors, see logs Andro…...

Linux redis 安装

1、解压 tar -zxvf redis-5.0.10.tar.gz 2、cd /data/redis-5.0.10 文件夹 3、make 等待make命令执行完成即可。 make命令报错&#xff1a;cc 未找到命令&#xff0c;系统中缺少gcc&#xff0c;执行命令安装 gcc&#xff1a; yum -y install gcc automake autocon…...

在Win11上部署ChatGLM3详细步骤

023年10月27日&#xff0c;智谱AI于2023中国计算机大会&#xff08;CNCC&#xff09;上&#xff0c;推出了全自研的第三代基座大模型ChatGLM3及相关系列产品&#xff0c;这也是智谱AI继推出千亿基座的对话模型ChatGLM和ChatGLM2之后的又一次重大突破。此次推出的ChatGLM3采用了…...

系列七、动态代理

一、概述 二、Jdk动态代理案例 2.1、Star /*** Author : 一叶浮萍归大海* Date: 2023/10/27 17:16* Description:*/ public interface Star {/*** 唱歌* param name 歌曲名字* return*/String sing(String name);/*** 跳舞*/void dance(); } 2.2、BigStar /*** Author : 一叶…...

Kafka集群搭建与SpringBoot项目集成

本篇文章的目的是帮助Kafka初学者快速搭建一个Kafka集群&#xff0c;以及怎么在SpringBoot项目中使用Kafka。 kafka集群环境包地址&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;x9yn 一、Kafka集群搭建 1、准备环境 &#xff08;1&#xff09;准备三台…...

一个简单的注册的页面,如有错误请指正;(3.JavaScript)

这段代码是一个JavaScript函数&#xff0c;实现了用户登录和上传图片的功能&#xff0c;并包含了一些辅助函数。让我一一解释&#xff1a; 1. login()&#xff1a;这个函数用于登录操作。首先&#xff0c;通过$(#name).val()来获取ID为name的元素的值&#xff0c;同理获取其他…...

selenium (自动化概念 测试环境配置)

什么是自动化测试 自动化测试介绍 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统. 预设条件包括正常和异常&#xff0c;最后评估运行结果。   自动化测试&#xff0c;就是将人为驱动的测试行为转化为机器执行的过程。 【机器 代替 人工】 自动化…...

Mybatis-Plus(企业实际开发应用)

一、Mybatis-Plus简介 MyBatis-Plus是MyBatis框架的一个增强工具&#xff0c;可以简化持久层代码开发MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官网&a…...

Spring Web MVC入门

一&#xff1a;了解Spring Web MVC (1)关于Java开发 &#x1f31f;Java开发大多数场景是业务开发 比如说京东的业务就是电商卖货、今日头条的业务就推送新闻&#xff1b;快手的业务就是短视频推荐 (2)Spring Web MVC的简单理解 &#x1f497;Spring Web MVC&#xff1a;如何使…...

【C++】mapset的底层结构 -- AVL树(高度平衡二叉搜索树)

前面我们对 map / multimap / set / multiset 进行了简单的介绍&#xff0c;可以发现&#xff0c;这几个容器有个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的。 但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索…...

吴恩达《机器学习》1-4:无监督学习

一、无监督学习 无监督学习就像你拿到一堆未分类的东西&#xff0c;没有标签告诉你它们是什么&#xff0c;然后你的任务是自己找出它们之间的关系或者分成不同的组&#xff0c;而不依赖于任何人给你关于这些东西的指导。 以聚类为例&#xff0c;无监督学习算法可以将数据点分成…...

一个简单的注册页面,如有错误请指正(2.css)

这段CSS代码定义了页面的样式&#xff0c;让我逐个解释其功能&#xff1a; 1. * {}&#xff1a;通配符选择器&#xff0c;用于将页面中的所有元素设置统一的样式。这里将margins和paddings设置为0&#xff0c;以去除默认的边距。 2. div img {}&#xff1a;选择页面中所有div…...

【Unity精华一记】特殊文件夹

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...