《S2R-DepthNet:Learning a Generalizable Depth-specific Structural Representation》论文笔记

Posted m_buddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《S2R-DepthNet:Learning a Generalizable Depth-specific Structural Representation》论文笔记相关的知识,希望对你有一定的参考价值。

参考代码:

  1. 官方:S2R-DepthNet,但是2021-0607通过该入口无法进入了,后续再观察。
  2. 未知版本:S2R-DepthNet

1. 概述

导读:这篇文章经过分析人对场景的3D感知,发现场景中的空间结构信息在深度感知中扮演了至关重要的作用。因而文章首先学习得到一个针对深度的结构表达,这个表达中抓住了深度估计中的关键信息,排除一些数据中无关的风格信息。这样使得深度网络着力关注场景的结构信息,使得即使在合成数据场景训练的模型也具有良好的泛化能力。文章方法的组成可以划分为下面的3个部分:
1)用于提取结构信息的STE(structure extraction)模块,它通过将图像进行分解得到domain-invariant的结构信息,以及与数据自身相关的domain-specific风格信息;
2)通过DSA(Depth-specific attention)模块构建一个上面STE结构图的attention map,再与之相乘从而进一步提纯STE模块得到结构图;
3)使用DP(depth prediction)模块在结构特征表达的基础上实现深度估计;
由于文章的方法使用结构信息作为深度估计的参考,因而在没有相应真实数据加入的情况下也取得了很好的效果,对深度估计任务来说是个很好的参考idea。

现有自监督和监督的深度估计方法都对深度信息的domain存在依赖,而且使用合成的数据简单进行深度回归会存在domain-transfer的问题,这就导致了其使用存在一定的局限性。而在这篇文章中抓住了图像中的结构信息,从而在此基础上进行深度估计,可以说是抓住了图像中的关键信息。
在这里插入图片描述
文章的方法首先会使用STE模块将输入的图像进行分解得到两个分量:stype-domain和structure-domain。这里的style-domain是不需要的,后者才是对深度估计有用的,可以见图1的第二列。但是structure-domain中也存在depth-specific和depth-irrelevant的两个分量。对此文章提出了DSA模块用于去产生一个attention map从而进一步对结构信息进行抑制和过滤,从而只剩下depth-specific的信息用于深度估计,见图1的第三列。

2. 方法设计

2.1 pipline

文章方法的整体pipeline见下图所示:
在这里插入图片描述
按照之前讲述的过程可以将上的pipeline划分为:STE( S \\mathcal{S} S)/DSA( A \\mathcal{A} A)/DP( P \\mathcal{P} P)三个部分。对应的文章也将整体的训练过程划分为三个阶段:

  • 1)训练STE模块中的编码器模块 ϵ s \\epsilon_s ϵs,使用风格迁移网络的训练方式使得其对不同风格的图片通用化,这里涉及到的是image-to-image的迁移(参考:MUNIT: Multimodal UNsupervised Image-to-image Translation,code:MUNIT);
  • 2)在训练好编码器模块 ϵ s \\epsilon_s ϵs之后(之后都不再更新其中的参数)与STE中的解码器 D s D_s Ds,以及 P \\mathcal{P} P进行深度估计(这里并没有使用 A \\mathcal{A} A);
  • 3)将 A \\mathcal{A} A加入近来与 P \\mathcal{P} P进行深度估计,这里不更新模块 ϵ s \\epsilon_s ϵs D s D_s Ds中的参数;

对于这篇文章的解读可以参考:CVPR 2021 | 神经网络如何进行深度估计?

2.2 训练的过程

step1: 编码器 ϵ s \\epsilon_s ϵs的训练
这里编码器是在PBN(painter by number)数据与合成数据(用于训练深度vKITTI)通过迁移学习的方式使得可以编码器对不同风格的图片具有通用性。这里具体的训练过程文章没有给出,提到的supplemental material也没有找见,通过上面的解读文章可以大体看一下它训练的结构:
在这里插入图片描述
step2:STE和DP部分的训练
这里固化编码器 ϵ s \\epsilon_s ϵs部分的参数,之后通过合成数据训练解码器 D s D_s Ds和DP部分的参数,使用的损失函数为:
L S = ∑ p ∣ ∣ D ^ ( p ) − D ( p ) ∣ ∣ 1 + λ ∑ p ∣ ∣ M s ( p ) ∣ ∣ 1 ⋅ e − β ( ∣ ∇ x D ( p ) + ∇ y D ( p ) ∣ ) L_{\\mathcal{S}}=\\sum_p||\\hat{D}(p)-D(p)||_1+\\lambda\\sum_p||M_s(p)||_1\\cdot e^{-\\beta(|\\nabla_xD(p)+\\nabla_yD(p)|)} LS=pD^(p)D(p)1+λpMs(p)1eβ(xD(p)+yD(p))
其中, D ^ \\hat{D} D^是深度预测结果, p p p是像素索引, ∇ x , ∇ y \\nabla_x,\\nabla_y x,y是求取水平和垂直方向的梯度, λ , β \\lambda,\\beta λ,β是超参数, M s M_s Ms是STE模块输出的结构图(structure map)。
在这里插入图片描述
step3:DSA和DP的训练
这里固定STE模块中的参数,之后使用DSA模块生成的attention map对上文中的structure map( M a M_a Ma)进行优化,也就是下面element-wise相乘的形式:
M s a = M s ⊗ M a M_{sa}=M_s\\otimes M_a Msa=MsMa
之后使用合成数据集更新参数:
L A = ∑ p ∣ ∣ D ^ ( p ) − D ( p ) ∣ ∣ 1 L_{\\mathcal{A}}=\\sum_p||\\hat{D}(p)-D(p)||_1 LA=pD^(p)D(p)1

文章的各个模块对最后性能的贡献度,见下面的消融实验结果(baseline为单纯DP模块):
在这里插入图片描述

3. 实验结果

KITTI数据集上的表现:
在这里插入图片描述
NYU Depth v2数据集上的表现:
在这里插入图片描述

以上是关于《S2R-DepthNet:Learning a Generalizable Depth-specific Structural Representation》论文笔记的主要内容,如果未能解决你的问题,请参考以下文章

Lifelong learning

浅谈 Active Learning

《Learning.Python》pdf

Learning Jquery

Python Learning: 02

Machine Learning In Action