参考代码:bts
1. 概述
导读:从2D图像中估计出深度信息是多解的,对此文章提出了在解码器的多个stage上加上隐式约束,从而引导解码器中适应深度估计特征的生成,从而产生更佳的深度估计结果。其中的隐式约束即为LPG(local planar guidance)层,但是该层实现与其配套的操作较为复杂,直接运用于部署存在较大难度,不过用于teacher网络指导student网络是一个不错的选择。
将LPG层的输出取出,得到下图中第二行的结果:
可以看到在 s t r i d e = 8 stride=8 stride=8的层次上生成的是整幅图像的大体结构,之后随着stride的减小,逐渐呈现出更多的细节信息。不过这部分生成的结果并没有进行显式监督,而是只有在不同stride的LPG输出组合得到深度上进行监督。因而LPG可以看作是深度信息在不同stride分量的隐式约束。
2. 方法设计
2.1 网络结构
文章使用的深度估计网络是U型网络,见下图所示,主要的改进点也就是下图右边详细的decoder部分。
在backbone输出特征之后文章通过shortcut+upsample的形式得到 s t r i d e = 8 stride=8 stride=8的特征图,之后通过ASPP网络增强网络的感知能力,其中的膨胀系数为 r = [ 3 , 6 , 12 , 18 , 24 ] r=[3, 6, 12, 18, 24] r=[3,6,12,18,24]。接下来这些特征便会经过不同stride对应的LPG层,最后得到最后的深度输出。
2.2 LPG层
文章提出的LGP网络结构见下图所示:
首先输入的 s t r i d e = k stride=k stride=k的特征(对应的特征图大小为 H k \frac{H}{k} kH),之后经过一个reduction操作将输入的特征图编码为3通道的特征(对应上图的输入部分)。这样在此基础上就可以得到构建局部平面的参数,也就是文章中提到的 ( θ , ϕ ) (\theta,\phi) (θ,ϕ)(对应上图的中间部分),可以参考:
# pytorch/bts.py#L110
def forward(self, net):
net = self.reduc.forward(net)
if not self.is_final:
theta = self.sigmoid(net[:, 0, :, :]) * math.pi / 3
phi = self.sigmoid(net[:, 1, :, :]) * math.pi * 2
dist = self.sigmoid(net[:, 2, :, :])