ROI-10D之看不懂
解決什麼問題
6D位姿估計,不需要模型
本文創新點\貢獻
- 端到端的多尺度單目3D檢測,ROI lift map直接回歸3D框的全部元素
- 一個新的loss,在度量空間對齊3D包圍盒,直接最小化和真實3Dbbox的誤差,不需要設置參數
- 模型的延申,用於預測度量紋理mesh,支持進一步的3D推理,做3D合成數據增強
前人方法
SSD-6D,離散角度預測
yolo-6D,預測點做PnP
3D Pose Estimation and 3D Model Retrieval for Objects in the Wild
迴歸2D控制點,絕對尺度
BB8也看一下?2017
Posecnn: A convolutional neural network for 6d
object pose estimation in cluttered scenes. 2018
這個直接預測旋轉,然後預測2D形心對應的3D點,這樣RT都有了,然後將3Dmesh轉換到攝像機座標系,計算model點和真實點之間的距離。
微調
Deep model-based 6d pose refinement in rgb 2018
微調屬於射影對齊範疇
這些都需要精準的3D模型,都無法處理類內的
不過DeepIM說也能處理沒見過的
方法
方法概述
用自己做的mesh做了數據增強,使用網絡來預測深度圖,同時檢測出2D RoI,同時使用RoI處的特徵信息和預測的深度信息,根據作者提出的,來預測旋轉,RoI相關的2D形心,深度,範圍,用這個來建立八個角點
八角點預測
From Monocular 2D Instance to 6D Pose
定義一個全部可微的映射,從2DROI到3Dbox信息,3Dbox 是八個有序的3D點
loss的核心
和深度信息一起編碼,旋轉用4元數,位移用射影2D物體形心
和[ 3d bounding box estimation using deep learning and geometry ] 2017 相似
[ Ssd-6d: Making rgb-based 3d detection and 6d pose estimation great again ] 2017
[ Posecnn: A convolutional neural network for 6d object pose estimation in cluttered scenes ] 2018
知道了形心又如何,如何知道形心在3D中的位置?
有了旋轉,那就能知道一條射線,車的中心必在這個射線內,那麼有了z是不是就能直接知道位置了?有長度的射線就是線段了,線段的另一個端點就是那個點了,根據長度和夾角是不是就能算出其他座標系的值了?
不對,只有得知物體相對於原點的旋轉纔可以這麼算,感覺預測出來的並不是對於相機原點的角度,而是本身的絕對角度,這樣就不能根據旋轉和z確定位置了。
現在的問題是不知道預測的是什麼座標系的
答:下面說了,非自我中心的
那就根據形心,根據內參和z,就能知道世界座標系中中心點的位置了
我們將三維區段描述爲整個數據集上與平均值區段的偏差
這個我也想到了
給定ROI ,在該位置運行RoIAlign,用幾個單獨的head分別預測旋轉,RoI相關的2D形心,深度,範圍,用這個來建立八個角點 :
其中是相機內參的逆函數
有了,很容易就能通過內參和像素座標的位置獲得點在世界座標系中的位置,但是這個旋轉我有點迷,右乘旋轉矩陣是以自身座標系爲參考旋轉(自我中心),左乘旋轉矩陣是以其他固定座標系爲旋轉參考(非自我中心),先自己轉,再繞着相機原點轉,不太明白這麼做的含義,上式的輸入是一個點,點以自己爲中心旋轉沒什麼意義啊,如果去掉這個右乘對結果也沒什麼影響,最後也能得到對應的世界座標系的位置,這個是以攝像機原點爲中心。
還使用了3D anchor
[ Joint 3d proposal generation and object detection from view aggregation ] 2018
[ Multi-view 3d object detection network for autonomous driving ] 2017
在全部的圖片平面,這些3Danchor的2D實例化是稀疏的而且有效的
這樣的3D anchor能提供物體的3D位置。
是不是用平均值,然後預測偏差,就是anchor的概念,所以就叫3D anchor?
不然的話怎麼建anchor?整整比2D多了一個維度
Lifting Pose Error Estimation to 3D
從單目數據估計位姿的時候,在像素空間小的偏差能導致在3D上的大誤差
對每個信息單獨做loss的話,會導致易揮發(volatile)的優化,容易達到局部極小值
這個易揮發很貼切
之前的大部分做法都是對每項單獨做loss,而作者不一樣
不是同時平等的優化所有的元素,而是讓網絡在訓練的時候決定他的關注點
自己決定,這麼神奇,難道是寫了個函數能看出來那些元素對最終結果影響大,做加權?
不是,應該就是因爲他的公式,將所用項融合到一塊,得出一個結果
給定3D box ,還有相關的2DRoI ,然後使用作者提出的函數來恢復3D預測,。這個loss本身是度量空間的八個點的平均距離:
這個對應就像上圖中的綠線
所以說作者直接用所有信息生成的最後的結果來做loss,而想實現這樣的效果,就得保證在這個生成八角點的過程中,各個元素都是可微的,能反向傳播,正如下面的鏈式法則
但是問題又來了,沒有詳細的公式
該不會就是神經網絡直接預測把,然後FC得到八角點?
這個式子能清晰的表現每個元素對最終3D對齊的影響
[ Unsupervised learning of depth and egomotion from monocular video using 3d geometric constraints ] 2018
[ Deep model-based 6d pose refinement in rgb ] 2018
和上面兩個一樣,做了攝影和幾何約束,作者觀察到,需要一段熱身期,使迴歸迴歸到適當的數值體制
就是先單獨訓練每個元素,直到能出現一個穩定的3D box實例,再使用lift loss
這個熱身操作要學一下,元素很多的時候,不過單獨訓練是怎麼做的呢,先把其他的loss設爲0?之訓練一個也得不出正兒八經的框啊?
或許可以將其他項的元素都是用真實值表示,然後不計算其他項的loss,這樣就能看到3D框和單獨訓練的項之間的關係了
Allocentric Regression and Egocentric Lifting
[ 3d bounding box estimation using deep learning and geometry ] 2017
[ 3d-rcnn: Instance-level 3d object reconstruction via render-andcompare ] 2018
還真就脫不開這個3Dbbox了
這兩個強調非自我中心的pose,特別對於大的視野場景。
以自我爲中心的角度會一直變,而非自我爲中心的一直側面對着攝像機
因爲RoI沒有全局信息,所以作者也以非自我爲中心
所以以什麼爲中心是由全局信息決定的嗎,爲什麼全局信息有利於自我中心的旋轉預測?
難道是因爲我們看到的就是非自我中心旋轉的視圖?即使是筆直前行的車,在我們的視角看了也是有yaw偏移的
所以在迴歸的時候,用的是非自我爲中心的,然後通過推理轉換來修正,以此來建立自我爲中心的3Dbox
神奇的操作,所以非自我爲中心的優勢是什麼?難道因爲是相機的原因?在外觀圖中,是帶着攝像機的角度的,更能顯示非自我爲中心的角度?
像這樣?
後期的推理操作也不知道啊
物體形狀學習與檢索
大頭來了,最想知道的
Learning of a Smooth Shape Space
給定50個商業的汽車的可獲得的CAD模型,創造了大小爲的投影截斷的符號距離字段(TSDF)。
初始化使用PCA來學習低維形狀,就像這個[ 3d-rcnn: Instance-level 3d object reconstruction via render-andcompare ] 2018
對,就是這個,之前在想有沒有公共一些的特徵,其實就是要用PCA來做,可惜腦子裏沒這個東西,不夠理解
在實驗過程中,發現形狀空間迅速的偏離均值,導致退化的mesh
使用PCA來生成合適的外觀要求根據每一維的標準差來評估每個維度,爲了避免這個操作,訓練了一個自動編碼的3D卷積來提到,由編碼器和解碼器組成,還強加了不同的約束在輸出TSDF上。
對都使用了filter大小是的四個卷積核。
然後用了六個全連接層來表示 潛在的空間
這個潛在的空間就是車的外觀吧
所以就是用處理PCA提取的特徵?然後加上約束,再用全連接
約束是什麼呢?外觀相關的東西?
訓練的時候,進一步映射在單位超球面上的所有潛在表示,以確保嵌入的平穩性。
就是說本來是個球,然後多個潛在表示讓球在不同的部位突出,最後變成車的形狀
對於那些跳躍大的輸出,就懲罰,就是設置大loss的意思,這樣能
將CAD模型分成了’Small Car’, ’Car’, ’Large Car’ or ’SUV’
然後計算每個類別和所有汽車的中位形狀,使用[ Endre Weiszfeld. Sur le point pour lequel la somme des distances de n points donnes est minimum ]算法
真好,這個中位我也想了,就是操作不出來,不知道如何去做
上圖中下面那行是結果,能平滑的插入,作者觀察到,可以安全地遍歷嵌入上的所有中間點,而沒有退化的形狀,並發現一個六維的潛在空間是平滑性和細節之間的一個很好的折衷。
至此,知道了學習參數,來代表潛在表示,然後改變超球面,獲得模型
Ground truth shape annotation
通過中心差異來避免梯度近似,像[ 3d-rcnn: Instance-level 3d object reconstruction via render-andcompare ] 2018
就是外形比較像, 導致loss也差不多???
使用貪婪搜索從每個中位數初始化?從LIDAR和分割[ mask RCNN ]尋找最小化投影矛盾
這個初始化搞不懂,不知道要做啥
對於3D lifter 形狀分支,測量和預測的形狀和真實形狀之間的相似性,作爲在超平面上的兩個點之間的角度???
各自球面上的點之間的夾角,用表示,這樣計算之間的loss,就能算出差異了?應該是這回事
在推理的時候預測低維的latent向量(這個要作用在超球面上),然後把向量放到 decoder 中獲得TSDF表達。
[ Marching cubes: A high resolution 3d surface construction algorithm ] 1987 ACM >??????????????????????????????????????????????????????????
可以利用 marching cube 從TSDF來計算3D mesh
我服了
mesh就是三角形網布模型,之前的汽車就是。
這快看不懂也不知道怎麼做,來個源碼救救我吧
Simple mesh texturing
作者的方法是計算絕對的scale和6D pose,所以作者生成復原的3Dmesh的紋理的投影
所以,作者投影那些在圖像平面上指向攝像機的向量,並且分配對應的像素值,然後沿着完成的對稱軸來反射顏色。
不知道講的啥
是說生成的數據都是側面指向攝像機的?
看下面的合成圖,陰影是怎麼搞的?也太真實了吧
這個爲下面的數據增強提供了mesh
合成3D數據增強
使用人工合成的數據可能會因爲域差距的變大而性能顯著下降。
是說和真實數據的分佈不同嗎
KITTI3D只有7k張圖,很容易過擬合
[ Augmented reality meets computer vision: Efficient data generation for urban driving scenes ] 包括通過將物體的三維合成效果圖嵌入到真實世界的圖像背景中來擴展數據集(consists in extending the dataset by inpainting 3D synthetic renderings of objects onto real-world image backgrounds)。
受這個啓發,作者利用之前提取的mesh來生成真實的render。這樣也不用只使用小的CAD模型了,而且作者沒有使用強大的手動和地圖先驗來在場景中防止合成物體;相反,作者使用非自我爲中心的pose來移動3D中的物體,這樣也不用改變視角了。
使用了一些3D的旋轉擾動來生成新的看不見的pose,還能減少過擬合
所以作者使用自己生成的mesh,投影到平面中
訓練
網絡結構
兩階段,類似Faster RCNN,先生成2D區域推薦,然後對每個區域預測
第一階段是RetinaNet,使用帶有FPN的ResNet-34,使用的focal loss
對於每個推薦的2D區域,使用ROIAlign來提取局部特徵
直接從單目數據預測3D信息,尤其是絕對位移,是不合適的,由於尺度和重投影的模糊性,缺少上下文加劇了這種情況,利用深度信息可以克服這種模棱兩可性,使用幾何約束[ Unsupervised cnn for single view depth estimation:Geometry to the rescue ] 2016
提取一些邊緣也能做優化手段?
還是想看看之前那個SLAM分割的
使用深度估計的sota[ Self-supervised, super-resolved monocular depth estimation ] 2018 來生成深度圖,用這些深度圖來支持距離推理
還想在深度圖裏包含對應的區域,加了個2D座標映射[ An intriguing failing of convolutional neural networks and the coordconv solution ] 2018
然後傳遞所有的信息到融合模組,對每個輸入的模型做兩個帶有GN的卷積
然後連接所有特徵,使用ROIAlign然後放到不同的分支來預測R,T,絕對範圍,外觀
參數設置
使用的SGD
batch size是8
學習率是0.001
總計200K次迭代,再120k和180k的時候除10
數據增強
做了縮放抖動和水平反轉來做數據增強
從訓練序列中提取了共計140個mesh,使用相對的的真實pose來提取紋理
這個咋做?如和考慮到真實的光照和陰影問題?
在每個輸入中加三個不同的車,通過隨機發射三條射線,然後車子在射線上位移來完成。
使用原始的非中心旋轉來避免紋理的僞影,然而,爲了總是產生新的看不見的6D姿態,將旋轉的角度設置爲10度
這個紋理僞影是啥
在附錄中展示了量化結果
實驗
測試的時候,把短邊resize成600,然後做2D檢測,再RoI-lifting之前做0.65的NMS過濾
然後,得出的3D框用很嚴格的俯瞰圖,用0.05的NMS過濾
只要有0.05的交際就過濾掉
估計
在俯視圖和全部的3D框上都算了AP
[ Multi-level fusion based 3d object detection from monocular images ] 2018
這個好像很不錯
2D檢測AP不高,但是俯視圖和3DAP很高,作者說適當的數據分析對抵消過擬合很有用
怎麼分析?
好像是數據增強那裏也針對了下,而且還分析了不同旋轉角度的分佈
[ Multi-level fusion based 3d object detection from monocular images ] 2018
這個在KITTI3D和Cityscapes都做了深度模型的訓練,作者只在KITTI上做了預訓練。。。。。。。。。。。。。。。。。。
但是這樣以後,性能從驗證集到測試集降了不少(from 22.03% to 13.73% or 10.53% to 7.08%),這表明要積極地調整驗證集,使其符合已知的ground truth.
2D 檢測的性能很影響後面的位姿估計
這進一步加強了我們的情況,因爲如果我們用2D AP歸一化來糾正我們的姿態度量數,那麼我們的姿態度量數將會更高
太頂了,這篇論文好多搞不懂的東西
消融實驗
作者還分析了現在爲什麼預測不好
分析這個方法對於不同的輸入,還有這個loss能多好的影響位姿的質量
Lifting Loss:
隔離一個帶有真實Roi 和3D box的實例,然後只根據這個優化,隨機初始化參數,然後逐步提高和之間的對齊
三幅圖分別代表什麼呢?三個不同元素?
搞錯了,這裏不是loss,是梯度的大小,梯度越大說明越關注
作者還參考了補充材料,補充材料在哪找呢
每個都獨立初始化,最後也能收斂到全局最小
還展示了下式的的雅可比
可以看到loss很關注深度,然後對旋轉和2D形心位置的重要性穩步增加。
尺度的迴歸修復了平均車size的偏差問題,再優化的時候忽略了,因爲誤差已經很小了。
在優化過程中不需要手動執行任何主方向,也不需要縮放大小,損失就可以很好地控制每個組件的影響。
就是說不用控制各種比例咯,直接就能表現和好
Pose Recall vs. Training Data:
爲了更好的理解優勢和弱點,下圖展示了深度和旋轉的不同bin再 train/val 分割上的表現[ Monocular 3d object detection for autonomous driving ] 2016
好好學操作,分割數據集的時候一直在提這個論文
算了不同角度的召回率,這怎麼做的?假定預測了a角度,然後真實的是b角度,就是該是b的時候,有多少次是b?
如果俯視圖的IoU大於0.5,就認爲是正確
作者的座標系和KITTI一樣,角度爲0意味着物體朝向右(就是非自我中心了)。
由於數據集數量較小,所以畫了訓練數據的分佈,來看採樣頻率和位姿的質量的關係。
如果數據量小,就可能訓練的不夠,那樣看看每個分佈的質量,也合理;如果數據集很大的話,是不是就不用了?感覺也要看看吧,這樣的話能知道網絡的能力
對於位移,並沒有調查出現數量和結果的關係,通常更近的更好定位,因爲距離的很難估計,所以網絡也很依賴深度圖來估計距離。
在看不清楚的物體那裏,效果還是不好
Loss and input data:
還是那個論文裏的權重分配策略和輸入修改
前兩行是每個元素獨立迴歸,沒有使用lift loss
要怎麼個獨立迴歸呢?訓練的時候咋訓練啊
第一行是對所有的統一權重,就想41 [ Multi-level fusion based 3d object detection from monocular images ] 2018
然後第二行多任務是參考的[ Multi-task learning using uncertainty to weigh losses for scene geometry and semantics ] 2018
這下Multi mask 的權重分配也有專業的論文看了
但是加權後並沒有看到提升,哈哈哈哈
作者認爲每一項的大小根本沒法比較
除了數值大小之外,任何關於實際3D實例的不知情加權都無法恰當地評估相對重要性,就像將蘋果與橘子進行比較
類都不一樣,瞎平衡loss是沒有意義的,除非真的能量化每項對網絡的影響
但是,萬一某個項對網絡的影響很大呢,結果導致只要這一項優化的好了,其他項優化的不好也沒關係,總loss掉了就行,這樣的話還是要人工限制一下,把這個超級項的影響變小
就是像作者說的,各項都完全不同,那麼對網路的反向傳播作用效果也必然是不同的,讓他們平等的運行我感覺還是有點問題
不對,作者的loss計算不一樣,作者是將所有的項合稱爲一個最終結果,然後計算最終結果的偏差,這樣根據鏈式法則,就知道各項應有的係數了,就不用自己去設置係數了
第四行就沒有做加權操作,所有指標都是最好的
我感覺可能是巧合?除非loss函數設置的剛好
沒有深度圖的鳥瞰圖和3DAP也不算太差
合成的數據效果很好,這個合成數據還解決了旋轉的採樣不平衡問題
哇,原來合成數據還能齊到這樣的效果
以後做事要想想,能有那些好處,還能不能順手再多一些好處
作者還發現,他的數據增強都是無遮擋的,這無意中引入了新的偏差,即對遮擋的物體的檢測不友好
那就再來個遮擋的數據增強被,這樣還能用來做遮擋分割,就用mask來做,用mask來做遮擋,我真是個小天才!
代碼
沒開源,github上也沒人實現,而且文中提供的信息也不夠復現啊
求大佬指點一下,帶帶我
物體形狀探索和數據增強那塊整不明白