【MMDetection3D实战5】Dataset 和 model配置文件解析

news2024/12/23 14:00:55

文章目录

    • 1. Dataset 配置文件解析
      • 1. 1 定义全局变量
      • 1. 1 数据处理pipeline
        • (1) train_pipeline
        • (2) test_pipeline
        • (3) eval_pipeline
      • 1. 2 data 字典的定义
    • 2. model 配置文件解析
      • 2. 1 体素化voxel_layer
      • 2. 2 voxel_encoder
      • 2. 3 middle_encoder
      • 2. 4 2D 检测网络(backbone + neck + detection head)
        • 2.4.1 backone+neck
        • 2.4.2 detection head
      • 2. 5 train_cfg 和 test_cfg
        • 2.5.1 train_cfg
        • 2.5.1 test_cfg

本文以Kitti数据集以及PointPillar 模型的配置文件来举例,详细解析数据集和模型配置相关的内容。

在MMDetection3D(mmdet3d)项目的configs目录下提供了不同版本的各类3d模型配置文件,大概有40多种主流和前沿的3D模型。支持Lidar-based Camera-basedMulti-modal (多模态)3D 目标检测模型以及 3D语义分割模型。模型的配置文件在项目的confgs文件夹中,根据项目需要找到对应的模型,比如pointpillars可以看到mmdet3d帮我们适配了各种版本的pointpillars模型。配置文件中包含了:模型结构数据处理的pipeline训练相关的配置(优化器、超参数、训练验证的轮数以及指标评估)等。

  • 当我们需要训练一个3D模型时,只需要准备好配置文件预训练权重以及自定义数据集即可。其中不同模型训练的配置文件MMDetection3D已经提供了,另外也提供了对应版本的SOTA预训练权重,可到官网进行下载。

  • 配置文件中包含了:模型结构配置数据处理的pipeline训练相关的配置,因此配置文件中它会继承, 通过_base_变量存储需要继承的文件:模型的配置文件dataset的配置文件优化器相关的配置文件、以及runtime的配置文件(定义日志级别、workdir、resume的模型路径等)
    在这里插入图片描述

  • 另外,如果我们自己需要修改配置文件,只需要继承官方提供的配置文件基础上,做一些局部的改动即可,大部分配置都不需要修改,使用起来非常便利。

在这里插入图片描述

  • 整个训练和测试的配置文件,包含了:模型的配置文件dataset的配置文件优化器相关的配置文件、以及runtime的配置文件, 其中模型的配置文件dataset的配置文件是两个最核心的配置文件,因此接下来会重点介绍这两个配置文件。优化器和runtime的配置比较简单,基本看看就明白。

1. Dataset 配置文件解析

KITTI数据集为例进行解析,Dataset的配置文件路径在: configs/_base_/datasets/kitti-3d-3class.py。它定义了:数据采样db_sampler,数据处理的pipeline : train_pipeline、test_pipeline、val_pipeline, 以及data(完整的data处理定义); 还有一些全局变量,如:dataset_type、data_root、class_names、point_cloud_range
在这里插入图片描述

1. 1 定义全局变量

kitti-3d-3clas.py 定义了如下几个全局变量

  • dataset_type: 因为是kitti数据集,所以默认为KittiDataset。也可以是其他数据集,比如 LyftDataset,WaymoDataset,NuScenesDataset, 也可以是自定义的数据集类型。
  • data_root:定义数据存放的跟目录,比如data/kitti/
  • class_names: 数据的类别名,比如KITTI数据集的类型为:[‘Pedestrian’, ‘Cyclist’, ‘Car’]
  • point_cloud_range: 点云覆盖的有效范围,用于过滤点云数据。比如KITTI 对应的范围为: [-50, -50, -5, 50, 50, 3]
  • input_modality: 设定使用的数据对应的模态信息。对于pointpillars,用于lidar点云检测,所以 use_lidar=True
    input_modality = dict(
    use_lidar=True,
    use_camera=False,
    use_radar=False,
    use_map=False,
    use_external=False)
    

1. 1 数据处理pipeline

当代码解析了数据的类型dataset_type, 就会获取点云路径图像路径.pkl格式的标注数据路径,得到了数据的路径和标注之后,对于训练和测试我们需要对点云数据做一定的处理才能送入模型进程训练或推理,数据的pipeline就是用来数据处理的,主要包括train_pipeline(用于处理训练数据)和test_pipeline(默认test和val都使用一样的pipeline)以及eval_pipeline(处理数据,用于评估模型效果)

(1) train_pipeline

train_pipeline是用来处理用于训练的点云数据,脚本如下:

train_pipeline = [
    dict(
        type='LoadPointsFromFile',
        coord_type='LIDAR',
        load_dim=4,
        use_dim=4,
        file_client_args=file_client_args),
    dict(
        type='LoadAnnotations3D',
        with_bbox_3d=True,
        with_label_3d=True,
        file_client_args=file_client_args),
    dict(type='ObjectSample', db_sampler=db_sampler),
    dict(
        type='ObjectNoise',
        num_try=100,
        translation_std=[1.0, 1.0, 0.5],
        global_rot_range=[0.0, 0.0],
        rot_range=[-0.78539816, 0.78539816]),
    dict(type='RandomFlip3D', flip_ratio_bev_horizontal=0.5),
    dict(
        type='GlobalRotScaleTrans',
        rot_range=[-0.78539816, 0.78539816],
        scale_ratio_range=[0.95, 1.05]),
    dict(type='PointsRangeFilter', point_cloud_range=point_cloud_range),
    dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range),
    dict(type='PointShuffle'),
    dict(type='DefaultFormatBundle3D', class_names=class_names),
    dict(type='Collect3D', keys=['points', 'gt_bboxes_3d', 'gt_labels_3d'])
]
  • 可以看到pipeline中定义的第一个数据处理操作,就是从文件中读取点云(LoadPointsFromFile),根据我们定义点云路径,把点云文件中存储的nx4的数据读取出来
  • 第二个操作是加载3D标注数据,它会把我们处理好(create_data.py)的标注文件数据读取出来。
  • 然后定义了一个数据增强的操作ObjectSample,也就是会把其他场景中的一些物体的点云,迁移到当前场景的点云数据中,做数据增强。
  • 紧接着ObjectNoise也是一种数据增强操作,对点云数据做一些微小的平移和旋转,增加一些扰动的噪声
  • 然后会对点云数据做一些随机的翻转(RandomFlip3D),以及旋转、缩放和平移操作GlobalRotScaleTrans
  • 紧接着会把我们关注范围以内的点云数据筛选出来(PointsRangeFilter和ObjectRangeFilter),可能点云数据放大、旋转、平移后有些数据就出去了,需要过滤掉。
  • 然后,对点云数据随机打乱顺序
  • 最后将所需要的数据,包括点云,3D 标注框和标签数据打包在一起(Collect3D),形成一个字典,供模型的训练或推理测试。
(2) test_pipeline

测试的pipeline的脚本如下:

test_pipeline = [
    dict(
        type='LoadPointsFromFile',
        coord_type='LIDAR',
        load_dim=4,
        use_dim=4,
        file_client_args=file_client_args),
    dict(
        type='MultiScaleFlipAug3D',
        img_scale=(1333, 800),
        pts_scale_ratio=1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++实验 面向对象编程

一、实验目的: 掌握类中静态成员的定义方法,初始化方法,使用方法; 掌握类的友元说明方法,理解友元的使用特点 二、实验内容: 1、编写程序,统计某旅馆住宿客人的总数,要求输入客人…

hot100 -- 矩阵

👂 Peter Pan - kidult. - 单曲 - 网易云音乐 👂 Bibliothque(图书馆) - Jasing Rye - 单曲 - 网易云音乐 目录 🌼前言 🌼二分模板 🎂矩阵置零 AC 标记数组 AC 标记变量 🚩…

AI成就画质冠军!海信电视U8N Pro的“硬参数”和“软实力”

不得不说,这几年AI落地大有摧枯拉朽之势,也离普通人的生活越来越近了。 如果说,曾经1997年“深蓝”计算机赢下国际象棋世界冠军,还没那么让人印象深刻,2016年Alpha Go战胜围棋世界冠军,即使广泛关注&#…

replace和replaceAll的区别

replace和replaceAll的区别 replaceAll有些浏览器不兼容,如下图所示 replace的使用1>若只替换一个字符串abc.replace(b,1)//a1cabcaaa.replace(a,1)//1bcaaa2>若替换所有字符串abcaaa.replace(/\a/g,1)//1bc111replaceAll的使用1>若只替换一个字符串abc.replace(b,…

AI智慧校园电子班牌云平台源码

目录 家长端 学校端 电子围栏 亲情通话 课堂答题 移动化管理模式 统一资源管理平台 模板内容智能更换 家校互联 家长端 多场景通话:上学放学联系、紧急遇险求助联系、日常亲情通话关注孩子人身安全:到校离校情况、进入危险区域预警等。 学校端 课堂秩序管理:提高教…

服务器数据恢复—服务器硬盘灯显示红色的数据恢复案例

服务器数据恢复环境&故障: 一台服务器中有一组由多块硬盘组建的raid阵列,在运行过程中服务器突然崩溃,管理员检查服务器发现该服务器raid阵列中有两块硬盘的指示灯显示红色。于是,管理员重启服务器,服务器重启后&a…

基于Python django的人脸识别门禁系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅&…

mac redis启动,redis哨兵模式,redis集群的相关命令

Homebrew安装的软件会默认在/usr/local/Cellar/路径下 redis的配置文件redis.conf存放在/usr/local/etc路径下 cd /usr/local/Cellar/redis/7.0.10. 存在 cd /usr/local/opt/redis/bin/redis-server. 目录存在 cd /usr/local/etc/redis.conf 存在。配置文件 复制文件 cp …

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展,建筑行业也在不断迈向数字化转型的道路。在这个过程中,BIM(Building Information Modeling,建筑信息模型)技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

MATLAB中visdiff函数用法

目录 语法 说明 示例 比较两个文件 比较两个文件并指定类型 发布比较报告 visdiff函数的功能是比较两个文件或文件夹。 语法 visdiff(filename1,filename2) visdiff(filename1,filename2,type) comparison visdiff(___) 说明 visdiff(filename1,filename2) 打开比较工…

JVM理解学习

参考视频 运行时数据区 JVM架构总览图 绿色的:方法区,堆,是所有线程共享的 黄色的: 虚拟机栈,本地方法栈,程序计数器,是线程私有的 程序计数器 程序计数器是一块较小的内存空间,物…

蓝桥杯单片机快速开发笔记——矩阵键盘

一、原理分析 二、示例框架 定义了四个位控制变量,用于控制键盘扫描时的行列信号。 在Scan_Keys()函数中,首先设置行列信号,将其中一个行信号置为0,另一个行信号置为1,同时将列信号置为1,用于扫描键盘按键…

力扣映射题:机器人能否返回原点

超时太多了&#xff0c;笔者也开始放弃遍历了 bool judgeCircle(char* moves) {int arr[4]{0};for(int x0;x<strlen(moves);x) {if(moves[x]R){arr[0]arr[0]1;}if(moves[x]L){arr[1]arr[1]1;}if(moves[x]U){arr[2]arr[2]1;}if(moves[x]D){arr[3]arr[3]1;}} if(arr[0]-arr[1…

php彩虹/异世界云商全解系统

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发&#xff0c;增强了系统的功能和性能。2. 新增自定义输入框提示内容&#xff08;支持批量修改&#xff09; - 用户可以自定义输入框的提示内容&#xff0c;并支持批量修改&#xff0c;提升用户体验。3. 新…

掌握高级设计原则:Java中的过滤器模式解析与实战演练,构建灵活且可扩展的系统架构

过滤器模式是一种结构型设计模式&#xff0c;它允许开发者使用不同的标准来过滤一组对象&#xff0c;并通过逻辑运算以解耦的方式将它们联系起来。 过滤器模式的核心在于提供了一个处理对象的机制&#xff0c;这个机制可以根据一个或多个标准来决定哪些对象应该被接受、哪些应…

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.16 主要内容&#xff1a;今天主要是结合类型的题目加深对回溯算法的理解&#xff1a;1&#xff1a;组合总和&#xff1b;2&#xff1a;电话号码的字母组合 216.组合总和III17.电话号码的字母…

快速了解微软推出的开发人员主页的应用

一、概述 开发人员主页是微软推出的一个新的 Windows 控制中心&#xff0c;提供以下功能&#xff1a;使用可自定义小组件监视仪表板中的项目&#xff0c;通过下载应用、包或存储库来设置开发环境&#xff0c;连接到开发人员帐户和工具&#xff08;如 GitHub&#xff09;&#x…

【C++进阶】深度解析AVL树及其简单模拟实现

AVL树的解析和模拟实现 一&#xff0c;什么是AVL树二&#xff0c;AVL树的特性三&#xff0c;模拟实现1. 基本框架2. 插入&#xff08;不带旋转&#xff09;2. AVL树的旋转3. AVL树的验证 四&#xff0c;总结 一&#xff0c;什么是AVL树 之前我们学习了二叉搜索树&#xff0c;但…

【每日力扣】40.组合总和II与701. 二叉搜索树中的插入操作

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 40.组合总和II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为…

【小白学机器学习8】统计里的自由度DF=degree of freedom, 以及关于df=n-k, df=n-k-1, df=n-1 等自由度公式

目录 1 自由度 /degree of freedom / df 1.1 物理学的自由度 1.2 数学里的自由度 1.2.1 数学里的自由度 1.2.2 用线性代数来理解自由度&#xff08;需要补充&#xff09; 1.2.3 统计里的自由度 1.3 统计学里自由度的定义 2 不同对象的自由度 2.1 纯公式的自由度&#…