学习MMDetection3D---整体框架介绍

 原文在这:带你玩转 3D 检测和分割(一):MMDetection3D 整体框架介绍 - 知乎

1.前言

代码库目录结构:

# MMDetection3D 代码目录结构,展示主要部分 
mmdetection3d 
   | 
   |- configs                    # 配置文件 
   |- data                       # 原始数据及预处理后数据文件 
   |- mmdet3d  
   |     |- ops                  # cuda 算子(即将迁移到 mmcv 中) 
   |     |- core                 # 核心组件 
   |     |- datasets             # 数据集相关代码 
   |     |- models               # 模型相关代码 
   |     |- utils                # 辅助工具 
   |     |- ... 
   |- tools 
   |     |- analysis_tools       # 分析工具,包括可视化、计算flops等 
   |     |- data_converter       # 各个数据集预处理转换脚本 
   |     |- create_data.py       # 数据预处理入口 
   |     |- train.py             # 训练脚本 
   |     |- test.py              # 测试脚本 
   |     |- ...                       
   |- ... 

任务介绍

 3D 目标检测按照输入数据模态划分可以分为:点云 3D 检测、纯视觉 3D 检测以及多模态 3D 检测(点云+图片)。

算法模型支持

所有模型相关代码位于 mmdet3d/models 下,MMDetection3D 支持的各个方向的模型大体可以归类如下:

MMDetection3D 依赖于 MMDetection 和 MMSegmentation, 所以很多的模型及组件都是直接复用或者继承而来。目前在 MMDetection3D 内,整体模型的构建方式会根据任务类型被划分为三种方式,具体如下图所示:

点云目标检测

对于点云 3D 检测(多模态 3D 检测),我们继承自 MMDetection 中的 BaseDetector 构建了适用于 3D 检测的 Base3DDetector ,再根据检测中的单阶段和二阶段分别构造,需要注意的是不同于 SingleStage3DDetector,为了尽可能的复用已有的代码组件,二阶段检测器TwoStage3DDetector 同时继承自 Base3DDetector 和 TwoStageDetector。而由于多模态任务的特殊性,我们专门为多模态检测方法设计了 MVXTwoStage3DDetector,图中只列出了部分支持的模型算法。 

 单目3D检测

 对于单目 3D 检测,考虑到和 2D 检测输入数据的一致性,同时方便做 2D 检测的同学能快速的上手单目 3D 检测,我们继承自 MMDetection 中的 SingleStageDetector 构建了 SingleStageMono3DDetector,目前所支持的单目 3D 检测算法都是基于该类构建的。

 2.数据预处理

 该部分对应于 tools/create_data.py ,各个数据集预处理脚本位于 tools/data_converter 目录下。由于 3D 数据集的多样性,MMDetection3D 会对数据集做预处理。我们在官方文档里面介绍了不同的数据集的格式转换方法和命令,在这里我们从整体视角来看一下数据预处理的文件生成过程:

在 MMDetection3D 中,不同的任务和不同的场景(室内或室外)的数据预处理都会存在一定的区别,如上图所示,会产生不同的预处理后的文件,便于后续训练。

  1. 对所有的任务和场景,我们统一使用数据处理脚本转换后的 pkl 文件,该文件包含数据集的各种信息,包括数据集路径、calib 信息和标注信息等等,从而做到各个数据集内部格式尽可能的统一。
  2. 对于点云 (多模态)3D 检测,室内和室外数据集生成的文件是不一样的:

对于某些室外数据集,我们会借助 pkl 文件的信息进一步提取 reduced_point_cloud 和 gt_database:前者是仅包含前方视野的点云文件,通常存在于 kitti 数据集处理过程中,因为 kitti 数据集仅包含前方视野的标注;后者则是将包含在训练数据集的每个 3D 边界框中的点云数据分别提取出来得到的各个物体的点云文件,常用来在数据增强时使用(copy-paste)。

而对于室内数据集,由于室内点云较为密集的特点,通常会进行点云的下采样处理,保存在points内。

对于单目 3D 检测,由于在前面提到,整个模型构建的流程是遵循 2D 检测的,同样的在数据处理的过程中,在生成基本的 pkl 文件后,还需要将其转换为 coco 标注格式的 json 文件,该过程中会对 pkl 的标注信息做相应处理,实际在该任务中,pkl 文件用来提供 data 信息,json 文件提供标注信息。

3.模块抽象

和 MMDetection 一脉相承,整个 MMDetection3D 的模块内部抽象流程也主要包括 Pipeline、DataParallel、Model、Runner 和 Hooks。如果对DataParallel、Runner 和 Hooks这三个抽象模块不熟悉的同学,我们非常推荐大家先参轻松掌握 MMDetection 整体构建流程(二)篇文章中的【第二层模块抽象】部分了解这些抽象概念,在这里我们重点介绍不同的 Pipeline 。

3.1  Pipeline

上图展示了三个比较典型的 3D 检测 pipeline, 流程自上而下分别是点云 3D 检测、多模态 3D 检测和单目 3D 检测,从上述的流程可以,pipeline 其实是由一系列的按照插入顺序运行的数据处理模块组成,接受数据字典,输出经过处理后的数据字典,MMDetection3D 对于点云 3D 检测提供了很多常用的 pipeline 模块,比如GlobalRotScaleTrans(点云的旋转缩放)、PointsRangeFilter / ObjectRangeFilter(限定了点云和物体的范围)、PointShuffle(打乱点云数据);而对于单目 3D 检测基本就是直接调用 MMDetection 的数据处理模块,比如 Resize (图片缩放)、Normalize (正则化)、Pad (图片填充);多模态检测则兼用两者。我们可以看到其实这些任务共享了部分的 pipeline 模块,比如 LoadAnnotations3D (标签载入)、RandomFlip3D(会对点云和图片同时进行翻转)、DefaultFormatBundle3D(数据格式化)、Collect3D (选取需要用于训练的数据和标签),这些代码都在 mmdet3d/datasets/pipeline 目录下。

4.训练和测试流程

在 轻松掌握 MMDetection 整体构建流程(二) 中的 【第三层代码抽象】部分中,按照训练和测试整体代码抽象流程-> Runner 训练和验证代码抽象 -> Model 训练和测试代码抽象的方式给大家进行了介绍,在这里我们简要概括前两部分:

首先我们训练和验证调用的是 tools/train.py 脚本,先进行 Dataset、Model 等相关类初始化,然后我们构建了一个 runner,最终模型的训练和验证过程是发生在 runner 内部的,而训练和验证的时候实际上是 runner 调用了 model 内部的 train_step 和 val_step 函数。

对如何从 tools/train.py 脚本开始到调用 train_step 和 val_step 函数的细节过程可以参考前述文章的【第三层代码抽象】部分,而理解了这两个函数调用流程就理解了 MMDetection3D 训练和测试流程。笔者在这一部分主要以 PointPillars 为例分析 MMDetection3D 中 Model 的训练和测试代码:

4.1 Train和val流程

 4.2 test流程

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值