【DETR3D】3D目标检测


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

模型结构

特征学习

检测头

演示效果

核心逻辑

部署方式

参考文献


 本文所有资源均可在该地址处获取。

概述

  DETR3D介绍了一种多摄像头的三维目标检测的框架。与现有的直接从单目图像中估计3D边界框或者使用深度预测网络从2D信息中生成3D目标检测的输入相比,DETR3D直接在3D空间中进行预测。DETR3D从多个相机图像中提取2D特征,使用3D对象查询的稀疏集来索引这些2D特征。使用相机变换矩阵将3D位置链接到多视图图像。最后对每个目标单独进行边界框预测,使用集合到集合的损失来衡量真值和预测之间的差异。

模型结构

  DETR3D架构的输入是一组投影矩阵(内参和相对外参的组合)和已知的相机收集的RGB图像,为场景中的物体输出一组3D边界框参数。与过去的方法相比,DETR3D基于一些高级需求构建体系结构。

  • DETR3D将3D信息合并到中间计算中,而不是在图像平面上执行纯粹的2D计算
  • DETR3D不估计密集的三维场景几何,避免相关的重建误差
  • DETR3D避免了NMS等后处理步骤

      如上图所示,DETR3D使用一个新的集合预测模块来解决这些问题,该模块通过在2D和3D计算之间交替来连接2D特征提取和3D边界框预测。我们的模型包括三个关键部分:
  • 首先,遵循2D视觉中的常见做法,它使用共享ResNet主干从相机图像中提取特征。这些特征可以选择性的由特征金字塔网络增强
  • 一个检测头,以集合感知的方式将计算出的2D特征连接到一组3D边界框预测中。检测头的每一层都是从一组稀疏的对象查询开始,这些查询是从数据中学习的。每个对象查询编码一个3D位置,该位置被投影到相机平面上,用于通过双线性插值收集图像特征。DETR3D使用多头注意力通过结合对象交互来细化对象查询。该层重复多次,在特征采样和对象查询细化之间交替。
  • DETR3D采用了一个集合到集合的损失来训练网络

特征学习

  DETR3D的输入有图像 I={im1,…,imK}⊂RHim×Wim×3I={im1​,…,imK​}⊂RHim​×Wim​×3,相机矩阵 T={T1,…,TK}⊂R3×4T={T1​,…,TK​}⊂R3×4,地面真实边界框B={b1,…,bj,…,bM}⊂R9B={b1​,…,bj​,…,bM​}⊂R9,和分类类别C={c1,…,cj,…,cM}⊂ZC={c1​,…,cj​,…,cM​}⊂Z,每一个边界框包含BEV视角下的位置、大小、朝向角和速度。DETR3D旨在从这些图像预测这些框及其标签。图像数据经过ResNet和FPN网络被编码为四组特征F1,F2,F3,F4F1​,F2​,F3​,F4​,每组特征Fk={fk1,…,fk6}⊂RH×W×CFk​={fk1​,…,fk6​}⊂RH×W×C对应六个不同视角下图像的某一级特征。这些多尺度特征为识别不同大小的物体提供了丰富的信息。

检测头

  在相机输入中检测物体的现有方法通常采用自下而上的方法,该方法预测每张图像的密集边界框,过滤图像之间的冗余框,并在后处理步骤中汇总相机之间的预测。这种范式由两个关键的缺点:密集边界框预测需要精确的深度感知,这本身就是一个具有挑战性的问题;基于NMS的冗余删除和聚合是不可并行化的操作,会引入大量的推理开销。
DETR3D采用下面描述的自顶向下的目标检测头来解决这些问题。它使用L层基于集合的计算从2D特征图中产生边界框估计,每层都遵循如下的步骤:

  • 预测一组与对象查询相关的边界框中心
  • 使用相机变换矩阵将这些中心投影到所有的特征映射中
  • 通过双线性插值采样特征,并将其合并到对象查询中
  • 采用多头注意力机制描述对象的相互作用

  基于DETR,每一层ℓ∈{0,…,L−1}ℓ∈{0,…,L−1}在一组对象查询上操作Qℓ={qℓ1,…,qℓM∗}⊂RCQℓ​={qℓ1​,…,qℓM∗​}⊂RC生成一个新的集合Qℓ+1Qℓ+1​。每一个参考点cℓi∈R3cℓi​∈R3都按照以下公式从对象查询中解码

cℓi=Φref(qℓi),cℓi​=Φref(qℓi​),

  其中ΦrefΦref是一个神经网络。cℓicℓi​可以假设为第i个边界框的中心。之后获取对应cℓicℓi​的图像特征并且优化和预测最终的边界框,cℓicℓi​通过相机的转换矩阵投影到六个视图中的一个。

cℓi∗=cℓi⊕1cℓmi=Tmcℓi∗,cℓi∗​=cℓi​⊕1cℓmi​=Tm​cℓi∗​,

  其中⊕⊕表示在通道维度上拼接,cℓmicℓmi​是在第m个相机上投影出来的参考点。为了消除特征图大小的影响并收集不同级别的特征图,DETR3D将cℓmicℓmi​归一化为[-1,1]。然后,对图像特征进行采集。

fℓkmi=fbilinear(Fkm,cℓmi)fℓkmi​=fbilinear(Fkm​,cℓmi​)

  其中fℓkmifℓkmi​表示来自于DETR3D中第L层,第M个相机的输入图像,第K个特征图的第I个点的特征。<

06-21
### DETR3D 介绍 DETR3D 是一种基于多视角图像的 3D 目标检测方法,它将 DETR 的思想扩展到了 3D 检测任务中[^1]。具体来说,DETR3D 利用了逆几何投影技术,将提取的 2D 特征与 3D 包络框预测连接在一起[^3]。这种方法能够无缝地利用多个相机的信息,并且避免了二阶段网络中深度预测不准确的问题。此外,DETR3D 不需要后处理步骤(如 NMS 或图像融合),从而简化了整个检测流程。 在 nuScenes 数据集上的实验表明,DETR3D 在重叠区域的表现优于其他方法,同时其性能与现有的基于 NMS 的方法相当[^3]。 --- ### DETR3D 的实现 DETR3D 的实现主要依赖于以下关键模块: 1. **特征提取**:通过卷积神经网络从多视角图像中提取 2D 特征。 2. **逆几何投影**:将 2D 特征映射到 3D 空间,形成鸟瞰图(BEV)表示。 3. **Transformer 编码器-解码器结构**:使用 Transformer 来建模全局上下文信息,并生成 3D 包络框预测。 4. **损失函数**:基于 bipartite matching loss 的思想,优化 3D 包络框的预测结果。 以下是 DETR3D 的核心代码框架示例: ```python import torch import torch.nn as nn class DETR3D(nn.Module): def __init__(self, backbone, transformer, num_classes, num_queries): super(DETR3D, self).__init__() self.backbone = backbone # 用于提取2D特征 self.transformer = transformer # Transformer编码器-解码器 self.num_classes = num_classes self.query_embed = nn.Embedding(num_queries, transformer.d_model) # 学习的对象查询 self.class_embed = nn.Linear(transformer.d_model, num_classes + 1) # 分类头 self.bbox_embed = MLP(transformer.d_model, transformer.d_model, 6, 3) # 3D包围框回归头 def forward(self, images, calib_matrices): # 提取2D特征 features = self.backbone(images) # 将2D特征反投影到3D空间 projected_features = inverse_geometric_projection(features, calib_matrices) # Transformer处理 hs = self.transformer(projected_features, self.query_embed.weight) # 预测分类和3D包围框 outputs_class = self.class_embed(hs) outputs_coord = self.bbox_embed(hs).sigmoid() return {'pred_logits': outputs_class, 'pred_boxes': outputs_coord} # 辅助函数:MLP定义 class MLP(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, num_layers): super().__init__() self.layers = nn.ModuleList() for _ in range(num_layers): self.layers.append(nn.Linear(input_dim, hidden_dim)) self.layers.append(nn.ReLU()) input_dim = hidden_dim self.layers.append(nn.Linear(hidden_dim, output_dim)) def forward(self, x): for layer in self.layers: x = layer(x) return x ``` --- ### DETR3D 的教程 为了更好地理解和使用 DETR3D,可以参考以下资源: 1. **官方文档和代码**:如果 DETR3D 有官方实现,建议优先参考官方代码库。通常情况下,官方文档会提供详细的安装指南、模型配置和训练脚本。 2. **Deformable DETR 教程**:虽然 Deformable DETRDETR3D 不完全相同,但它们都基于 DETR 架构,因此可以参考 Deformable DETR 的教程来理解 Transformer 的应用[^2]。 3. **主流框架教程**:学习 PyTorch 或 TensorFlow 的基础知识,特别是 Transformer 和多视角几何相关内容[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值