CaDDN 论文学习

news2024/11/28 6:25:05

1. 解决了什么问题?

单目 3D 目标检测是自动驾驶的重要课题,与一般的多传感器系统相比,它具有简洁、成本低、易部署的优点。单目 3D 检测的主要挑战在于能否准确预测目标的深度。由于缺乏直接的测量手段,我们只能从目标和场景信息推断,因此单目 3D 检测的表现远落后于 LiDAR 和双目视觉的方案。

一些单目目标检测方法会单独训练一个深度估计网络,直接学习深度信息。但在 3D 检测阶段,它们直接使用估计的深度信息,缺乏对深度置信度的理解,网络对预测的深度值过于相信,造成模型对于大尺度范围的深度估计不准确。而且在训练时,深度估计任务独立于 3D 检测任务,深度图的优化就脱离了检测任务。

另一些方法则隐式地学习图像中的深度信息,将图像特征直接变换到 3D 空间,再变换到 BEV 网格里。但这类方法会遇到特征拖尾效应(feature smearing),即投影空间内的多个位置出现相似的图像特征。特征拖尾效应增加了目标定位的难度。 如下图所示,(a) 是输入图像。(b) 是不带深度分布监督时,CaDDN 的 BEV 特征具有特征拖尾效应。© 带了深度分布监督后,BEV 特征编码了丰富的深度置信度,目标能被准确地检出。
在这里插入图片描述

2. 提出了什么方法?

本文提出了 Categorical Depth Distribution Network(CaDDN),使每个像素点都有一个分类深度分布,将图像特征映射到 3D 空间内合适的深度区间,生成 BEV 表征。然后使用 BEV 表征和单阶段目标检测器输出最终的检测结果。该方案完全可微并且端到端,协同完成深度估计和目标检测任务。下图展示了 CaDDN 架构,主要用 3 个模块生成 3D 表征,以及 1 个模块进行 3D 检测。使用预测的深度分布 D \mathbf{D} D,由图像 I \mathbf{I} I生成视锥特征 G \mathbf{G} G,再变换为体素特征 V \mathbf{V} V。然后将体素特征 V \mathbf{V} V坍缩为 BEV 特征 B \mathbf{B} B,用于 3D 检测。
在这里插入图片描述

2.1 3D 表征学习

网络学习输出适用于 3D 目标检测的 BEV 表征。对于单张输入图像,我们使用预测得到的分类深度分布,构建视锥特征。利用相机参数,将该视锥特征栅格变换为体素栅格,最后坍缩为 BEV 特征栅格。

2.1.1 视锥特征网络

该网络将图像特征关联到预测的深度值,将图像信息映射到 3D 空间。网络的输入是一张图像 I ∈ R W I × H I × 3 \mathbf{I}\in \mathbb{R}^{W_I\times H_I\times 3} IRWI×HI×3 W I , H I W_I,H_I WI,HI是图像的宽度和高度。输出是一个视锥特征栅格 G ∈ R W F × H F × D × C \mathbf{G}\in \mathbb{R}^{W_F\times H_F\times D\times C} GRWF×HF×D×C W F , H F W_F,H_F WF,HF是图像特征的宽度和高度, D D D是离散化深度 bins 的个数, C C C是特征通道数。

主干网络使用 ResNet-101 提取图像特征 F ~ ∈ R W F × H F × C \tilde{\mathbf{F}}\in\mathbb{R}^{W_F\times H_F\times C} F~RWF×HF×C,如上图所示。从 ResNet-101 的 Block1 提取图像特征,保证高分辨率。从视锥到体素网格的变换需要分辨率高一些,这样视锥栅格就不太可能包含重复的特征。

F ~ \tilde{\mathbf{F}} F~用于估计每个像素点的分类深度分布 D ∈ R W F × H F × D \mathbf{D}\in\mathbb{R}^{W_F\times H_F\times D} DRWF×HF×D,类别是 D D D个离散的深度 bins。对于 F ~ \tilde{\mathbf{F}} F~上的每个像素点,分别预测 D D D个概率值,每个概率值表示深度值属于某一个深度 bin 的置信度。

作者按 DeepLabV3 语义分割网络设计了上图的 Depth Distribution Network,从图像特征 F ~ \tilde{\mathbf{F}} F~预测分类深度分布。作者修改了网络,输出的是每个像素点属于各深度 bin 的概率得分,而非某个语义类别。ResNet-101 其余的结构(Block2, Block3, Block4)会对 F ~ \tilde{\mathbf{F}} F~做下采样。使用了 atrous spatial pyramid pooling 获取多尺度信息,输出通道数等于 D D D。用双线性插值对 ASPP 模块的输出做上采样,让特征尺寸和原始特征的尺寸一样,得到分类深度分布 D ∈ R W F × H F × D \mathbf{D}\in\mathbb{R}^{W_F\times H_F\times D} DRWF×HF×D。然后对每个像素点使用 softmax 函数,将 D D D个 logits 归一化为 0 0 0 1 1 1之间的概率值。

同时,对 F ~ \tilde{\mathbf{F}} F~进行通道降维以降低 ResNet-101 的内存占用,得到最终的图像特征 F \mathbf{F} F,具体是用 1 × 1 1\times 1 1×1卷积 + BatchNorm + ReLU +\text{BatchNorm}+\text{ReLU} +BatchNorm+ReLU 将通道数从 C = 256 C=256 C=256降为 C = 64 C=64 C=64

( u , v , c ) (u,v,c) (u,v,c)表示图像特征 F \mathbf{F} F的坐标, ( u , v , d i ) (u,v,d_i) (u,v,di)表示分类深度分布 D \mathbf{D} D的一个坐标, ( u , v ) (u,v) (u,v)是特征的像素位置, c c c是通道索引, d i d_i di是深度 bin 的索引。为了得到视锥特征栅格 G \mathbf{G} G,对每个特征像素 F ( u , v ) \mathbf{F}(u,v) F(u,v),用该像素关联的 D ( u , v ) \mathbf{D}(u,v) D(u,v)深度 bin 的概率对其加权,以填充深度维度 d i d_i di,如下图所示。计算特征像素和深度概率的外积,做加权:

G ( u , v ) = D ( u , v ) ⊗ F ( u , v ) \mathbf{G}(u,v)=\mathbf{D}(u,v)\otimes \mathbf{F}(u,v) G(u,v)=D(u,v)F(u,v)

D ( u , v ) \mathbf{D}(u,v) D(u,v)是预测的深度分布, G ( u , v ) \mathbf{G}(u,v) G(u,v)是大小为 D × C D\times C D×C的输出矩阵。上式的外积就算出了每个像素点的视锥特征 G ∈ R W F × H F × D × C \mathbf{G}\in \mathbb{R}^{W_F\times H_F\times D\times C} GRWF×HF×D×C
在这里插入图片描述

2.1.2 视锥到体素的变换

如下图所示,利用已知的相机参数,将视锥特征 G ∈ R W F × H F × D × C \mathbf{G}\in \mathbb{R}^{W_F\times H_F\times D\times C} GRWF×HF×D×C变换到体素表征 V ∈ R X × Y × Z × C \mathbf{V}\in \mathbb{R}^{X\times Y\times Z\times C} VRX×Y×Z×C。在每个体素的中心位置产生该体素的采样点 s k v = [ x , y , z ] k T s_k^v=[x,y,z]_k^T skv=[x,y,z]kT,用相机参数矩阵 P ∈ R 3 × 4 \mathbf{P}\in \mathbb{R}^{3\times 4} PR3×4将之变换到视锥栅格,产生视锥采样点 s ~ k f = [ u , v , d c ] k T \tilde{s}_k^f=[u,v,d_c]_k^T s~kf=[u,v,dc]kT d c d_c dc是视锥深度轴 d i d_i di上连续的深度值。每个连续的深度值 d c d_c dc都转化为一个离散的深度 bin 的索引 d i d_i di。通过三线性插值,使用采样点 s k f = [ u , v , d i ] k T s_k^f=[u,v,d_i]_k^T skf=[u,v,di]kT采样 G \mathbf{G} G内的视锥特征,填充体素特征 V \mathbf{V} V

视锥栅格 G \mathbf{G} G的空间分辨率和体素栅格 V \mathbf{V} V的分辨率应该接近。如果 V \mathbf{V} V的分辨率高,其采样密度就高,若对低分辨率的视锥栅格做过采样,会产生大量相似的体素特征。因此,我们从 ResNet-101 的 Block1 提取特征 F ~ \tilde{\mathbf{F}} F~,确保视锥栅格 G \mathbf{G} G的空间分辨率较高。
在这里插入图片描述

2.1.3 体素坍缩为 BEV

体素特征 V ∈ R X × Y × Z × C \mathbf{V}\in \mathbb{R}^{X\times Y\times Z\times C} VRX×Y×Z×C坍缩为单一高度的平面,生成 BEV 特征 B ∈ R X × Y × C \mathbf{B}\in \mathbb{R}^{X\times Y\times C} BRX×Y×C。BEV 栅格极大地降低了计算成本,而检测表现与 3D 体素栅格相似。沿着通道维度 c c c,concat V \mathbf{V} V的垂直轴 z z z,得到 BEV 栅格 B ~ ∈ R X × Y × Z ∗ C \tilde{\mathbf{B}}\in \mathbb{R}^{X\times Y\times Z\ast C} B~RX×Y×ZC。用 1 × 1 1\times 1 1×1卷积 + BatchNorm + ReLU +\text{BatchNorm}+\text{ReLU} +BatchNorm+ReLU 降低 B ~ ∈ R X × Y × Z ∗ C \tilde{\mathbf{B}}\in \mathbb{R}^{X\times Y\times Z\ast C} B~RX×Y×ZC维度,得到 B ∈ R X × Y × C \mathbf{B}\in \mathbb{R}^{X\times Y\times C} BRX×Y×C, 回到原始的通道数 C C C ,学习每个高度切片的相对重要性。

2.2 BEV 3D 目标检测

为了在 BEV 特征栅格上做 3D 检测,主干网络和检测 head 借鉴了 PointPillars,该 BEV 3D 目标检测器的 3D 检测效果优异,而且计算成本低。

在 BEV 主干部分,将 Block1, Block2, Block3 中下采样模块的 3 × 3 3\times 3 3×3卷积 + BatchNorm + ReLU +\text{BatchNorm}+\text{ReLU} +BatchNorm+ReLU 的个数从 ( 4 , 6 , 6 ) (4,6,6) (4,6,6)增加到 ( 10 , 10 , 10 ) (10,10,10) (10,10,10),增大 BEV 网络的学习能力。与 LiDAR 点云相比,图像提供的特征质量较低。
检测 head 与 PointPillars 一样,输出最终检测结果。

2.3 深度离散化

将连续的深度空间离散化,在深度分布 D \mathbf{D} D中定义一个由 D D D个 bins 组成的集合。深度离散化可以用固定 bin 大小的 uniform discretization(UD),bin 大小在 log ⁡ \log log空间逐渐增大的 spacing-increasing discretization(SID),或 bin 大小线性增加的 linear increasing discretization(LID) 完成。下图展示了这些深度离散方法。本文采用了 LID,它能为所有的深度提供均衡的深度估计,定义如下:
d c = d min ⁡ + d m a x − d m i n D ( D + 1 ) ⋅ d i ( d i + 1 ) d_c=d_{\min}+\frac{d_{max}-d_{min}}{D(D+1)}\cdot d_i(d_i+1) dc=dmin+D(D+1)dmaxdmindi(di+1)

d c d_c dc是连续的深度值, [ d m i n , d m a x ] [d_{min},d_{max}] [dmin,dmax]是离散化的深度区间, d c d_c dc离散化为 D D D个深度 bins, d i d_i di是深度 bin 的索引。
在这里插入图片描述

2.4 深度分布标签的生成

我们需要深度分布标签 D ^ \hat{\mathbf{D}} D^来监督深度分布的预测。将 LiDAR 点云投射到图像平面,生成稀疏的深度图,以此作为深度分布的标签。在图像的每个像素点进行深度补全,生成深度值。在每个特征像素都要有深度信息,于是对大小是 W I × H I W_I\times H_I WI×HI的深度图做下采样,从而和特征图大小 W F × H F W_F\times H_F WF×HF一致。使用 LID 方法将深度图离散化为 bin 索引,然后转化为一个 one-hot 编码,生成深度分布标签。One-hot 编码确保深度分布标签是清晰的。

2.5 训练损失

监督深度分布网络的学习时,作者通过分类来促成某一正确深度 bin,本文使用了 focal loss:
L depth = 1 W F ⋅ H F ∑ u = 1 W F ∑ v = 1 H F FL ( D ( u , v ) , D ^ ( u , v ) ) L_\text{depth}=\frac{1}{W_F\cdot H_F}\sum_{u=1}^{W_F}\sum_{v=1}^{H_F}\text{FL}(\mathbf{D}(u,v),\hat{\mathbf{D}}(u,v)) Ldepth=WFHF1u=1WFv=1HFFL(D(u,v),D^(u,v))

其中 D \mathbf{D} D是预测的深度分布, D ^ \hat{\mathbf{D}} D^是深度分布标签。作者发现在自动驾驶数据集中,图像里的目标像素要远少于背景像素,造成损失更偏向于背景像素。在 focal loss 中,针对前景和背景像素,分别设定加权系数 α f g = 3.25 , α b g = 0.25 \alpha_{fg}=3.25, \alpha_{bg}=0.25 αfg=3.25,αbg=0.25。所有位于 ground-truth 2D 目标框的像素都算前景像素,其余的就是背景像素。Focal loss 的关注系数 γ = 2.0 \gamma=2.0 γ=2.0
在 3D 检测中,使用了 PointPillar 的分类损失 L c l s L_{cls} Lcls、回归损失 L r e g L_{reg} Lreg和方向分类损失 L d i r L_{dir} Ldir。整的损失如下:

L = λ d e p t h L d e p t h + λ c l s L c l s + λ r e g L r e g + λ d i r L d i r L=\lambda_{depth}L_{depth}+\lambda_{cls}L_{cls}+\lambda_{reg}L_{reg}+\lambda_{dir}L_{dir} L=λdepthLdepth+λclsLcls+λregLreg+λdirLdir

其中 λ d e p t h , λ c l s , λ r e g , λ d i r \lambda_{depth},\lambda_{cls},\lambda_{reg},\lambda_{dir} λdepth,λcls,λreg,λdir是加权系数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb15 - 线程数据共享和安全 -ThreadLocal

1. 什么是 ThreadLocal ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!]ThreadLocal 可以像 Map 一样存取数据,key 为当前线程, get 方法…

无屏幕时树莓派连接wifi

这种方式需要使用到1根网线有线连接,需要提前准备~ 按照以下步骤操作:   找到wifi然后右键选择“属性”,进入配置页面:   勾选“允许其他网络用户通过此计算机的internet连接”,然后确定,它会提示你…

论文阅读_语音合成_Spear-TTS

论文信息 number headings: auto, first-level 2, max 4, _.1.1 name_en: Speak, Read and Prompt: High-Fidelity Text-to-Speech with Minimal Supervision name_ch: 说话、阅读和提示:少量监督实现高保真文本转语音 paper_addr: http://arxiv.org/abs/2302.0354…

操作系统理解 什么事件可以造成进程的产生和消亡呢?当然有很多这样的事件。对于进程产生来说,主要的事件有:造成进程消亡的事件则可以分为四种情况:

目录 什么事件可以造成进程的产生和消亡呢?当然有很多这样的事件。对于进程产生来说,主要的事件有: 造成进程消亡的事件则可以分为四种情况: 好好理解计算机是人造的,这句话的含义,特别是计算机这是西方人…

【ChatGPT】人工智能发展的背后厉害:跌宕起伏的近百年

文章目录 前言一、麦卡洛克-皮特斯神经元二、赫布式学习三、感知机四、反向传播算法五、卷积神经网络六、递归神经网络七、通用计算GPU芯片八.生成式神经网络与大型语言模型总结 前言 今天,ChatGPT等大型语言预训练神经网络模型已经成为广为人知的名字,…

算法笔记:A2-A4-RSRQ切换算法

1 LTE 切换 LTE切换是移动通信网络中的一个过程,移动设备在保持无间断服务的情况下,将其连接从一个基站切换到另一个基站。当移动设备离开当前基站的覆盖范围或网络资源拥塞时,就需要进行切换。LTE切换通常是基于特定的条件触发的&#xff0…

Ansys Lumerical | FDTD 应用:设计光栅耦合器

本文将设计一个光栅耦合器,将光子芯片表面上的单模光纤连接到集成波导。内置粒子群优化工具用于最大化耦合效率,并使用组件S参数在 INTERCONNECT 中创建紧凑模型。还演示了如何使用 CML 编译器提取这些参数以生成紧凑模型。(联系我们获取文章…

第十章 Productions最佳实践 - 路由Production的设计模型

文章目录 第十章 Productions最佳实践 - 路由Production的设计模型配置项应用规范 第十章 Productions最佳实践 - 路由Production的设计模型 本章介绍了客户成功用于构建接口路由解决方案的设计模型。因此,它可以被认为是开发路由制作的最佳实践的集合。 本章仅介…

Go colly爬虫框架精简高效【杠杠的】入门到精通

1 前言 1.1 Go Colly 爬虫介绍 爬虫框架中,各中流行的编程语言都有自己热门框架,python中的selenium、Scrapy、PySpider等,Java中的Nutch、Crawler4j、WebMagic、WebCollector等。golang中colly使用Go语言编写的功能强大的爬虫框架&#xf…

cpp11实现线程池(七)——线程池cached模式设计实现

用vector::size() 获取当前容器元素数量不是线程安全的,所以采用atomic_int 来实现当前容器元素数量的改变能够保证线程安全 线程池成员变量的修改 添加变量记录当前线程数量、空闲线程数量,以及线程数的上限: int threadSizeThreshHold_; …

由浅入深Netty源码分析

目录 1 启动剖析2 NioEventLoop 剖析3 accept 剖析4 read 剖析 1 启动剖析 我们就来看看 netty 中对下面的代码是怎样进行处理的 //1 netty 中使用 NioEventLoopGroup (简称 nio boss 线程)来封装线程和 selector Selector selector Selector.open();…

Trie与可持久化Trie

Trie Trie,也称为字典树或前缀树,是一种用于高效存储和检索字符串的树形数据结构。它的主要特点是利用字符串的公共前缀来减少存储空间和提高查询效率。下面是对 Trie 的常见操作的介绍: 插入(Insertion)&#xff1a…

PETRv2 论文学习

1. 解决了什么问题? 过去,一般使用基于单目视觉进行 3D 目标检测。现在进行 3D 任务的方法大致分两类。一类是基于 BEV,将多视角图像映射为 BEV 表征,然后使用 3D 目标检测方法。另一类是基于 DETR,如 DETR3D 和 PETR…

xhs-xs webmsxywx分析

近期又更新了,先是改了x-s生成,然后又加上了a1校验。 后面可能会全参校验,比如再加上gid、deviceId、profileData、x-s-common、smidV2之类。 估计以后不能写xhs了,大家且看且珍惜吧。之前相关的文章都被下架了 危!…

K8s日志组件-Loki是如何存储数据的?

文章目录 为什么需要loki为什么不是EFK?Loki是如何存储数据的?底层的LSM treeB tree 和LSM tree的区别?Ref参考链接 为什么需要loki 日志记录本质上是一个事件。大多数语言、应用程序框架或库都支持日志,表现形式可以是字符串这样…

安卓动画壁纸实战:制作一个星空动态壁纸(带随机流星动画)

前言 在我之前的文章 羡慕大劳星空顶?不如跟我一起使用 Jetpack compose 绘制一个星空背景(带流星动画) 中,我们使用 Compose 实现了星空背景效果。 并且调用非常方便,只需要一行代码就可以给任意 Compose 组件添加上…

30多家投递石沉大海,总算上岸了

大家好,我是帅地。 今年的行情,无论是暑假实习还是春招校招,都比往年要难一些,很多人在三月份要嘛简历石沉大海,要嘛面试一轮游,但也有部分人最后都拿到了不错的 Offer,包括我 训练营 里&#…

企业级信息系统开发——初探Spring-采用Spring配置文件管理Bean

初探Spring 一、Spring框架(一)Spring框架优点(二)Spring 框架因何而来(三)Spring框架核心概念 二、采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Sp…

在C++中,怎么把string转换成char*?

2023年5月21日,周日中午: 今天在写项目的时候遇到了这个问题,也解决了,所以记录一下 通过string类的copy成员函数就可以解决这个问题 copy函数的函数原型: string& copy(char* s, size_t n, size_t pos 0); 其…

【框架源码】SpringBoot核心源码解读之启动类源码分析

首先我们要先带着我们的疑问,spring boot是如何启动应用程序?去分析SpringBoot的启动源码。 我们在新建SpringBoot项目时,核心方法就是主类的run方法。 SpringApplication.run(ArchWebApplication.class, args) 我们点击run方法进入到源码中…