轉載請註明本文連接:html
http://www.javashuo.com/article/p-ekzzsmet-ge.htmlgit
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentationgithub
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場景理解的數據,緣由是:
一、點雲是很是接近原始傳感器的數據集,激光雷達掃描以後的直接就是點雲,深度傳感器(深度圖像)只不過是一個局部的點雲,原始的數據能夠作端到端的深度學習,挖掘原始數據中的模式
二、點雲在表達形式上是比較簡單的,一組點。相比較來講
Mesh須要選擇面片類型和如何鏈接
網格須要選擇多大的網格,分辨率。
圖像的選擇,須要選擇拍攝的角度,可是表達是不全面的。
最近纔有一些方法研究直接在點雲上進行特徵學習,以前的大部分工做都是集中在手工設計點雲數據的:
這些特徵都是針對特定任務,有不一樣的假設,新的任務很難優化特徵。 但願用深度學習特徵學習去解 決數據的問題。
可是點雲數據是一種不規則的數據,在空間上和數量上能夠任意分佈,以前的研究者在點雲上會先把它轉化成一個規則的數據,好比柵格讓其均勻分佈,而後再用3D-cnn 來處理柵格數據:
缺點:3D cnn 複雜度至關的高,三次方的增加,因此分辨率不高30*30*30 相比圖像是很低的,帶來了量化的噪聲錯誤,限制識別的錯誤
一、可是若是考慮不計複雜度的柵格,會致使大量的柵格都是空白,智能掃描到表面,內部都是空白的。因此柵格並非對3D點雲很好的一種表達方式
二、有人考慮過,用3D點雲數據投影到2D平面上用2D cnn 進行訓練,這樣會損失3D的信息。 還要決定的投影的角度
三、點雲中提取手工的特徵,再接FC,這麼作有很大的侷限性
咱們可否直接用一種在點雲上學習的方法:統一的框架
網絡設計:
網絡設計有兩種點雲的特色決定的:
一、點雲是數據的表達點的集合,對點的順序不敏感
D維的特徵,最簡單的D=3,還能夠有其餘顏色,法向
點集是無序的,能夠作變化,背後的表明的是同一套點集,置換不變性。 模型須要對N!網絡須要作到置換的不變性。
系統化的解決方案,對稱函數,具備置換不變性。神經網絡本質是一個函數
如何用神經網絡構建對稱函數:最簡單的例子:
雖然是置換不變的,可是這種方式只計算了最遠點的邊界,損失了不少有意義的幾何信息,如何解決呢?
與其說直接作對稱性能夠先把每一個點映射到高維空間,在高維空間中作對稱性的操做,高維空間能夠是一個冗餘的,在max操做中經過冗餘能夠避免信息的丟失,能夠保留足夠的點雲信息,再經過一個網絡r來進一步 消化信息獲得點雲的特徵。這就是函數hgγ的組合。每一個點都作h低位到高位的映射,G是對稱的那麼整個結構就都是對稱的。下圖就是原始的pointnet結構。
實際操做過程當中:
在實際執行過程當中
能夠用MLP多層感知器(Multilayer perceptron) 來描述h和γ,g max polling 效果最好。
接下來有個頗有意思的理論問題,用神經網絡構建的pointnet中,保證了對稱
那麼在全部的對稱函數中,point(vanilla)是什麼樣的位置呢?什麼樣的函數pointnet 能表明,什麼函數不能表明
能夠獲得理論:
pointnet 能夠任意的逼近在集合上的對稱函數,只要是對稱函數是在hausdorff空間是連續的,那麼就能夠經過任意的增長神經網絡的寬度深度,來逼近這個函數
上面解釋了若是經過對稱函數,來讓點雲輸入順序的不變
二、如何來應對輸入點雲的幾何(視角)變換,好比一輛車在不一樣的角度點雲的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) ,比較難對精細的特徵作學習,在分割上有侷限性
二、沒有local context 在平移不變性上也有侷限性。(世界座標系和局部座標系)
(xyz)對點雲數據作平移 全部的數據都不同了,致使全部的特徵,全局特徵都不同了,分類也不同
對於單個的物體還好,能夠將其平移到座標系的中心,把他的大小歸一化到一個球中,在一個場景中有多個物體很差辦,對哪一個物體作歸一化呢?
-------------------------
-------------------------
pointnet ++ 核心的想法在局部區域重複性的迭代使用pointnet ,在小區域使用pointnet 生成新的點,新的點定義新的小區域,多級的特徵學習,應爲是在區域中,咱們能夠用局部座標系,能夠實現平移的不變性,同時在小區域中仍是使用的PN,對點的順序是無關的,保證置換不變性。
具體的例子: 多級的點雲學習:
2D卡通的例子,世界座標系,先找到一個局部的區域,由於不想受總體平移的影響
一、能夠先把局部的點轉換到一個局部座標系中
二、在局部中使用pointnet 來提取特徵
三、提取完特徵之後會獲得一個新的點,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場流估計能夠跳過,
上面是在圖片中的表達
下面是在點雲中可視化的例子
以前的工做是怎麼處理三維物體的呢?
很大一套工做是基於,
一、先在三維空間中作region proposal
基於點雲投影到圖片上(鳥瞰圖),在圖片中proposal 三維的box
也能夠是3D的cnn來作,
二、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點雲中搜索的問題
好處有了兩個:
一、利用2D的detector 來縮小搜索的範圍,原本須要在整個3D空間中,由於有2Ddector的幫忙,能夠在視錐的範圍內搜索,大幅減小了搜索的計算量和複雜度
二、在視錐內能夠針對於點雲作操做,利用點雲幾何的精確性。利用3D,deeplearning 的工具(pointnet)直接處理點雲的數據,獲得很是精確的3DBB。
基於視錐的3D物體檢測,有兩個挑戰:
一、前景的遮擋和後景的干擾,基於層級的方法在這都會敗下陣來
二、點的範圍很大,很難用3D cnn 網格化柵格化。
解決方案用pointnets來解決這個問題,(基於3D點雲數據的方法):
一、利用一個2Ddection 將物體檢測出來,根據照相機的投影角度參數,能夠把2D box 變換到 3d 視錐的範圍,在視錐內搜索車在哪裏(Frustum Proposal )
二、理論上能夠直接在視錐內找3D的BOX,可是因爲前景的干擾和後景的干擾,但願把關鍵點拿出來,不要受到干擾點的影響,因此後面會接一個3D pointnet的分割網絡。
三、分割出來之後呢,再用一個精確的網絡估計物體的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個好處: 一、簡單 二、能夠和 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 ,還適用於很是高維的空間