一、比赛任务简要介绍
任务要求:
基于全景图像的室内外定位,即利用全景图像中特征点的位置关系来确定全景相机拍摄的坐标。
简单说就是每个场景他都给一组图片(用Insta360 Pro2相机拍摄的六个鱼眼图片和对应的合成全景图),图片如下:
给定了标定的相机内参以及训练集的绝对坐标,如下(图片名称,x,y,z):
任务要求:
对同一个场景下测试集的图片进行定位
二、比赛进程回顾
整体回顾就是各种方法的baseline大作战
目前战况如下:
第一阶段 -- 深度学习直接回归坐标
前期就感觉深度学习肯定好,因为大家都在搞这个,然后调研了不少方法,比较有代表性的就是posenet--《PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization》
这个方法就是直接用深度学习去预测相机的坐标,网络里在卷积层后面加上了LSTM,把一组图片给他输入,网络就能学习到一个场景下的一些信息去预测相机位置。
不过这方法尝试几次基本无解,原论文backbone是VGG能跑到30分吧,即便是跑ResNet34和50的backbone也就能提高一两个点。但是当时第一已经快40分了。
最后又研究下,最新的CVPR19论文《Understanding the Limitations of CNN-based Absolute Camera Pose Regression》直接就说了,那些用CNN回归相机位姿的方法其实最后都退化成图像检索了,整个网络就是在从学到的图像库中检索一个最相似的图片返回给你。
所以放弃深度学习了。
第二阶段 -- 传统三维重建
初期OpenMVG + 默认参数
开始考虑了好多方法,因为毕竟有很多框架嘛,但是还是选择了openMVG,主要是他有 球形相机模型。这个模型可以让你直接将全景图放进去重建,不需要进行什么去畸变切成透视图的操作。
然后有了显著提升:
感觉还不错,直接比CNN高了十几点!
当时我发现问题就是,我为了追求高精度用的自己合成的高清照片,但是我同学用的他们给的相机自身合成的小分辨率图片得到的结果竟然比我好三个点。
我越想越不对劲,然后检查一下他们给的小分辨率图片的Exif信息,发现有的竟然有GPS坐标!感觉貌似找到了原因。。。
就这样我用OpenMVG到了50点。
中期OpenMVG + 各种特征点 + 调参
SIFT、AKAZE、LFNET、D2NET、ContextDesc都尝试过。
总结说吧,都是半斤八两,深度特征点很多情况更差,也就ContextDesc有时候能高那么一两个点。
我放几张图就能感受到:
首先是LFNET,一张图片提取一万个特征点来匹配:
简直惨不忍睹,可能是训练集问题吧,这个网络的描述点泛化能力不咋地。
然后是D2Net:
简直是随机匹配666
比较好的是ContextDesc:
好太多了,但是这个描述点计算起来超级慢,超级消耗资源。
最后放上最传统的SIFT吧:
虽然不知道正确匹配的结果,但是看起来就觉得sift果然是经典。
现在COLMAP + 调参
直接锤爆OpenMVG,参数都不用调整,直接auto跑起来就是65分!baseline太高了,而且大家都发现这个东西了。感觉随时都可能被顶下来。
做法:
COLMAP没球形相机模型,所以我只好crop出来的透视相机来跑重建,原图如下:
Crop后的小图片:
问题挺多的,总结下吧:
- 由于是切割的图片,会导致重建出来的属于同一地点的相机有偏移。
在这种情况下,直接求平均值肯定不是最好的解决方案。我查阅很多COLMAP的文档和Issue,关于相机间的的相对位姿是可以做到硬约束的,我也实现了这个脚本。但是目前看来这个硬约束就是在重建的结果基础上再做一次全局的BA,提升非常有限,甚至会导致结果变差(很简单,就是在之前重建的基础上有同属于一个位置的不同相机被SfM当作不在一个地点,而且这个差距还比较大,这时候强行给一个约束就会将别的很好的相机拉过去强行满足这个条件,自然结果不会好,毕竟tracks什么都还是之前计算的。) - 有的场景表现的还不如OpenMVG
主要是全景图问题,这个Colmap用的是crop后的图片,在纹理比较少的地方就会丢失相机,而全景图先天具有特点就是视野非常大,即便是某处没纹理但是其他地方也有纹理,这就对重建非常有利。 - 最重要是怎么调参来提高精度
感觉重建的结果不一定跟图片的分辨路呈正相关结果。有时候小的图片反而更好。
图片大时候提取特征点数目也要变多,但是不是越多越好,就我实验一张图三十万的特征点跟一万特征点很多时候不是变好的。
match严格那么精度有所提高但是相机会丢失,宽松了精度就下来了。
reconstruction时候怎么才能不让他初始化距离为1,因为这样转换误差比较大。
大场景global肯定比incremental好,但是colmap其实没有这个选项,只能通过调节局部BA和全局BA频率来降低累积的误差。