點雲深度學習的3D場景理解


轉載請注明本文鏈接:

https://www.cnblogs.com/Libo-Master/p/9759130.html

PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

Paper reading:Frustum PointNets for 3D Object Detection from RGB-D Data

-------------------------------------------------------------------------------------------------------------------------------------

前言: 

  近期剛剛開始調研3D場景理解,下文是對point,point net++,frustum point 的一些整理和總結,內容包括如何將點雲進行深度學習,如何設計新型的網絡架構,如何將架構應用的3D場景理解。

背景:

  進來很多3D的應用在興起,3D傳感器在進步,隨着虛擬網絡的發展轉到物理實際中的應用,比如(ADAS,AR,MR)自動駕駛中需要理解 汽車行人交通標識,同時也需要理解三維物體的狀態靜至,移動。

   

  AR頭戴顯示器有深度傳感器,也需要做三維場景的理解。例如把todo_list合適的放到冰箱的門上。

  需要一種數據驅動的方式去理解和處理三維數據,3D deep learning

  三維表達的形式:

  

  三維數據本身有一定的復雜性,2D圖像可以輕易的表示成矩陣,3D表達形式由應用驅動的:

  point cloud ,深度傳感器掃描得到的深度數據,點雲

  Mesh,三角面片在計算機圖形學中渲染和建模話會很有用。

  Volumetric,將空間划分成三維網格,柵格化。

  Multi-View,用多個角度的圖片表示物體。

  Point c'loud 是一種非常適合於3D場景理解的數據,原因是:

  1、點雲是非常接近原始傳感器的數據集,激光雷達掃描之后的直接就是點雲,深度傳感器(深度圖像)只不過是一個局部的點雲,原始的數據可以做端到端的深度學習,挖掘原始數據中的模式

  2、點雲在表達形式上是比較簡單的,一組點。相比較來說  

    Mesh需要選擇面片類型和如何連接

    網格需要選擇多大的網格,分辨率。

    圖像的選擇,需要選擇拍攝的角度,但是表達是不全面的。

  最近才有一些方法研究直接在點雲上進行特征學習,之前的大部分工作都是集中在手工設計點雲數據的:

  

  這些特征都是針對特定任務,有不同的假設,新的任務很難優化特征。 希望用深度學習特征學習去解 決數據的問題。

 

  但是點雲數據是一種不規則的數據,在空間上和數量上可以任意分布,之前的研究者在點雲上會先把它轉化成一個規則的數據,比如柵格讓其均勻分布,然后再用3D-cnn 來處理柵格數據:

  

  缺點:3D cnn 復雜度相當的高,三次方的增長,所以分辨率不高30*30*30  相比圖像是很低的,帶來了量化的噪聲錯誤,限制識別的錯誤

  1、但是如果考慮不計復雜度的柵格,會導致大量的柵格都是空白,智能掃描到表面,內部都是空白的。所以柵格並不是對3D點雲很好的一種表達方式

  2、有人考慮過,用3D點雲數據投影到2D平面上用2D cnn 進行訓練,這樣會損失3D的信息。 還要決定的投影的角度

  3、點雲中提取手工的特征,再接FC,這么做有很大的局限性

  

  我們能否直接用一種在點雲上學習的方法:統一的框架

    

 

   

網絡設計:

網絡設計有兩種點雲的特點決定的:

  1、點雲是數據的表達點的集合,對點的順序不敏感

  

 

  D維的特征,最簡單的D=3,還可以有其他顏色,法向

  點集是無序的,可以做變化,背后的代表的是同一套點集,置換不變性。 模型需要對N!網絡需要做到置換的不變性。

  系統化的解決方案,對稱函數,具有置換不變性。神經網絡本質是一個函數

  

 

   如何用神經網絡構建對稱函數:最簡單的例子:

  

   

   

  雖然是置換不變的,但是這種方式只計算了最遠點的邊界,損失了很多有意義的幾何信息,如何解決呢?

  

  與其說直接做對稱性可以先把每個點映射到高維空間,在高維空間中做對稱性的操作,高維空間可以是一個冗余的,在max操作中通過冗余可以避免信息的丟失,可以保留足夠的點雲信息,再通過一個網絡r來進一步  消化信息得到點雲的特征。這就是函數hgγ的組合。每個點都做h低位到高位的映射,G是對稱的那么整個結構就都是對稱的。下圖就是原始的pointnet結構。

實際操作過程中:

 

   在實際執行過程中

   可以用MLP多層感知器(Multilayer perceptron) 來描述h和γ,g max polling 效果最好。

  接下來有個很有意思的理論問題,用神經網絡構建的pointnet中,保證了對稱

  那么在所有的對稱函數中,point(vanilla)是什么樣的位置呢?什么樣的函數pointnet 能代表,什么函數不能代表

  可以得到理論:

  

 

   pointnet 可以任意的逼近在集合上的對稱函數,只要是對稱函數是在hausdorff空間是連續的,那么就可以通過任意的增加神經網絡的寬度深度,來逼近這個函數

  

  上面解釋了如果通過對稱函數,來讓點雲輸入順序的不變

  2、如何來應對輸入點雲的幾何(視角)變換,比如一輛車在不同的角度點雲的xyz都是不同的 但代表的都是扯,我們希望網絡也能應對視角的變換

  如果spatial transform network

  

  

   增加了一個基於數據本身的變換函數模塊,n個點(x,y,z)  t-net 生成變換參數,之后的網絡處理變換之后的點,目標是通過整體優化變換網絡和后面的網絡使得變換函數對齊輸入,如果對齊了,不同視角的問題就可以簡化。

  

 

  實際中點雲的變化很簡單,不像圖片做變換需要做插值,做矩陣乘法就可以。比如對於一個3*3的矩陣僅僅是一個正交變換,計算容易實現簡單

  我們可以推廣這個操作,不僅僅在輸入作此變換,還可以在中間做 N個點 K維特征,用另外網絡生成k*k 來做特征空間的變化,生成另一組特征

  

  高維優化過程中,難度高,需要加正則化,比如希望矩陣更加接近正交矩陣

  那么這些變換的網絡如何和pointnet結合起來:得到分類和分割網絡

   首先輸入一個n*3的矩陣,先做一個輸入的矩陣變換,T-net 變成一個3*3的矩陣,然后通過mlp把每個點投射到64高維空間,在做一個高維空間的變換,形成一個更加歸一化的64維矩陣,繼續做MLP將64維映射到1024維,在1024中可以做對稱性的操作,就是maxpooling,得到globle fearue,1024維度 ,通過級聯的全連接網絡生成k (分類)

 

    

   

  如果是分割呢?

  可以定以成對每個點的分類問題,通過全局坐標是沒法對每個點進行分割的,簡單有效的做法是,將局部單個點的特征和全局的坐標結合起來,實現分割的功能

  最簡單的做法是將全局特征重復N遍,和每一個原來單個點的特征連接在一起,相當於單個點在全局特征中進行了一次檢索,檢索到在哪個位置就是哪個類別,對連接起來的特征進行MLP的變換,最后輸出m類相當於m個score:(將單個點和總體的特征連接到一起,判定在總體中的位置,來決定是哪個分類)

  

結果:

  

   分類,pointnet 當時最早 點雲界

   

  部件分割和完整的分割。shapenetpart

  

   2D-3D-S

   

   還是個非常輕量級的網絡:對比2D圖片和3D柵格

  

  適用於移動設備:

  

 

 

   同時對數據的丟失也是非常的魯棒,對比於voxelnet 的對比

  

 

   在modelnet 40 的分類問題上,在丟失50%的點的情況下,pointnet僅僅收到2%的影響,與之想想比Voxnet3D精度相差了20%

  為什么這么魯棒呢?

  第一行是原始的,我們想知道哪些點對全局特征做出了貢獻,maxpooling有些點embedded的特征非常小,在經過maxpooling之后對全局特征沒有任何的貢獻,哪些點是剩下來的勝利者

  Critial points  (Maxpooling 之后存活下來的大特征點)

  

 

   只要輪廓和骨骼得到保存,就能把形狀分類正確。

--------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------

PointNet++

  pointnet 缺陷:對比3Dcnn

    3D和2D很像,只是變成了3D卷積,多級學習 不斷抽象特征,平移不變性。

  

 

  pointnet 一開始對每個點做MLP低維到高維的映射,把所有點映射到高維的特征通過Max pooling 結合到一起

  本質上來說,要么對一個點做操作,要么對所有點做操作,實際上沒有局部的概念(loal context) ,比較難對精細的特征做學習,在分割上有局限性

2、沒有local context 在平移不變性上也有局限性。(世界坐標系和局部坐標系

  (xyz)對點雲數據做平移 所有的數據都不一樣了,導致所有的特征,全局特征都不一樣了,分類也不一樣

  對於單個的物體還好,可以將其平移到坐標系的中心,把他的大小歸一化到一個球中,在一個場景中有多個物體不好辦,對哪個物體做歸一化呢?

  -------------------------

  -------------------------

  

 

   pointnet ++ 核心的想法在局部區域重復性的迭代使用pointnet在小區域使用pointnet 生成新的點,新的點定義新的小區域多級的特征學習,應為是在區域中,我們可以用局部坐標系,可以實現平移的不變性,同時在小區域中還是使用的PN,對點的順序是無關的,保證置換不變性

具體的例子: 多級的點雲學習:

 

 

 

  2D卡通的例子,世界坐標系,先找到一個局部的區域,因為不想受整體平移的影響

  1、可以先把局部的點轉換到一個局部坐標系中  

  2、在局部中使用pointnet 來提取特征

  3、提取完特征以后會得到一個新的點,F (x,y )在整個點雲中的位置 在歐氏空間中,還有個向量特征F(高緯的特征空間),代表小區域的幾何形狀,

    

  如果重復這個操作就會得到一組新的點,在數量上少於原先的點,但是新的每個點代表了它周圍一個區域的幾何特點

   

  點集的簡化: layer:選擇小區域,提取小區域提取局部坐標系,應用point net聯合而成。

  我們可以重復set abstraction的過程,實現一個多級的網絡,下圖展示兩級, 使得點的數量越來越少,但是每個點代表的區域以及感受野,越來越大,這個cnn的概念很類似,,最后把點做一個pooling 得到globle feature,用來做分類。

  

  我們可以將最后的點重新上卷積的方式傳回原來的點上,既可以通過3D的插值,可以通過另一種通過PN的方式回傳。

  

  在多級網絡中有一個很有意思的問題,如何選擇局部區域的大小,相較而言就是怎么選擇卷積核的大小寬度,如果選擇pointnet 作用區域的球的半徑?

  在卷積神經網絡中大量應用小的kernal(VGG 3*3*3),在pointcloud中是否一樣呢?不一定。 

  因為pointnet 常見的采樣率的不均勻,比如有個depth camera 采到的圖像,近的點非常密集,遠的點非常稀疏,在密的地方沒有問題,在稀疏的會有問題,比如極端的情況,只有一個點,這樣學到的特征會非常的不穩定,我們因該避免。

  為了量化這個問題,有個控制變量的實驗,在1024上訓練,減少點的數量相當於減少點的密度,不均勻的減少,

  在剛開始1024點的時候point net ++ 更加強大,得到更高的精確度,應為它是在小區域上,隨着密度的下降,性能收到了極大的影響,在小於500個點以后性能低於pointnet

  

  

  結論:在pointcloud 中 如果局部的kernel 操作太小的話,會影響性能被采樣率不均勻。

  針對於這個問題,我們希望設計一個神經網絡來智能學習,如何綜合不同區域大小的特征,得到一個魯棒的學習層

  希望在密集的地方相信這個特征,稀疏的地方不相信這個特征,而去看更大的區域。(MSG/MRG)

   

 

  

 

  比較簡單的做法是設計一個Multi-scale :  在這個2D的例子中 將不同半徑的區域 ,聯合在一起。有點像inception 中的結構,

  但不一樣的是,在訓練過程中隨機的對輸入的dropout, 迫使網絡學習若何結合不同的尺度應對損失的數據的特征。

  另外一種方式不是在同一級中,而是在不同網絡集中綜合,它有個好處,可以節省計算,在下一級的特征已經計算好了,只需要把它池化拿來用就行了。 而在mutile scale中需要對不同尺度分別計算。

  

  發現加了MRG和MSG中,丟失數據后魯棒性能好很多。丟失75%的點 分類都不會受到影響。

  下圖是在scanenet 上對場景分割做評估:

  

 

   pointnet ++ 大幅提高了場景分割性能,因為多級的結構,使得他對局部的特征更好的學習,同時還有平移不變性的特點。同時多級分割稍稍提升了性能。

  如果是局部點雲的分割:單個角度,局部點雲,多級結構對采樣率更魯棒的MSG大幅提升了partial scan的性能。

  

 

 

   另一個POINT ++非常好的性能是  不局限於2D或者3D歐式空間,可以拓展到任意的測度空間,只要有個定義好的距離函數,下面展示對可變性物體,有機物提分割的數據集

  比如分類:AB 屬於幾何外形相似,但是屬於不同的類別,AC反之。

  不是想依靠XYZ,想依靠物體表面形狀的變化。

  

  上面網絡結構、設計原理

 ----------------------------------------------------------------------------------------------------------------------------------------------

   PN在三維場景理解中的應用:

  點雲支持我們探索全新的解決方案,基於3D數據的解決方案

   

   側重前者,3D場流估計可以跳過,

  

  上面是在圖片中的表達

  下面是在點雲中可視化的例子

  之前的工作是怎么處理三維物體的呢?

  

 

  很大一套工作是基於,

  1、先在三維空間中做region proposal

     基於點雲投影到圖片上(鳥瞰圖),在圖片中proposal 三維的box

    也可以是3D的cnn來做,

  2、propos完之 后可以把2D和3D的feature 結合到proposal中,做一個分類。

  缺點是:三維搜索空間非常大,計算量也非常大

  而且在3D中proposal 點雲的分辨率非常有限,很多時候很難發現比較小的物體。

  

  另外一套思路是基於圖片的,我想通過RGB的圖片估計3D的box,依賴於對物體大小的先驗知識,很難精確的估計物體的大小和位置

  另外也可以基於depth image。對其領域的定義有很多局限,比如兩個點在空間中距離很遠,但是投影之后的距離會非常近。

   所以在圖片的表達形式下,2D的cnn收到了很大的局限。很難精確的估計物體的深度和大小

  

 

  我們的設計思路 希望結合2D和3D的優點,針對與RGB-D 的輸入 

      先在RGB圖片上用一個2Ddector 得到一個2D的檢測框,因為我們知道camera intrases(投影角度,投影點),我們可以有2D的區域(逆投影)生成一個3D的視錐frustum

      接下來對物體的搜索就可以在視錐內進行搜索,我們可以將其轉化成在3D點雲中搜索的問題

    好處有了兩個:

      1、利用2D的detector 來縮小搜索的范圍,本來需要在整個3D空間中,因為有2Ddector的幫忙,可以在視錐的范圍內搜索,大幅減少了搜索的計算量和復雜度

       2、在視錐內可以針對於點雲做操作,利用點雲幾何的精確性。利用3D,deeplearning 的工具(pointnet)直接處理點雲的數據,得到非常精確的3DBB

    

    

     

 

     基於視錐的3D物體檢測,有兩個挑戰:

      1、前景的遮擋和后景的干擾,基於層級的方法在這都會敗下陣來

      2、點的范圍很大,很難用3D cnn 網格化柵格化。

 

    解決方案用pointnets來解決這個問題,(基於3D點雲數據的方法):

    

 

    1、利用一個2Ddection 將物體檢測出來,根據照相機的投影角度參數,可以把2D box 變換到 3d 視錐的范圍,在視錐內搜索車在哪里(Frustum Proposal )

    2、理論上可以直接在視錐內找3D的BOX,但是由於前景的干擾和后景的干擾,希望把關鍵點拿出來,不要受到干擾點的影響,所以后面會接一個3D pointnet的分割網絡。

    3、分割出來以后呢,再用一個精確的網絡估計物體的3D bb,位置,大小 ,姿態

    result:

    

 

    在汽車 小物體(行人 自行車)優勢更大。因為2D的分辨率很高,小物體有優勢

    為什么有這么優異的結果呢?

    有兩方面原因:

    1 , 2D的分辨率非常高,比較容易把2D區域propasal出來。

    2   選擇了3D 分割方法,相比mask-rcn 。將2d mask的depth point 拿出來發現分割效果非常差,原因是:在圖片中很近,但是在3d中很遠的 

    

    

 

 

    3  對輸入做歸一化,因為對點雲的歸一化,可以簡化學習問題:

    比如:

    

    a:俯視圖,汽車的位置視錐的范圍x 很大

    b:歸一化之后,可以旋轉坐標系,旋轉z軸,把z指向視錐的中心方向,簡化了x的分布和學習問題

    c:進一步,在深度上,z上有很大的分布,我們基於3D物體分割可以找到分割后的中心,物體的點集中在原點附近,進一步簡化

    d:可以通過一個網絡,去估計物體真實的中心,分割和物體中心可能不一樣,在最后綠色坐標系進行bb估計

    因為是點雲數據,所以歸一化操作比較方便。矩陣乘法就可以

V3 亦可以檢測,V4 非常遠的點。

室內場景

加速100 1k效果加速

總結:

  兩個網絡,對輸入順序的置換不變性,輕量級的結構,對數據的丟失非常魯棒,提供了一個統一的框架為不同的任務服務。具體在3d場景理解中,3d物體識別的應用

  AI不僅僅在場景理解中有用,產品設計,圖片集合中 圖片之間的關系

FAQ:

  1  PN沒考慮點之間的關系,在PN ++ 中有考慮

  2  數據集,部件分割shapenet part 場景 s-3d-s  scan-net

  3  如果僅僅使用雷達,做3D物體檢測,有沒有可能進行拓展?

     簡單的拓展是在雷達中進行propal , 就不是一個視錐的propal了

    把雷達投影到地面變成一個鳥瞰圖,在里面進行區域的pp,在pp里在用Pointnet 估計3DBBx,這還是基於投影的方法。

    能否直接在3D中做PP呢?

    蘋果voxelnet  利用了pointnet 和3D cnn 直接在雷達數據中進行PP 和 dection 

  4  點的數量的評價?

    輸入點數量是可變嗎?訓練的時候是固定的,測試時候是可變的。

    如果是單個圖片的話,是可變的。多個其實也是可以的。只需要強行pad到一樣的數目即可

  5  未來發展趨勢?

    2D和3D結合,傳感器的分辨率不高,3D幾何信息豐富,更好的結合

  6 激光雷達 近密遠疏 ,該怎么處理呢?

    pointnet ++ 中有些結構 能處理這些不均勻采樣率的問題,進一步 可以加W 來調節點雲的分布

    github 上都有數據集下載 可以 Frustum pointnet

   7 pointnet ++  如何用到實例分割

    其實frustum pointnet 就是一種實例分割,實例分割在3D中是一個先做的問題,先有實例分割,后又物體檢測

  8 pointnet ++ 因為需要對局部特征做處理對GPU有要求

    可以解決,可以專門寫cuda layer 減少gpu的使用率。

    1024  batch32    6G內存

  9 frustum point 2d檢測是gt還是檢測結果:

    gt ,進行了擾動,2個好處: 1、簡單  2、可以和 2 d dector 有個分離,可以隨時換2d dector,而不用重新訓練后面的網絡。

  9 測試注意?

    測試方向旋轉 然后平均,數據增強,隨機drop 一些點,魯棒性更好。

  10 有沒有可能直接用PN++ 直接對點雲數據做檢測?

    正在研究,voxelnet 也是解決類似的問題

  11 volnet 只對點雲數據訓練做到kitti第一?

    只在車上,因為車相對比較大,只用點雲應該夠用,行人和自行車比較困難

  12 法向量的作用?

    如果仔細看的話,物體基於Mutil-view還是最領先的,分辨率高,鍵盤的建, 但是在點雲上看和平板沒區別。 在mesh上提取的法向量,就能把平板和鍵盤區別開

  13 貓和馬非歐空間是怎么處理的?

    先算測地距離,降為到3d,用3d的歐式距離模擬測地距離

  14 Tnet 可以用姿態gt 監督其訓練

  15  point ++ 結果不太問題,modelnet data size限制的,split test,鼓勵在test 時進行多次旋轉以后平均結果

  16 人臉點雲很有潛力

  17 3D行人檢測有意義嗎?

     圖片暗的時候,可以預防交通事故

  18 pointnet ++ 中 release 版本沒有+T-net  

    在model-net分類上Tnet幫助不大,因為PN++ 已經學了局部特征,局部特征其實對旋轉不太敏感,已經可以取得比較好效果

  19 PN++ 有對局部點雲變換的不變性嗎?

    局部加T-net 是不太合理的,並不能保證不同局部的變換是統一的,如果需要實現統一,capsil(?) net 

 

 

  20 法國數據集是室外的。 可以試試metapoint3D的數據集

  21  RGB 相對於點雲是錦上添花的

  22 為什么用FPS降采樣?希望達到一個均勻采樣的效果,盡可能采遠處的點,也可以隨機的采樣   

  23 point++ 提供了多卡的

  24 frustum 在2d檢測不准的時候影響截斷最終的結果嗎?

    會,但是有能力復原。但是2d的部分非常不好,會限制3D部分

  25 GCNN 和 pointnet ++ 有很多相通的地方,在點雲上的應用?

    都是在3D空間中尋找局部,然后再局部定義某種操作,形成多級的網絡架構

    pointnet ++ 不僅適用於2d和3d ,還適用於非常高維的空間

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM