如何理解自動駕駛,SLAM,BEV,訓練數據源常見術語?(3)
圖17只能說類似,并不準確,后面也會具體說明的,這個深度信息可以構建一個偽3D模型(Point Cloud點云模式),類似圖15:
圖18看著還行,但把這個3D模型轉到BEV俯視角下,估計親娘都認不出來了:
圖19拍扁后結合特征Feature再做一次語義識別,形成:
圖20這個就是喜聞樂見的BEV圖了。以上是對LSS的直觀認知,算法層面是如何實現的?先給單個相機可拍攝的范圍構建一個立方體模樣的鐵絲籠子(高8寬22深41),祭出大殺器Blender:
圖21這里是示意圖,不要糾結于格子的數量和尺寸。這個3D網格代表的是一路相機的視錐體(Frustum),前面貼過視錐體的形狀(圖9),這里變形成立方體,在相機空間里看這個照片和這個立體網格的關系就是:
圖22右邊是個正對著網格立方體的相機示意圖,相片提取深度后(深度圖的實際像素尺寸是高8寬22):
圖23把這個深度圖按照每個像素的深度沿著紅線方向展開(Lift)后:
圖24可以看到,部分深度像素已經超出了視錐體的范圍,因為LSS一開始就假設了這么個有限范圍的籠子,超出部分直接過濾掉。這里必須提醒一下:LSS并不是直接算出每個像素的深度,而是推理出每個像素可能處于籠子里每個格子的概率,圖24是已經通過Softmax提取出每個像素最有可能位于哪個格子,然后把它裝進對應格子的示意結果,便于理解,更準確的描述如下:
圖25在圖25中選取深度圖的某個像素(紅色格子,事實上LSS的深度圖分辨率是很小的,默認只有8*22像素,所以這里可以用一個格子當做一個像素),它隸屬于籠子下方邊沿的一條深度格子(這條格子其實就代表相機沿著深度看向遠方的一條視線):
圖26圖25中的那個紅色的深度像素,沿著圖26這條視線格子的概率分布就是:
圖27黃線的起伏表示2D深度圖像素在Lift后沿著視線3D深度的概率分布(Depth Distribution,我這是示意性得畫法,不是嚴格按照實際數據做的)。等價于LSS論文里的這張圖:
圖28
LSS中構建立方籠子的代碼位于:
class LiftSplatShoot(nn.Module):
def __init__(self, grid_conf, data_aug_conf, outC):
self.frustum = self.create_frustum()
def create_frustum(self):
# D x H x W x 3
frustum = torch.stack((xs, ys, ds), -1)
return nn.Parameter(frustum, requires_grad=False)
def get_geometry(self, rots, trans, intrins, post_rots, post_trans):
"""Determine the (x,y,z) locations (in the ego frame)
of the points in the point cloud.
Returns B x N x D x H/downsample x W/downsample x 3
"""
B, N, _ = trans.shape
# undo post-transformation
# B x N x D x H x W x 3
points = self.frustum - post_trans.view(B, N, 1, 1, 1, 3)
points = torch.inverse(post_rots).view(B, N, 1, 1, 1, 3, 3).matmul(points.unsqueeze(-1))
# cam_to_ego
points = torch.cat((points[:, :, :, :, :, :2] * points[:, :, :, :, :, 2:3],
points[:, :, :, :, :, 2:3]
), 5)
combine = rots.matmul(torch.inverse(intrins))
points = combine.view(B, N, 1, 1, 1, 3, 3).matmul(points).squeeze(-1)
points += trans.view(B, N, 1, 1, 1, 3)
return points*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。






