首先,我们要感谢组织者和Kaggle团队举办这次挑战赛,这是一次非常棒的体验。
我们的解决方案
在最终提交中,我们采用了SuperPoint、KeyNet/AffNet/HardNet和SOSNet的集成作为特征检测器/描述子,并使用SuperGlue和Adalam进行特征匹配。我们使用Colmap进行重建和相机定位。我们还使用了hloc来加速流程,并使其在验证和测试时更具可扩展性。
图像检索
我们使用了在hloc中实现的NetVLAD作为图像检索的全局特征描述子。
特征匹配
我们在数据集中首先注意到的是,某些场景包含大量旋转后的图像,我们尝试通过两种方法来解决这个问题:
1) 使用旋转不变的特征匹配器(例如KeyNet/AffNet/HardNet、SOSNet)。
2) 使用轻量级方向检测器检测旋转角度,并相应地旋转图像对,使两张图像具有相似的方向(为简化起见,我们仅将旋转角度设为90、180和270度)。
我们同时尝试了这两种方法,发现它们在Heritage数据集上均能带来相似的提升。然而,通过集成更多特征匹配器,我们在Urban和Haiper数据集上观察到了额外的改进,因此最终采用了这种方法。该集成方案在9小时的时间限制内取得了最佳效果:SuperGlue + KeyNet/AffNet/HardNet(配合Adalam)+ SOSNet(配合Adalam)。在集成模型上使用方向补偿并未带来进一步的提升。
未奏效的方法:
1) 我们首先尝试了这种SOTA方向检测器,但它占用内存过多,无法集成到Kaggle上的流程中。
2) 我们发现基线中的KeyNet/AffNet/HardNet + Adalam是无需任何预处理的最佳单一特征匹配器——仅通过调整参数并将输入图像调整为1600大小,我们就能达到0.455/0.433的分数(相当于第47名),但当我们使用hloc将其集成到流程中时,性能显著下降至0.334/0.277(在本地同样如此,主要体现在Urban数据集上),我们尝试调查原因,但仍未找到答案。
3) 我们尝试了许多近期的特征匹配器及其集成方案,包括DKMv3、DISK、LoFTR、SiLK、DAC,但它们要么表现不佳,要么在集成到流程中时速度过慢。总体而言,我们发现端到端的密集匹配器并不太适合本次多视角挑战,尽管它们在去年的双视角挑战中表现出色,但其速度过慢,且取得的分数也不够理想。以下是一些本地验证结果:
- SiLK(在约800x600分辨率下):
urban:0.125
haiper:0.165 - DKMv3(在约800x600分辨率下,仍然非常慢):
heritage:0.185
haiper:0.510 - DISK(在约1600x1200分辨率下):
urban:0.461
heritage:0.292(使用方向补偿时为0.452)
haiper:0.433 - 使用Adalam的SOSNet(在约1600x1200分辨率下):
urban:0.031
heritage:0.460(使用方向补偿时相同)
haiper:0.653 - 使用Adalam的Sift / Rootsift(在约1600x1200分辨率下):
urban:0.02
heritage:0.396
haiper:0.635 - DAC:结果非常差
重建
在合并集成模型中的所有匹配点后,我们在重建模型前于Colmap中应用了几何验证,从而加速了重建过程。
未奏效的方法:
1) 我们尝试使用Pixel-Perfect SFM,在本地搭建后,其视觉效果与我们的流程相当,但由于无法在Kaggle上成功运行,因此未进一步采用。
2) 我们尝试使用MAGSAC++替代Colmap默认的RANSAC函数,以在重建模型前剔除错误的匹配点,但最终得分未出现显著差异。