【单目3D检测】:SMOKE论文

2024-03-13 01:20
文章标签 检测 3d 论文 单目 smoke

本文主要是介绍【单目3D检测】:SMOKE论文,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1 网络结构
      • 1.1 Backbone
      • 1.2 检测模块
        • key-point(heatmap)分支
        • 3D box 回归分支
    • 2. 损失函数loss
      • 2.1 keypoint分类损失
      • 2.2 3D box回归损失
    • 3. 数据增广
    • 实验结果
    • 参考

在这里插入图片描述
论文: SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation
github: https://github.com/lzccccc/SMOKE

  • SMOKE 延续了 centernetkey-point做法,认为 2D 检测模块是多余的只保留了 3D 检测模块。其预测投影下来的 3D 框中心点和其他属性变量,从而得到 3D 框,参考 Disentangling Monocular 3D Object Detection 对预测属性进行了 loss 解耦。这个简单的结构收敛较快且推理耗时较小。
  • 提出一种端到端的单目 3D 目标检测的方法,该方法具有较为简洁的网络结构
  • 在 2019.11.12 提交的时候,SMOKE 在 KITTI 数据集上优于所有当时的最先进的单目 3D 目标检测算法

解决的问题:

  • 在SMOKE算法之前,一般基于region_based的RCNN或者RPN结构,基于得到的2d proposals,结合后序结构推理出3dbox。一般是多阶段的算法。

  • SMOKE仅3d模块,基于key-point直接回归3d属性,基于解耦loss来训练

1 网络结构

在这里插入图片描述

图1:SMOKE网络结构
  • SMOKE 的网络结构非常简洁,主要由 backbone 、关键点分类分支和 3D 框回归分支组成
  • SMOKE 利用DLA-34作为backbone提取特征,将特征图下采样到原图的1/4。输出的Featue map 通过两个独立的分支分别预测keypoint的类别以及回归3D box坐标
  • keypoint分支输出的分辨率为(H/4,W/4,C) ,表示数据集中前景目标的类别个数
  • 3D box回归分支输出的分辨率为 (H/4,W/4,8),表示描述3D边界框的8个参数:h,w,l,x,y,z,yaw

1.1 Backbone

使用与 centernet 相同的 DLA-34 backbone来提取特征,唯一的改变就是将BN替换为GN(group norm),因为GN对batch size不那么敏感, 且对于训练噪声更加鲁棒,因此 SMOKE 将所有的 BN 操作全部换为 GN 操作, 图像经过Backbone输出特征尺寸为[H/4, w/4,C]。 DLA-34结构中包含多个cross path、下采样与上采样。如下图(Objects as Points):

在这里插入图片描述

图 2 DLA-34

1.2 检测模块

3d检测模块(head)分为两部分:(1)key-point分支,即heatmap分类分支;(2)3D box回归分支。结构图如下:

在这里插入图片描述

图 3 检测模块
key-point(heatmap)分支

与centernet不同的是这里预测3d box中心点投影到2d图像上的点,而不是2d box的中心点,因为论文中直接抛弃了2d检测分支,而3d box中心点在2d图像上的投影点,可通过相机内参 K K K, 可完全恢复3d box中心点的三维坐标,所以这里用3d box投影下来的点更合适,
在这里插入图片描述

图3:可视化2D中心点 和3D投影点

如图3,红色点为 2D 框中心点,而橙色点为 3D 点投影后的点。假设 [ x , y , z ] T [x,y,z]^T [x,y,z]T为物体在相机坐标系下的3D中心点, [ x c , y c ] T [x_c,y_c]^T [xc,yc]T为3D中心点投影到图像上的点。利用相机内参矩阵 K K K, 则这两个点的投影关系如下:
在这里插入图片描述

3D box 回归分支

回归分支主要任务是对heatmap上的keypoint 预测一组参数来构建3D box, 预测的参数为 ( x , y , z , l , w , h , θ ) (x,y,z,l,w,h,\theta) (x,y,z,l,w,h,θ), 其中, ( x , y , z ) ( x , y , z ) (x,y,z) 为 3D 框的中心点, ( l , w , h ) ( l , w , h ) (l,w,h) 为 3D 框的长宽高, θ \theta θ 为 3D 框的偏航角。论文中与ROI-10Ddisentangling中类似,用8维的变量来表示: [ δ z , δ x c , δ y c , δ w , δ h , δ l , s i n a , c o s a ] [\delta_z, \delta_{x_c}, \delta_{y_c},\delta_w,\delta_h,\delta_l,sina,cosa] [δz,δxc,δyc,δw,δh,δl,sina,cosa], 都做成的预测偏移量形式来预测,来降低学习的难度

  • δ z \delta_z δz:表示相机坐标系下深度depth偏移量offset, 根据从数据集中统计出平移平均值 μ z \mu_z μz, 度方差 σ z \sigma_z σz, 基于预测的深度偏移量 δ z \delta_z δz, 利用公式 z = μ z + σ z δ z z= \mu_z +\sigma_z\delta_z z=μz+σzδz, 得到最终的深度 z z z
  • δ x c , δ y c \delta_{x_c}, \delta_{y_c} δxc,δyc 为 heatmap 中由于下采样引起的量化误差, 目标在中心点相机坐标系的位置 ( x , y , z ) (x,y,z) (x,y,z), 可以利用2D图像上投影点 [ x c , y c ] T [x_c,y_c]^T [xc,yc]T 结合下采样产生的量化偏差 δ x c , δ y c \delta_{x_c}, \delta_{y_c} δxc,δyc, 并利用相机内参矩阵 K K K 来计算。
    在这里插入图片描述
  • δ w , δ h , δ l \delta_w,\delta_h,\delta_l δw,δh,δl : 为长宽高的偏移量,结合预先计算的逐类别统计的尺度平均值 [ h ‾ , w ‾ , l ‾ ] [\overline h,\overline w,\overline l] [h,w,l], 根据如下公式计算目标的长宽高尺寸:
    在这里插入图片描述
    这里使用e的幂次是为了保证正数乘到均值上,结果一定为正。实际在网络输出加了sigmoid来映射:
  • s i n α sinα sinα c o s α cosα cosα : 基于以往的论文,作者选择回归观测角度 α \alpha α,而不是偏航角 θ \theta θ, 并且将 α \alpha α [ s i n a , c o s a ] [sina,cosa] [sina,cosa]来编码, 从而映射为连续值,是角度估计中的常见做法。通过以下公式可以计算角度 θ \theta θ, 关于角度的详细说明,参考:https://zhuanlan.zhihu.com/p/452676265
    在这里插入图片描述

kitti中的alpha
这里有必要解释下kitti数据集中的 α \alpha α角,在下图中将小车沿着y轴顺时针旋转,待小车和camera连线与相机坐标系的z轴重合时停止,那么紫色的角是没有发生变化的,可以有: r _ y + p i / 2 − t h e t a = a l p h a + p i / 2 r\_y + pi/2 -theta =alpha + pi/2 r_y+pi/2theta=alpha+pi/2, 整理后得: r _ y = a l p h a + t h e t a = a l p h a + a r c t a n ( x / z ) r\_y = alpha + theta = alpha +arctan(x/z) r_y=alpha+theta=alpha+arctan(x/z)

论文中作者给出yaw角 θ \theta θ的计算公式: θ = a z + a r c t a n ( x / z ) \theta =a_z +arctan(x/z) θ=az+arctan(x/z) ,这里的 θ \theta θ就是公式中的 r _ y r\_y r_y, a z a_z az就是kitti中的alpha。而smoke中定义的角度是 a x a_x ax,而smoke中定义的角度是 a z a_z az,现在来解释它俩的关系。参考1,参考2

在这里插入图片描述
来看下代码:smoke/smoke/modeling/smoke_coder.py:200

def decode_orientation(self, vector_ori, locations, flip_mask=None):locations = locations.view(-1, 3)rays = torch.atan(locations[:, 0] / (locations[:, 2] + 1e-7))  # 计算theta,用的gtalphas = torch.atan(vector_ori[:, 0] / (vector_ori[:, 1] + 1e-7))  # arctan(sin/cos)# get cosine value positive and negtive index.cos_pos_idx = torch.nonzero(vector_ori[:, 1] >= 0)  # 比较cos值是否大于0,判断属于哪个区间cos_neg_idx = torch.nonzero(vector_ori[:, 1] < 0)alphas[cos_pos_idx] -= PI / 2  # 通过这步转换为kitti中的alpha角度定义alphas[cos_neg_idx] += PI / 2# retrieve object rotation y angle.rotys = alphas + rays  # ry = alpha + theta
  • rotys 就是 θ \theta θ:
    • θ = r o t y s = r _ y \theta =rotys=r\_y θ=rotys=r_y =alphas + a z a_z az = alphas + rays = alphas+ a r c t a n ( x / z ) arctan(x/z) arctan(x/z)
    • 其中: rays = a r c t a n ( x / z ) arctan(x/z) arctan(x/z) = torch.atan(locations[:, 0] / (locations[:, 2] + 1e-7))
    • alphas = alphas =torch.atan(vector_ori[:, 0] / (vector_ori[:, 1] + 1e-7)), 其中vector_ori = [ s i n a , c o s a ] [ sina,cosa] [sina,cosa]
    • vector_ori = [ s i n a , c o s a ] [ sina,cosa] [sina,cosa] 中的 s i n a sina sina c o s a cosa cosa 是在网络输出的 o s i n a o_{sina} osina o c o s a o_{cosa} ocosa做归一化后得到的。
      在这里插入图片描述

最后,通过航角的旋转矩阵 R θ R_{\theta} Rθ, 物体的长宽高 [ h , w , l ] T [h,w,l]^T [h,w,l]T, 和中心点位置 [ x , y , x ] T [x,y,x]^T [x,y,x]T, 可构建 3D 边界框的 8 个角点(corners),公式如下:
在这里插入图片描述

2. 损失函数loss

损失函数由keypont分类损失和 3D box回归损失组成

2.1 keypoint分类损失

在heatmap上逐点应用focal loss,其中 s i , j s_{i,j} si,j 为heatmap上位置 ( i , j ) (i,j) (i,j)处的预测分数, y i , j y_{i,j} yi,j为真实的gt值由Gaussian Kernel分配。 β \beta β γ \gamma γ是超参数, N N N 是每张图片中关键点的数量, 损失函数的定义如下:
在这里插入图片描述
总结:分类损失就是一个带focal loss的交叉熵损失

2.2 3D box回归损失

作者利用多步计算loss, 扩展了loss disentanglement思想。利用对3D box的尺寸 (h, w, l),中心点坐标(x, y, z) 和观测角度 α \alpha α, 产生了表征3D box 的8个角点。通过3个解耦L1 loss来计算损失。
在这里插入图片描述
其中 λ \lambda λ为权重的平衡系数,B为gt值, B ^ \hat{B} B^为预测值。

  • 中心点(x,y,z)预测: 利用相机上的3D box中心点投影到图像平面上得到 [ x c , y c ] T [x_c,y_c]^T [xc,yc]T 和网络预测偏移量 δ x c , δ y c \delta_{x_c}, \delta_{y_c} δxc,δyc 以及已知的相机内参矩阵 K K K可以预测中心点。
  • 观测角预测:使用 3D 框的 gt 中心点 ( x , y , z ) ( x , y , z ) (x,y,z) 和预测的观察角 a z ^ \hat{a_z} az^, 计算 θ \theta θ
  • whl:长宽高使用预测值,其他值使用gt代入计算得到3d box的8个角点坐标。

其实就是,预测哪种类型的,那一类型的参数就使用预测值,其他使用真实值,从而计算得出 8 个预测角点的坐标

故最终损失为:
在这里插入图片描述
作者总结利用解耦的多步( multi-step)损失,可以显著提高检测精度

3. 数据增广

  • heatmap分类分支: 包括水平翻转、多尺度、平移。
  • 针对回归分支,只做了水平翻转。因为3d属性会随着缩放平移变化,需要对标签也做相应修改。

实验结果

  • 仅用了60epoch就收敛,说明确实收敛更快了。
  • test数据上比其他算法好,而val上不如其他算法,说明·smoke需要更多数据才能训好·,也说明kitti的val(当然这个val是人为划分的)和数据集划分不是很合理。
    在这里插入图片描述
  • 3.回归中将不同属性的loss解耦后,性能提升明显。不同属性间会相互影响,这是单目检测或者多任务中经常面临的问题,而解耦loss是常用的解决方案。具体可以参考:Disentangling Monocular 3D Object Detection。
    在这里插入图片描述
    1. 对比了GN和BN,GN效果更好,对batch-size不敏感,训练更快,BN对GN多消耗60%的时间
      在这里插入图片描述
    1. 其他细节还有使用本文中sin/cos编码角度比四元数效果要好。本文无2d模块,将3d结果投影到图像作为2d检测结果,性能也不错

在这里插入图片描述

参考

https://zhuanlan.zhihu.com/p/452676265
https://blog.csdn.net/steven_ysh/article/details/124936613

这篇关于【单目3D检测】:SMOKE论文的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803217

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已