盯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
“
想想人眼是怎么工作的:人是双目的,实时做了语义级别的三维重建,但是并没有做的非常精确。
因为没必要很精确,只要够用就行。比如算出来旁边那张桌子或者椅子离我近一点或者远一点并无太大的问题。
人的大脑一定是该忽略的信息忽略,不会无端的增加计算量。人眼只会对四周三维环境做一个粗略的估计。
等注意到了某个目标,眼球转过去了,才会对那个区域做精确的重建和识别。
人眼是通过 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 结构出来,
应该有的功能或者性质:
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
关注到一个超像素网络,开源了,有点意思,非常适合融入深度估计和语义分割的框架