【openpcdet中yaml文件的DATA_AUGMENTOR学习】

2024-05-25 03:28

本文主要是介绍【openpcdet中yaml文件的DATA_AUGMENTOR学习】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、代码
  • 二、详细解释
    • DISABLE_AUG_LIST
    • AUG_CONFIG_LIST
      • 1. gt_sampling
      • 2. random_world_flip
      • 3. random_world_rotation
      • 4. random_world_scaling
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

openpcdet中yaml文件的DATA_AUGMENTOR学习


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码

DATA_AUGMENTOR:DISABLE_AUG_LIST: ['placeholder']AUG_CONFIG_LIST:- NAME: gt_samplingUSE_ROAD_PLANE: TrueDB_INFO_PATH:- kitti_dbinfos_train.pklPREPARE: {filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'],filter_by_difficulty: [-1],}SAMPLE_GROUPS: ['Car:15','Pedestrian:15', 'Cyclist:15']NUM_POINT_FEATURES: 4DATABASE_WITH_FAKELIDAR: FalseREMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]LIMIT_WHOLE_SCENE: False- NAME: random_world_flipALONG_AXIS_LIST: ['x']- NAME: random_world_rotationWORLD_ROT_ANGLE: [-0.78539816, 0.78539816]- NAME: random_world_scalingWORLD_SCALE_RANGE: [0.95, 1.05]

二、详细解释

这个DATA_AUGMENTOR配置主要用于3D目标检测或点云处理的数据增强。

以下是对这段配置的详细解释:

DISABLE_AUG_LIST

'placeholder':这里是一个占位符,表示没有禁用任何数据增强方法。通常,这个列表会包含那些你希望禁用的数据增强方法的名称。

AUG_CONFIG_LIST

这是一个列表,包含了多个数据增强的配置。

1. gt_sampling

NAME: gt_sampling
表示这种数据增强方法的名字是gt_sampling,通常用于从数据库(DB)中采样真值(ground truth)对象并将其放置在场景中。

USE_ROAD_PLANE: True 表示在采样过程中会考虑道路平面。

DB_INFO_PATH:
这是一个列表,包含了数据库信息(如对象的3D边界框、类别等)的路径。在这里,它指向了一个名为kitti_dbinfos_train.pkl的文件。

PREPARE:
filter_by_min_points: 这是一个列表,指定了每个类别对象所需的最小点数。例如,Car:5表示只考虑点数大于或等于5的汽车对象。
filter_by_difficulty: 这是一个列表,指定了过滤对象的难度级别。在这里,-1表示不过滤任何难度级别的对象。
SAMPLE_GROUPS: 这是一个列表,指定了每个类别对象在场景中应该被采样的数量。例如,Car:15表示应该采样15个汽车对象。

NUM_POINT_FEATURES: 表示每个点云点的特征数量,这里是4个。

DATABASE_WITH_FAKELIDAR: False 表示不使用模拟的激光雷达数据。

REMOVE_EXTRA_WIDTH: 一个列表,指定了在采样对象时从对象的边界框中移除的额外宽度(以x, y, z方向为顺序)。在这里,没有移除任何额外宽度。

LIMIT_WHOLE_SCENE: False 表示不限制整个场景的大小或内容。

2. random_world_flip

NAME: random_world_flip 表示这种数据增强方法的名字是随机翻转整个世界场景。

ALONG_AXIS_LIST: [‘x’] 表示只在x轴方向上进行随机翻转。

当采用random_world_flip这种数据增强方法后,数据会发生以下改变:

方向性变化:

原本的三维场景或对象会在指定的轴上(如x轴)进行随机翻转。这意味着场景或对象的方向会发生变化,可能是向左翻、向右翻,或者是上下翻转(如果沿z轴翻转)。

标签和注释的相应调整:

如果场景或对象带有标签或注释(例如目标检测任务中的边界框或语义分割任务中的语义标签),那么这些标签和注释也需要进行相应的翻转调整,以确保它们仍然正确地与翻转后的场景或对象对应。

数据多样性的增加:

通过随机翻转,原始数据集中的每个场景或对象都会产生多个不同方向的变体,从而增加了数据的多样性。这有助于训练出更加鲁棒和泛化能力更强的模型。

def random_world_flip(self, data_dict=None, config=None):if data_dict is None:return partial(self.random_world_flip, config=config)gt_boxes, points = data_dict['gt_boxes'], data_dict['points']for cur_axis in config['ALONG_AXIS_LIST']:assert cur_axis in ['x', 'y']gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(gt_boxes, points, return_flip=True)data_dict['flip_%s'%cur_axis] = enableif 'roi_boxes' in data_dict.keys():num_frame, num_rois,dim = data_dict['roi_boxes'].shaperoi_boxes, _, _ = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(data_dict['roi_boxes'].reshape(-1,dim), np.zeros([1,3]), return_flip=True, enable=enable)data_dict['roi_boxes'] = roi_boxes.reshape(num_frame, num_rois,dim)data_dict['gt_boxes'] = gt_boxesdata_dict['points'] = pointsreturn data_dict
gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(gt_boxes, points, return_flip=True)  

这段代码定义了一个名为random_world_flip的函数,它用于对三维点云数据及其对应的标签(通常是目标边界框)进行随机的轴翻转。

以下是对该代码的详细解释:

函数定义

def random_world_flip(self, data_dict=None, config=None):
self: 表示这是一个类的方法,可能是一个数据增强类的一部分。
data_dict: 一个字典,包含点云数据(points)和对应的目标边界框(gt_boxes)等信息。
config: 一个配置字典,其中包含了翻转时要考虑的轴列表(ALONG_AXIS_LIST)。

主体部分
参数检查

if data_dict is None:  return partial(self.random_world_flip, config=config)
如果data_dict是None,则返回一个偏函数(partial function),该函数在稍后可以被调用,并自动传入config参数。

数据遍历和翻转

for cur_axis in config['ALONG_AXIS_LIST']:  
...
遍历配置中指定的轴列表,对每个轴进行翻转操作。

翻转断言

assert cur_axis in ['x', 'y']
确保当前轴只能是'x'或'y'。这通常是因为在三维空间中,沿z轴翻转可能不符合物理世界的情况(如重力方向)。

调用翻转函数

gt_boxes, points, enable = getattr(augmentor_utils, 'random_flip_along_%s' % cur_axis)(  gt_boxes, points, return_flip=True  
)
使用getattr从augmentor_utils模块中动态获取翻转函数(如random_flip_along_x或random_flip_along_y),并传入gt_boxes、points和return_flip=True。该函数会对数据进行翻转,并返回翻转后的数据以及一个布尔值enable,表示是否实际进行了翻转。

def random_flip_along_x(gt_boxes, points, return_flip=False, enable=None):"""Args:gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]points: (M, 3 + C)Returns:"""if enable is None:enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])if enable:gt_boxes[:, 1] = -gt_boxes[:, 1]gt_boxes[:, 6] = -gt_boxes[:, 6]points[:, 1] = -points[:, 1]if gt_boxes.shape[1] > 7:gt_boxes[:, 8] = -gt_boxes[:, 8]if return_flip:return gt_boxes, points, enablereturn gt_boxes, points

这段代码定义了一个函数 random_flip_along_x,用于沿x轴随机翻转三维数据(如点云和目标边界框)。

下面是对该代码的详细解释:

函数定义

def random_flip_along_x(gt_boxes, points, return_flip=False, enable=None):
gt_boxes: 是一个形状为 (N, 7 + C) 的二维数组,其中N表示目标边界框的数量,7表示每个边界框的基本属性(x, y, z, dx, dy, dz, heading),C表示额外的属性(如速度vx, vy等)。points: 是一个形状为 (M, 3 + C) 的二维数组,其中M表示点的数量,3表示每个点的三维坐标(x, y, z),C表示额外的属性。return_flip: 一个布尔值,如果为True,则除了返回翻转后的gt_boxes和points外,还返回是否执行了翻转的标志enable。enable: 一个布尔值,如果传入,则指定是否执行翻转。如果为None,则随机决定是否执行翻转。

函数体

随机决定是否翻转

if enable is None:  enable = np.random.choice([False, True], replace=False, p=[0.5, 0.5])
如果enable是None,则使用numpy的random.choice函数随机选择是否执行翻转。默认情况下,翻转和不翻转的概率都是0.5。

执行翻转

if enable:  gt_boxes[:, 1] = -gt_boxes[:, 1]  gt_boxes[:, 6] = -gt_boxes[:, 6]  points[:, 1] = -points[:, 1]  if gt_boxes.shape[1] > 7:  gt_boxes[:, 8] = -gt_boxes[:, 8]

如果决定执行翻转:

边界框的y坐标(索引为1)被取反,实现沿x轴的翻转。边界框的heading(索引为6)也被取反,因为heading通常表示目标的朝向,翻转后朝向也会变化。点的y坐标(索引为1)也被取反。如果gt_boxes有额外的属性(即C > 0),并且第一个额外属性是速度vy(通常索引为8),则也将其取反(这取决于额外的属性是否表示速度,并且vy是否是第一个)。

返回结果

if return_flip:  return gt_boxes, points, enable  
return gt_boxes, points
根据return_flip的值决定是否返回enable。如果return_flip为True,则返回翻转后的gt_boxes、points和enable;否则只返回翻转后的gt_boxes和points。

总结
这个函数允许你沿x轴随机翻转三维数据(如点云和目标边界框),并可以返回是否执行了翻转的标志。这在数据增强中很有用,可以帮助训练出更鲁棒的模型。


记录翻转状态

data_dict[‘flip_%s’%cur_axis] = enable

将翻转状态记录到data_dict中,以便后续处理。

处理ROI(Region of Interest)边界框、

如果data_dict中包含'roi_boxes'键,则对ROI边界框也进行相同的翻转操作。这里,ROI边界框可能是在多帧数据或特定区域中定义的边界框。

更新数据字典

data_dict['gt_boxes'] = gt_boxes  
data_dict['points'] = points
最后,将翻转后的gt_boxes和points更新回data_dict中。

返回值

函数返回更新后的data_dict。

总结

这个函数实现了对三维点云数据和目标边界框的随机轴翻转,同时考虑了ROI边界框的翻转,并将翻转状态记录到数据字典中。这种数据增强方法有助于提高三维目标检测或场景理解模型的泛化能力

3. random_world_rotation

NAME: random_world_rotation 表示这种数据增强方法的名字是随机旋转整个世界场景。

WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] 表示旋转角度的范围,单位是弧度。这个范围大约对应于-45度到45度。

def global_rotation(gt_boxes, points, rot_range, return_rot=False, noise_rotation=None):"""Args:gt_boxes: (N, 7 + C), [x, y, z, dx, dy, dz, heading, [vx], [vy]]points: (M, 3 + C),rot_range: [min, max]Returns:"""if noise_rotation is None: noise_rotation = np.random.uniform(rot_range[0], rot_range[1])points = common_utils.rotate_points_along_z(points[np.newaxis, :, :], np.array([noise_rotation]))[0]gt_boxes[:, 0:3] = common_utils.rotate_points_along_z(gt_boxes[np.newaxis, :, 0:3], np.array([noise_rotation]))[0]gt_boxes[:, 6] += noise_rotationif gt_boxes.shape[1] > 7:gt_boxes[:, 7:9] = common_utils.rotate_points_along_z(np.hstack((gt_boxes[:, 7:9], np.zeros((gt_boxes.shape[0], 1))))[np.newaxis, :, :],np.array([noise_rotation]))[0][:, 0:2]if return_rot:return gt_boxes, points, noise_rotationreturn gt_boxes, points

这段代码定义了一个名为 global_rotation 的函数,其主要目的是对给定的 gt_boxes(真实边界框)和
points(点云数据)进行全局旋转。这里的旋转是沿着 z 轴进行的。

下面是详细的解释:

输入参数:

gt_boxes: 一个形状为 (N, 7 + C) 的数组,其中 N 是边界框的数量,7 是边界框的基本属性(x, y, z, dx, dy, dz, heading),C 是可选的额外属性(如速度 vx, vy)。points: 一个形状为 (M, 3 + C) 的数组,其中 M 是点的数量,3 是点的三维坐标(x, y, z),C 是可选的额外属性。rot_range: 一个长度为 2 的列表,表示旋转角度的范围(即 [min, max])。return_rot: 一个布尔值,决定是否返回旋转角度。noise_rotation: 可选的旋转角度,如果为 None,则随机从 rot_range 中选择一个。

函数执行:
如果 noise_rotation 为 None,则从 rot_range 中随机选择一个旋转角度。

使用 common_utils.rotate_points_along_z 函数对 points 进行旋转。这个函数会沿着 z 轴旋转点云数据,并返回旋转后的结果。同样地,使用 common_utils.rotate_points_along_z 函数对 gt_boxes 的前三维(x, y, z)进行旋转,并更新 gt_boxes。更新 gt_boxes 的 heading(方向角)属性,将其加上 noise_rotation。如果 gt_boxes 有额外的属性(如速度 vx, vy),并且这些属性是二维的(可能是速度向量),则也对它们进行旋转。根据 return_rot 的值,决定是否返回旋转角度 noise_rotation。

输出:

如果 return_rot 为 True,则返回旋转后的 gt_boxes、points 和旋转角度 noise_rotation。如果 return_rot 为 False(或省略),则只返回旋转后的 gt_boxes 和 points。

这个函数在三维目标检测或点云处理中可能很有用,特别是当你需要模拟真实世界中的旋转或对数据集进行增强时。

4. random_world_scaling

NAME: random_world_scaling 表示这种数据增强方法的名字是随机缩放整个世界场景。

WORLD_SCALE_RANGE: [0.95, 1.05] 表示缩放因子的范围。这意味着场景可以被缩放到原始大小的95%到105%之间。

def global_scaling(gt_boxes, points, scale_range, return_scale=False):"""Args:gt_boxes: (N, 7), [x, y, z, dx, dy, dz, heading]points: (M, 3 + C),scale_range: [min, max]Returns:"""if scale_range[1] - scale_range[0] < 1e-3:return gt_boxes, pointsnoise_scale = np.random.uniform(scale_range[0], scale_range[1])points[:, :3] *= noise_scalegt_boxes[:, :6] *= noise_scaleif gt_boxes.shape[1] > 7:gt_boxes[:, 7:] *= noise_scaleif return_scale:return gt_boxes, points, noise_scalereturn gt_boxes, points

这段代码定义了一个名为global_scaling的函数,其主要功能是对给定的点云(points)和地面真值边界框(gt_boxes)进行全局缩放。缩放的比例(noise_scale)是从指定的缩放范围(scale_range)中随机选择的。

以下是该函数的详细解释:

参数

gt_boxes: 形状为 (N, 7) 的数组,其中 N 是边界框的数量。每个边界框有7个元素,分别是 [x, y, z, dx, dy, dz, heading]。其中 (x, y, z) 是边界框的中心坐标,(dx, dy, dz) 是边界框的尺寸(宽度、长度和高度),而 heading 是边界框的朝向。points: 形状为 (M, 3 + C) 的数组,其中 M 是点的数量,3 表示每个点的三维坐标 (x, y, z),C 表示每个点的其他特征数量(如果有的话)。scale_range: 一个长度为2的列表或数组,表示缩放比例的取值范围,即 [min, max]。return_scale: 一个布尔值,如果为 True,则函数还会返回缩放比例 noise_scale。

返回值

如果 return_scale 为 False,则返回缩放后的 gt_boxes 和 points。如果 return_scale 为 True,则返回缩放后的 gt_boxes、points 和缩放比例 noise_scale。	

功能

检查缩放范围:如果 scale_range 的两个值之间的差小于 1e-3(即缩放范围非常小),则不进行任何操作并直接返回原始的 gt_boxes 和 points。随机选择缩放比例:从 scale_range 中随机选择一个缩放比例 noise_scale。缩放点云:将 points 数组中的每个点的三维坐标 (x, y, z) 乘以缩放比例 noise_scale。缩放边界框:将 gt_boxes 数组中的每个边界框的中心坐标 (x, y, z) 和尺寸 (dx, dy, dz) 乘以缩放比例 noise_scale。如果 gt_boxes 的列数大于7(即存在额外的特征或属性),则这些额外的特征或属性也会被缩放。返回结果:根据 return_scale 的值,返回缩放后的 gt_boxes、points 和(可选的)缩放比例 noise_scale。

总结

总的来说,这个DATA_AUGMENTOR配置定义了一系列数据增强方法,这些方法可以帮助模型更好地泛化并处理各种复杂的场景和对象。

在训练3D目标检测模型时,使用这些数据增强方法通常可以提高模型的性能和鲁棒性。

这篇关于【openpcdet中yaml文件的DATA_AUGMENTOR学习】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1000351

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件