【論文筆記】FSD V2: Improving Fully Sparse 3D Object Detection with Virtual Voxels

原文鏈接:https://arxiv.org/abs/2308.03755

1. 引言

完全稀疏檢測器在基于激光雷達的3D目標檢測中有較高的效率和有效性,特別是對于長距離場景而言。

但是,由于點云的稀疏性,完全稀疏檢測器面臨的一大困難是中心特征丟失(CFM),即因為點云往往分布在物體表面,物體的中心特征通常會缺失。FSD引入實例級表達,通過聚類獲取實例,并提取實例級特征進行邊界框預測,以避免使用物體中心特征。但由于實例級表達有較強的歸納偏好,其泛化性不足。例如,聚類時需要對各類預定義閾值,且難以找到最優值;在擁擠的場景中可能使得多個實例被識別為一個實體,導致漏檢。

本文提出FSDv2,丟棄了FSD中的實例級表達,以追求更高的泛化性。本文引入虛擬體素以替代FSD中的實例,這些虛擬體素通過體素化投票中心得到。為減輕投票質量低帶來的影響,虛擬體素被輸入輕量級的稀疏虛擬體素混合器(VVM)增強特征,聚合屬于同一物體不同虛擬體素的特征,得到覆蓋整個實例的特征。VVM模擬了FSD中的實例級特征提取,但不顯式地生成實例,以避免產生手工的歸納偏好。由于虛擬體素位于物體中心附近,可將虛擬體素作為“錨點”,從中預測邊界框;這可減輕正負樣本的不平衡性。

2. 相關工作

2.1 密集檢測器

密集檢測器(如VoxelNet和PointPillars)將點云轉化為密集的3D體素或2D BEV,并使用密集的3D卷積或2D卷積處理。

2.2 半密集檢測器

半密集檢測器(如SECOND和CenterPoint)將點云轉化為稀疏3D體素,使用稀疏3D卷積處理后得到2D密集BEV特征,輸入檢測頭進行檢測。其余方法使用Transformer結構增強稀疏主干。

2.3 完全稀疏檢測器

完全稀疏檢測器(如PointRCNN和VoteNet)基于點云進行檢測,無需將點云轉化為體素。FSD避免了點云處理中耗時的操作。

3. 準備知識

3.1 FSDv1的整體設計

FSDv1主要包含3部分:(1)點特征提取:使用稀疏體素特征提取器提取體素特征,然后使用基于MLP的頸部網絡將體素特征轉化為點特征。最后使用輕量級的逐點MLP進行逐點分類和中心投票。(2)聚類:將連接組件標簽(CCL)應用在投票的中心,以將點聚類為實例。(3)實例特征提取和邊界框預測:詳見下文。

3.2 稀疏實例識別

FSDv1實例特征提取的核心是稀疏實例識別(SIR)。

首先,初始的實例點特征輸入MLP,并通過最大池化得到實例特征,與實例各點的特征拼接,輸入到另一MLP壓縮通道維度。迭代執行上述步驟后,將最大池化的結果用于邊界框預測。該方法類似一系列PointNet層。

4. 方法

4.1 總體結構

如下圖所示,首先使用稀疏體素特征提取器作為主干,并使用MLP用于逐點分類和中心投票(與FSDv1相同)。FSDv2使用虛擬體素化替代聚類,并使用虛擬體素混合器混合不同虛擬體素的特征,用于預測邊界框。
在這里插入圖片描述

4.2 虛擬體素化

4.2.1 虛擬體素

使用投票中心創建虛擬體素。具體來說,對于每個前景點,預測偏移量得到投票中心。然后將各投票中心與原始點云的并集體素化。虛擬體素即至少包含一個投票中心的體素,而僅含真實點的體素則稱為真實體素

雖然投票中心可能有很多,但虛擬體素一般較少,因為投票中心往往彼此接近,且體素大小會設置得比通常更大(主干已經捕捉了細粒度特征,此處無需高分辨率)。

4.2.2 虛擬體素特征編碼

引入虛擬體素編碼器,類似FSDv1中的SIR結構,區別在于FSDv1提取實例特征而本文提取體素特征。首先為投票中心生成特征,此處將生成投票中心的點的(經過主干編碼后的)特征作為投票中心特征,并將預測偏移量作為額外特征以與真實點區分。對于真實點則設置虛擬偏移量0。然后使用SIR結構聚合虛擬體素內真實點和虛擬點的特征。

4.3 虛擬體素混合器

虛擬體素混合器(VVM)用于混合虛擬體素特征、真實體素特征和主干輸出的多尺度特征。

4.3.1 混合虛擬體素特征的動機

當中心投票效果不佳時,一個物體的中心附近可能會有多個虛擬體素,但這些體素沒有交互。

4.3.2 混合虛擬體素與真實體素的動機

由于虛擬體素來自預測的前景點,當預測不準時會有前景信息損失。

4.3.3 混合多尺度特征

多尺度特征包含主干輸出的多尺度真實體素特征和4.1節中得到的虛擬/真實體素特征。由于特征是稀疏而不規則的,多尺度特征融合不能像圖像一樣進行通道維度的拼接。

設(相對于虛擬體素特征的)步長 s s s下的稀疏特征為 F s ∈ R N s × C s F_s\in\mathbb{R}^{N_s\times C_s} Fs?RNs?×Cs?,其中 N s N_s Ns?為體素數, C s C_s Cs?為通道數。體素的坐標為 I s ∈ R N s × 3 I_s\in\mathbb{R}^{N_s\times 3} Is?RNs?×3,轉化到 s ~ \tilde{s} s~步長下的坐標為 I s s ~ I_s^{\tilde{s}} Iss~?。虛擬體素化得到的特征為 F 1 F_1 F1?。首先將 I s I_s Is?轉化為 I s 1 I_s^1 Is1?
I s 1 = I s × s + ? s / 2 ? I_s^1=I_s\times s+\lfloor{s/2}\rfloor Is1?=Is?×s+?s/2?
按下式得到聚合的稀疏特征和體素坐標:
F a g g = Concat ( Linear ( F 1 ) , Linear ( F 2 ) , ? , Linear ( F L ) ) I a g g = Concat ( I 1 , I 2 1 , ? , I L 1 ) F_{agg}=\text{Concat}(\text{Linear}(F_1),\text{Linear}(F_2),\cdots,\text{Linear}(F_L))\\ I_{agg}=\text{Concat}(I_1,I_2^1,\cdots,I_L^1) Fagg?=Concat(Linear(F1?),Linear(F2?),?,Linear(FL?))Iagg?=Concat(I1?,I21?,?,IL1?)
其中線性層用于將特征轉換為相同的通道數。

注意 I a g g I_{agg} Iagg?可能包含重復元素,因為不同尺寸的體素可能有相同的坐標。本文使用動態池化操作DP來去除重復坐標,將重復坐標對應的特征求取均值,得到單一特征。

4.3.4 VVM的模型結構

使用SparseUNet處理上述聚合結果。

4.4 討論:聚類v.s.虛擬體素

當中心投票一致時,所有投票中心位于同一虛擬體素內,假設聚類是完美的,則本文的虛擬體素化方法與FSDv1的實例表達類似。

但當中心投票不一致時,會導致多個虛擬體素,每個體素編碼了物體的部分形狀。虛擬體素混合器使得虛擬體素之間可以交互,以編碼完整幾何信息。此時也與FSDv1的實例表達類似。

總的來說,本文的方法可以避免SIR中的手工參數設計,使得模型更簡單通用。

4.5 虛擬體素分配

4.5.1 潛在的設計選擇

傳統的分配方法對于虛擬體素而言是次優的。因為:

  • 虛擬體素不總是填充物體中心,特別是對于遠處或大型物體。因此,基于中心的分配方法是不可行的。
  • 基于錨框的方法需要逐類的超參數(如錨框大小),這和本文提高泛化性的設計思路沖突。
  • 最近體素分配方法(將離中心最近的體素分配給對應的物體)會導致模糊性且阻礙優化。因為多個虛擬體素可能位于同一物體中心附近,但只有一個能作為匹配結果。

4.5.2 本文的方法:邊界框內體素分配

本文將邊界框內的所有虛擬體素作為正樣本。

  • 由于虛擬體素數遠少于真實體素數,不會導致不同物體的正樣本數不平衡。且能提高點很少的物體的召回率。
  • 由于虛擬體素分布于物體中心附近,考慮所有虛擬體素不會導致回歸目標有較大方差。
  • 由于真實的邊界框標注不會重疊,且點云的稀疏性保證邊界框內不包含背景噪聲,使得這種分配方法可靠。這解釋了為什么基于圖像的2D檢測需要更加復雜的策略。

4.5.3 虛擬體素位置定義

直接的方法是將體素的幾何中心作為虛擬體素的位置,但會導致不精確性和模糊性,因為體素的大小可能會超過一些小物體的大小。

本文考慮體素內點的分布,將體素的位置定義為所含點的加權中心:
x ˉ = ∑ i = 0 N ? 1 I ( x i ) x i ∑ i = 0 N ? 1 I ( x i ) \bar{x}=\frac{\sum_{i=0}^{N-1}I(x_i)x_i}{\sum_{i=0}^{N-1}I(x_i)} xˉ=i=0N?1?I(xi?)i=0N?1?I(xi?)xi??
其中
I ( x ) = { 1 , 若 x ∈ F α , 若 x ? F I(x)=\left\{\begin{matrix}1,& 若x\in \mathbb{F}\\\alpha,&若x\notin \mathbb{F}\end{matrix}\right. I(x)={1,α,?xFx/F?
其中 F \mathbb{F} F為前景點(包含原始點和投票中心)集合, α ∈ [ 0 , 1 ] \alpha\in[0,1] α[0,1]

4.6 虛擬體素頭

VVM輸出的虛擬體素特征會輸入一組MLP預測最終邊界框。本文類似CenterPoint進行類別分組。分類分支使用Focal損失,回歸分支使用L1損失,回歸對象包含虛擬體素幾何中心到物體邊界框質心的偏移量、尺寸的對數以及朝向角的正余弦。

5. 實驗

5.3 主要結果

在WOD數據集和Argoverse數據集上,本文的方法能達到SotA;在nuScenes數據集上,本文的方法能與SotA性能相當。

5.4 聚類v.s.虛擬體素

5.4.1 統計數據

  • 對于大型物體,通常對應多個虛擬體素,且虛擬體素的數量大于聚類簇的數量,這表明VVM的必要性。
  • 對小型物體,虛擬體素和簇的數量都很少,此時二者功能相當。
  • 大型車輛的真實體素比簇和虛擬體素的數量多很多,這表明使用真實體素進行預測會導致不同大小物體的不平衡,而使用較少的虛擬體素預測能減輕這一問題。

5.4.2 擁擠場景的性能

若一個物體和與其最近的同類物體的距離小于2m,則定義該物體處于擁擠場景。性能分解表明,相比于FSDv1,FSDv2在擁擠場景物體上的性能提升比常規場景更大。

5.4.3 消除歸納偏好的有效性

實驗表明,FSDv1隨訓練輪數的增加,性能逐漸飽和;而FSDv2的性能持續上升。

5.5 主要消融研究

5.5.1 基準方案設置

  • 不生成投票中心,但保留投票損失作為額外監督。
  • 僅對真實點使用體素化和體素編碼,沒有虛擬體素。
  • 真實體素不通過混合器,直接輸入檢測頭預測結果。
  • 由于虛擬體素分配策略對小物體檢測有重要影響,保留之。
    實驗表明,逐步增加本文提出的模塊能在各數據集上一致提高性能。且混合器和虛擬體素對相對大型的物體有性能提升。

5.6 每個組件的性能分析

5.6.1 虛擬體素的有效性

為理解虛擬體素機制的作用,本文設計退化策略,即為預測的中心投票偏移量乘上一個縮放因數 s ∈ [ 0 , 1 ] s\in[0,1] s[0,1],當 s = 1 s=1 s=1時為FSDv2的正常情況; s = 0 s=0 s=0時虛擬體素完全退化。實驗表明:

  • 大型物體在大縮放因數下的性能較好。因為大型物體的中心包含空體素的可能性更高。
  • 縮放因數對小型物體的影響很小。因為此時的偏移量很小,不同縮放因數下的虛擬體素位置接近。
  • 對于barrier類別,大縮放因數能極大地提升性能。這是因為通常它們相鄰放置,小縮放因數會導致從兩個相鄰實例的邊界預測,導致模糊性。

5.6.2 虛擬體素編碼器(VVE)的作用

將投票中心的特征置零后進行編碼(這樣,虛擬體素的特征僅來自真實點)。實驗表明,上述改動會導致性能下降,且VVE對小物體的性能提升更明顯。

5.6.3 虛擬體素混合器的輸入

考慮三種組合:(1)僅輸入虛擬體素;(2)輸入虛擬體素和真實體素;(3)輸入虛擬體素和多尺度體素。實驗表明引入真實體素能極大提高性能,多尺度體素能在多數類別上進一步提高性能。

5.6.4 虛擬體素分配的作用

實驗表明:

  • 略微增大小物體的GT框能幫助分配更多標簽,但過分增大會因為噪聲或邊界框重疊而降低性能。
  • 使用虛擬體素質心比幾何中心對小物體更有利,進一步使用加權質心能進一步提高性能。
    使用最近虛擬體素分配方法會導致性能嚴重下降,但增加分配的虛擬體素數量能減小性能下降。考慮最近的10個虛擬體素時性能達到飽和。

5.6.5 虛擬體素大小

實驗表明,性能對虛擬體素的大小不敏感,且更大的體素能有略高的性能,這是因為此時大型物體的虛擬體素更少,不同大小物體的樣本不平衡性被減輕。

5.7 運行時間評估

實驗表明,FSDv2比FSDv1有更高的性能和效率。其中FSDv2的虛擬體素化與體素編碼比FSDv1的聚類有更快的速度,但混合器考慮了真實體素,比FSDv1的SIR更慢。

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

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

相關文章

vFW搭建IRF

正文共:2328字 40圖,預估閱讀時間:5 分鐘 IRF(Intelligent Resilient Framework,智能彈性架構)技術通過將多臺設備連接在一起,虛擬化成一臺設備,集成多臺設備的硬件資源和軟件處理能…

C++如何通過調用ffmpeg接口對H265文件進行編碼和解碼

要對H265文件進行編碼和解碼&#xff0c;需要使用FFmpeg庫提供的相關API。以下是一個簡單的C程序&#xff0c;演示如何使用FFmpeg進行H265文件的編碼和解碼&#xff1a; 編碼&#xff1a; #include <cstdlib> #include <cstdio> #include <cstring> #inclu…

兩個月軟考-高項上岸

文章目錄 前言結緣軟考功虧一簣有始有終2個月計劃資料部分計劃截圖 總結 前言 我們看小說或者電視劇電影都會看到這樣的情節&#xff0c;主角一開始錦衣玉食&#xff0c;突然家道中落&#xff0c;啥都沒了&#xff0c;主角再一路奮起重新找回了屬于自己的一切&#xff1b;還有…

Vue項目中實現瀏覽器標簽頁名字的動態修改

修改router/index.js文件 路由條目下面添加meta屬性 meta:{title:DevOps運維平臺 }示例 使用Vue的全局守衛函數beforeEach&#xff0c;在路由切換前動態修改瀏覽器標簽頁名字 router.beforeEach((to,from,next) > {document.title to.meta.titlenext() })

Error: Cannot find module ‘E:\Workspace_zwf\mall\build\webpack.dev.conf.js‘

執行&#xff1a;npm run dev E:\Workspace_zwf\zengwenfeng-master>npm run dev> mall-app-web1.0.0 dev E:\Workspace_zwf\zengwenfeng-master > webpack-dev-server --inline --progress --config build/webpack.dev.conf.jsinternal/modules/cjs/loader.js:983thr…

[筆記]ARMv7/ARMv8 交叉編譯器下載

開發 Cortex-A7、Cortex-A72 或其他 ARM 架構 profile 芯片時&#xff0c;經常需要下載對應架構的交叉編譯器&#xff0c;所以寫這篇筆記&#xff0c;用于記錄一下交叉編譯器下載流程&#xff0c;免得搞忘。 編譯環境&#xff1a;ubuntu 虛擬機 下載地址 我們可以從 ARM 官網…

09 視頻分片上傳Minio和播放

文章目錄 一、流程設計1. 分片上傳實現思路2. 文件分片上傳流程3. 視頻播放流程 二、代碼實現1. 后端代碼2. 文件上傳前端代碼3. 視頻播放前端代碼 一、流程設計 1. 分片上傳實現思路 2. 文件分片上傳流程 3. 視頻播放流程 二、代碼實現 1. 后端代碼 pom.xml <dependenc…

多線程案例-單例模式

單例模式 設計模式的概念 設計模式好比象棋中的"棋譜".紅方當頭炮,黑方馬來跳.針對紅方的一些走法,黑方應招的時候有一些固定的套路.按照套路來走局勢就不會吃虧. 軟件開發中也有很多常見的"問題場景".針對這些問題的場景,大佬們總結出了一些固定的套路.按…

vue實現可拖拽列表

直接上代碼 <!-- vue實現可拖拽列表 --> <template><div><button click"logcolig">打印數據</button><TransitionGroup name"list" tag"div" class"container"><divclass"item"v-f…

常見請求頭與響應頭你了解哪些?

常見的 HTTP 請求頭和響應頭包括&#xff1a; 常見的請求頭&#xff1a; User-Agent&#xff1a;標識客戶端代理信息&#xff0c;通常用于識別用戶使用的瀏覽器或設備類型。 Accept&#xff1a;指示客戶端可以接受的內容類型&#xff0c;例如 text/html, application/json 等…

深度學習記錄--激活函數

激活函數的種類 對于激活函數的選擇&#xff0c;通常有以下幾種 sigmoid&#xff0c;tanh&#xff0c;ReLU&#xff0c;leaky ReLU 激活函數的選擇 之前logistic回歸一直使用的激活函數都是sigmoid函數&#xff0c;但一般來說&#xff0c;tanh函數是比sigmoid函數更加好的選…

【Python】 生成二維碼

創建了一個使用 python 創建二維碼的程序。 下面是生成的程序的圖像。 功能描述 輸入網址&#xff08;URL&#xff09;。 輸入二維碼的名稱。 當單擊 QR 碼生成按鈕時&#xff0c;將使用 QRname 中輸入的字符將 QR 碼生成為圖像。 程序代碼 import qrcode import tkinterd…

java泛型:泛型類,泛型方法

今日記錄我的泛型使用&#xff0c;供后期查閱。 主要包含泛型類&#xff0c;泛型屬性&#xff0c;泛型方法&#xff0c;靜態方法中使用泛型。 public class GenericOperationResultRep<T> {private boolean success; // 是否操作成功。true&#xff0c;成功&#xff1b;f…

Oracle的錯誤信息幫助:Error Help

今天看手冊時&#xff0c;發現上面有個提示&#xff1a; Error messages are now available in Error Help. 點擊 View Error Help&#xff0c;顯示如下&#xff0c;其實就是oerr命令的圖形化版本&#xff1a; 點擊Database Error Message Index&#xff0c;以下界面等同于命令…

[Kadane算法,前綴和思想]元素和最大的子矩陣

元素和最大的子矩陣 題目描述 輸入一個n級方陣&#xff0c;請找到此矩陣的一個子矩陣&#xff0c;此子矩陣的各個元素的和是所有子矩陣中最大的&#xff0c;輸出這個子矩陣及這個最大的和。 關于輸入 首先輸入方陣的級數n&#xff0c; 然后輸入方陣中各個元素。 關于輸出 …

車載藍牙音樂流程簡單分析

關鍵類&#xff1a; /packages/apps/Bluetooth/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerStateMachine.java /packages/apps/Bluetooth/src/com/android/bluetooth/avrcpcontroller/AvrcpControllerService.java 一、音樂播放狀態 CPP中通過JNI接口將接從…

Python中利用遺傳算法探索迷宮出路

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 當處理迷宮問題時&#xff0c;遺傳算法提供了一種創新的解決方案。本文將深入探討如何運用Python和遺傳算法來解決迷宮問題。迷宮問題是一個經典的尋路問題&#xff0c;尋找從起點到終點的最佳路徑。遺傳算法是一…

ActiveMQ斷線重連技巧,即通信高可用的配置

最近在做一個內部應用的時候&#xff0c;應用到了ActiveMQ作為服務之間消息傳遞&#xff0c;解耦服務之間的關聯&#xff0c;但是在應用的過程中遇到了連接斷線無法重連的問題&#xff0c;下面基于這個問題&#xff0c;深入了解一下ActiveMQ的一些相關原理和知識。 一、前置知…

springboot2 在Java項目中你們是如何配置時間格式響應給前端呢

在 Spring Boot 2 項目中配置時間格式&#xff0c;通常可以通過配置文件&#xff08;application.properties 或 application.yml&#xff09;或者通過 Java 代碼進行配置。以下是兩種常見的配置方式&#xff1a; 1. 通過配置文件配置時間格式&#xff1a; 在 application.pr…

mybaties plus插入數據,自動回顯 機制

結論&#xff1a;mybaties plus會將庫里數據自動回顯到 要插入的數據上 測試表格 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- 表結構 DROP TABLE IF EXISTS t_stu; CREATE TABLE t_stu (id int NOT NULL COMMENT id,name varchar(255) CHARACTER SET utf8mb4 COLLATE…