深度估計 流水帳

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

這篇博客把全部相關資料集中記錄一下。python

 

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

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

 

而後是中文翻譯:https://github.com/Lishunkai/CNN-SLAM github

而後是一篇知乎點評文章:https://zhuanlan.zhihu.com/p/35062953  面試

 

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

由於要在python裏頭調用深度學習的depth prediction的東西,又要有slam方面的基礎設施,因此少不了要ubuntu

有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 中的東西。 

http://www.javashuo.com/article/p-ftymyfnf-mo.html 

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

這裏頭還有一些點雲融合的東西,對復現一個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

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

相關文章
相關標籤/搜索