【MLP-BEV(7)】深度的计算。针孔相机和鱼眼相机对于深度depth的采样一个是均匀采样,一个是最大深度均匀采样

文章目录

  • 1.1 问题提出
    • 1.1 看看DD3D 的深度是怎么处理的
      • 给出代码示例
    • 1.2 我们看看BEVDepth的代码

1.1 问题提出

针孔相机和鱼眼相机的投影模型和畸变模型不一样,如果对鱼眼的模型不太了解可以到我的这篇博客【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模型区别,哪个更好?,以及这个系列看看。

针孔相机可以对于深度depth的采样一个是均匀采样,鱼眼来说,一个是最大深度均匀采样合适。

1.1 看看DD3D 的深度是怎么处理的

在3d head 中输出了深度,看这个代码

box3d_quat, box3d_ctr, box3d_depth, box3d_size, box3d_conf, dense_depth = self.fcos3d_head(features)

特征x经过 box3d_tower 卷积层后输出

box3d_tower_out = self.box3d_tower(features)
depth = self.box3d_depth[_l](box3d_tower_out)

而这个box3d_tower就是一群3x3卷积

box3d_tower.append(
                Conv2d(
                    in_channels,
                    in_channels,
                    kernel_size=3,
                    stride=1,
                    padding=1,
                    bias=norm_layer is None,
                    norm=norm_layer,
                    activation=F.relu
                )
            )

得到后得到深度

        pixel_size = torch.norm(torch.stack([inv_intrinsics[:, 0, 0], inv_intrinsics[:, 1, 1]], dim=-1), dim=-1)
        depth = depth / (pixel_size * scale_depth_by_focal_lengths_factor)

与相机的内参(intrinsics)和深度图(depth map)的处理有关。
这两行代码的目的是根据相机的焦距和某个比例因子来调整深度图的值。这在计算机视觉和3D重建等任务中是很常见的操作。

  • inv_intrinsics: 这应该是一个表示相机内参逆矩阵的Tensor。在相机标定中,内参矩阵通常是一个3x3的矩阵,包含了焦距(fx, fy)、主点(cx, cy)和可能的扭曲因子等。但是在这里,我们只关心对角线元素,即焦距的倒数(假设fx和fy已经被取倒数)。
  • torch.stack([inv_intrinsics[:, 0, 0], inv_intrinsics[:, 1, 1]], dim=-1): 这将逆内参矩阵的第一行第一列和第二行第二列的元素(即fx和fy的倒数)沿着最后一个维度(dim=-1)堆叠成一个新的Tensor。结果是一个形状为[batch_size, 2]的Tensor,其中batch_sizeinv_intrinsics的第一个维度的大小。
  • torch.norm(..., dim=-1): 这计算了沿着最后一个维度(dim=-1)的范数。但是,由于我们堆叠的是两个值(即两个焦距的倒数),实际上计算的是这两个值的L2范数,也就是它们的平方根之和(但在这个特殊情况下,由于只有两个正数,L2范数就是它们的几何平均值)。但是,因为这里两个数都是正数并且只是简单的堆叠,所以实际上torch.norm在这里计算的是这两个值的平方根的和,这与直接取它们的平均值(或者只是取它们的和,如果后续操作是除法)在效果上可能差别不大。但几何平均值或平方根的和可能用于平滑或归一化目的。
  • pixel_size: 最终得到的Tensor包含了每个图像或图像批次的“像素大小”的某种度量,这个度量是基于焦距的倒数来计算的。
  • depth: 这是一个表示深度图的Tensor,其中每个值可能代表图像中对应像素的真实世界深度(或某种与深度相关的量度)。
  • pixel_size * scale_depth_by_focal_lengths_factor: 这部分计算了每个像素的“大小”与某个比例因子scale_depth_by_focal_lengths_factor的乘积。这个比例因子可能是用于根据焦距来缩放或调整深度值的。
  • depth / ...: 最后,原始的深度图被这个乘积除以,得到一个新的深度图,其中每个像素的深度值都根据焦距和比例因子进行了调整。这种调整可能是为了将深度图从某种原始度量(如像素单位的倒数)转换为更物理的度量(如米或厘米),或者为了校正由于相机内参引起的某种偏差。

给出代码示例

首先,我们需要确保inv_intrinsics是一个形状为[batch_size, 3, 3]的Tensor,其中包含了逆相机内参矩阵的集合,每个矩阵的(0, 0)(1, 1)位置是焦距的倒数(即1/fx1/fy)。同时,depth应该是一个形状为[batch_size, ...]的Tensor,其中包含了每个像素的深度值。

以下是代码示例,说明了如何计算pixel_size并更新depth

import torch

# 假设 inv_intrinsics 是一个形状为 [batch_size, 3, 3] 的 Tensor
# 假设 depth 是一个形状为 [batch_size, ...] 的 Tensor
# 假设 scale_depth_by_focal_lengths_factor 是一个标量或者与 depth 形状相同的 Tensor

# 示例数据
batch_size = 4  # 假设批次大小为 4
inv_intrinsics = torch.randn(batch_size, 3, 3)  # 随机生成逆内参矩阵
depth = torch.randn(batch_size, 10, 10)  # 随机生成深度图,假设每个样本的深度图大小为 10x10
scale_depth_by_focal_lengths_factor = 0.5  # 假设的比例因子

# 计算 pixel_size
# 注意:我们只关心逆内参矩阵的对角线元素,即焦距的倒数
pixel_size = torch.sqrt(inv_intrinsics[:, 0, 0] ** 2 + inv_intrinsics[:, 1, 1] ** 2)
# 或者,如果你想使用 torch.norm 来计算两个元素的 L2 范数(几何平均值),但这里更简单的方法是直接相加然后开方
# pixel_size = torch.norm(torch.stack([inv_intrinsics[:, 0, 0], inv_intrinsics[:, 1, 1]], dim=-1), dim=-1)

# 更新 depth
depth = depth / (pixel_size.unsqueeze(1).unsqueeze(1) * scale_depth_by_focal_lengths_factor)
# 注意:我们需要使用 unsqueeze 来扩展 pixel_size 的维度,以便它可以与 depth 进行广播(broadcast)

# 此时,depth 已经根据 pixel_size 和 scale_depth_by_focal_lengths_factor 进行了更新

在这个示例中,我使用了torch.sqrt来直接计算两个焦距倒数的平方和的平方根,这是更简单且等价于使用torch.norm计算L2范数的方法。同时,我使用了unsqueeze来扩展pixel_size的维度,以便它可以与depth进行广播操作。这确保了当我们将pixel_sizedepth相除时,广播规则能够正确地将pixel_size扩展到与depth相同的形状。

1.2 我们看看BEVDepth的代码

    def _forward_single_sweep(...):
        # 提取环视图片特征
        # img_feats:[1, 1, 6, 512, 16, 44]
        img_feats = self.get_cam_feats(sweep_imgs)
        source_features = img_feats[:, 0, ...]
        
        # 提取Depth以及context
        depth_feature = self._forward_depth_net(...)
        # 预测的距离分布 depth:[6, 112, 16, 44]
        depth = depth_feature[:, :self.depth_channels].softmax(1)
        # 对应论文中的 Context Feature * Depth Distribution 操作
        img_feat_with_depth = ... # 

depth 是采用depth = depth_feature[:, :self.depth_channels].softmax(1) 均匀采样,商汤采样的的是最大深度均匀采样

采样策略:

最大深度均匀采样主要关注最大深度范围内的均匀性,而不太关心近处或中间深度层次的细节。
均匀深度分布采样则在整个深度范围内追求均匀性,确保每个深度层次都得到同等的关注。

数据分布:

最大深度均匀采样可能导致近处或中间深度层次的点或像素被过度采样,而远处深度层次的点或像素被采样不足。
均匀深度分布采样则在整个深度范围内保持相对均匀的数据分布。

适用场景:

最大深度均匀采样适用于那些主要关注远处目标或障碍物检测的应用,因为远处目标往往对任务结果有更大影响。
均匀深度分布采样适用于需要全面考虑场景深度的应用,如三维重建或增强现实。

鱼眼相机镜头对光线有折射作用,以此获得更大的可视范围,越靠近边缘区域,折射率越大,生成的图片畸变程度越大。

由于畸变,使用均匀的深度分布来生成的点云大部分位于感兴趣范围以外。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/760385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度强化学习】关于混合动作空间转化为连续域空间的一点思考与实现

文章目录 前言问题解决方法以此类推假设动作之间有联系假设动作之间没有联系 前言 根据导师的文章,得到的想法,论文如下: 论文链接:《Deep Reinforcement Learning for Smart Home Energy Management》 问题 现在我有一个环境&…

Excel显示/隐藏批注按钮为什么是灰色?

在excel中,经常使用批注来加强数据信息的提示,有时候会把很多的批注显示出来,但是再想将它们隐藏起来,全选工作表后,“显示/隐藏批注”按钮是灰色的,不可用。 二、可操作方法 批注在excel、WPS表格中都是按…

解决本机电脑只能通过localhost访问,不能通过127.0.0.1访问

背景问题 有天我启动项目,发现项目连接Mysq总是连接不上,查了url、ip、port、用户名和密码都没有错,就是连接不上mysql数据库,后来通过查找资料发现有多个进程占用3306端口。 pid 6016 是mysqld服务 而pid 9672 是一个叫 svchos…

算力时代,算能(SOPHGO)的算力芯片/智算板卡/服务器选型

数字经济时代,算力成为支撑经济社会发展新的关键生产力,全球主要经济体都在加快推进算力战略布局。随着大模型持续选代,模型能力不断增强,带来算力需求持续增长。算力对数字经济和GDP的提高有显著的带动作用,根据IDC、…

安装ubuntu过程中,出现“执行‘grub-install/dev/sda’失败,这是一个致命错误”问题,解决办法!软碟通制作U盘启动盘!

背景 U盘安装ubuntu系统过程中,出现类似如下问题,/dev/sda7内容可能不一样,但问题类似。 可能原因 1.U盘启动盘制作失败 2.U盘启动盘UEFI格式与Ubuntu引导分区有冲突 解决办法 1.用UltraISO(软碟通)重新制作U盘启…

多表执行嵌套查询,减少笛卡尔积,防止内存溢出

问题:当涉及四个表的查询时,会产生大量的笛卡尔积导致内存溢出。 解决办法 :可以使用嵌套查询将多表的联合查询拆分为单个表的查询,使用resultmap中的association(适合一对一) 或 collection(一…

模拟城市5: 未来之城 全DLC for Mac 下载安装包

模拟城市5:未来之城(SimCity BuildIt)是一款由Maxis开发并由 Electronic Arts(EA)发行的城市建设和管理模拟游戏。这款游戏最初在2014年发布,适用于iOS、Android以及Windows Phone平台,随后在20…

聚焦Python分布式爬虫必学框架Scrapy打造搜索引擎(一)

Scrapy综述 Scrapy总体架构 Scrapy架构图(绿线是数据流向) 适用于海量静态页面的数据下载 Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 Scheduler(调度器): 它负责接受引擎发送过来的Request请求&…

生命在于学习——Python人工智能原理(2.4.1)

在这里插一句话,我有两个好兄弟的github项目,感兴趣的可以去看一下,star一下,谢谢。 https://github.com/fliggyaa/fscanpoc https://github.com/R0A1NG/Botgate_bypass 四、Python的程序结构与函数 4.1 Python的分支结构 &…

matlab可以把图像数据转换为小波分析吗

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

P1107 [BJWC2008] 雷涛的小猫

[BJWC2008] 雷涛的小猫 题目背景 原最大整数参见 P1012 题目描述 雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的)。在他的照顾下,小猫很快…

vb6多线程异步,VB.NET 全用API实现:CreateThread创建多线程,等待线程完成任务

在VB.NET中,你可以使用API函数来创建多线程并等待线程完成任务。以下是一个示例代码,展示如何使用API函数来实现这个功能: Imports System.Runtime.InteropServices Imports System.ThreadingPublic Class Form1Private Delegate Sub ThreadC…

嵌入式系统中静态库与动态库详解

大家好,今天我们来分享一下,动态库与静态库之间的差异有哪些? 计算机的运行当然离不开内存。 程序运行在内存当中,那么程序在内存中的布局是什么样子的呢? 程序的内存分为代码区、数据区、堆区和栈区,它们的布局是这样的,这里重点看代码区。 代码区中是什么呢? 这里主…

【sqlite3】联系人管理系统

SQLite3实现简单的联系人管理系统 有关sqlite3的基础知识请点击:SQLite3的使用 效果展示: 创建一个名为contacts.db的数据库 首先,我们需要创建一个名为contacts.db的数据库,并建立一个名为"contact"的表&#xff0…

某易六月实习笔试

第一题 下面代码需要更改的地方已指出。 解题思路 模拟题,用双指针记录双方当前式神,再记录一下当前谁先手,直到有一方指针越界。 把下面代码now1变为now(now1)%2就行。 第二题 解题思路 01背包变种,只是背包的容量变为多个维度…

打开防火墙设置提示需要使用新应用以打开此windowsdefender

拿到一台新电脑,装好虚拟机。主机ping虚拟机正常,虚拟机上网也正常,但是虚拟机ping主机ping不通。根据我多年虚拟机使用经验,这显然是因为主机防火墙没关。但是当我准备关闭主机防火墙的时候,发现防火墙设置打不开。界…

nvm安装以及idea下vue启动项目过程和注意事项

注意1:nvm版本不要太低,1.1.7会出现下面这个问题,建议1.1.10及其以上版本 然后安装这个教程安装nvm和node.js 链接: nvm安装教程(一篇文章所有问题全搞定,非常详细) 注意2:上面的教程有一步骤…

【WPF】Windows系统桌面应用程序编程开发新手入门-打造自己的小工具

电脑Windows系统上的桌面程序通常是用Visual Studio 开发工具编写出来的,有两种开发方式供选择,一种是WindowForm,简称WinForm,另一种是Windows Presentation Foundation,简称WPF,这里将学习WPF项目。 文章…

[数据库]mysql用户管理权限管理

目录 ​编辑用户管理​编辑 权限管理 ​编辑 ​编辑 ​编辑案例​编辑 细节 ​编辑 用户管理 我们用创建的用户在登录之后可以看到他和root看到的数据库是完全不一样的 权限管理 案例 登录这个账户可以看到还看不到teatdb这个数据库, 因为还没有授权 分配权限 过来刷新…

MathType2024最新官方无限永久试用版本下载

“我正在使用MathType,它让我的工作变得简单多了。”在中国科学院数学与系统科学研究院的一间办公室内,研究员张益唐兴奋地对《中国科学报》说。 这位因解决了数学界著名的“孪生素数猜想”而名声大噪的数学家,在谈到他最近使用的数学公式编辑…