25/2/16 <算法笔记> MiDas原理

MiDaS(Monocular Depth Sensing)是一种基于单目深度估计的技术,它通过深度学习方法使用单张RGB图像(普通2D图像)来估算场景的深度图(Depth Map)。相比于传统的依赖专用深度传感器(如LiDAR或ToF相机)的深度感知方法,MiDaS 不需要额外的硬件,仅依赖普通的单目摄像头即可对场景的深度进行预测。

以下是通俗化的 MiDaS 原理解析:

1. 什么是深度估计?

在计算机视觉中,深度估计旨在为场景中的每个像素估算与摄像机的距离。这种深度信息可以用灰度图表示:

  • 场景中的物体越近,像素值越亮(深度越小)。
  • 场景中的物体越远,像素值越暗(深度越大)。

MiDaS 生成的结果通常是标准化后的相对深度(Relative Depth),而非绝对物理尺度上的距离。

2. MiDaS 的核心原理

(1) 深度估计的训练目标

MiDaS 的核心目标是通过神经网络从单张 RGB 图像提取有意义的特征,并学习将其映射为深度图。其训练过程基于多种深度相关数据集,将网络训练成为能泛化到多场景、多分辨率、多种镜头的深度估计模型。

与其他深度估计方法相比,MiDaS 关注生成相对深度关系,即:预测场景中的物体之间哪个更远,哪个更近,而非精确的实际测量值。

(2) 网络结构
  • MiDaS 使用了一种基于图像特征提取的编码器-解码器(Encoder-Decoder)架构
    • 编码器负责提取图像中的全局特征(例如形状、边缘等),并压缩到低维特征空间。
    • 解码器将这些特征逐步上采样,生成与输入图像相同分辨率的深度图。
  • 最新版本的 MiDaS 使用 Vision Transformer(ViT) 或强大的卷积网络(如 ResNet 或 EfficientNet)作为特征提取器,使模型能够捕捉更多场景中的长距离依赖关系和复杂特征。
(3) 训练数据来源
  • MiDaS 是一种跨领域模型,它通过不同的深度相关数据集进行联合训练,比如:
    • 近景目标的精准深度数据集(如 MegaDepth、ReDWeb)。
    • 室内场景(如 NYU Depth 数据集)。
    • 广域尺度的景深(如 DIW 数据集)。
  • 使用了一种叫 Scale-Invariant Loss(尺度不变损失) 的策略,使模型能够在平滑过渡和深度关系中保持稳健。
(4) 输出相对深度
  • MiDaS 的结果表示的是像素间的相对深度关系,而不是物理距离。
  • 比如说,输出的深度图可能告诉我们“树在汽车后面”,但不能直接告诉我们“树距离摄像头 10 米”。

3. MiDaS 的执行流程

  1. 输入处理

    • 一张 RGB 图像被输入至深度估计模型。
    • 图像经过预处理(如标准化和缩放)以适应网络输入。
  2. 特征提取

    • 编码器提取图像的高维抽象特征,捕捉全局场景结构以及物体之间的关系。
  3. 深度预测

    • 解码器将特征映射为二维深度图,并通过独特的损失函数优化输出结果,使相对深度信息更加准确。
  4. 后处理与输出

    • 将神经网络输出的深度图标准化(例如归一化到0-255),方便视觉化或后续任务使用。

在 MiDaS(或单目深度估计)中,模型的核心目标是从输入的 RGB 图像中学习到场景的深度关系,并通过特定的损失函数来优化。这些公式主要围绕以下几个方面展开:前向传播中的深度表示网络参数优化的损失函数,以及标准化(后处理)操作

MiDaS 的核心任务是将输入 RGB 图像(3 通道)映射到一个深度图(Depth Map,1 通道)。可以用以下公式表示:

MiDaS 使用多种深度相关的训练数据,其中一部分数据只提供相对深度,而非绝对深度。为此,MiDaS 引入一种尺度不变损失(Scale-Invariant Loss),专注于优化深度关系,而不受绝对尺度的影响。

(1) 尺度不变损失(Scale-Invariant Loss)

尺度不变损失函数用于训练深度估计模型,让其专注于预测正确的点间深度关系,而忽略整体深度的绝对大小。这一损失由两部分组成:点对点误差项和整体协方差项。

(2) 梯度一致性损失(Gradient Consistency Loss)

此外,为了使预测深度图展现更平滑的远近关系,MiDaS 还引入了一个梯度一致性损失,用于比较深度图的梯度变化(即物体边缘和纹理等特征):

(3) 总体损失

结合尺度不变损失和梯度一致性损失,MiDaS 的总体损失函数可以表示为:

λgrad​:控制梯度损失对总损失的影响权重(通常是一个超参数)。

输出的深度图经常是未归一化的相对深度,因此需要后处理(标准化)以便易于理解或进一步处理。假设原始深度图的像素值为 D^iD^i​,我们可以对其进行线性归一化到区间 [0,1][0,1]:

由于 MiDaS 使用的网络(如 ResNet 或 Vision Transformer)会对输入图像进行下采样,再解码生成深度图,可能会导致输出的深度图分辨率低于原始图像分辨率。因此需要插值进行分辨率恢复:

双线性插值(Bilinear Interpolation):

在推理阶段,单张 RGB 输入图像 II 进入模型后,经过编码器提取特征,再通过解码器生成深度图:

  • Wencode​:编码器权重,提取图像的特征 ϕ(I)。
  • Wdecode​:解码器权重,将低维特征还原以输出深度图。
  • 最终得到的深度图可以通过归一化和后处理调整,以适用于具体任务。

大致的方法可以归纳为将一张三通道(RGB)的图片编码为一通道(单通道)的过程,但背后还涉及更多的细节来确保模型不仅仅是简单地转换通道,而是能够精准地提取和预测深度信息

简单归纳:RGB(三通道) -> Depth Map(一通道)

但是,不同于对颜色、纹理等直接编码,这里的一通道并不是像灰度图那样只表示亮度,而是深度信息,即图像中每个像素都含有该点与相机之间的相对距离。模型的核心任务是从三通道图像中理解物体的几何关系和场景的三维信息,而这需要模型具备一些特殊能力:

实际做了哪些复杂的事情

  1. 特征提取:看透二维信息的本质

    • 对于三通道的输入图片来说,RGB 中的红、绿、蓝通道值本身其实只包含像素亮度信息。要估计深度,模型需要从二维特征中提取潜在的三维信息
    • 举个例子:模型要认出两颗球相互遮挡,并判断哪个更靠近镜头。
    • 这就需要依赖神经网络的编码器部分(通常是采用预训练的 ResNet 或 Transformer 变种网络),学习到这些复杂的特征关系。
  2. 相对深度 vs 绝对深度

    • 由于单目深度估计只能基于一张图片,它缺乏真实场景的绝对度量(比如激光雷达提供的真实深度值),所以预测出的深度图是一个相对深度图
    • 比如一棵树比一栋建筑物近,但具体的米数可能无法得知。
  3. 损失函数引导的深度学习

    • 模型在训练时依赖特殊的损失函数,比如 MiDaS 提到的尺度不变损失(Scale-Invariant Loss),这类损失函数能避免模型被图片缩放和场景比例的问题干扰,让它更关注哪些物体更近,哪些更远
  4. 梯度一致性:确保边界清晰

    • 为了让深度预测能捕捉到物体的轮廓和边界,模型还通过梯度损失或边缘一致性损失,强制让深度图中的变化(比如边缘处的深度差)与原图片的结构相一致。
  5. 后处理:标准化单通道深度图

    • 深度图本身是理论上的相对值,因此最后的输出通常会经过归一化或插值来调整尺度或增强可视化效果
### 实现鼠标悬停时按钮变色效果 要实现鼠标悬停时按钮背景颜色变化的效果,可以通过纯 CSS 完成这一功能。以下是具体的实现方法: #### 使用 CSS 的 `:hover` 伪类 `:hover` 是一种 CSS 伪类,当用户的指针悬浮在一个元素之上时会触发该状态。可以利用此特性来修改按钮的样式。 ```css button { padding: 10px 20px; margin: 5px; color: #fff; background-color: #007bff; /* 初始背景颜色 */ border: none; border-radius: 4px; cursor: pointer; } button:hover { background-color: #0056b3; /* 鼠标悬停时的背景颜色 */ } ``` 上述代码中定义了一个默认样式的按钮,并设置了鼠标悬停时的颜色变化[^1]。 如果需要更复杂的交互逻辑(例如动态计算颜色),则可以借助 JavaScript 来完成。 #### 使用 JavaScript 动态更改背景颜色 虽然推荐使用 CSS 解决此类简单需求,但如果希望增加更多灵活性,也可以通过 JavaScript 修改按钮的样式属性。 ```javascript document.querySelector('button').addEventListener('mouseover', function() { this.style.backgroundColor = '#0056b3'; // 设置鼠标悬停时的背景颜色 }); document.querySelector('button').addEventListener('mouseout', function() { this.style.backgroundColor = '#007bff'; // 恢复初始背景颜色 }); ``` 这段脚本监听了 `mouseover` 和 `mouseout` 事件,在鼠标进入和离开按钮区域时分别设置不同的背景颜色。 无论是采用 CSS 还是 JavaScript 方法,都可以达到预期效果。通常情况下优先考虑 CSS 方案,因为它性能更高且易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值