OpenPCDet解析

这篇具有很好参考价值的文章主要介绍了OpenPCDet解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、OpenPCDet 简介

1.1 简介

OpenPCDet: Open-MMLab 面向LiDAR点云表征的3D目标检测代码库

OpenPCDet的github链接

  • OpenPCDet 是一套基于PyTorch实现的点云3D目标检测代码库

  • 设计思想点云数据集(KITTI、NuScene、Lyft、Waymo、PandaSet等)在数据格式与3D坐标系上往往定义各不相同,各式各样的点云感知算法(point-based、 voxel-based、one-stage/two-stage等)也形态各异
    因此基于数据-模型分离的顶层代码框架设计思想,设计一个统一的架构,使得相关研究者可以在一个统一的框架内进行各种组合实验

1.2 数据-模型分离的顶层代码框架

PCDet定义了统一的规范化3D坐标表示贯穿整个数据处理与模型计算,从而将数据模块模型处理模块完全分离。
具体框架如下图所示:
OpenPCDet解析

数据模型分离的优点:

  • 研究者在研发不同结构模型时,统一使用标准化的3D坐标系进行各种相关处理(比如计算loss、RoI Pooling和模型后处理等),而无需理会不同数据集的坐标表示差异性
  • 研究者在添加新数据集时,只需写少量代码将原始数据转化到标准化坐标定义下,PCDet将自动进行数据增强并适配到各种模型中。

1.3 统一的3D目标检测坐标定义

PCDet 中我们采用了固定的统一点云坐标系,以及更规范的3D检测框定义,贯穿整个数据增强、处理、模型计算以及检测后处理过程。3D检测框的7维信息定义如下:

3D bounding box: (cx, cy, cz, dx, dy, dz, heading)

每个维度解释如下:

  • (cx, cy, cz) 为物体3D框的几何中心位置
  • (dx, dy, dz)分别为物体3D框在heading角度为0时沿着x-y-z三个方向的长度
  • heading为物体在俯视图下的朝向角 (沿着x轴方向为0度角,逆时针x到y角度增加)。
    OpenPCDet解析

1.4 模块化模型拓扑设计

我们在PCDet中搭建3D目标检测框架只需要写config文件将所需模块定义清楚,然后PCDet将自动根据模块间的拓扑顺序组合为3D目标检测框架,来进行训练和测试。
模块化设计如下图所示:
OpenPCDet解析
PCDet可以支持目前已有的绝大多数面向LiDAR点云的3D目标检测算法,包括voxel-based,point-based,point-voxel hybrid以及one-stage/two-stage等等3D目标检测算法。 如下图所示:
OpenPCDet解析

二、 代码解析

2.1 框架介绍

文件结构如下图所示:
OpenPCDet解析
各个目录的作用如下:
OpenPCDet解析

2.2 数据处理流程

OpenPCDet解析

  • 步骤1: __getitem__
    作用:从磁盘上加载数据并统一坐标系。
    如果只更换数据集,则需要重写__getitem__

  • 步骤2: data_augmentor
    作用: 数据增强的方法,例如随机裁剪、随机旋转等…
    OpenPCDet解析

  • 步骤3:point_feature_encoder
    作用:选择一些特征的编码,输入的特征是points:(N,3+C_in) 经过选择和编码后,输出的特征是points:(N,3+C_out)
    OpenPCDet解析

  • 步骤4: data_processor
    作用:处理输入的数据,比如mask_point_boxes_outside_range、sample_points等
    OpenPCDet解析

  • 步骤5: collate_batch
    作用:将数据整理成batch

2.3 模型拓扑的依赖关系

OpenPCDet解析
建立model的过程在【pcdet/models/detectors/detector3d_template.py】中。
OpenPCDet解析
其中build_networks 是根据拓扑信息(module_topology)建立网络, 并保存在module list 中。
OpenPCDet解析
其中module_topology 的定义如下:
OpenPCDet解析

2.4 模型的前向传播和最优

point_rcnn 为例,定义了一个PointRCNN的类,继承的是Detector3DTemplate的类。
OpenPCDet解析

  • 前向传播

    • 首先遍历module_list, 通过topology 顺序的调用各个模型。如果是训练过程(training ), 则调用get_traing_loss 计算损失。如果是推理过程,则调用post_processing 进行后处理
  • 最优化
    计算的损失包括两个部分

    • DETECTOR.get_training_loss()
    • HEAD.get_loss()

2.5 模型

2.5.1 detector

detector的存放位置:
OpenPCDet解析

对于所有detector的顶级模板如下

  • 建立网络结构(Build_networks)
  • 前向传播(Forword)
  • 计算损失(Loss calculation)
  • 后处理 (Post_processing:NMS+score threshold)

2.5.2 3D backbone network

backones_3d的存放位置:
OpenPCDet解析
3d主干网络的作用:提取基于体素的或者基于点云的特征。

3d主干网络主要有如下几种:

  • 3d encoder with sparse convolution(with VFE)
    • 功能:通过稀疏卷积进行编码
    • 实例:VoxelBackBone8x、VolxelResBackBone8x
  • 3d UNet with sparse convolution(with VFE)
    • 功能:通过稀疏网络进行编码和解码两个部分
    • 实例:UNetV2
  • point-wise networks(PointNet++)
    • 功能: 用PointNet++ 直接提取点的特征
    • 实例:PointNet2MSG

2.5.3 2D Backbone network

backones_2d的存放位置:
OpenPCDet解析

2d主干网络的作用: 提取2d特征图。
3d主干网络主要有如下几种:

  • Map_to_bev_module(把3d特征映射到2d上)
    • HeightCompression
    • PointPillarScatter
  • 2d convolution encoder with FPN-like unsampling
    • BaseBEVBackbone

2.5.4 Denseheads

Denseheads的存放位置:
OpenPCDet解析

  • 任务:生成dense 3d boxes, 真正进行检测的过程。
    AnchorHead包含如下两部分:
    • target assigning:对于每个anchor判断是否是正样本以及要朝着那个groud truth 回归。
    • head loss calculation:计算loss,包括分类和回归的损失。

分类:

  • 基于BEV 特征的 Dense head (继承于AnchorHeadTemplate)
    • AnchorHeadSingle: 只输入一个特征图,基于anchor进行检测
    • AnchorHeadMulti:输入多个特征图,基于anchor检测
    • CentorHead:anchor- free检测,对于每个pixel输出一个检测框。
  • 基于点特征的Dense head (继承于PointHeadTemplate)
    • PointHeadSimple: 只做分割,判断每个点是前景点还是背景点。
    • PointHeadBox: 不仅做分割,还做预测。对于每个点预测一个3d 的bonding box。
    • PointIntraPartOffsetHead: 除了分割和预测外,还可以预测Intra part offset

2.5.5 RoIHeads

RoIHeads的存放位置:

OpenPCDet解析

  • 任务:Refine 3D proposals with RoI-aligned features
    • Extract RoI-aligned features
    • proposal_layer
    • ProposalTargetLayer
    • Head loss calcution
  • 二阶段的ROI检测(继承于ROITemplate)
    • PointRCNNHead
    • PartA2Head
    • PVRCNNHead

2.6 配置文件

配置文件的存放路径:
OpenPCDet解析
通过.yaml文件进行多层次的配置。
例如如下图所示的pv_rcnn.yaml 是个整体的配置。其中嵌套了三个下一级的配置,包括DATA_CONFIGMODELOPTIMIZATION
OpenPCDet解析

三、拓展开发

3.1 使用自定义的数据集

步骤如下:文章来源地址https://www.toymoban.com/news/detail-439516.html

  1. 继承DatesetTemplate 写自己的DatasetModule
  2. 重载self.__getitem__() 函数来加载点云或者gt_boxes, 并把它们转换成统一的坐标系。
  3. 调用self.prepare_data() 去处理数据
  4. 重载self.generate_prediction_dicts() 函数把预测结果转换成我们需要的格式。
  5. 重载self.evaluation() 函数来评估模型的性能

3.2 使用自定义的模型

步骤如下:

  1. 继承DetectorTemplate 来写自定义的detector
  2. 写自定义的配置文件
  3. 在对应的目录下写对应的模型
  4. 重载forward() 函数
  5. 重载get_training_loss() 函数

到了这里,关于OpenPCDet解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 吴恩达+Open AI 《面向开发者的ChatGPT Prompt 工程》课程学习1——课程介绍

    许多人都体验过ChatGPT的Web用户界面来完成特定而且通常是一次性的任务。但是从开发者的角度来说,通过API调用LLM(large language model大语言模型)来快速构建应用程序这个强大的功能被严重低估了。 学习到一些软件开发提示词的最佳实践; 学习到一些常见的用例、总结、推

    2024年02月06日
    浏览(71)
  • 吴恩达+Open AI 《面向开发者的ChatGPT Prompt 工程》课程学习2——prompt指导原则1

    吴恩达+Open AI 《面向开发者的ChatGPT Prompt 工程》课程学习1——课程介绍 吴恩达+Open AI 《面向开发者的ChatGPT Prompt 工程》课程学习2——prompt指导原则1(本博文) prompt编写指导原则1:写出清晰而具体的指示。 本节课讲述方式:理论+代码实践。 1 在整个课程中,我们将使用

    2024年02月07日
    浏览(43)
  • nuplan(面向自动驾驶规划的数据集)简介

            是世界第一个针对自动驾驶规划方法测试的开源数据集(发布于2021年),收集了波士顿、匹兹堡、拉斯维加斯和新加坡这 4 个城市收集了大约 1300 小时的驾驶数据。         虽然基于 ML 的运动规划器越来越多,但缺乏既定的数据集、模拟框架和评价指标,这

    2024年02月16日
    浏览(51)
  • 【点云处理教程】00计算机视觉的Open3D简介

            Open3D 是一个开源库,使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式,例如 .ply、.obj、.stl 和 .xyz,并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广泛应用于机器人、增强现实和自

    2024年02月14日
    浏览(48)
  • Python面向对象编程详细解析(都带举例说明!)

    Python面向对象编程 (Object-Oriented Programming,简称OOP) 是一种编程范式,它将数据和操作数据的方法封装在一起,形成一个对象。 Python中的面向对象编程包括以下内容: 想找辣条哥的话直接戳这里,辣条之前的一些Python相关都可以拿走: 类是一种抽象的数据类型,它定义了

    2024年02月06日
    浏览(42)
  • Python中对open读取文件内容时的mode模式解析

    Python3中的open函数定义为: 其中mode列表为: 这里我们主要关心一下\\\'r\\\', \\\'w\\\', \\\'a\\\', \\\'r+\\\', \\\'w+\\\', \\\'a+\\\', \\\'x\\\',很多人容易混淆不同模式的读写操作 2.\\\'r\\\' 只读模式,open函数中mode参数的默认模式,文件不存在的话,报FileNotFoundError(python2是IOError); 文件打开后,初始游标位置为0; 每次读都

    2024年02月12日
    浏览(40)
  • 深入解析 Java 面向对象编程与类属性应用

    面向对象编程 (OOP) 是一种编程范式,它将程序组织成对象。对象包含数据和操作数据的方法。 OOP 的优势: 更快、更易于执行 提供清晰的结构 代码更易于维护、修改和调试 提高代码重用性 减少开发时间 类和对象 类 是对象的模板,它定义了对象的属性和方法。 对象 是类的

    2024年02月20日
    浏览(46)
  • FlashAttention2原理解析以及面向AIGC的加速实践

    FlashAttention-2提出后,便得到了大量关注。本文将具体讲述FlashAttention-2的前世今生,包括FlashAttention12的原理解析、加速效果比较以及面向AIGC的加速实践,在这里将相关内容与大家分享~ 引言 将 Transformers 扩展到更长的序列长度一直是过去几年的一个热点问题,这将有助于提

    2024年02月07日
    浏览(41)
  • 最新技术解析:Open ai新推出了视频生成工具Sora

    文章目录 概要 技术名词解释 技术细节 小结 OpenAI 的 GPT 大模型最近几年发展迅猛,起初我还是观望或者看客心态,毕竟新鲜事物太多。直到最近半年两个技术改变了我的看法,之前推出的诸如人工智能图片生成器(Midjourney、DALL-E2、Stableboost、NovelAI和Stable Diffusion等)以及本

    2024年03月16日
    浏览(63)
  • Openpcdet训练自己的数据集

    * Openpcdet详细内容请看以下链接: GitHub - open-mmlab/OpenPCDet: OpenPCDet Toolbox for LiDAR-based 3D Object Detection. 1.首先gitclone原文代码 2. 这里我建议自己按照作者github上的docs/install文件夹下指示一步步安装,(之前根据csdn上教程一直有报错),然后下载spconv,以及cumm, github链接如下: GitH

    2024年03月24日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包