Simple-BEV的bilinear_sample 作為view_transformer的解析,核心是3D-2D關聯點生成

文件路徑models/view_transformers

父類 是class BiLinearSample(nn.Module)基于https://github.com/aharley/simple_bev。

函數解析

  • 函數bev_coord_to_feature_coord的功能

鳥瞰圖3D坐標通過多相機(針孔/魚眼)內外參投影圖像特征平面,生成歸一化采樣坐標與有效掩碼,實現多視角特征的空間對齊與融合篩選。
代碼

def bev_coord_to_feature_coord(self, features, block_idxs, extrin_camera_to_ego, intrinsic, dist, ida, dist_type='KB'):...

首先:函數接收多個參數,包括特征、塊索引、外參、內參、畸變參數等。
然后:處理不同相機類型(針孔和魚眼)的索引
然后:生成3D點(通過gridcloud3d()函數實現,非均勻空間采樣),將記憶坐標系中的點轉換到自我車輛坐標系(get_bevgrid()matrix_mem_egocar)。并通過外參矩陣轉換到相機坐標系。對于針孔相機,計算投影點,并進行畸變校正,然后將坐標轉換到特征圖的比例。對于魚眼相機,處理類似,但使用了不同的畸變模型。
最后:合并兩種相機的結果,并根據塊索引屏蔽某些相機的特征。

這里面核心的是“對于針孔/魚眼相機,計算投影點”。
首先,生成相機索引

pinhole_index = torch.cat([torch.arange(num_cams_pinhole) + self.num_cams * i for i in range(B)])
fisheye_index = torch.cat([torch.arange(num_cams_pinhole, num_cams_pinhole+ num_cams_fisheye) + self.num_cams * i for i in range(B)])

操作演示,num_cams_pinhole有1個,num_cams_fisheye有4個,num_cams 是5個。
在這里插入圖片描述
然后用pinhole_index 和fisheye_index 索引取get_bevgrid()生成的3D點。
然后用內外參數將3D點轉換到圖像2D點

        # 投影3D點到2D圖譜 (原始圖像尺寸是 2160x3840)外參逆矩陣 = 外參矩陣.inverse()2D圖像的點 = (內參矩陣 @ 外參逆矩陣)@ 3D點  # 尺寸是(BN,4,K)2D圖像的點 = 2D圖像的點.transpose(2, 1)  #  尺寸是(BN, k, 4)2D深度檢測Mark = (2D圖像的點[:, :, 2] > 0.0).bool() # 投影點的深度(z坐標)是否為正值,排除位于相機后方的點(不可見)# (X, Y, Z, 1)-> (X/Z, Y/Z, 1, 1)2D圖像的點 = 2D圖像的點[0:2]/2D圖像的點[2]# 增加一個維度2D圖像的點 = torch.cat(2D圖像的點,ones)# 通過 ida_pinhole(圖像坐標系轉移矩陣)將歸一化坐標映射到圖像像素坐標。該矩陣通常包含焦距和主點偏移,完成從相機坐標系到圖像平面的投影。2D圖像的點 = 圖像坐標系轉移矩陣 @ 2D圖像的點# 縮放2D圖像的點 = 2D圖像的點/下采樣系數# 濾除無效區域的Mark2D的X軸檢測Mark = (2D圖像的點> -0.5).bool() & (2D圖像的點< float(寬度 - 0.5)).bool()2D的Y軸檢測Mark = (2D圖像的點> -0.5).bool() & (2D圖像的點< float(寬度 - 0.5)).bool()有效性Mark = (2D深度檢測Mark& 2D的X軸檢測Mark & 2D的Y軸檢測Mark)

對于魚眼相機

3D相機的點 = 外參逆矩陣 @ 3D點  # 
內參矩陣的仿射部分 = 內參[:2,:2]  # (焦距和軸間縮放),用于將歸一化坐標映射到圖像平面
內參矩陣中的主點坐標 = 內參[0:2, 2](圖像中心偏移),用于投影時的平移校正。
計算徑向距離 = X2 + Y2 的平方根
入射角  = torch.atan2(3D相機的點, 計算徑向距離)
徑向畸變系數 = self.polyval(畸變系數, 入射角, Kannala-Brandt模型) # 根據入射角 theta 計算徑向畸變系數 rho
歸一化的3D點 = 3D相機的點 × rho ÷ 計算徑向距離
2D魚眼點 = (內參矩陣的仿射部分 @ 歸一化的3D點) + 內參矩陣中的主點坐標# 通過 ida_fisheye(圖像坐標系轉移矩陣)將歸一化坐標映射到圖像像素坐標。該矩陣通常包含焦距和主點偏移,完成從相機坐標系到圖像平面的投影。
2D魚眼點 = ida_fisheye @ 2D魚眼點 # 從相機坐標系到圖像平面的投影
2D魚眼點 = 魚眼點/下采樣系數# 和針孔相機一樣
有效性Mark = (2D深度檢測Mark& 2D的X軸檢測Mark & 2D的Y軸檢測Mark)

最后返回的是:有效性Mark

補充:Kannala-Brandt模型介紹–點擊這里
在這里插入圖片描述在這里插入圖片描述

  • 函數gridcloud3d()功能是:

函數通過非均勻采樣生成三維網格點云,每個網格位置對應一個點,但不同區域的點密度可能不同。具體來說:

  • 函數forward_kestrel(),功能是:

該函數通過多相機特征采樣與體素聚合,將鳥瞰圖特征映射到3D空間并壓縮生成統一表征。

    def forward_kestrel(self, input):# 獲得Neck傳過來的特征features = input["bev_neck_features"]# features 復制Z次并在通道維度拼接features = torch.cat([features] * Z, 1)# 特征尺寸調整features = features.reshape(self.num_cams * Z, -1, 60, 128)# 得到 unproject_image_to_mem() 計算的xyz_pix 和 有效性Markxyz_pix , valid_mask= ...# 將2D特征映,通過xyz_pix ,利用GridSampleFuction映射函數,映射到3D特征trans_feats = self.GridSampleFuction().apply(features, xyz_pix, "bilinear","zeros", None)# 有效性Mark 刪除values = trans_feats* valid_mask# 特征被重塑values = values.reshape(B, self.num_cams, -1, X, Y)# 通道相加feat_mem = torch.sum(values, dim=1)# 通過 conv_norm 壓縮成鳥瞰圖特征feat_bev = self.bev_z_compressor(feat_mem)return feat_bev

首先是:輸入的features被復制Z次并在通道維度拼接,使用reshape將特征調整為(num_cams * Z, -1, 60, 128),這里num_cams可能代表相機數量,Z是體素深度層數。
然后:GridSampleFuction應用雙線性采樣,將特征映射到新的坐標,生成trans_feats。
然后:特征被重塑為(B, num_cams, -1, X, Y)。feat_mem 是將多個相機視角的3D特征沿相機數量維度(dim=1)求和后的融合特征,目的是整合不同視角的信息,得到feat_mem。
最后: 最后通過bev_z_compressor壓縮成鳥瞰圖特征feat_bev。

  • 函數unproject_image_to_mem(),功能是:得到xyz_pix, valid_mask,用于后續的GridSampleFuction采用。
    def unproject_image_to_mem(self, features, block_idxs, extrinsic, intrinsic, dist_mat, dist_type, ida_mat, X, Y, Z):BN, C, H, W = features.shape# get proj point on the feature map and then normalize to [-1, 1]xyz_feat, valid_mask = self.bev_coord_to_feature_coord(features, block_idxs, extrinsic, intrinsic, dist_mat, ida_mat, dist_type)x, y = xyz_feat[:, :, 0], xyz_feat[:, :, 1]x_norm, y_norm = self.normalize_grid2d(x, y, W, H)xyz_pix = torch.stack([x_norm, y_norm], axis=1)#import pdb; pdb.set_trace()xyz_pix = rearrange(xyz_pix, "n d (x y z) -> n (z d) x y", x=X, y=Y, z=Z)valid_mask = rearrange(valid_mask, "n (x y z) -> n z x y", x=X, y=Y, z=Z)return xyz_pix, valid_mask

首先通過 bev_coord_to_feature_coord()得到 2D點和有效性Mark
按照前述分析 2D 尺寸應該是類似(bn, k, 2),這里bn是批處理大小,k是柵格的數量(通過gridcloud3d()獲得),2是xy坐標。
對2D點的x和y進行歸一化到[-1,1],分別除以寬和高,組成新的 2D點。
最后,將三維空間中的點按高度(Z軸)分層,每層對應一個二維網格(X-Y平面)

問文心一言的問題:LSS(Lift-Splat-Shoot)和BEVDepth在3D點處理上有以下核心區別

回答:

LSS(Lift-Splat-Shoot)和BEVDepth在3D點處理上有以下核心區別:

LSS的3D點

  • 全體視錐體柵格:LSS將圖像特征提升到整個相機視錐體對應的3D體素網格中,覆蓋所有可能的深度層(如0-100米,按固定間隔分層)。
  • 概率分布:每個像素的特征會被分配到多個深度層,形成概率分布(通過深度預測或幾何計算),而非單一深度值。
  • 目的:構建全局3D場景表示,適用于復雜場景理解(如多物體遮擋、非地面目標檢測)。

BEVDepth的柵格

  • BEV平面聚焦:BEVDepth通常將特征投影到鳥瞰圖(BEV)平面的柵格中(如地面區域),每個柵格對應一個位置,深度預測用于確定該位置是否存在有效特征。
  • 單一深度假設:每個柵格可能僅保留最可能的深度值(如通過深度網絡預測),或基于幾何投影選擇有效層。
  • 目的:高效生成BEV空間特征,尤其適合自動駕駛中地面目標檢測(如車輛、行人),減少計算冗余。

柵格點數量減少

  • LSS:在全體視錐體空間生成三維體素網格(如 100 層深度 × X×Y),覆蓋整個相機視野的 3D 空間。
  • BEVDepth:將特征投影到二維 BEV 平面柵格(如地面區域),僅保留與地面感知相關的位置,深度維度被壓縮為單層(通過深度預測或幾何投影篩選)。
  • 結論:BEVDepth 的柵格點數量顯著減少(從三維到二維),降低了顯存占用和計算復雜度。

總結:

  • LSS的3D點是全體視錐體的分層柵格,強調3D空間的完整建模。
  • BEVDepth的柵格是BEV平面的深度預測結果,側重地面區域的緊湊表示。
  • 兩者均可結合使用(如BEVDepth可能用LSS作為 backbone),但核心差異在于對3D空間的覆蓋范圍和深度建模方式。

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

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

相關文章

A/B測試入門指南

目錄 一、什么是A/B測試1.1 A/A測試1.2 多變量測試 二、A/B測試應用場景三、A/B測試基本流程四、A/B測試面試真題4.1 【是什么】4.2 【為什么】4.3 【怎么做】 五、應用實戰 一、什么是A/B測試 A/B 測試是一種常見的實驗方法&#xff0c;用于比較兩個或多個方案的效果&#xff…

自己構建的交叉編譯器找不到PATH_MAX

接上篇centos6.10 編譯gcc11.5 x64到aarch64交叉工具鏈 -CSDN博客 PATH_MAX找不到&#xff0c;不僅在編譯gcc的過程中遇到&#xff0c;而且臨時改gcc源碼添加#define PATH_MAX 4096 宏定義后勉強通過gcc全量編譯。這個新的gcc編譯使用了PATH_MAX宏的代碼還是會找不到。這個問題…

vscode查看文件歷史git commit記錄

方案一&#xff1a;GitLens 在vscode擴展商店下載GitLens 選中要查看的文件&#xff0c;vscode界面右上角點擊GitLens的圖標&#xff0c;選擇Toggle File Blame 界面顯示當前打開文件的所有修改歷史記錄 鼠標放到某條記錄上&#xff0c;可以看到記錄詳情&#xff0c;選中O…

ngx_http_conf_ctx_t

定義在 src/http/ngx_http_config.h typedef struct {void **main_conf;void **srv_conf;void **loc_conf; } ngx_http_conf_ctx_t; ngx_http_conf_ctx_t 是 Nginx 中用于管理 HTTP 配置上下文的核心結構體&#xff0c;其設計體現了 Nginx 多級配置&…

IREE AI編譯器編譯測試流程指南

iree onnx demo 計劃協議系列博客,記錄學習iree編譯器的過程. 今天第一篇博客,記錄安裝和測試iree 文章目錄 iree onnx demo下載安裝ireepython環境安裝編譯測試1. [前端] onnx模型轉MLIR文件2. [后端] MLIR文件轉可執行文件3. [執行] 執行測試編譯后的文件 關于后端設備的介…

【產品小白】如何運營一個新的產品

運營一個新產品既充滿機遇&#xff0c;也伴隨著挑戰。新產品運營的核心在于快速獲取用戶、驗證市場假設、持續迭代與優化&#xff0c;并通過有效的推廣和用戶反饋機制不斷完善產品。 1. 市場調研與定位 用戶調研&#xff1a;在產品初期&#xff0c;通過訪談、問卷、競品分析等…

破解驗證碼新利器:基于百度OCR與captcha-killer-modified插件的免費調用教程

破解驗證碼新利器&#xff1a;基于百度OCR與captcha-killer-modified插件的免費調用教程 引言 免責聲明&#xff1a; 本文提供的信息僅供參考&#xff0c;不承擔因操作產生的任何損失。讀者需自行判斷內容適用性&#xff0c;并遵守法律法規。作者不鼓勵非法行為&#xff0c;保…

JSON 解析中需要清理的危險字符

在代碼中 replace(chr(0), "") 的作用是刪除 JSON 響應中可能存在的空字符&#xff08;Null character&#xff09;。以下是詳細解釋&#xff1a; 1. chr(0) 是什么&#xff1f; chr(0) 表示 ASCII 碼為 0 的字符&#xff0c;即空字符&#xff08;Null Character&am…

指令系統2(Load/Store 指令)

一. Load/Store 指令 1. 前變址 前變址指令是在讀取或存儲數據時&#xff0c;先根據基址寄存器&#xff08;Rn&#xff09;與偏移量&#xff08;offset&#xff09;計算出有效地址&#xff0c;再進行數據操作。相關指令及示例如下&#xff1a; LDR R0, [R1, #4]&#xff1a;從…

ubuntu部署運行xinference全精度對話deepseek本地部署圖文教程

前置環境搭建勞請移步往期 source activate 自己環境名啟動python3.12環境安裝xinference&#xff0c; 按教程敲命令&#xff0c;wheel包與wsl的通用&#xff0c;pip install 包名。 vllm引擎&#xff0c;transform引擎也會順帶自動裝上了。 后續操作請參照往期教程。本地部署模…

技術分享 | MySQL內存使用率高問題排查

本文為墨天輪數據庫管理服務團隊第51期技術分享&#xff0c;內容原創&#xff0c;如需轉載請聯系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明來源。 一、問題現象 問題實例mysql進程實際內存使用率過高 二、問題排查 2.1 參數檢查 mysql版本 &#xff1a;8.0.…

[AI速讀]混合語言IP集成:挑戰與高效解決方案

在現代SoC(系統級芯片)設計中,IP(知識產權模塊)復用是提升開發效率的關鍵。然而,當設計涉及多種硬件描述語言(如SystemVerilog、VHDL、SystemC)時,如何高效集成不同語言的IP模塊成為一大難題。本文將從實際設計場景出發,探討混合語言IP集成的核心挑戰,并介紹一套方法…

【vulhub/wordpress靶場】------獲取webshell

1.進入靶場環境&#xff1a; 輸入&#xff1a;cd / vulhub / wordpress / pwnscriptum 修改版本號&#xff1a; vim docker-compose.yml version: 3 保存退出 開啟靶場環境&#xff1a; docker - compose up - d 開啟成功&#xff0c;docker ps查看端口 靶場環境80…

微信小程序:用戶拒絕小程序獲取當前位置后的處理辦法

【1】問題描述&#xff1a; 小程序在調用 wx.getLocation() 獲取用地理位置時&#xff0c;如果用戶選擇拒絕授權&#xff0c;代碼會直接拋出錯誤。如果再次調用 wx.getLocation() 時&#xff0c;就不會在彈窗詢問用戶是否允許授權。導致用戶想要重新允許獲取地理位置時&#x…

NLP 與常見的nlp應用

自然語言處理&#xff08;NLP&#xff09;是一個廣泛的領域&#xff0c;它不僅包括自然語言理解&#xff08;NLU&#xff09;&#xff0c;還涉及一系列其他任務和子領域。以下是NLP領域中的主要組成部分及其相關任務&#xff1a; 1. 自然語言理解&#xff08;NLU&#xff09; …

全網首創/純Qt/C++實現國標GB28181服務/實時視頻/云臺控制/預置位/錄像回放和下載/事件訂閱/語音對講

一、前言說明 用純Qt來實現這個GB28181的想法很久了&#xff0c;具體可以追溯到2014年&#xff0c;一晃十年都過去了&#xff0c;總算是整體的框架和邏輯都打通了&#xff0c;總歸還是雜七雜八的事情多&#xff0c;無法靜下心來研究具體的協議&#xff0c;最開始初步了解協議后…

Django+celery+flower

Djangoceleryflower Django的定時任務及可視化監控Django Django的定時任務及可視化監控 Django的定時任務&#xff0c;以及可視化監控。 Django Django&#xff1b; 首先在python中新建虛擬環境并激活 pip install virtualenv python -m venv venv source venv/bin/activa…

Python 編程題 第十一節:選擇排序、插入排序、刪除字符、目標移動、尾部的0

選擇排序 假定第一個為最小的為已排序序列&#xff0c;與后面的比較&#xff0c;找到未排序序列中最小的后&#xff0c;交換位置&#xff0c;獲得最小元素&#xff0c;依次往后 lst[1,14,25,31,21,13,6,8,14,9,7] def selection_sort(lst):for i in range(len(lst)):min_inde…

組態王Kingview配置為OPCUA服務器的一些問題處理

一、問題描述 1、組態王【運行配置】界面沒有【服務配置】的選項&#xff0c;無法將組態王Kingview配置為OPCUA服務器&#xff1b; 2、點擊組態王【運行配置界面】的【服務配置】選項彈窗警告提示【試圖執行的操作不受支持】&#xff0c;如下圖所示&#xff1a; 二、問題分析 …

模塊二 單元4 安裝AD+DC

模塊二 單元4 安裝ADDC 兩個任務&#xff1a; 1.安裝AD活動目錄 2.升級當前服務器為DC域控制器 安裝前的準備工作&#xff1a; 確定你要操作的服務器系統&#xff08;Windows server 2022&#xff09;&#xff1b; 之前的服務器系統默認是工作組的模式workgroup模式&#xff08…