久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

博客專欄

EEPW首頁 > 博客 > 如何理解自動駕駛,SLAM,BEV,訓練數據源常見術語?(3)

如何理解自動駕駛,SLAM,BEV,訓練數據源常見術語?(3)

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

圖片

圖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


*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



關鍵詞: 汽車電子

相關推薦

技術專區

關閉