博客專欄

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

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

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

        圖片

        圖17只能說類似,并不準(zhǔn)確,后面也會具體說明的,這個深度信息可以構(gòu)建一個偽3D模型(Point Cloud點云模式),類似圖15:

        圖片

        圖18看著還行,但把這個3D模型轉(zhuǎn)到BEV俯視角下,估計親娘都認不出來了:

        圖片

        圖19拍扁后結(jié)合特征Feature再做一次語義識別,形成:

        圖片

        圖20這個就是喜聞樂見的BEV圖了。以上是對LSS的直觀認知,算法層面是如何實現(xiàn)的?先給單個相機可拍攝的范圍構(gòu)建一個立方體模樣的鐵絲籠子(高8寬22深41),祭出大殺器Blender:

        圖片

        圖21這里是示意圖,不要糾結(jié)于格子的數(shù)量和尺寸。這個3D網(wǎng)格代表的是一路相機的視錐體(Frustum),前面貼過視錐體的形狀(圖9),這里變形成立方體,在相機空間里看這個照片和這個立體網(wǎng)格的關(guān)系就是:

        圖片

        圖22右邊是個正對著網(wǎng)格立方體的相機示意圖,相片提取深度后(深度圖的實際像素尺寸是高8寬22):

        圖片

        圖23把這個深度圖按照每個像素的深度沿著紅線方向展開(Lift)后:

        圖片

        圖24可以看到,部分深度像素已經(jīng)超出了視錐體的范圍,因為LSS一開始就假設(shè)了這么個有限范圍的籠子,超出部分直接過濾掉。這里必須提醒一下:LSS并不是直接算出每個像素的深度,而是推理出每個像素可能處于籠子里每個格子的概率,圖24是已經(jīng)通過Softmax提取出每個像素最有可能位于哪個格子,然后把它裝進對應(yīng)格子的示意結(jié)果,便于理解,更準(zhǔn)確的描述如下:

        圖片

        圖25在圖25中選取深度圖的某個像素(紅色格子,事實上LSS的深度圖分辨率是很小的,默認只有8*22像素,所以這里可以用一個格子當(dāng)做一個像素),它隸屬于籠子下方邊沿的一條深度格子(這條格子其實就代表相機沿著深度看向遠方的一條視線):

        圖片

        圖26圖25中的那個紅色的深度像素,沿著圖26這條視線格子的概率分布就是:

        圖片

        圖27黃線的起伏表示2D深度圖像素在Lift后沿著視線3D深度的概率分布(Depth Distribution,我這是示意性得畫法,不是嚴格按照實際數(shù)據(jù)做的)。等價于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)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



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

        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 吐鲁番市| 广平县| 晴隆县| 新龙县| 尉氏县| 邯郸市| 麦盖提县| 阳山县| 黄平县| 香港 | 裕民县| 个旧市| 通州区| 探索| 铅山县| 无棣县| 南溪县| 清远市| 深圳市| 阳江市| 渑池县| 隆尧县| 裕民县| 陆河县| 溧阳市| 夏河县| 商城县| 天气| 富源县| 讷河市| 景泰县| 色达县| 山东| 定南县| 称多县| 马山县| 临沧市| 通河县| 星子县| 新建县| 涟源市|