论文笔记 - BiFuse: Monocular 360◦ Depth Estimation via Bi-Projection Fusion. CVPR 2020
这篇博客介绍一篇CVPR2020的论文,这篇论文结合了全景图(360°图像)的两种常见投影方式,设计了融合模块及双分支神经网络,实现了出色的单目全景图深度估计性能。论文地址:https://ieeexplore.ieee.org/document/9157424
通过两种投影融合方式进行单目360度全景深度估计
本文提出了利用两种全景图投影进行单目全景深度估计的算法。文章利用双分支的神经网络处理ERP投影以及CubeMap投影这两种常见的360图像投影。ERP合成了完整的视场角但是引入了畸变,cubemap消除了畸变但是在边界存在不连续。本文提出了双投影融合方案并结合了可学习的mask平衡两种投影的feature map。此外,本文也提出了针对cubemap的球面padding 方法来缓解面之间边界的不连续性。本文的算法在4个全景数据集上取得了sota的结果。
1. Introduction
文章指出,从2维图像恢复三维结构存在广阔的应用前景,例如自动驾驶及室内机器人等。由于深度学习及大规模训练数据,单目深度估计的性能得到了大幅改善。例如FCRN取得了单目深度估计很好的效果。但现有的算法主要为常规视场角的相机而设计。360°相机近年来逐渐流行,也因其能够推断完整周围环境三维结构的能力而激发了360°单目深度估计的研究。
这篇文章提出了一个端到端可训练的神经网络,能够利用两种全景图常见投影–equirectangular projection(ERP)和 cubemap,将二者作为输入预测单目的360°深度图。其idea的动机来源于人眼能够结合周围广阔视野以及视觉焦点(视网膜黄斑区域)的视觉信号。ERP提供了广角视野信息而cubemap提供了小但无畸变的视野。ERP能够呈现周围全景但是引入了畸变,cubemap无畸变但每个面连接处存在不连续性。将二者结合就提出了本文的算法:BiFuse
文章认为一般cubemap提供的中央视角太小限制了融合算法的有效性,cube padding填充算法在一些研究中用于扩展视野,但是会在边界处引入畸变与几何不一致性,因此提出了球面填充spherical padding结合了球面几何减小边界不一致性。最后,不同于简单的将两个投影的特征直接结合的方式,文章提出了带有可学习mask的融合策略,来平衡二者的信息。文章项目连接:https://fuenwang.ml/project/bifuse 不过代码目前只有测试代码,没有训练部分。
本文的算法应用于Matterport3D, PanoSUNCG, 360D and Stanford2D3D 这4个全景公开数据集上取得了SOTA的结果。作者总结文章的贡献如下:
- 提出了端到端双分支网络,分别处理ERP与cubemap投影,模拟人眼的周边与中央视角
- 提出了具有可学习mask的融合算法,共享两种投影处理时的信息
- 提出了球面填充spherical padding扩展cubemap的视野减小边界不一致性
2. Related Work
本文对单目深度估计,以及全景感知的相关论文进行了回顾,这里不再赘述。
3. Approach
cubemap一般表示为6个面,每个面是边长为w的正方形,标记为{B,D,F,L,R,U}分别指代back,down,front,left,right,up这6个面。每个面可以被看做是焦距为w/2的相机独立拍摄的图像(视场角90°),6个相机的投影中心重合于1点,也即立方体的中心。如果将世界坐标系原点设置于立方体中心处,则6个相机的外参将只由旋转矩阵
R
(
f
i
)
R_(f_i )
R(fi) 表示,没有平移向量。给定相机系统中某个成像平面fi上的一点pi及其三维坐标(x,y,z)
能够通过映射关系转换道ERP表示:
θ
(
f
i
)
θ_(f_i )
θ(fi),
ϕ
(
f
i
)
ϕ_(f_i )
ϕ(fi) 代表ERP投影下的经纬度,
q
i
x
,
q
i
y
,
q
i
z
q_i^x,q_i^y,q_i^z
qix,qiy,qiz 是q坐标的x,y,z分量。这一映射关系实现了ERP与cubemap之间相互转换关系,文中记作E2C与C2E。
本文指出一般的cube padding填充方法仅使用相邻面的特征进行填充,不和投影性质,因此提出了球面填充spherical padding(SP)方法,通过投影关系进行填充。将每个面通过几何关系联系起来。
最直接实现SP的方法是将所有面先投影到一张ERP图像上,然后将每个面的视场角扩展为大于90°,并重新投影到cubemap。
视场角扩展为σ′, 边长扩展为w^′=w+2γ,投影为cubemap时需要使用新的参数。
上述的变换过程需要先进行C2E,改变参数再进行E2C,计算量较大。因此作者提出建立cubemap面与面之间的映射关系,padding部分等价于从其他面取一些点。
根据相机投影模型,cubemap不同平面等价于不同相机拍摄的图像,相机直接只存在旋转关系,因此一个平面的点投影到另一个平面上的位置能够根据上述关系计算得到,从而得到需要填充区域的信息。
BiFuse网络
整体而言,网络包含两条分支,都遵循encoder-decoder的结构,分别将ERP与cubemap作为输入,两条分支分别记为Be和Bc。
文章提出了融合模块fusion block作为两个分支交互的桥梁。在最后得到ERP与cubemap各自分支的深度图后,将cubemap转化为ERP进行拼接,并通过卷积网络结合二者得到最终的预测深度图。
文章设计了bi-projection双投影融合模块H,对Be和Bc每一层的特征he和hc,估计对应的特征图:
首先将得到的h_e^′, h_c^′ 拼接起来,随后通过卷积网络及sigmoid激活函数估计出Mask来平衡两个分支的特征。然后计算二者交互后的特征:
将二者作为两个分支下一层的输入。
换句话说,两个分支并不是一层的输出作为下一层输入,而是将输出的特征经过融合模块,并计算一个可学习的mask,随后按照mask加权,得到融合的特征,在输入到下一层去。这样的设计使得连个分支每一层都进行了交互。
损失函数选择了huber损失:
两种投影的输出都进行了监督。
网络结构方面,本文使用ResNet50作为encoder,借鉴了FCRN的decoder部分。两个分支每2层插入一个融合模块进行特征的融合。
4. Experimental Results
本文取得了很好的结果,这里简单放一张结果图:
实际测试:
论文开源了与训练的模型和测试代码,测试结果是裁剪后的ERP图像,在南极和北极各有一个条带裁掉了,如果不裁的话可以看到南北极误差较大,可能是收到畸变的影响。由于没有提供训练代码,我尝试载入预训练模型并微调,对于256*512的ERP图像,大约batch size为2时占用约20G显存。以上只是个人简单测试结果。