博客專欄

EEPW首頁(yè) > 博客 > 如何理解自動(dòng)駕駛,SLAM,BEV,訓(xùn)練數(shù)據(jù)源常見術(shù)語(yǔ)?(3)

如何理解自動(dòng)駕駛,SLAM,BEV,訓(xùn)練數(shù)據(jù)源常見術(shù)語(yǔ)?(3)

發(fā)布人:計(jì)算機(jī)視覺工坊 時(shí)間:2023-08-15 來源:工程師 發(fā)布文章
先提取圖像特征和深度(Feature and Depth,LSS里是同時(shí)提取的,后面會(huì)具體解釋),深度圖類似:

圖片

圖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)系工作人員刪除。



關(guān)鍵詞: 汽車電子

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉