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

再一次轮到讲自己的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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于 Mybatis 的开启二级缓存返回对象不一致问题

做实验报告的时候&#xff0c;跟着学习&#xff0c;发现我已经将 开启 二级缓存的 配置都配置好了&#xff0c;但是返回值地址不一致&#xff0c;说明对象不一致&#xff0c;二级缓存命中失败。 跟着流程配置&#xff1a; mybatis-config <settings><!-- 启用 myba…

SpringBoot+Thymeleaf项目重定向到另一个系统HTTPS变成HTTP

SpringBootThymeleaf项目是一个简单的单体项目&#xff0c;只有一个页面。 重定向的是前后分离&#xff0c;前端用的vue。 浏览器看到重定向后 https成了http&#xff0c;F12控制台看到是 301 Moved Permanently 单体项目最开始写法&#xff1a; response.sendRedirect(url); …

react native中使用@react-navigation/native进行自定义头部

react native中使用react-navigation/native进行自定义头部 效果示例图实例代码 效果示例图 实例代码 /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react/no-unstable-nested-components */ import React, { useLayoutEffect } from react; import…

基于uniapp(vue3)H5附件上传组件,可限制文件大小

代码&#xff1a; <template><view class"upload-file"><text>最多上传5份附件&#xff0c;需小于50M</text><view class"" click"selectFile">上传</view></view><view class"list" v…

html+css+js气球消除小游戏

气球消除小游戏 消除15个就成功 源码在图片后 点赞加关注&#xff0c;谢谢 左上角的数字显示消除气球的数量 定时随机生成气球 &#x1f388;&#x1f388;&#x1f388; 图片 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset&…

C++部分复习笔记上

C语法复习 1. C入门基础 缺省参数 半缺省参数必须从右往左依次来给出&#xff0c;不能间隔着给缺省参数不能在函数声明和定义中同时出现缺省值必须是常量或者全局变量C语言不支持&#xff08;编译器不支持&#xff09; 函数重载 函数重载是函数的一种特殊情况&#xff0c;…

小试牛刀-Solana合约账户详解

目录 一.Solana 三.账户详解 3.1 程序账户 3.2 系统所有账户 3.3 程序派生账户(PDA) 3.4 Token账户 四、相关学习文档 五、在线编辑器 Welcome to Code Blocks blog 本篇文章主要介绍了 [Solana合约账户详解] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ …

企业如何管理安全生产工作?(附模板)

总结一下在企业内管理安全中遇到的一些问题&#xff1a; 1、 管理方式落后&#xff0c;还在使用纸质记录 2、 人员信息杂乱无章&#xff0c;无人整理 3、出现问题找不到源头和负责人 我做系统管理已经7年了&#xff0c;题主说的这些问题我之前也遇到过&#xff0c;相信也有…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…

taro小程序terser-webpack-plugin插件不生效

背景 taro小程序terser-webpack-plugin插件不生效 运行环境&#xff1a; taro3.6.32vue3.2.24 webpack5 不断尝试过 按官网这种配置不生效&#xff0c;然后又看了文档中赋的这个链接《编写插件&#xff0c;将 Taro 编译打包耗时缩短至三分之一》。 按这个文档中的配置&…

魏建军亲测智驾第二季:长城全场景NOA挑战重庆

6月30日&#xff0c;魏建军再次直播长城的全场景智能驾驶NOA。上一次直播是保定&#xff0c;而这次选在了山城重庆。 重庆号称「8D魔幻城市」&#xff0c;是每一个在智驾上有抱负的头部公司&#xff0c;都想跑一跑必争之地。 这次直播长城用的智驾系统&#xff0c;也是TA序列…

Go - 8.func 函数使用

目录 一.引言 二.func 定义 三.func 实践 1.多个返回值 2.命名返回值 3.可变参数 四.总结 一.引言 函数是编程语言中的基本构建块&#xff0c;用于将代码组织成可重用的逻辑单元。函数可以接受输入参数&#xff0c;执行特定的操作&#xff0c;并返回结果。在 Go 语言&a…

25.labview数据采集中的读取和写入文本文件和Excel表格文件

①本文将会讲解labview读取和写入文本文件和Excel文件的几种不同方式&#xff0c;讲解程序的基本原理&#xff0c;并提出具体的实施方案&#xff0c;本文内容如下所示。 ②本文文章结束会提供大家 文本和表格读取写入的源程序 &#xff0c;以便于大家学习和使用。 本文中可能用…

家政小程序的开发:打造现代式便捷家庭服务

随着现代生活节奏的加快&#xff0c;人们越来越注重生活品质与便利性。在这样的背景下&#xff0c;家政服务市场迅速崛起&#xff0c;成为许多家庭日常生活中不可或缺的一部分。然而&#xff0c;传统的家政服务往往存在信息不对称、服务效率低下等问题。为了解决这些问题&#…

Windows10录屏,教你3个方法,简单快速录屏

“我的电脑系统是Windows10的系统&#xff0c;今晚要进行线上开会&#xff0c;但我实在有事没办法参加会议&#xff0c;想把会议的内容录制下来方便我后续观看。但却找不到电脑录屏功能在哪里打开&#xff1f;求助一下&#xff0c;谁能帮帮我&#xff1f;” 在数字化时代&…

Oracle - 数据库打补丁实践

原文&#xff1a;https://www.cnblogs.com/ddzj01/p/12097467.html 一、概述 本文将介绍如何给oracle数据库打最新补丁&#xff0c;数据库版本为11.2.0.4单实例&#xff0c;操作系统为redhat6.5 二、下载相关升级包 1. 登录MOS&#xff0c;查阅(ID 2118136.2)&#xff0c;下载…

编译原理1

NFA&DFA 在正规式的等价证明可以借助正规集&#xff0c;也可以通过有限自动机DFA来证明等价&#xff0c;以下例题是针对DFA证明正规式的等价&#xff0c;主要步骤是①NFA&#xff1b;②状态转换表&#xff1b; ③状态转换矩阵&#xff1b; ④化简DFA&#xff1b; 文法和语…

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像 2024/7/2 18:19 rootok3588:/# rootok3588:/# rootok3588:/# lsusb Bus 005 Device 001: ID 1d6b:0002 Bus 003 Device 001: ID 1d6b:0001 Bus 001 Device 001: ID 1d6b:0002 Bus 006 Device 00…

llama-factory训练RLHF-PPO模型

理论上RLHF&#xff08;强化学习&#xff09;效果比sft好&#xff0c;也更难训练。ppo有采用阶段,步骤比较多,训练速度很慢. 记录下工作中使用llama-factory调试rlhf-ppo算法流程及参数配置,希望对大家有所帮助. llama-factory版本: 0.8.2 一 rlhf流程 ppo训练流程图如下, 会…

【Linux】—Xshell、Xftp安装

文章目录 前言一、下载Xshell、Xftp二、安装Xshell三、使用XShell连接Linux服务器四、修改windows的主机映射文件&#xff08;hosts文件&#xff09;五、远程连接hadoop102/hadoop103/hadoop104服务器六、安装Xftp 前言 XShell远程管理工具&#xff0c;可以在Windows界面下来访…