如何理解自動(dòng)駕駛,SLAM,BEV,訓(xùn)練數(shù)據(jù)源常見術(shù)語(yǔ)?(3)
圖17只能說類似,并不準(zhǔn)確,后面也會(huì)具體說明的,這個(gè)深度信息可以構(gòu)建一個(gè)偽3D模型(Point Cloud點(diǎn)云模式),類似圖15:
圖18看著還行,但把這個(gè)3D模型轉(zhuǎn)到BEV俯視角下,估計(jì)親娘都認(rèn)不出來了:
圖19拍扁后結(jié)合特征Feature再做一次語(yǔ)義識(shí)別,形成:
圖20這個(gè)就是喜聞樂見的BEV圖了。以上是對(duì)LSS的直觀認(rèn)知,算法層面是如何實(shí)現(xiàn)的?先給單個(gè)相機(jī)可拍攝的范圍構(gòu)建一個(gè)立方體模樣的鐵絲籠子(高8寬22深41),祭出大殺器Blender:
圖21這里是示意圖,不要糾結(jié)于格子的數(shù)量和尺寸。這個(gè)3D網(wǎng)格代表的是一路相機(jī)的視錐體(Frustum),前面貼過視錐體的形狀(圖9),這里變形成立方體,在相機(jī)空間里看這個(gè)照片和這個(gè)立體網(wǎng)格的關(guān)系就是:
圖22右邊是個(gè)正對(duì)著網(wǎng)格立方體的相機(jī)示意圖,相片提取深度后(深度圖的實(shí)際像素尺寸是高8寬22):
圖23把這個(gè)深度圖按照每個(gè)像素的深度沿著紅線方向展開(Lift)后:
圖24可以看到,部分深度像素已經(jīng)超出了視錐體的范圍,因?yàn)長(zhǎng)SS一開始就假設(shè)了這么個(gè)有限范圍的籠子,超出部分直接過濾掉。這里必須提醒一下:LSS并不是直接算出每個(gè)像素的深度,而是推理出每個(gè)像素可能處于籠子里每個(gè)格子的概率,圖24是已經(jīng)通過Softmax提取出每個(gè)像素最有可能位于哪個(gè)格子,然后把它裝進(jìn)對(duì)應(yīng)格子的示意結(jié)果,便于理解,更準(zhǔn)確的描述如下:
圖25在圖25中選取深度圖的某個(gè)像素(紅色格子,事實(shí)上LSS的深度圖分辨率是很小的,默認(rèn)只有8*22像素,所以這里可以用一個(gè)格子當(dāng)做一個(gè)像素),它隸屬于籠子下方邊沿的一條深度格子(這條格子其實(shí)就代表相機(jī)沿著深度看向遠(yuǎn)方的一條視線):
圖26圖25中的那個(gè)紅色的深度像素,沿著圖26這條視線格子的概率分布就是:
圖27黃線的起伏表示2D深度圖像素在Lift后沿著視線3D深度的概率分布(Depth Distribution,我這是示意性得畫法,不是嚴(yán)格按照實(shí)際數(shù)據(jù)做的)。等價(jià)于LSS論文里的這張圖:
圖28
LSS中構(gòu)建立方籠子的代碼位于:
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
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。