本文主要是介绍【3D目标检测】Categorical Depth Distribution Network for Monocular 3D Object Detection,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 概述
- 细节
- 网络结构
- 类别深度分布
- 损失函数
- 与OFT-Net 的对比
概述
本文是基于单目图像的3D目标检测方法。
【2021】【CaDNN 】
研究的问题:
- 以往的深度信息学习方法(无论是显示学习还是隐式学习)都存在一些问题,会导致后面边界框定位困难
- 显示学习的方法将深度估计和目标检测分开训练,导致得到的深度图是次优的,进而导致边界框定位性能差。
- 隐式学习的方法会出现特征涂抹的问题,导致生成的鸟瞰图表示质量不高。
提出的方法:
- 实现了端到端的训练,也就是单个网络中同时进行深度估计和目标检测
- 为每个像素预测一组深度分布,能够得到高质量的鸟瞰图,使得边界框定位更加准确
注:
本文的related work部分写的也很好,从单目3D目标检测中3D场景中间表示的角度对算法进行了分类(第一种就是基于2D特征的,第二第三种是基于3D特征的):
- 没有中间表示的方法,也就是基于2D特征+各种约束实现检测,如2D-3D约束,关键点约束等。没有显示的使用深度信息,定位性能相对较差。
- 基于深度的方法,通过图像直接估计深度图(也就是显示学习深度信息),接下来将深度图作为额外的输入,要么将深度图作为图像的通道要么转换为伪点云。缺点就是下面显示学习的缺点。
- 基于网格表示的方法,联系体素,将图像特征抓换成体素特征,然后投影到鸟瞰图表示的方法避免了估计深度值(也就是隐式学习深度信息)
细节
网络结构
- 视锥特征网络:将图像特征投影到3D空间中,输入是 W 1 ∗ H 1 ∗ 3 W_1*H_1*3 W1∗H1∗3的图像,输出是 W F ∗ H F ∗ D ∗ C W_F*H_F*D*C WF∗HF∗D∗C的视锥特征(为了下一步视锥特征转换到体素表示转换的高效,这里的空间分辨率是比较高的,所以只使用了ResNet的第一个Block的输出),其中 D D D是深度bin的个数, C C C当前特征代表的深度bin对应的特征。具体的过程就是使用ResNet101对图像作特征提取得到 W F ∗ H F ∗ C 1 W_F*H_F*C1 WF∗HF∗C1的特征图,然后分两路,一路降低通道数得到 W F ∗ H F ∗ C W_F*H_F*C WF∗HF∗C,一路使用DeepLab v3的结构估计类别深度分布 W F ∗ H F ∗ D W_F*H_F*D WF∗HF∗D,然后做逐元素相乘得到视锥特征 W F ∗ H F ∗ D ∗ C W_F*H_F*D*C WF∗HF∗D∗C
- 视锥特征转换到体素表示:通过相机的内参矩阵和采样进行,输入是视锥特征 W F ∗ H F ∗ D ∗ C W_F*H_F*D*C WF∗HF∗D∗C,输出是体素特征 X ∗ Y ∗ Z ∗ C X*Y*Z*C X∗Y∗Z∗C。视锥特征有的是特征,没有3D位置信息,体素(体素是对3D空间的一个划分,这个是很容易做到的,先预先定义好3D空间的范围和体素块的大小,就可以将空间划分为若干个体素了)有的是3D位置信息但是没有特征,因此需要将视锥特征转换成体素特征。具体的做法就是:将体素的中心 ( x , y , z ) (x,y,z) (x,y,z)作为当前体素的表示,接着将 ( x , y , z ) (x,y,z) (x,y,z)通过内参矩阵转换到图像坐标系下得到 ( u , v , z ) (u,v,z) (u,v,z),接着将深度离散化得到 ( u , v , d i ) (u,v,d_i) (u,v,di), d i d_i di指的就是深度 z z z对应的深度bin,然后在视锥特征中查询就可以得到对应的特征 c c c,将它上采样就得到了体素特征 C C C。
- 体素表示投影得到鸟瞰图表示:输入是体素表示 X ∗ Y ∗ Z ∗ C X*Y*Z*C X∗Y∗Z∗C,输出是鸟瞰图表示 X ∗ Y ∗ C X*Y*C X∗Y∗C。具体做法就是最后两个维度concat然后 1 ∗ 1 1*1 1∗1卷积降维。
- 检测:使用PointPillars处理鸟瞰图表示。
类别深度分布
以往的深度信息学习方法存在的问题:
显示学习:也就是估计深度图。一般深度估计和目标检测是分开训练的,深度估计网络无法在检测任务中同时优化,得到的深度图是次优的(因为只有ROI的深度值才是我们后面需要的,背景像素的深度值没那么重要,起码这一点是分开训练无法学习到的),会导致边界框定位性能差
隐式学习:就是将2维的图像特征转换成体素特征,然后转换成鸟瞰图。然而这样子可能存在特征涂抹的情况(这个过程其实是和本文一样的,只是本文使用了深度bin,而以前是直接使用深度值的,多个体素点会对应同一个2维特征),同样会增加定位物体的难度。
类别深度分布:
每个像素对应的不再是一个深度值,而是一组类别深度分布,也就是属于每一个预定义的深度箱的概率。为了使深度分布尽可能准确,作者是加了监督信号的(监督信号来自于点云投影)
效果:
在隐式学习的方法中,使用作者的方法能够让图像特征在3D空间中精确定位,消除特征涂抹问题,使得产生的鸟瞰图特征更加准确(因为原来的话体素采样点很容易就对应到同一个特征,而作者提出的方法下,体素采样点基本不会对应到同一个特征)。
b是不采用类别深度分布方法生成的鸟瞰图特征的可视化结果,可以看到收到了特征涂抹问题的影响。c是采用类别深度分布方法生成的鸟瞰图特征的可视化结果,特征会更加清晰和准确
深度离散化:
离散化方法有均匀离散化、对数增长bin大小的离散化和线性增长bin大小的离散化,作者采用了线性增长bin大小的方法。
深度分布标签生成:
深度分布肯定要有标签,不然怎么效果怎么好呀。具体方法就是将点云投影到图像坐标系下得到深度图,然后再离散化成one-hot向量。
损失函数
第一个损失是生成类别深度分布的损失,因为是分布,而且标签是one-hot向量,所以用交叉熵损失就比较合适,并且很显然前景的类别深度分布和背景的类别深度分布重要性完全不一样,数量也相差巨大,因此作者采用了focal loss。
其余的损失和PointPillars中一样了
与OFT-Net 的对比
1、OFT-Net没有显示的深度估计部分;而CaDNN有显式的深度估计,并且使用的还是类别深度估计。
2、OFT-Net在做OFT的时候将整个体素投影了过去然后做聚合,计算量大;而CaDNN只投影了体素的质心点,计算量小,且由于类别深度估计不存在特征涂抹问题。
3、OFT-Net采用的是z轴方向元素带权相加的方法得到鸟瞰图;而CaDNN采用的是reshape+1*1卷积的操作。
4、检测头:OFT-Net的检测头采用的是基于图像的方法常用的检测头;CaDNN采用的就是基于点云的方法常用的检测头
这篇关于【3D目标检测】Categorical Depth Distribution Network for Monocular 3D Object Detection的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!