机器视觉基础系列2---简单了解深度估计
深度估计
深度估计通俗的来讲就是要得到一张图像当中,哪些区域离得比较近,哪些区域离得比较远。
输入一张彩色得图像,我们输出深度估计得图像,深浅即为远近(从而完成了离相机距离的估计。)
它是我们三维重建
的基础环节,因为我们需要深度的信息
。
简单总结一下深度估计的应用场景:
- AR,VR
- 可以得到每个像素点的深度值
- 辅助驾驶场景:
- 获取各目标距离信息
- 深度信息在三维世界中相当重要(坐标转换)三维重建
它有些类似于我们的分割任务:分割任务可以看作是对每一个像素点做一个预测,而我们的深度估计类似于对每一个像素点进行一个回归操作。
本质上说深度估计算是一个基础的任务了。
研究背景
在了解深度估计之后我们产生了一个疑问?因为之前从导师那里也了解到了激光雷达和3d点云这些东西。
这些完全可以完成3维空间的一个立体建模(其中一定包含深度的信息 )那为什么要用神经网络做深度估计和三维的重建呢?
原因就是激光雷达这些东西价格高成本高,普通的单目镜头比较便宜而已了
单目深度估计(End2End)用算法来进行实现。
使用的数据集
KITTI数据集(3d目标检测的一个常用的数据集)
KITTI数据集官网:https://www.cvlibs.net/datasets/kitti/index.php
特点:广(深度,分割,检测,3D等)准确 经典
这个数据集是一个车载数据集(个人理解是坐在车上面拍出来的)。
网络模型
使用神经网络来进行深度估计。
论文题目:Monocular Depth Estimation Using Laplacian Pyramid-Based Depth Residuals
发表时间:2021
IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY, VOL. 31, NO. 11, NOVEMBER 2021
对这一个用来进行深度估计的网络结构模型,进行拆解分开来看。
backbone特征提取
我们用RestNext101作为我们的backbone用来提取特征。(要考虑速度和精度来进行合理的选择。
)
从论文的网络结构图中我们也可以看出,它使用的多个尺度的层级信息。分别下采样2倍 4倍 8倍 和16倍的下采样操作。
从未体现出了特征的多样性。4个层,尺度大小各不相同,先准备好backbone输出。
深度估计的难度在哪里?难点主要就是在轮廓信息的处理上。我们通过多次的过程使得轮廓信息变得更加的清晰。
- 那么在下一步我们需要得到输入图片的轮廓信息,就像网络图描述的那样。如何得到清晰的轮廓信息呢?
两个特征图做减法来提取差异特征。分别对各个层级都做这个事,提取不同尺度的差异
如何做特征图的减法呢?我们对其中的细节进行简单的描述。
其实它这一个过程和Unet的过程有些相似,将我们下采样得到的第四个特征图 16倍下采样的特征图,使用插值的方法进行上采样的操作
经过上采样,向后得到 16 8 4 2倍上采样的结果,将两侧的特征图相减提取出轮廓的信息。
特征融合
之前在YOLO V3和其他的一些网络结构中用到了spp模块部分。
Spatial Pyramid Pooling,设计该模块的目的是,确保输入全连接层之间的特征向量feature vector是固定尺寸。feature vector 是feature maps的展开,常规的做法是对输入的数据进行剪裁和变形操作,这两种操作可能引发裁剪区域没包含物体的全部或者目标无用,是真严重等问题;而SPP则是将不同feature maps展开为固定尺寸的feature vector。
优点:可以忽略输入尺寸并产生固定长度的输出;利用不同池化核尺寸提取特征的方式可以获得丰富的特征信息,有利于提高网络的识别精度。
但是resize会丢失相关的信息。
我们spp模块与我们的空洞卷积进行结合。
- 让感受野更大,在不增加计算量的情况下
- 并不用每个特征点都计算,分开
- 可以设置空洞倍率来得到不同的特征图
对于我们的空洞卷积来说,因为中间的计算的叉开了会使得我们的计算不完全从而会缺少一些特征的提取。
但是换一种相反,我们将经过不同膨胀系数的空洞卷积得到的特征图进行一个像Spp一样的操作进行融合,能不能很好的改善这种效果呢?
结合之前提到的两个部分的思想于是就引出了我们的重点结构ASPP了
atrous spatial pooling pyramid
- 主要集成了SPP的思想和空洞卷积
- 文中只在backbone最后特征图做了一次
- 其实就是希望特征多样性能体现出来
X表示拼接(特征图预测结果R5,差异结果L4,中间特征X4拼起来)
首先我们从图中来看R5其实表示的就是,16倍下采样得到的特征图经过(红色块
)多尺度的卷积之后得到的深度图(使得我们的输出通道数为1
)的一个预测结果我们称之为R5
这个网络的复杂之处就在于,使用了不同维度的特征来进行拼接。分析好这些连线之间的关系,对于理解这个网络结构十分重要。
- 先说明得到R4的一个特征融合的步骤。
-
将得到的R5首先经过一个黄色块进行一个上采样的操作得到8倍的下采样的特征图。
-
将绿色的部分作为一个中间结果,经过一个upconv在通过卷积层进行卷积
-
同时我们提取到S/8直接经过一个卷积网络进行进一步的特征提取得到x4
-
将轮廓图l4也进行一个输入
综上:就是按照图示的部分进行融合不断的进行特征的融合,最后通过卷积层得到最后的一个R4深度图的输出。
同理按照相同的套路进行递归或者说是循环,就可以依次的得到 R3 R3 R1的输出结果。 Coarse-to-Fine的一个过程。
先把整体做好,再还原细节
结果输出
最后的一步其实和许多检测网络的部分有很多类似的地方,我个人总结就是将之前得到的结果,与最后于原图像尺寸相同的部分,在进行依次融合的操作。
权重参数预处理
图中的蓝色部分代表的是权重参数的分布,主要集中在0附近。
在通过RELU激活函数就会出现问题传统套路是CONV+BN+RELU 现在是多一个预处理;也就是橙色部分的WS我们称之为权重参数的一个标准化。
损失函数
深度估计的损失函数:
D ( y , y ∗ ) = 1 2 n ∑ i = 1 n ( log y i − log y i ∗ + α ( y , y ∗ ) ) 2 D\left(y, y^{*}\right)=\frac{1}{2 n} \sum_{i=1}^{n}\left(\log y_{i}-\log y_{i}^{*}+\alpha\left(y, y^{*}\right)\right)^{2} D(y,y∗)=2n1i=1∑n(logyi−logyi∗+α(y,y∗))2
yi指的是我们得到的一个深度的预测值。 yi*代表的是我们的真实值。
D ( y , y ∗ ) = 1 2 n 2 ∑ i , j ( ( log y i − log y j ) − ( log y i ∗ − log y j ∗ ) ) 2 = 1 n ∑ i d i 2 − 1 n 2 ∑ i , j d i d j = 1 n ∑ i d i 2 − 1 n 2 ( ∑ i d i ) 2 \begin{aligned} D\left(y, y^{*}\right) & =\frac{1}{2 n^{2}} \sum_{i, j}\left(\left(\log y_{i}-\log y_{j}\right)-\left(\log y_{i}^{*}-\log y_{j}^{*}\right)\right)^{2} \\ & =\frac{1}{n} \sum_{i} d_{i}^{2}-\frac{1}{n^{2}} \sum_{i, j} d_{i} d_{j}=\frac{1}{n} \sum_{i} d_{i}^{2}-\frac{1}{n^{2}}\left(\sum_{i} d_{i}\right)^{2} \end{aligned} D(y,y∗)=2n21i,j∑((logyi−logyj)−(logyi∗−logyj∗))2=n1i∑di2−n21i,j∑didj=n1i∑di2−n21(i∑di)2
di:表示的是预测值和真实值之间的差异,可以用下面的式子来进行表示。
log y i − log y i ∗ \log y_{i}-\log y_{i}^{*} logyi−logyi∗
不是特别理解,后面如果理解了在补充吧