【论文阅读】自动驾驶光流任务 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]].Tbefore_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=Zt⊙Ht−1+(1−Zt)⊙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 * qreturn 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
相关文章:

【论文阅读】自动驾驶光流任务 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.b…...

调和均值
文章目录 调和均值的定义和公式调和均值的几何解释调和均值的应用调和均值与算术平均和几何平均的比较示例 调和均值的定义和公式 调和均值是一种特殊的平均数,适用于处理涉及比率或速度的数据。对于一组正数 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1,x2…...

DP学习——模板模式
学而时习之,温故而知新。 字面理解 模板?啥叫模板?模板就是固定死了,就是一套流程/步骤上层写死了。固定死了的流程或者步骤就是模板。然后我们要重写或者改写的是写死的这套流程中的节点。俗称“套模板”。 使用场合ÿ…...

AOP在业务中的简单使用
背景 业务组有一些给开发用的后门接口,为了做到调用溯源,业务组最近需要记录所有接口的访问记录,暂时只需要记录接口的响应结果,如果调用失败,则记录异常信息。由于后门接口较多以及只是业务组内部轻度使用࿰…...

C# 用户权限界面的测试内容
测试用户权限界面的主要目标是确保权限管理功能按照设计工作,同时保证用户界面响应正确,不会出现意外的行为或安全漏洞。以下是C#中用户权限界面测试的一些关键内容: 1. 功能性测试 权限分配与撤销:测试权限的分配和撤销功能&am…...

PyCharm
一、介绍 PyCharm 是 JetBrains 公司开发的一款功能强大的 Python 集成开发环境(IDE)。它专为 Python 开发设计,提供了一系列强大的工具和功能,帮助开发者更高效地编写、调试和维护 Python 代码。以下是对 PyCharm 的详细介绍&am…...

【嵌入式开发 Linux 常用命令系列 1.5 -- grep 过滤特定类型文件】
请阅读【嵌入式开发学习必备专栏 】 文章目录 grep 过滤特定类型文件 grep 过滤特定类型文件 在Linux中使用grep搜索字符串时,如果你想排除特定类型的文件,比如 .map 和 .py 文件,可以使用grep的--exclude选项。这个选项允许你定义一个或多个…...

学习笔记——动态路由——OSPF(邻接/邻居)
十、OSPF的邻接/邻居 1、OSPF路由器之间的关系 (1)基本介绍 在OSPF网络中,为了交换链路状态信息和路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念。 OSPF路由器的两种关系&#x…...

k8s 答疑
1 如何修复容器中的 top 指令以及 /proc 文件系统中的信息呢? 这段自问自答的内容解释了如何通过使用 lxcfs 来修复 Docker 容器中 top 指令和 /proc 文件系统中的信息。让我们分步骤来详细说明: 背景信息 在容器化环境中,通常会遇到一个问题,即容器中的一些命令(如 to…...

[终端安全]-2 移动终端之硬件安全(SE)
本文主要介绍针对安全芯片的攻击和防护方案。 1 芯片攻击 1)故障注入攻击 故障注入攻击(Fault Injection Attack, FIA)是一种通过人为引入故障,诱发系统或芯片在异常情况下产生错误结果,从而泄露机密信息或破坏系统…...

数据库与SQL
数据库基本概念 数据库(DataBase):数据库就是存储数据的仓库数据库管理系统(DBMS):可以独立运行的软件,维护磁盘上的数据,用统一的方式维护不同种类的数据,做到通用且高效。常见的DBMS: mysqloracledb2sqlserver 数据…...

AIGC | 在机器学习工作站安装NVIDIA CUDA® 并行计算平台和编程模型
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x02.初识与安装 CUDA 并行计算平台和编程模型 什么是 CUDA? CUDA(Compute Unified Device Architecture)是英伟达(NVIDIA)推出的并行计算平台和编…...

【电商纯干货分享】干货速看!电商数据集数据API接口数据分析大全!
数据分析——深入探索中小企业数字化转型,专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板,为钻研于数据分析的朋友们加油充电。 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)…...

随手记录: Ubuntu NVIDIA显卡驱动安装后 屏幕亮度无法调节 无法连接外显示器等问题
背景 一句话:简单记录帮身边人装系统发现 GPU和外接显示器的无法连接,同时亮度无法调节等新问题 设备型号: 联想笔记本:ThinkBook 16p Gen2CPU:AMD Ryzen 7 5800HGPU:RTX 3060 问题描述及流程ÿ…...

Java:数组
文章目录 一、概念二、声明数组2.1 格式2.2 实例 三、初始化数组3.1 格式3.2 实例 四、处理数组4.1 for循环4.2 增强for循环 五、多维数组5.1 格式5.2 实例 一、概念 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。…...

【代码随想录——图论——岛屿问题】
1.岛屿数量 https://kamacoder.com/problempage.php?pid1171 1.1 深度优先搜索 package mainimport "fmt"var direction [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}func main() {var M, N intfmt.Scanln(&N, &M)sea : make([][]int, N)visited : make…...

异步调用 - 初识
目录 1、引入 2、同步调用 2.1、例子:支付功能 2.2、同步调用的好处 2.3、同步调用的缺点 3、异步调用 3.1、异步调用的方式 3.2、异步调用的优势 3.3、异步调用的缺点 3.4、什么场景下使用异步调用 3.5、MQ技术选型 1、引入 为什么想要异步通信呢&…...

Java 家庭物联网
家庭物联网系统的代码和说明,包括用户认证、设备控制、数据监控、通知和警报、日志记录以及WebSocket实时更新功能。 ### 项目结构 plaintext home-iot-system ├── backend │ └── src │ └── main │ └── java │ └…...

机器学习——随机森林
随机森林 1、集成学习方法 通过构造多个模型组合来解决单一的问题。它的原理是生成多个分类器/模型,各自独立的学习和做出预测。这些预测最后会结合成组合预测,因此优于任何一个单分类得到的预测。 2、什么是随机森林? 随机森林是一个包含…...

Java - JDK17语法新增特性(如果想知道Java - JDK17语法新增常见的特性的知识点,那么只看这一篇就足够了!)
前言:Java在2021年发布了最新的长期支持版本:JDK 17。这个版本引入了许多新的语法特性,提升了开发效率和代码可读性。本文将简要介绍一些常见的新特性,帮助开发者快速掌握并应用于实际开发中。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨…...

Linux-DNS
DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。…...

使用gitlab的CI/CD实现logseq笔记自动发布为单页应用
使用gitlab的CI/CD实现logseq笔记自动发布为单页应用 使用gitlab的CI/CD实现logseq笔记自动发布为单页应用如何实现将logseq的笔记发布成网站使用 logseq-publish-docker 实现手动发布使用gitlab的CI/CD实现自动发布过程中的问题及解决参考资料 使用gitlab的CI/CD实现logseq笔记…...

云联壹云 FinOps:赋能某车企公有云成本管理与精细化运营
背景 某车企,世界 500 强企业,使用了大量的公有云资源,分布于多家公有云,月消费在千万级别。 业务线多且分散,相关的云消耗由一个核心团队进行管理,本次案例的内容将围绕这些云成本的管理展开的。 需求 …...

C#静态类与非静态类
1、静态类 静态类有几个重要的特点: 1)无法实例化:由于静态类不能被实例化,因此它不会占用对象内存。 2)静态成员:静态类只能包含静态成员(静态方法、静态属性、静态事件等)。 3&am…...

亚信安全:《2024云安全技术发展白皮书》
标签 云计算 安全威胁 云安全技术 网络攻击 数据保护 一句话总结 《云安全技术发展白皮书》全面分析了云计算安全威胁的演进,探讨了云安全技术的发展历程、当前应用和未来趋势,强调了构建全面云安全防护体系的重要性。 摘要 云安全威胁演进ÿ…...

GuLi商城-商品服务-API-品牌管理-云存储开通与使用
这里学习下阿里云对象存储 地址:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 登录支付宝账号,找到了我以前开通的阿里云对象存储 熟悉下API 文档中心 简介_对象存储(OSS)-阿里云帮助中心 我们将用这种方式上传阿里云OSS...

git 命令行初始化并上传项目
XXXX 为项目名称 1. 初始化 cd D:\XXXX git init git remote add origin http://账号192.168.1.231:8088/r/XXXX.git 2. 拉取项目,做本地合并 git pull origin master git fetch origin git merge origin/master 3. 添加注释,上传 git add . git c…...

Spring框架Mvc(2)
1.传递数组 代码示例 结果 2.集合参数存储并进行存储类似集合类 代码示例 postman进行测试 ,测试结果 3.用Json来对其进行数据的传递 (1)Json是一个经常使用的用来表示对象的字符串 (2)Json字符串在字符串和对象…...

Python学习笔记29:进阶篇(十八)常见标准库使用之质量控制中的数据清洗
前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…...

【LLM】一、利用ollama本地部署大模型
目录 前言 一、Ollama 简介 1、什么是Ollama 2、特点: 二、Windows部署 1.下载 2.安装 3.测试安装 4.模型部署: 5.注意 三、 Docker部署 1.docker安装 2.ollama镜像拉取 3.ollama运行容器 4.模型部署: 5.注意: 总结 前言…...