赞
踩
原文在这:带你玩转 3D 检测和分割(一):MMDetection3D 整体框架介绍 - 知乎
代码库目录结构:
- # 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 检测算法都是基于该类构建的。
该部分对应于 tools/create_data.py
,各个数据集预处理脚本位于 tools/data_converter
目录下。由于 3D 数据集的多样性,MMDetection3D 会对数据集做预处理。我们在官方文档里面介绍了不同的数据集的格式转换方法和命令,在这里我们从整体视角来看一下数据预处理的文件生成过程:
在 MMDetection3D 中,不同的任务和不同的场景(室内或室外)的数据预处理都会存在一定的区别,如上图所示,会产生不同的预处理后的文件,便于后续训练。
对于某些室外数据集,我们会借助 pkl 文件的信息进一步提取 reduced_point_cloud
和 gt_database
:前者是仅包含前方视野的点云文件,通常存在于 kitti 数据集处理过程中,因为 kitti 数据集仅包含前方视野的标注;后者则是将包含在训练数据集的每个 3D 边界框中的点云数据分别提取出来得到的各个物体的点云文件,常用来在数据增强时使用(copy-paste)。
而对于室内数据集,由于室内点云较为密集的特点,通常会进行点云的下采样处理,保存在points
内。
对于单目 3D 检测,由于在前面提到,整个模型构建的流程是遵循 2D 检测的,同样的在数据处理的过程中,在生成基本的 pkl 文件后,还需要将其转换为 coco 标注格式的 json 文件,该过程中会对 pkl 的标注信息做相应处理,实际在该任务中,pkl 文件用来提供 data 信息,json 文件提供标注信息。
和 MMDetection 一脉相承,整个 MMDetection3D 的模块内部抽象流程也主要包括 Pipeline、DataParallel、Model、Runner 和 Hooks。如果对DataParallel、Runner 和 Hooks这三个抽象模块不熟悉的同学,我们非常推荐大家先参考轻松掌握 MMDetection 整体构建流程(二)这篇文章中的【第二层模块抽象】部分了解这些抽象概念,在这里我们重点介绍不同的 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
目录下。
在 轻松掌握 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 的训练和测试代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。