深度估计 流水帐

盯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

关注到一个超像素网络,开源了,有点意思,很是适合融入深度估计和语义分割的框架

相关文章
相关标签/搜索