【论文阅读】自动驾驶光流任务 DeFlow: Decoder of Scene Flow Network in Autonomous Driving

news2024/12/26 20:42:55

再一次轮到讲自己的paper!耶,宣传一下自己的工作,顺便完成中文博客的解读 方便大家讨论。

  • Title Picture

  • Reference and pictures

    paper: https://arxiv.org/abs/2401.16122

    code: https://github.com/KTH-RPL/DeFlow

    b站视频: https://www.bilibili.com/video/BV1GH4y1w7LQ

1. Introduction

这个启发主要是和上一篇 动态障碍物去除 的有一定的联系,去除完了当然会开始考虑是不是可以有实时识别之类的, 比起只是单纯标记1/0 的动和非动分割以外会是什么?然后就发现了 任务:scene flow,其实在2D可能更为人所熟知一些:光流检测,optical flow,也就是输入两帧连续的图片,输出其中一张的每个pixel的运动趋势,NxNx2,其中N为图片大小,2为x,y两个方向上的速度

对应的 3D情况下 则是切换为 输入是两帧连续的点云帧,输出一个点云帧内每个点的运动,Nx3,N为点云帧内点的个数,3为x, y, z三个轴上的速度

Motivation

首先关于在自动驾驶的光流任务,我们希望的是能满足以下两个点:

  • Real Time Running 10Hz
  • 能负担的起大量点云的输入 32或64线 至少都是6万个点/帧 起步了 随便选kitti 一帧 点数是:125883~=12万;而之前大部分光流论文还停留在max point=8192,然后我当时(2023年8月附近)随手选了最新cvpr的sota:SCOOP一文,一运行就cuda out of memory;问作者才知道 领域内默认max=8192 number of point

那么Voxelization-based method就是其中大头 or 唯一选择了;

接着故事就来到了 启发DeFlow的点:在查看最近工作(于2023年8月附近查看),阅读相关资料时发现,很多自监督的paper都声称自己超过了 某篇监督的模型效果,也就是Waymo在RA-L发的一篇dataset顺带提出了FastFlow3D(官方闭源,民间有复现);但是实际上 FastFlow3D本身就是参考3D detection那边网络框架进行设计的,仅将最后的decoder 连一个 MLPs 用以输出point flow

在我们的实验中发现,特别是在resolution用的20cm的时候,效果确实不好,主要原因集中在于下图2,统计发现如果一个点在动(速度≥0.5m/s),那么绝大多数都是在0.2以下的距离内运动;那么动一动脑筋,我们就想到了 调参,直接把resolution调到10cm不就行了?没错!DeFlow 实验表格 Table III 第三行证明确实直接double kill

那么我们就知道了20cm 的栅格化分辨率下,点都在一个栅格里运动,所以前期pillar encoder 根本无法学出同一个voxel内不同点的feature,而FastFlow3D本身的decoder又是非常简单的MLP提取,无法实现voxel-to-point feature extraction

Contribution

所以我们的贡献就以以上为基础来讲述的啦,总结就是:1、提出了一个基于GRU voxel-to-point refinement的decoder;2、同时分析了以下loss function的影响并快速提了一个新的;3、最后实验到 AV2 官方在线榜单的SOTA

note:所有代码,各种对比消融实验 和 刷榜所用的model weight全部都开源供大家下载查阅,欢迎star和follow up:https://github.com/KTH-RPL/DeFlow

2. Method

非常简单易懂的方法部分,特别配合代码使用

2.1 Input & Output

输入是两帧点云,具体一点 和FastFlow3D还有一系列的3D detection 一样;我们会先做地面去除,所以实际输入已经去掉了地面的 P t , P t + 1 P_t, P_{t+1} Pt,Pt+1

然后我们要估计的是 P_t 的 flow F,其中根据ego pose信息,我们也专注于预测除pose flow外的,也就是环境内的属于动态物体带速度的点

2.2 Decoder

看代码可能更快一点,论文和图主要是给了一个insight :

  • 从pillar point feature提过来走MLP extend feature channel 作为 更新门 Z_t
  • 然后由经过U-Net后的voxel feature 作为initial H_0,之后由再根据迭代次数每次得到更新的 H_{t-1}

此处为对照代码,方便大家直接对照查看,具体在以下两个文件:

  • decoder:https://github.com/KTH-RPL/DeFlow/blob/main/scripts/network/models/basic/decoder.py
  • deflow mode: https://github.com/KTH-RPL/DeFlow/blob/main/scripts/network/models/deflow.py
def forward_single(self, before_pseudoimage: torch.Tensor,
                   after_pseudoimage: torch.Tensor,
                   point_offsets: torch.Tensor,
                   voxel_coords: torch.Tensor) -> torch.Tensor:
    voxel_coords = voxel_coords.long()
    after_voxel_vectors = after_pseudoimage[:, voxel_coords[:, 1],
                                            voxel_coords[:, 2]].T
    before_voxel_vectors = before_pseudoimage[:, voxel_coords[:, 1],
                                              voxel_coords[:, 2]].T
    
    # [N, 64] [N, 64] -> [N, 128]
    concatenated_vectors = torch.cat([before_voxel_vectors, after_voxel_vectors], dim=1)
    
    # [N, 3] -> [N, 64]
    point_offsets_feature = self.offset_encoder(point_offsets)
    
    # [N, 128] -> [N, 128, 1]
    concatenated_vectors = concatenated_vectors.unsqueeze(2)

    for itr in range(self.num_iters):
        concatenated_vectors = self.gru(concatenated_vectors, point_offsets_feature.unsqueeze(2))

    flow = self.decoder(torch.cat([concatenated_vectors.squeeze(2), point_offsets_feature], dim=1))
    return flow

然后self.gru则是由这个常规ConvGRU module生成,forward和如下公式 直接对应

H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t (3) \mathbf{H}_t=\mathbf{Z}_t \odot \mathbf{H}_{t-1}+\left(1-\mathbf{Z}_t\right) \odot \tilde{\mathbf{H}}_t \tag{3} Ht=ZtHt1+(1Zt)H~t(3)

# from https://github.com/weiyithu/PV-RAFT/blob/main/model/update.py
class ConvGRU(nn.Module):
    def __init__(self, input_dim=64, hidden_dim=128):
        super(ConvGRU, self).__init__()
        self.convz = nn.Conv1d(input_dim+hidden_dim, hidden_dim, 1)
        self.convr = nn.Conv1d(input_dim+hidden_dim, hidden_dim, 1)
        self.convq = nn.Conv1d(input_dim+hidden_dim, hidden_dim, 1)

    def forward(self, h, x):
        hx = torch.cat([h, x], dim=1)

        z = torch.sigmoid(self.convz(hx))
        r = torch.sigmoid(self.convr(hx))
        rh_x = torch.cat([r*h, x], dim=1)
        q = torch.tanh(self.convq(rh_x))

        h = (1 - z) * h + z * q
        return h

所以和其他对GRU的用法不同,主要是我们将其用于voxel和point 之间细化特征提取了,当然代码里也有我第一次的MM TransformerDecoder 和 直接的 LinearDecoder尝试 hahah;前者太慢了,主要是点太多 我分了batch;后者效果不行,带代码就当附带都留下来了

然后论文里讲了以下loss function的设计,过程简化以下就是:之前的工作一般,在和gt的norm基础上 都自己给设计不同的权重,比如这里的 σ \sigma σ

结论就是我们这样设计的,根据ZeroFlow的三种速度划分,我们不用权重而是直接unified average;实验部分会说明各个module的进步

OK 方法到这里就结束了,自认为非常直觉性的讲故事下来的 hahaha,然后很多实验在各种角度模块进行证明我们的statement

3. Experiments

这个是直接抽的leaderboard的表格,具体每个方法的文件 见 https://github.com/KTH-RPL/DeFlow/discussions/2

前三者都是自监督 每篇都说超过了监督方法 FastFlow3D,但实际上只是baseline weak了,或者说他们比不过 FastFlow3D 10cm (0.1m)的分辨率,ZeroFlow XL就是把分辨率降到了0.1 然后加大了网络;OK leaderboard (test set 只能上传到在线平台评估) 的分析就这样了,知道SOTA就行

接下来的所有评估都是本地的,因为在线平台有提交次数限制 hahaha;首先贴出 Table III:注意这之中仅改变了decoder,其他loss func, learning rate, 训练条件均保持一致

这张表格也就是我们说的 我们的decoder提出 不需要细化10cm分辨率;因为这样GPU的Memory 大大上升了,总得留点给其他模块用嘛,见FastFlow3D 0.1 第三行

而我们保持了20cm的分辨率 速度和GPU内存使用均无太多上涨的情况下,我们的EPE 3-Way的分数甚至比FastFlow3D 细化10cm的还要好,误差比原来的 低了33%

Ablation Study

Loss Function:注意此处我们全部使用FastFlow3D的network,仅loss function不同而已

decoder iter number:其实我不太想做这个实验,但耐不住可能审稿人要问,所以我当时initial是选2/4跑的,毕竟多了降速 hahaha;此处全部使用deflow,仅iteration number不同,所以第二行可以认为是deflow: our decoder+our loss的效果(因为Table III为了对decoder的消融,所以其实我们使用的是fastflow3d提出的loss function;途中有韩国老哥没看论文,只要结果,所以他跑提供的weight的结果比我好,其实是他看错了表 lol)

结果可视化

主要就是快速看看就行,code那边还有10秒 demo视频可看

4. Conclusion

结论重复了一遍贡献

然后说了以下future work:自监督的模型训练,毕竟gt难标呀;欢迎查看最新ECCV2024的工作SeFlow,也就是我当时写下future work的时候已经在尝试路上的时候了;同开源(只要我主手的工作都开源 并在文章出版前 code上传完全能复现论文结果,我的信条 hahaha)

  • https://github.com/KTH-RPL/SeFlow

赠人点赞 手有余香 😆;正向回馈 才能更好开放记录 hhh

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

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

相关文章

Git 命令学习之推送本地项目到 Gitee 托管

引言 在软件开发中,版本控制是不可或缺的一环。Git 作为目前最流行的分布式版本控制系统,广泛应用于各种项目中。而 Gitee(原名码云)作为国内知名的代码托管平台,为开发者提供了稳定、安全的代码托管服务。下面将详细…

C++的IO流操作

文章目录 C语言的输入与输出流是什么CIO流C标准IO流C文件IO流二进制读写文本读写 stringstream的简单介绍 C语言的输入与输出 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放…

【单片机毕业设计选题24042】-基于无线传输的老人健康监护系统

系统功能: 系统操作说明: 上电后OLED显示 “欢迎使用健康监护系统请稍后”,两秒后显示Connecting...表示 正在连接阿里云,正常连接阿里云后显示第一页面,如长时间显示Connecting...请 检查WiFi网络是否正确。 第一页面第一行…

基于苹果CMS系统的双端视频播放APP源码

基于苹果CMS系统的双端视频播放APP源码。一款基于苹果CMS系统的移动端在线视频播放软件,支持mp4、flv、m3u8、rmvb、mkv等主流视频格式的播放,现有安卓ios版本 源码下载:https://download.csdn.net/download/m0_66047725/89471018 更多资源…

爬虫逆向实战(42)-某巢登陆(AES、MD5、RSA、滑块验证码)

一、数据接口分析 主页地址:某巢 1、抓包 通过抓包可以发现在登录时,网站首先请求captcha/querySlideImage/来获取滑块验证码的图片,然后请求captcha/checkCode/接口来验证滑块验证码。滑块验证码校验成功后,请求noshiro/getPu…

windows10如何打开开发者模式

按键盘上的win键或者点击屏幕左下角的开始图标,即可出现如下的界面 在打开的界面中找到设置按钮,点击设置按钮 进入windows设置界面后,找到‘更新和安全’的选项,随后点击进入 进去后在左侧的功能列表中找到‘开发者选…

8N10 惠海 100V 8A HG160N10L TO-252封装 打火机-加湿器N沟道MOS管

MOS管是金属-氧化物-半导体场效应晶体管,或者称为金属-绝缘体-半导体。MOS管的工作原理主要是利用加在栅极(G)上的电压(VGS)来控制“感应电荷”的多少,从而改变由这些“感应电荷”形成的导电沟道的状况&…

安捷伦B2902A精密电源/测量单元KEYSIGHT是德B2902A数字源表

Agilent B2902A、Keysight B2902A、HP B2902A 精密电源/测量单元,2 通道,100 fA,210 V,3 A 直流/10.5 A 脉冲 Agilent B2902A 精密源/测量单元 (SMU) 是一款 2 通道、紧凑且经济高效的台式 SMU,能够提供和测量电压和电…

基于Java中的SSM框架实现大学生就业预测系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现大学生就业预测系统演示 摘要 科技不断飞速发展,人类文明走向一个又一个的高峰。在科技进步的浪潮中,计算机技术得到了巨大的发展,随着技术的完善,生产成本的降低,计算机走进千家万户。计算机…

录屏软件哪个好用?分享5款(2024最新)

随着网络时代的发展,电脑的使用频率也越来越高,还有近些年出现的网课、直播等,这让电脑的录屏功能显得更重要。随之而来的录屏软件也越来越多样化,选择一款好的软件是录屏至关重要的环节。 在数字浪潮汹涌的时代,录屏…

【Tech Point】

ARM加速LLama C 加速对象 LLama C 加速对象 LLama C 关键技术: 使用neon加速指令进行SIMD操作;优化数据排布,降低数据读取的中断

挑战与成长:面对他人成就引发的焦虑与迷茫

挑战与成长:面对他人成就引发的焦虑与迷茫 对于追求知识和技能的人来说,看到他人做出自己尚未达到的成就确实会带来焦虑感。这种焦虑常常源于对自己能力的质疑和对未来的不确定性。 在我的学习和发展过程中,有时确实会看到其他模型或系统能…

mdb转gdb实现过程介绍(1)mdb地理数据库结构解析和gdb库的创建

内容提示: mdb数据转出为gdb,应保留原mdb的库体结构。库体结构中,应该正确处理数据集、要素类和表之间的结构。 数据集:保持数据集结构; 要素类:要素类位于mdb根目录或数据集下; 表:…

MySQL InnoDB Cluster 高可用集群部署

MySQL InnoDB Cluster 简介 官方文档:https://dev.mysql.com/doc/refman/8.4/en/mysql-innodb-cluster-introduction.html 本章介绍 MySQL InnoDB Cluster,它结合了 MySQL 技术,使您能够部署和管理完整的 MySQL 集成高可用性解决方案。 说…

Labview绘制柱状图

废话不多说,直接上图 我喜欢用NXG风格,这里我个人选的是xy图。 点击箭头指的地方 选择直方图 插值选择第一个 直方图类型我选的是第二个效果如图。 程序部分如图。 最后吐槽一句,现在看CSDN好多文章都要收费了,哪怕一些简单的入…

运营商如何通过PCDN技术提高用户服务?

着互联网的快速发展,用户对网络速度和质量的要求越来越高。为了满足这些需求,内容分发网络(CDN)成为了关键的基础设施。而在CDN技术中,PCDN(PersonalCDN)作为一种新兴的技术,为运营商和用户提供了新的解决方案。本文将重点介绍PCD…

vue3中使用Antv G6渲染树形结构并支持节点增删改

写在前面 在一些管理系统中,会对组织架构、级联数据等做一些管理,你会怎么实现呢?在经过调研很多插件之后决定使用 Antv G6 实现,文档也比较清晰,看看怎么实现吧,先来看看效果图。点击在线体验 实现的功能…

图形的搭建

例一: 输入描述: 多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。 输出描述: 针对每行输入,输出用“*”组成的X形图案。 示例一&…

macos m2 百度paddleocr文字识别 python

创建了一个虚拟环境:conda create -n orc python3.11.7 进入虚拟环境后执行2条命令 pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple​ ​ 安装好后,在网…

VUE2及其生态查漏补缺

1、数据代理概括 数据代理过程相当于是进行了 vm 代理 vm_data中的属性,vm._data 是与 我们vue文件中写的 data是全等的 //创建Vue实例let data { //data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。name:atguig…