PointNet++详解(一):数据增强方法

这篇具有很好参考价值的文章主要介绍了PointNet++详解(一):数据增强方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


如有错误,恳请指出。


下面是pointnet++项目实现的点云数据增强方法,主要包括随机旋转、随机缩放、随机丢弃、随机平移、随机扰动等等。

github项目链接:https://github.com/yanx27/Pointnet_Pointnet2_pytorch

1. 随机顺序

# 作用: 随机打乱Batch中点云及其label的顺序
def shuffle_data(data, labels):
    """ Shuffle data and labels.
        Input:
          data: B,N,... numpy array
          label: B,... numpy array
        Return:
          shuffled data, label and shuffle indices
    """
    idx = np.arange(len(labels))
    np.random.shuffle(idx)
    return data[idx, ...], labels[idx], idx

# 作用: 随机打乱一个点云中点的顺序
def shuffle_points(batch_data):
    """ Shuffle orders of points in each point cloud -- changes FPS behavior.
        Use the same shuffling idx for the entire batch.
        Input:
            BxNxC array
        Output:
            BxNxC array
    """
    idx = np.arange(batch_data.shape[1])    # 根据索引随机点顺序
    np.random.shuffle(idx)
    return batch_data[:,idx,:]

2. 随机旋转

这里贴上的是沿3个轴随机旋转

# 作用: 对每个点云与法向量均进行沿xyz三个轴随机(小幅度)旋转
def rotate_perturbation_point_cloud_with_normal(batch_data, angle_sigma=0.06, angle_clip=0.18):
    """ Randomly perturb the point clouds by small rotations
        Input:
          BxNx6 array, original batch of point clouds and point normals
          angle_sigma: 权重系数, 控制随机角度的大小
          angle_clip:  确定随机角度的上下限(-0.18~0.18)
        Return:
          BxNx3 array, rotated batch of point clouds
    """
    rotated_data = np.zeros(batch_data.shape, dtype=np.float32)
    for k in range(batch_data.shape[0]):
        # 对xyz三个轴方向随机生成一个旋转角度
        angles = np.clip(angle_sigma*np.random.randn(3), -angle_clip, angle_clip)
        # 根据公式构建三个轴方向的旋转矩阵
        Rx = np.array([[1,0,0],
                       [0,np.cos(angles[0]),-np.sin(angles[0])],
                       [0,np.sin(angles[0]),np.cos(angles[0])]])
        Ry = np.array([[np.cos(angles[1]),0,np.sin(angles[1])],
                       [0,1,0],
                       [-np.sin(angles[1]),0,np.cos(angles[1])]])
        Rz = np.array([[np.cos(angles[2]),-np.sin(angles[2]),0],
                       [np.sin(angles[2]),np.cos(angles[2]),0],
                       [0,0,1]])
        # 按照内旋方式:Z-Y-X旋转顺序获得整体的旋转矩阵
        R = np.dot(Rz, np.dot(Ry,Rx))
        shape_pc = batch_data[k,:,0:3]
        shape_normal = batch_data[k,:,3:6]
        # 分别对坐标与法向量进行旋转,整体公式应该为: Pt = (Rz * Ry * Rx) * P
        rotated_data[k,:,0:3] = np.dot(shape_pc.reshape((-1, 3)), R)
        rotated_data[k,:,3:6] = np.dot(shape_normal.reshape((-1, 3)), R)
    return rotated_data

3. 随机噪声

# 作用: 对点云数据添加噪声, 进行小范围扰动
def jitter_point_cloud(batch_data, sigma=0.01, clip=0.05):
    """ Randomly jitter points. jittering is per point.
        Input:
          BxNx3 array, original batch of point clouds
          angle_sigma: 权重系数, 控制随机噪声幅度
          angle_clip:  确定随机噪声的上下限(-0.05~0.05)
        Return:
          BxNx3 array, jittered batch of point clouds
    """
    B, N, C = batch_data.shape
    assert(clip > 0)
    jittered_data = np.clip(sigma * np.random.randn(B, N, C), -1*clip, clip)
    jittered_data += batch_data    # 添加噪声
    return jittered_data

4. 随机平移

# 作用: 对每个点云进行随机平移, 对点云中的每个点添加一个随机的移动距离
def shift_point_cloud(batch_data, shift_range=0.1):
    """ Randomly shift point cloud. Shift is per point cloud.
        Input:
          BxNx3 array, original batch of point clouds
        Return:
          BxNx3 array, shifted batch of point clouds
    """
    B, N, C = batch_data.shape
    shifts = np.random.uniform(-shift_range, shift_range, (B,3))    # 对每个batch的点云设置一个随机的移动偏差
    for batch_index in range(B):
        batch_data[batch_index,:,:] += shifts[batch_index,:]    # 每个点都进行移动
    return batch_data

5. 随机缩放

# 作用: 对每个点云进行随机缩放, 实现方法是乘积因子直接与点云数据相乘即可
def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25):
    """ Randomly scale the point cloud. Scale is per point cloud.
        Input:
            BxNx3 array, original batch of point clouds
        Return:
            BxNx3 array, scaled batch of point clouds
    """
    B, N, C = batch_data.shape
    scales = np.random.uniform(scale_low, scale_high, B)    # 0.8~1.25间的随机缩放
    for batch_index in range(B):
        batch_data[batch_index,:,:] *= scales[batch_index]  # 每个点都进行缩放
    return batch_data

6. 随机丢弃

# 作用: 随机丢弃点云中的点, 操作是将丢弃点全部赋予first point的值, 也就是是一个伪丢弃(shape是没有改变的)
def random_point_dropout(batch_pc, max_dropout_ratio=0.875):
    ''' batch_pc: BxNx3 '''
    for b in range(batch_pc.shape[0]):
        dropout_ratio = np.random.random()*max_dropout_ratio  # 设置随机丢弃的概率,区间是0~0.875
        drop_idx = np.where(np.random.random((batch_pc.shape[1])) <= dropout_ratio)[0]  # 找到那些比概率低的索引值来丢弃
        if len(drop_idx) > 0:
            batch_pc[b,drop_idx,:] = batch_pc[b,0,:]   # 这里所谓的丢弃就是将值设置与第一个点相同
    return batch_pc

ps:在PointNet++分组采样k个邻域点时,如果符合距离的点不足k个,也是使用第一个点来对其他不满足距离的点进行替换,达到了一种单点重复多次的效果。和这里的随机丢弃使用的一样的方法。


参考资料:

https://github.com/yanx27/Pointnet_Pointnet2_pytorch文章来源地址https://www.toymoban.com/news/detail-765902.html

到了这里,关于PointNet++详解(一):数据增强方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Fusion_PointClouds - 多激光雷达点云数据融合

    Fusion_PointClouds - 多激光雷达点云数据融合

    fusion_pointclouds 主要目的为Ubuntu环境下无人车多激光雷达标定之后, 将多个激光雷达点云话题/坐标系 通过PCL (Point Cloud Library)融合为 一个ros点云话题,以便于后期点云地面分割与地面处理等等。 1.1 应用场景 图1:为了保证激光雷达的360°环境覆盖,我们需要用到多传感器的拼

    2024年02月03日
    浏览(38)
  • 点云数据类型分析 sensor_msgs/PointCloud2

    ROS应用中,使用到雷达、相机等传感器。与单线雷达不同的是,多线雷达与深度相机的应用都会涉及到多维问题。3D视觉处理的主要是点云,点云,是很多点的集合。在处理点云数据之前需了解点云数据类型sensor_msgs/PointCloud2,所以记录一下学习过程。 点云是某个坐标系下的

    2024年02月05日
    浏览(6)
  • YOLOv5数据增强方法

    YOLOv5的数据增强方法包括以下几种: 随机剪裁:随机从输入图像中剪裁出一块区域并将其作为新的输入。 随机翻转:随机将输入图像左右或上下翻转。 随机颜色变化:随机调整输入图像的对比度、亮度和饱和度。 随机加噪:在输入图像上随机添加噪声。 随机模糊:使用高

    2024年02月11日
    浏览(8)
  • 【论文阅读笔记】序列数据的数据增强方法综述

    【论文阅读笔记】序列数据的数据增强方法综述

     这篇论文探讨了在深度学习模型中由于对精度的要求不断提高导致模型框架结构变得更加复杂和深层的趋势。随着模型参数量的增加,训练模型需要更多的数据,但人工标注数据的成本高昂,且由于客观原因,获取特定领域的数据可能变得困难。为了缓解数据不足的问题,

    2024年02月05日
    浏览(7)
  • 【深度学习:数据增强 】提高标记数据质量的 5 种方法

    【深度学习:数据增强 】提高标记数据质量的 5 种方法

    计算机视觉模型的复杂性、准确性、速度和计算能力每天都在进步。机器学习团队正在训练计算机视觉模型以更有效地解决问题,这使得标记数据的质量比以往任何时候都更加重要。 质量差的标记数据,或者基于图像或视频的数据集中的错误和错误可能会给机器学习团队带来

    2024年01月24日
    浏览(9)
  • 【语义分割】数据增强方法(原图与标签同时扩增)

    【语义分割】数据增强方法(原图与标签同时扩增)

       避免过拟合    提升模型的鲁棒性   提高模型的泛化能力   避免样本不均衡的问题 可分为两类:在线增强和离线增强。这两者的区别在于离线增强是在训练前对数据集进行处理,往往能得到多倍的数据集,在线增强是在训练时对加载数据进行预处理,不改变训练数据的

    2024年02月03日
    浏览(9)
  • 深度学习中的各种数据增强方法大全

    深度学习中的各种数据增强方法大全

    随着深度学习在计算机视觉的广泛应用,以卷积神经网络为代表的深度学习模型取得了突破性的进展。然而,直至今日,尽管提出了以 ViT 为代表的新一代视觉网络架构,但数据问题仍然是构建深度学习模型最常见的挑战之一。在实际的应用场景中,足量且高保真的优质数据

    2023年04月18日
    浏览(6)
  • 训练数据不够怎么造?yolo5 最有用的trick 之数据增强详解

    训练数据不够怎么造?yolo5 最有用的trick 之数据增强详解

    在深度学习领域,模型参数量往往数以百万计,因此要训练一个鲁棒的模型往往需要大量的数据,与此同时,我们还可以利用各种数据增强的手段来增加模型训练数据的多样性,令模型尽可能适应不同的场景,防止过拟合的发生。 yolo5是Ultralytics公司于2020年开源的目标检测算

    2024年02月16日
    浏览(7)
  • Vivado cordic IP核rotate和translate使用详解(附有代码)

    Vivado cordic IP核rotate和translate使用详解(附有代码)

    Vivado cordic IP核rotate和translate使用详解(附有代码) 目录 前言 一、cordic简介 二、使用cordic IP核需要知道的预备知识 1.数据端口 2.Q Numbers Format 3.Vector Translation 4.Vector Rotation 三、IP核配置说明 1.translate 2.Rotate 四、Translate仿真 1.顶层代码 2.仿真代码 五、Rotate仿真 1.顶层代码 2.仿真代

    2023年04月27日
    浏览(90)
  • YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

    YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

    最近我在做论文实验时从MSCOCO数据集中筛选了符合条件的1260张图片,但数据样本太少了,于是我就利用数据增强的方法实现了带标签的样本扩充,最后扩充为7560张图片。本文就来记录一下过程,有不懂的地方欢迎留言噢~ 目录 前言 👥一、什么是数据增强 👥二、数据增强的

    2024年02月09日
    浏览(1825)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包