【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

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa