【論文閱讀】自動駕駛光流任務 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38505.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計?個?性能可?撐分桶多分?的庫存中?,提供單庫存分?不?扣減的合并庫存功能,并提供商 品操作庫存?庫的漸進性?緩存的實現

設計一個高性能的庫存中心,需要考慮多個方面,包括數據結構設計、存儲優化、庫存管理策略、緩存策略以及高并發處理能力。以下是設計這樣一個系統的一些關鍵點: ### 1. 系統架構設計 - **微服務架構**:采用微服務架構,…

基于1bitDAC的MU-MIMO的非線性預編碼算法matlab性能仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 基于1-bit DAC的非線性預編碼背景 4.2 ZF(Zero-Forcing) 4.3 WF(Water-Filling) 4.3 MRT(Maximum Ratio Transmission&…

uniapp做小程序內打開地圖展示位置信息

使用場景&#xff1a;項目中需要通過位置信息打開地圖查看當前位置信息在地圖那個位置&#xff0c;每個酒店有自己的經緯度和詳細地址&#xff0c;點擊地圖按鈕打開內置地圖如圖 方法如下&#xff1a; <view class"dttu" click"openMap(info.locationY,info.…

快照讀與當前讀 是怎樣的?

在數據庫系統中&#xff0c;快照讀&#xff08;Snapshot Read&#xff09;和當前讀&#xff08;Current Read&#xff09;是兩種不同的數據讀取方式&#xff0c;它們與事務的隔離級別和一致性保證緊密相關。 快照讀&#xff08;Snapshot Read&#xff09; 快照讀是一種讀取操…

Vue使用vue-cropper裁剪圖片作頭像

1.安裝 工程目錄下運行cmd npm install vue-cropper -S2.引用組件 全局引入&#xff0c;在main.js中添加 import VueCropper from vue-cropper Vue.use(VueCropper)3.使用裁剪框 這里httpUrl可以隨意選擇一張網絡圖片的連接作測試 <!-- 圖片裁剪框 --><div style…

(18)GPS/指南針(一)

文章目錄 前言 1 GPS/指南針 2 RTK GPS 3 GPS驅動程序選項 4 GPS自動切換 5 高級用途 前言 Copter/Plane/Rover 支持與 GPS、指南針和其他定位技術的整合&#xff1a; 1 GPS/指南針 Avionics Anonymous GNSS CompassAvionics Anonymous CompassBeitain BN-220 GPS / B…

源碼解讀:如何正確使用并區分@Resource和@Autowired注解?

環境&#xff1a;Spring5.3.23 源碼解讀&#xff1a;如何正確使用Resource和Autowired注解&#xff1f; 1.注解區別 Resource 和 Autowired 都可以用于&#xff0c;依賴注入。但它們之間存在一些明顯的區別。 1.提供方&#xff1a; Autowired 是 Spring 提供的注解。Resour…

[Labview] 改寫表格內容并儲存覆蓋Excel

在上一個功能的基礎上&#xff0c;新增表格改寫保存功能 [Labview] Excel讀表 & 輸出表單中選中的單元格內容https://blog.csdn.net/Katrina419/article/details/140120584 Excel修改前&#xff1a; 修改保存后&#xff0c;動態改寫儲存Excel&#xff0c;并重新寫入新的表…

[21] Opencv_CUDA應用之使用Haar級聯的對象檢測

Opencv_CUDA應用之使用Haar級聯的對象檢測 Haar級聯使用矩形特征來檢測對象,它使用不同大小的矩形來計算不同的線和邊緣特征。矩形包含一些黑色和白色區域,如下圖所示,它們在圖像的不同位置居中 類Haar特征檢測算法的思想是計算矩形內白色像素和黑色像素之間的差異這個方法的…

【HDC.2024】云原生中間件,構筑軟件安全可信的連接橋梁

近日&#xff0c;在華為云開發者大會2024期間&#xff0c;來自華為云PaaS服務&#xff0c;中間件領域產品團隊的資深專家、技術總監、高級產品經理等大咖們發表了以“云原生中間件&#xff0c;構筑軟件安全可信的連接橋梁”為主題的專題演講。 演講伊始&#xff0c;華為云產品…

Python編程使用openai的API訪問oneapi暴露的ollama qwen2大模型

首先安裝conda 安裝Python 3.12 &#xff08;低版本的可能缺少openai庫&#xff09; conda create -n py312 python3.12 conda activate py312 然后 pip install openai 提示&#xff1a; Installing collected packages: openai Successfully installed openai-1.35.…

關于 Mybatis 的開啟二級緩存返回對象不一致問題

做實驗報告的時候&#xff0c;跟著學習&#xff0c;發現我已經將 開啟 二級緩存的 配置都配置好了&#xff0c;但是返回值地址不一致&#xff0c;說明對象不一致&#xff0c;二級緩存命中失敗。 跟著流程配置&#xff1a; mybatis-config <settings><!-- 啟用 myba…

你喜歡波段交易嗎?

波段交易的核心在于精準捕捉市場中的長期趨勢波動&#xff0c;以實現更為穩健的收益。與剝頭皮和日內交易不同&#xff0c;波段交易者更傾向于持有交易頭寸數日乃至數周&#xff0c;以更寬廣的視角把握市場動態。 這種交易方式的優勢在于&#xff0c;它降低了對即時市場反應的…

【Gin】項目搭建 一

環境準備 首先確保自己電腦安裝了Golang 開始項目 1、初始化項目 mkdir gin-hello; # 創建文件夾 cd gin-hello; # 需要到剛創建的文件夾里操作 go mod init goserver; # 初始化項目&#xff0c;項目名稱&#xff1a;goserver go get -u github.com/gin-gonic/gin; # 下載…

動態規劃算法,完全零基礎小白教程!不是計算機的都能學會!萬字吐血詳解。

目錄 一、動態規劃算法概念 題一 1、算法解析 1&#xff09;確定狀態&#xff1a; ?2&#xff09;狀態轉移方程&#xff1a; ?3&#xff09;初始化&#xff1a; 4&#xff09;填表順序&#xff1a; 5&#xff09;返回值&#xff1a; 2、代碼 題二 1、算法解析 1、確…

如何理解MySql的MVCC機制

MVCC是什么 MySQL的MVCC機制&#xff0c;全稱為多版本并發控制&#xff08;Multi-VersionConcurrency Control&#xff09;&#xff0c;是一種提高數據庫并發性能的技術。MVCC的主要目的是在保證數據一致性的同時&#xff0c;提高數據庫的并發性能。 它通過為每個讀操作創建數…

【高中數學/三角函數】已知:x,y皆為實數,且4x^2+y^2+xy=1 求:2x+y的最大值

【問題】 已知&#xff1a;x,y皆為實數&#xff0c;且4x^2y^2xy1 求&#xff1a;2xy的最大值 【問題來源】 https://www.ixigua.com/7289764285772497448?logTag0d228277f3a8e049ab6d 【解答】 解&#xff1a; 由4x^2y^2xy1 可得 15/4*x^21/4*x^2xyy^21 得到(15開方/…

智能版面設計:指令跟隨模型在自動布局規劃中的應用

在廣告行業一個吸引人的視覺布局能夠顯著提升信息的傳播效果。但對于非專業設計師來說&#xff0c;創建既美觀又功能性強的布局常常是一項挑戰。他們往往缺乏必要的設計技能、審美訓練或資源來快速實現創意構想。傳統的設計軟件和在線工具雖然提供了一些模板和指導&#xff0c;…

0702_ARM6

練習&#xff1a; 中斷實驗 main.c #include "key.h" int main() {//初始化rcc gpiohal_key_rcc_gpio_init();//初始化extihal_key_exti_init();//初始化gichal_key_gic_init();while(1){}return 0; }key.c #include "key.h"//GPIOF初始化 void hal_key_…

Linux的一些雜項函數總結

getopt_long 解析命令行。 參考&#xff1a; C語言linux getopt_long()函數&#xff08;命令行解析&#xff09;&#xff08;getopt、getopt_long_only&#xff09;&#xff08;短選項 -&#xff0c;長選項 --&#xff09;&#xff08;option結構體&#xff09;&#xff08;opt…