低成本测距方案--单目深度估计(二)
文章导读
导读:上周,小编分享了一篇单目深度估计的论文,发现大家对该研究方向有浓厚的兴趣,那么小编将继续为大家分享单目深度估计的最新进展。本次为大家带来的文章题目为Adabins:Depth Estimation using Adaptive Bins,这是一篇CNN结合Transformer的文章,也是最近的研究热点,让我们一起来学习一下吧。
Part 01
当CNN网络遇上Transformer
CNN是非常经典的网络结构,CNN的出现在很大程度上推动了计算机视觉技术的快速发展。CNN的三大核心思想是,局部连接(感受野)、权值共享(卷积)、空间或时间上的下采样(池化),卷积神经网络的优势是具有强大的特征提取能力,但其对局部细节的出色理解使得其全局的建模能力较弱。
Transformer在2017年横空出世,虽然该结构的提出时间较CNN晚了许多,而且其早期的应用是主要是NLP领域。但当研究者们将其跨领域应用于CV任务后,取得了意想不到的效果,甚至一度有赶超CNN的趋势。Transformer的核心思想是注意力机制,Transformer天然自带的long range特性使得其从浅层到深层,都能较好的利用全局有效信息,具有较强的全局建模能力。
CNN和Transformer各有特点,一个更加关注局部的特征,一个更加关注全局的特征。因此,如果二者能够有效的结合,那么必定能够进一步推动计算机视觉技术的发展。从目前最新的研究成果ConvTransformer、BoTNet等模型来看,二者结合的模型将成为CV领域的新的研究热点。
Part 02
单目深度估计中的关键点
计算机视觉中存在一个经典的问题,即如何利用单张RGB图像的输入,估计高质量稠密的深度图。因此,生成高质量的特征图对深度估计而言十分的重要,在上一篇深度估计的文章中介绍了BTS的方法,其提出了局部平面引导层(LPG Layer)将特征引导到全分辨率,而不是采用暴力上采样,提升了一定的效果。而单目深度估计提升效果的关键是,应对输出值执行足够的全局分析。这恰恰是传统CNN方法的弱点,CNN只有当在较低的空间分辨率时才能够较好的处理全局信息。
Part 03
AdaBins方法的提出
作者通过对现有方法的分析,明确了文章的核心思想是,对传统的编码器—解码器体系结构的输出进行全局统计分析,并使用以最高分辨率运行的学习后处理构建块来细化输出。对于处理模块的构建,作者紧随最新的研究趋势,引入transformer结构,并通过与cnn的结合,提出的Adabins的方法在单目深度估计上具有一定的优越性。
创新点:提出了一个基于transformer的架构模块—Adabins,来执行场景信息的全局处理。
Adabins的方法的网络结构如下:
Adabins方法的性能表现:在KITTI数据集下,目前该方法目前位居第一位,在NYU-Depth-v2数据集下,同样是目前的SOTA模型,证明该方法具有较强的性能优势,值得我们学习和参考。
Part 04
具体的实现方式
作者在设计网络架构时,提出了四种设计选择:
(1)采用自适应装箱策略来离散化深度区间D=(Dmin,Dmax)为N个单元。这个对于给定的数据集,间隔是固定的,由数据集规范确定或手动设定为合理的范围。这里将最终方案和其他三种可能的设计选择进行对比,如下图:
a. 用统一的单元宽度固定单元:深度间隔D将被划分为尺度相同的N个单元
b. 用对数尺度的单元宽度固定单元:深度间隔D将用对数尺度划分为相同大小的单元
c. 受训练的单元宽度:单元宽度时自适应的,并可以从特定的数据集进行学习,所有图片共享深度间隔D细分出来的单元
d. 最终方案Adabins:每张图片的间隔b是自适应计算出来的。
(2)将深度间隔D离散为各个单元并且将每个像素分配到单个单元中形成深度离散伪影,最终深度预测为单元中心的线性组合,从而使得模型能够估计平滑变化的深度值。
(3)作者通过分析发现,在空间分辨率较高的张量上使用注意力可以获得更好的结果。因此,对网络模块的顺序作了调整,为编码器+解码器+注意力机制,而先前的方法大多会将注意力机制放在中间位置。
(4)所提方法使用了一个基线编解码器卷积网络,结合一个基于transformer的架构块block。网络使用预先训练好的Efficientnet B5网络作为编码器主干,解码器方式为标准特征上采样。本文的核心内容是提出的自适应单元宽度估计块—AdaBins,该模块的输入是由前面解码器的输出张量Xd∈R(H×W×Cd),即解码特征,通过Adabins模块处理后,得到(H×W×1)的张量。
AdaBins的4个子模块,它们分别是:Mini-ViT、Bin-widths、Range attention maps和Hybrid regression,下面逐一介绍。
mini-ViT:该模块是ViT的简化版本,以适应较小的数据集,其作用是使用全局注意力来计算每个输入图像的单元宽度向量。模块的结构图如下图所示,mini-ViT由二个输出:1) bin widths向量,它定义了如何为输入图像划分深度区间;2)大小为H×W×C的范围注意映射,它包含了对于像素级深度计算有用的信息。
Bin-widths:Transformer需要一个固定大小的向量序列作为输入,而输入的是Xd∈R(H×W×Cd)的解码特征张量。因此,通过一个卷积核大小为p×p,步长为p,输出通道为E的卷积对输入进行操作,卷积输出结果为h/p×w/p×E的张量。再将结果reshape成一个空间坦的张量Xp∈(S×E),其中S=hw/p2作为Transformer的有效序列长度,并将这一E维向量作为patch embeddings。向量经过Transformer后的输出为Xo∈(S×E),在第一个输出embedding使用MLP head并对输出b'进行归一化,最终获得bin-widths向量b,如下:
range attention maps:解码后的特征代表高分辨率和局部像素级特征,而Transformer输出embeddings包含更多的全局信息。来自Transformer的输出embeddings 2 通过 C + 1 用作一组 1 × 1 卷积核,并与解码特征(在 3 × 3 卷积层之后)进行卷积以获得范围注意图 R。final depth=全局信息R+局部信息b。
Hybrid regression:范围注意图R通过1×1卷积层得到N通道,并进行softmax激活。深度单元中心c(b)从单元宽度向量b计算得到,计算公式如下:
最终,每个像素的最终的深度值d从该像素的Softmax分数和深度单元中心c(b)的线性组合计算得到,计算公式如下:
其中Pk为定义的N个softmax的得分。
损失函数:该方法的损失函数由2部分构成,分别是像素级深度损失和单元中心密度损失。
像素级深度损失的定义如下:
其中:
单元中心密度损失的定义如下:
最终,总损失定义如下:
Part 05
作者在kitti和NYU-Depth-v2二大数据集下进行了实验,均取得了SOTA的性能表现。
Part 06
总结
文章通过CNN结合Transformer的方式进行单目深度估计的研究,提出了一个新的模块称为Adabins,并在二大公开数据集上取得了优异的性能表现。小编觉得,作者的主要贡献是用transformer的出色全局信息处理能力,结合CNN的局部特征处理能力,并以取长补短的方式进行网络设计。那么,小编觉得,该思想不仅可以用于单目深度估计,如用于其他的任务,如分割,检测等任务应该对效果也会也一定的提升。从目前的研究情况来看,CNN和Transformer的结合在未来的研究中,将会在不同的任务中碰撞出火花,小编也期待新的研究成果的推出,与大家一同学习!