深度估計 流水賬


盯cnn-slam好久了,就是 Real-time dense monocular SLAM with learned depth prediction 這篇文章里頭的內容。

這篇博客把所有相關資料集中記錄一下。

 

首先是代碼,只有一個印度團隊寫的半成品:https://github.com/iitmcvg/CNN_SLAM 

一股咖喱味的代碼, gray -> grey。(仔細看過代碼后發現這個庫大概只完成了20-30%的工作量)

 

然后是中文翻譯:https://github.com/Lishunkai/CNN-SLAM 

然后是一篇知乎點評文章:https://zhuanlan.zhihu.com/p/35062953  

 

上面那個代碼里頭用到了python接口的g2o,pangolin。其實都是這里的東西:https://github.com/uoip 

因為要在python里頭調用深度學習的depth prediction的東西,又要有slam方面的基礎設施,所以少不了要

有py接口的g2o來完成姿態優化的部分。

(后來發現只要把要優化的位姿誤差的 loss 寫出來就可以了,深度學習框架本來就可以做優化,可以更加

徹底的脫離slam的相關設施)

上面那個代碼里頭顯然用到了 https://github.com/uoip/stereo_ptam 里頭的一些基礎設施。

 

然后具體安裝部分:

先pybind11,然后是g2opy,然后是pangolin,還有tensorflow。

我所有的東西都是在ubuntu 16.04 里裝的,預先裝了個anaconda3。

1, pybind11

git clone,在src里的cmakelists.txt要添加:

set(PYTHON_EXECUTABLE "/home/myname/anaconda3/pkgs/python-3.6.5-hc3d631a_2/bin/python")
set(PYTHON_INCLUDE_DIRS "/home/myname/anaconda3/include/python3.6m")
set(PYTHON_LIBRARIES "/home/myname/anaconda3/lib/libpython3.6m.so")

指定了python的相關路徑,不然會找到系統里的python。報了pytest的錯的話 cmake-gui 勾掉 需要測試 那個選項。

在src里建一個build文件夾,在build里面  cmake ..  ,然后再python setup.py install 即可。

2,g2opy

同pybind11類似,也要指定python編譯器,build文件夾也要在src里頭。cmake前預先裝一個eigen3和suitesparse即可,qt我也懶得裝了。

就算python setup.py install后,pip list里頭也是看不到g2o的,但是可以導入並測試。

make 到 99% g2o.cpp的時候會卡很久,但是沒有出錯,耐心等就可以了。我這筆記本性能不錯在這也等了5分鍾。

eigen版本不對也會出問題。安裝過程有問題的話去看issue

3,pangolin

先把pangolin本身的依賴裝了,再cmake和setup,步驟同上面類似。

 

tensorflow我裝了一個1.9 的gpu版。

 

2019.01.16 15:32

然后我又看了一波單目相機預測深度的博客和文章。。。

 

2019.01.17 09:57

https://zhuanlan.zhihu.com/akkala 這里有兩篇博客思路比較清晰。

然而看到一個高博的回答 https://www.zhihu.com/question/59151308/answer/253455678 

對於SFMlearner : " 給我的感覺是跑一遍direct slam,再用軌跡和地圖訓模型…… " 這就有點

脫了褲子放屁的感覺了。

的確,slam能夠得到粗略的深度,但是只用純slam手段問題也是很多的:

https://www.zhihu.com/question/67266664/answer/270986880 

 

其次,不同於大部分其他答主的觀點,我認為單目估計深度也是有意義的。盡管有不少硬件能夠直接得到深度圖,但它們都有各自的缺陷。
比如
3D LIDAR設備非常昂貴;
基於結構光的深度攝像頭比如Kinect等在室外無法使用,且得到的深度圖噪聲比較大;
而雙目攝像頭需要利用立體匹配算法,計算量比較大,而且對於低紋理場景效果不好。
單目攝像頭相比來說成本最低,設備也較普及,所以從單目攝像頭估計出深度仍然是一個可選的方案,應用比其它方案更加廣泛。
舉個SLAM的例子,對於單目SLAM來說,從單張圖(或者是靜止的圖序列)是無法在幾何上得到深度的。
如果能通過算法給出一個粗略的深度估計(相當於從數據集中獲得圖像的深度先驗),對於算法的收斂性和魯棒性也是一個很大的提升 [4]。
對於這個答主的回答,我在實際環境的測試中是有體會的。

想想人眼是怎么工作的:人是雙目的,實時做了語義級別的三維重建,但是並沒有做的非常精確。

因為沒必要很精確,只要夠用就行。比如算出來旁邊那張桌子或者椅子離我近一點或者遠一點並無太大的問題。

人的大腦一定是該忽略的信息忽略,不會無端的增加計算量人眼只會對四周三維環境做一個粗略的估計。

等注意到了某個目標,眼球轉過去了,才會對那個區域做精確的重建和識別。

人眼是通過 1, 顏色 -> 2, 三維結構 -> 3, 先驗信息 三種遞增的方式來認識四周環境的,並且后面的方式

會去輔助和修正前面的方式。前面的方式又會給后面的方式提供訓練素材。

比如

人眼會自動修正和忽略同一個物體所在的區域中因為光照不均勻而造成的顏色差異,這是訓練出來的,依靠了先驗信息。

比如一個目標物的顏色不對,但是這個目標物和背景明顯不在一個深度上,人眼也能做自動分割。並且人眼經常是顏色方便

分割目標對象時就按顏色來,按距離好做分割的時候就距離來,兩種方法都不占優勢時,就1,2,3三種方法一起來。

1,2兩種方式的作用甚至會隨着人的年齡的增長而弱化,但是第3種方式只要腦袋不出問題,甚至會越來越強的去輔助前

兩種方式。

 

所以最接近人眼的解決方式是:雙目、實時的粗略的三維語義地圖,並且之前接收到的圖像能一直不斷的訓練這個

視覺系統,以便得到更好的深度估計能力和語義分割能力。

對於實際系統而言,希望隨便拿一個相機做完標定后,扔到一個陌生的室外環境也能可靠的工作,泛化性要好。

我並不會拘泥於cnn slam,能夠盡力接近上述目標的方法就是我感興趣的方法。

 

2019.01.17.  18:54

跑了一下語義分割的代碼。pytorch升到1.0后我就沒什么時間玩玩,今天快速過了一下,跑了下FCN,參考的

是下面兩個鏈接:

https://github.com/bat67/pytorch-examples-cn    熟悉一下1.0,哎,世界變化太快,上一個我熟悉的版本還是0.3

https://github.com/bat67/pytorch-FCN-easiest-demo    pytorch1.0版的FCN,我的1050的4g內存的顯卡居然跑的動!不過batch size 改成了2。

vgg16 預訓練模型下載: aria2c -c -x 16 -s 16 -d ./vgg16 https://download.pytorch.org/models/vgg16-397923af.pth 

用了aria2c下載,速度快的驚人!要是斷了的話重新執行下就可以繼續下載了。

還需要了解一下如何自己標注語義訓練用的數據集並直接制作幾個。

還需要tensorboard把網絡結構圖顯示出來。

 

2019.01.18  15:30

monodepth 的pytorch 0.4版:   https://github.com/ClubAI/MonoDepth-PyTorch 

aria2c下kitti數據集倒是意向不到的快

 

2019年1月22日13:58:21

在pytorch 1.0 里頭改寫了上述0.4的版本,重寫了main文件,用公司一個雙目相機拍了室外的視頻,分解成

圖片后用渣顯卡訓練了幾十個epoch,看訓練過程中的預測結果,看起來感覺有點不太對。對比kitti數據集中的圖片,

發現是我拍的視頻左右兩個相機間的視差比較大,而kitti中的雙目圖片之間的視差都很小,兩張圖片之間重疊

的區域可能有90%以上。還得重新弄一下雙目相機再重新拍過視頻。

 

2019年1月28日10:41:48

之前看過一篇介紹  弱監督做語義分割  的文章有點印象,找了下,應該就是下面這篇博客中提到的文章:

https://zhuanlan.zhihu.com/p/53555419 

Learning Pixel-level Semantic Affinity with Image-level Supervision,開源了。

所有開源的文章都要高看一眼,沒開源的文章都只能把它們當做灌水文章隨便看一看,除了大家有口皆碑的沒開源的。

關注  弱監督語義分割  是因為想到讓我自己標數據集就頭疼,語義分割的數據集標注成本真是太高了!

這也算是為三維語義分割准備各種要素了。

看到有評論說目前的語義分割的sota是deeplabV3+,emmm......得研究下......

 

跑了下stereo-ptam,用的kitti的sequence 00,效果如下:

 

然后我稍微調整了一下代碼結構,回環檢測效果就不好了,真是玄學,看來對誤差很敏感啊,很不魯棒嘛。

issue里頭也有個人說回環檢測效果不好。

 

2019年2月16日10:25:25

BA-Net: Dense Bundle Adjustment Network

https://www.zhihu.com/question/67326012/answer/441434142

https://github.com/frobelbest/BANet    

 

傳統的BA是基於點、線特征的,最近的深度預測的各種網絡結構雖然提特征能力更強,

但是又沒有充分利用攝影幾何學中的先驗知識。BA-Net這個思路非常流暢!

解決一個問題,先驗信息或者規則利用的越多,這個問題越容易解決,而且難度多半是呈幾何級下降。

但是看訓練過程,是個supervised,需要groundtruth,這深度數據哪這么容易獲取。。。

還是要優先關注 unsupervised depth prediction 的方法。

 

2019年2月19日09:45:54

啊!昨天視頻面了一個廣州做自動駕駛的公司,問了1個小時20分鍾的技術方面的東西,

跟面試官有點不對味,應該是沒后文了。

不過約面試時間都拖了差不多一個禮拜,說面試官太忙,已經看的出這家公司忙到什么程度了。

還是繼續玩自己的,resnet -> DRN54,因為BANet里頭用了DRN-54嘛,

DRN-54 有代碼:https://github.com/fyu/drn 

一直在找一個在python里頭顯示點雲的工具,github上有人封裝了下PCL,但是我沒裝成功,而且只封裝了

一部分,封裝方式也不優雅。

然后看到了BA-Net里頭提到了DeMoN:  https://github.com/lmb-freiburg/demon ,里頭用VTK的python接口顯示點雲。

https://blog.csdn.net/donglany/article/details/78583380    nice哦!不過最終可能還是逃不過要封裝一下PCL。

現在有pangolin和vtk兩種顯示點雲的 python 接口了。

 

2019年2月20日09:20:18

想了想,我手邊最多有一個手機相機,或者一個雙目相機。supervised的深度預測的方法我就不考慮了。

理想情況下,應該具有下面這幾個要素:

1,要融合攝影幾何的先驗知識:BA-Net

2,要unsupervised: left-right consistensy 或者 ego-motion

3,預測出來的深度圖要比較精細:搞出一堆basic depth map來,就是搞基,然后組合起來。Pyramid?

4,盡量要實時:不是每一幀都預測深度圖,只對關鍵幀做預測,參考CNN-SLAM的結構。

5,還有回環檢測、語義分割、動態物體的處理等 沒有融進去。

 

2019年2月20日14:57:36

在arXiv 中搜了下關鍵詞 unsupervised depth prediction

看了下abstract和文章中的效果圖,看到比較不錯的一篇文章是: 

Depth Prediction Without the Sensors:

Leveraging Structure for Unsupervised Learning from Monocular Videos

有代碼: https://github.com/tensorflow/models/tree/master/research/struct2depth   

 

2019年2月22日11:05:44

捏着鼻子學tensorflow中,真的感覺跟新學一門語言一樣,然而現實還是逼得我要做tfboy。。。

我是為了把谷歌research model里頭的東西改寫成pytorch學tf的。

tf真是太不顧及用戶的學習成本了,毫無設計感,路徑依賴搞的現在的模樣已經人不人鬼不鬼的了。

github的免費私人庫真香!

 

2019年3月16日10:21:02

深度估計的3d-2d, 3d-3d之類的目前還沒人做。

二維特征 triangulation 得到三維特征還沒人做。

三維特征的表示, 三維特征怎么乘個 P 矩陣 就得到二維特征的表示,都沒人做。

三維特征未必一定要是深度圖,只要稍加轉換能夠方便的把三維特征轉換成深度圖就可以了。

點、線 等等特征,都只是很狹隘的特征。

為什么提個特征要添加訓練過程進去?添加多少的訓練進去為合適?

提取出怎樣的特征算是好的特征?

整體的結構和loss要怎么設計?都是問題。

還是大神說的好,深度學習果然是表示學習。。。

 

知乎上又看到一個大神的評論,結構信息是優先於顏色信息的,顏色信息依附於結構信息。

想想也是,黑白電影我們不照樣看么,並不太影響我們理解其中的東西。

 

2019年3月16日15:52:45

目標是我們設計的網絡,能夠從海量圖片中學出一個相機無關的 SE3 結構出來,

而且要在設計和訓練過程中充分體現出 SE3 的代數性質。

slam14講里頭的2D-2D,3D-2D都是應該有的。對應的就是triangulation, proejct網絡。

應該有的功能或者性質:

1,二維圖片-> 二維特征 -> 二維圖片

2,兩個二維特征 triangulation 到 三維特征,三維特征再project回二維特征。

      project過程是帶參數的,能夠輸入R, t變量。

3,三維特征 -> 深度圖 depth map -> 三維特征

4,兩個二維特征 + 內參 -> pose。對於三張圖片,能夠兩兩得到一個pose,且構成一個環。

     這里可以設計一個loss。給三張圖片,算出兩個pose出來算怎么回事,活只干了一半。

5,對於虛擬視點,投影過程搞出來的二維特征和圖片都應該是連續變化的。

     可以定義一個度量,二維特征和圖片有跳變的話就給懲罰。這里可能和SE3的可微連續性質掛鈎了。

6,相機無關的話,網絡應該有類似slam14講公式7.3, 7.7的操作。


其他的都可以繼承現有的常規操作了。

三維特征的表示目前來看可能跟BA-Net一樣搞出一堆基來比較好一點。

很多過程都是操作上應該可逆的、連續可微的。而且正着來也行,反着來也行。

很多合適的表示方法也應該具有類似autoencoder的性質。

 

虛擬視點搞不好可以引入GAN。畢竟GAN最擅長的就是想象,補全概率分布中未采樣的點。

難點應該是怎么把上述設計做成可微的。。。

 

2019年3月18日09:35:10

三維特征的表示可能可以借鑒 MVSNet、SurfaceNet 中的東西。 

https://blog.csdn.net/qq_38425638/article/details/84876481 

可微的單應矩陣也很有意思。

這里頭還有一些點雲融合的東西,對復現一個cnn-slam有幫助  

 

2019年3月23日22:20:13

另一個篇關於三維描述的文章:

https://zhuanlan.zhihu.com/p/59865273 

我對MVCNN比較感興趣。點雲,voxel這種東西都太不自然了,生物的視覺系統中有類似的機制?不見得。 

 

2019年3月29日17:06:42

之前做了一段時間 深度估計,后面接着做 弱監督語義分割、三維重建等。

 

2019年4月3日09:18:23

又看了一些文章的摘要,看到一篇訓練 SE3 網絡 的文章

SE3-Nets: Learning Rigid Body Motion using Deep Neural Networks 

還有一篇

3D Steerable CNNs: Learning Rotationally Equivariant Features in Volumetric Data  有代碼  

 

一直在找 dilated resnet,容易找到的是那個DRN,但是要自己編譯,明顯不通用。

終於找到了一個!!!之前看過,還注意過,沒有star,現在才又看到。。。

https://github.com/CSAILVision/semantic-segmentation-pytorch

非常重要!非常重要!

這東西隨便一改就可以拿來提升深度預測效果!

另外:  https://github.com/mrgloom/awesome-semantic-segmentation  爽到了。。。

 

2019年5月13日14:12:05

前一段時間將slam14講第13章的單目稠密重建改寫成了python版的,然而即便用了multiprocessing

做計算,速度還是遠不如原始的c++版本。又看了一遍cnn_slam的論文,感覺我似乎已經有能力

復現出來了。。。

 

2019年5月25日13:15:14

花了兩天學了下ros,架構上還是蠻簡單的。

魔改了下monodepth2的data_loader部分,還沒開始訓練。

 

2019年7月7日14:01

想要把一個ros的包用pybind11包裝成python的模塊,然后將點雲數據通過

這個模塊傳到ros里去,沒成功。簡單看了下ros的總體結構和代碼,ros真的好丑。。。

只能將點雲數據傳到pcl中處理和顯示了。后續考慮用protobuf將數據傳到ros中。

 

2019年7月15日13:37:38

1,遮擋的情況處理

2,畫幅的提高

3,兩張圖片-> 深度圖+pose 的結構才更合理

4,融入類似deepvo的lstm

5,增量式的深度預測

6,概率融合

7,結合語義分割的多任務學習

8,R和t分開

9,超像素、平面的處理,法向量,mixmatch 之類的 balabala ...

10,內參的訓練

11,huber loss

上述功能一個個慢慢做。

 

2019年7月18日22:19:53

關注到一個超像素網絡,開源了,有點意思,非常適合融入深度估計和語義分割的框架


免責聲明!

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



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