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

news2024/11/20 14:15:56

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 = cols
                prev_row = row
                continue
            if cols.size == 0:  # 如果当前没有列,继续
                continue
            col = 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 = cols
            prev_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]

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

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

相关文章

C语言之预处理

目录 前言 宏定义define的用法 文件包含include的用法 条件编译的用法 其他预处理命令 练习题 练习一 练习二 练习三 前言 预处理命令可以改变程序设计环境&#xff0c;提高编程效率&#xff0c;它们并不是C语言本身的组成部分&#xff0c;不能直接对它们进行编译&am…

竹云产品入选《2023年度上海市网络安全产业创新攻关成果目录》

为推进网络安全产业发展&#xff0c;建设网络安全产业创新高地&#xff0c;上海市经济和信息化委员会于10月24日正式发布《2023年度上海市网络安全产业创新攻关成果目录》&#xff0c;共评选出16项创新成果&#xff0c;其中包括基础技术创新8项、应用技术创新4项、服务业态创新…

源码推荐【源码好优多】

一、影视小程序 特点&#xff1a;可独立部署、消耗环境小、安全可靠。使用微信小程序技术开发。部署简单容易。该项目的部署需要具备微擎框架的开发以及部署能力 二、java博客管理系统 博客管理系统是一个融合线上、线下的网民在线交流管理信息化系统。它的使用为网民、运营者搭…

FineReport模版报错排查

在【智能运维——》平台日志——》模版报错】目录下可以查看在使用中有报错的模版&#xff0c;可在【下载日志】目录下下载具体时间断的日志进行报错分析。 常见报错 1、 11300003&#xff1a;com.fr.stable.DeathCycleException: pInvCode_sn 出现原因&#xff1a; 模版参数…

Linux 云服务器磁盘挂载简介

云服务器磁盘挂载 一、挂载须知 一般涉及工具或命令&#xff1a;fdisk/gdisk/parted等挂载&#xff08;mounting&#xff09;是指由操作系统使一个存储设备&#xff08;诸如硬盘、CD-ROM或共享资源共享资源上的计算机文件和目录可供用户通过计算机的文件系统访问的一个过程。…

Linux ls命令:查看目录下文件

ls 命令&#xff0c;list 的缩写&#xff0c;是最常见的目录操作命令&#xff0c;其主要功能是显示当前目录下的内容。此命令的基本格式为&#xff1a; [rootlocalhost ~]# ls [选项] 目录名称 ls 命令常用的选项以及各自的功能。 注意&#xff0c;当 ls 命令不使用任何选项时…

基于arduino uno + L298 的直流电机驱动proteus仿真设计

一、L298简介&#xff1a; L298是一个集成的单片电路&#xff0c;采用15个导线多瓦和PowerSO20封装。它是一个高电压、高电流双全桥驱动器&#xff0c;旨在接受标准TTL逻辑电平和驱动感应负载&#xff0c;如继电器、螺线管、直流和加速电机。提供两个使输入来使独立于输入信号的…

Vue---监听div元素宽高改变时echart图表重新resize

一、需求描述 当点击上图的红色框时&#xff0c;echart的div元素宽会改变但是无法触发echarts图表的resize重新渲染&#xff0c;对于浏览器而言&#xff0c;浏览器具有window.resize方法监听浏览器窗口大小的改变&#xff0c;而div元素没有监听宽高改变的方法。 二、解决方案 …

STM TIM(三) 输入捕获

STM TIM(三) 输入捕获 输入捕获简介 IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff08;上升沿或下降沿&#xff09;&#xff0c;当前CNT的值将被锁存到CCR中&#xff08;把当前CNT的值读出来&#x…

FL Studio21版无限破解版下载 软件内置破解补丁

FL Studio是一款非常好用方便的音频媒体制作工具&#xff0c;它的功能是非常的强大全面的&#xff0c;想必那些喜欢音乐创作的朋友们应该都知道这款软件是多么的好用吧&#xff0c;它还能够给用户们带来更多的创作灵感&#xff0c;进一步加强提升我们的音乐制作能力。该软件还有…

财报解读:若开启价格战“防沉迷”,特斯拉还有多少“杀手锏”?

“暴风雨中&#xff0c;再强的船也有麻烦。”近日的财报会议上&#xff0c;特斯拉首席执行官埃隆马斯克坦承了特斯拉处境的严峻。 根据三季报&#xff0c;特斯拉的营收净利未达预期&#xff1b;第三季度毛利率为17.9&#xff05;&#xff0c;呈现下滑态势&#xff0c;前两个季…

Maven配置阿里云中央仓库settings.xml

Maven配置阿里云settings.xml 前言一、阿里云settings.xml二、使用步骤1.任意目录创建settings.xml2.使用阿里云仓库 总结 前言 国内网络从maven中央仓库下载文件通常是比较慢的&#xff0c;所以建议配置阿里云代理镜像以提高jar包下载速度&#xff0c;IDEA中我们需要配置自己…

无法查看 spring-boot-starter-parent的pom.xml

1. idea版本&#xff1a;2022.3 2. 使用Spring Initializr创建一个简单的spring-boot项目&#xff0c;发现无法查看 spring-boot-starter-parent的pom.xml ctrl鼠标左键 和 ctrl B 都无法进入 3. 解决&#xff1a;清除缓存重启&#xff08;&#x1f927;&#x1f630;&#…

C++项目——云备份-④-服务端配置信息模块设计与实现

文章目录 专栏导读1.系统配置信息设计2.系统配置信息实现3.配置文件加载类设计&#xff08;单例模式&#xff09;4.配置文件加载类实现与整理 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划…

ps 图框选择工具

上文 PS 图层剪贴蒙版使用方法 我们为了能够开展 图框工具 的学习 先学习了剪贴蒙版 那么 我们现在就可以开始接触图框工具了 我们先在左侧菜单中选中图框工具 上方属性里面 有一个 矩形 圆形 这就是选择的区域形状 很好理解 这里 我们先选择 矩形 这里 我先将多余的两个图层…

GalaxyBase分布式集群关闭后启动

文章目录 1 环境2 按照官方文档操作3 启动操作3.1 将主节点的所有容器服务启动3.2 将从节点的容器graph服务启动 4 官方文档的操作仍然报错5 关于docker命令 前面由于服务器关机下电&#xff0c;导致重启&#xff0c;遇见很多问题&#xff0c;官方文档的参考并不是很清晰明确&a…

APP破解去广告

1.修改图标和名称 名称直接改 找到图标在进去把他替换掉 2.修改app包名实现分身 修改包名实现app分身_Tian翊的博客-CSDN博客 3.修改资源去广告 安卓逆向006之修改APK资源去广告_修改安装包去除app内广告-CSDN博客 打开模拟器后在cmd命令行输入adb devices连接上 在模拟器中…

基于Java的在线教育网站管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

ROS学习记录2018.7.10

ROS学习记录2018.7.10 1.ROS基础了解 开源机器人操作系统ROS&#xff08;robot operation system&#xff09; 分级&#xff1a; 1.计算图集&#xff08;一种网络结构&#xff09; 1.节点&#xff1a;执行运算的进程&#xff08;做基础处理的单元&#xff09;2.消息&#x…