点云深度学习之数据集处理(三)构建自己的点云数据集

转载自:https://blog.csdn.net/SGL_LGS/article/details/105962966

一、三维点云数据的采集

随着科技的迅速发展,目前获得物体三维点云的方法也越来越多。一种是通过硬件设备(深度传感器,结构光等)直接得到物体的三维信息,另一种是通过软件算法进行图像间匹配间接计算出物体的三维信息。常见的方法手段,如图所示:
在这里插入图片描述
这里不再对其中的内容进行展开说明。无论那一种方法,最终目的都是为了获得三维点云数据。

二、三维点云数据上标签

深度学习中,最繁杂且缺少技术含量的事情应该就是为采集的数据上标签。工欲善其事必先利其器,好的标注方法势必会让我们的工作变得更加高效。这里就介绍一种较为方便的点云标注工具。
代码的开源地址:https://github.com/MR-520DAI/semantic-segmentation-editor
之前的博客也有介绍过安装和使用教程:https://blog.csdn.net/lemonxiaoxiao/article/details/112948824
手动标记保存之后,得到的pcd文件前后如下图所示:
在这里插入图片描述
值得注意的是,该软件的一个缺陷就是在进行标记及保存之后的点云文件是不带颜色信息的(该工具原始目标任务是针对室外激光雷达点云的),颜色信息只能通过后处理手段加上去。此外,如果使用PCL自带的XYZL点云类型进行显示可视化需要注意:保存得到的pcd文件数据类型为(TYPE F F F I I)见上图有右侧所示。我在实际读取过程中就发现会报错,解决办法是将(TYPE F F F I I 批量替换成 TYPE F F F U U).

import os
from os import listdir, path

path_str = 'E:\\标注原始文件'  # your directory path
txts = [f for f in listdir(path_str)
        if f.endswith('.pcd') and path.isfile(path.join(path_str, f))]

for txt in txts:
    with open(os.path.join(path_str, txt), 'r') as f:
        lines = f.readlines()
        lines[3] = lines[3].replace('I','U')

    with open(os.path.join(path_str,os.path.splitext(txt)[0]+".pcd"), 'w') as f:
        f.write(''.join(lines[0:]))

三、点云深度学习数据集处理流程

接下来就介绍如何将标记好的点云数据集,生成网络的输入训练数据(或如何融合到现有的数据集中进行训练)

  1. PCD文件生成TXT文件
    这一步主要是将PCD文件的头信息进行去掉,得到只含有点坐标,颜色和标签的数据文件:
import os
from os import listdir, path

path_str = 'E:\\标注原始文件'  # your directory path
txts = [f for f in listdir(path_str)
        if f.endswith('.pcd') and path.isfile(path.join(path_str, f))]

for txt in txts:
    with open(os.path.join(path_str, txt), 'r') as f:
        lines = f.readlines()

    with open(os.path.join(path_str,os.path.splitext(txt)[0]+".txt"), 'w') as f:
        f.write(''.join(lines[11:]))
  1. 中心化和尺度缩放
    这一步的主要目的是将点云中心移动到坐标原点,并将所有点的坐标的绝对值限制在1以内(对于小型数据集仿照的ShapeNet数据格式):
# 输入的data数据为点云的坐标信息和标签信息(或者额外的颜色信息与法向量信息)
def change_scale(data):
    #centre 
    xyz_min = np.min(data[:,0:3],axis=0)
    xyz_max = np.max(data[:,0:3],axis=0)
    xyz_move = xyz_min+(xyz_max-xyz_min)/2
    data[:,0:3] = data[:,0:3]-xyz_move
    #scale
    scale = np.max(data[:,0:3])
    data[:,0:3] = data[:,0:3]/scale
    return data
  1. 点云的降采样
    这一步的主要目的是将每个点云文件点进行规范化到固定的点数,本文中我们采用随机采样的方式。当然如果有好的想法,采样的方式是可以按照需求进行改进的。
def sample_data(data, num_sample):
    """ data is in N x ...
        we want to keep num_samplexC of them.
        if N > num_sample, we will randomly keep num_sample of them.
        if N < num_sample, we will randomly duplicate samples.
    """
    N = data.shape[0]
    if (N == num_sample):
        return data, range(N)
    elif (N > num_sample):
        sample = np.random.choice(N, num_sample)
        return data[sample, ...], sample
    else:
        sample = np.random.choice(N, num_sample-N)
        dup_data = data[sample, ...]
        return np.concatenate([data, dup_data], 0), list(range(N))+list(sample)
  1. 划分训练集与测试集并保存为.H5文件
    这一步就是将处理好的数据划分为训练集和测试集,并将其保存为.H5文件。
# train and test number, save data
def save_data(data, ratio):
	""" data is in N x 4 (XYZL) ...
		ratio of training set to test set 
        if ratio = 0.8  
        train data is 80%, test data is 20%
    """
    if not os.path.exists('train.h5'):
        with h5py.File('train.h5') as f:
            f['data'] = data[0:int(data.shape[0]*ratio),0:3]
            f['labels'] = data[0:int(data.shape[0]*ratio),4]
            
    if not os.path.exists('test.h5'):
        with h5py.File('test.h5') as f:
            f['data'] = data[int(data.shape[0]*ratio):,0:3]
            f['labels'] = data[int(data.shape[0]*ratio):,4]

到此就完成。当然上面的代码只是方法的演示,针对不同数据需要进行不同的调整。最后给一个相对完整的代码,同样是仅供参考:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 25 21:53:03 2019
@author: xxx
"""
import os
import sys
import numpy as np
import h5py
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)

def getDataFiles(list_filename):
    return [line.rstrip() for line in open(list_filename)]

def loadDataFile(path):
    data = np.loadtxt(path)
    point_xyz = data[:,0:3]
    # 下面的ins_label, sem_label和obj_lable 
    # 需要根据自己的实际进行赋值(以下只是我的一个示例,就不再解释)
    ins_label = (data[:,3]).astype(int)
    find_index = np.where(ins_label>=1)
    sem_label = np.zeros((data.shape[0]), dtype=int)
    obj_lable = data[:,4]
    sem_label[find_index] = obj_lable[find_index]+1
    
    return point_xyz, ins_label, sem_label, obj_lable

def change_scale(data):
    #centre 
    xyz_min = np.min(data[:,0:3],axis=0)
    xyz_max = np.max(data[:,0:3],axis=0)
    xyz_move = xyz_min+(xyz_max-xyz_min)/2
    data[:,0:3] = data[:,0:3]-xyz_move
    #scale
    scale = np.max(data[:,0:3])
#    change_data[:,0:3] = data[:,0:3]/scale
#    return data[:,0:3]/scale
    return data[:,0:3]

def sample_data(data, num_sample):
    """ data is in N x ...
        we want to keep num_samplexC of them.
        if N > num_sample, we will randomly keep num_sample of them.
        if N < num_sample, we will randomly duplicate samples.
    """
    N = data.shape[0]
    if (N == num_sample):
        return data, range(N)
    elif (N > num_sample):
        sample = np.random.choice(N, num_sample)
        return data[sample, ...], sample
    else:
        sample = np.random.choice(N, num_sample-N)
        dup_data = data[sample, ...]
        return np.concatenate([data, dup_data], 0), list(range(N))+list(sample)
    
if __name__ == "__main__":
    DATA_FILES =getDataFiles(os.path.join(BASE_DIR, 'file_path.txt'))
    num_sample = 4096*2
    DATA_ALL = []
    for fn in range(len(DATA_FILES)):
        print(DATA_FILES[fn])
        current_data, current_ins_label, current_sem_label,current_obj_lable = loadDataFile(DATA_FILES[fn])
        change_data = change_scale(current_data)
#        data_sample,index = sample_data(change_data, num_sample)
        data_label = np.column_stack((change_data,current_ins_label,current_sem_label,current_obj_lable))
        DATA_ALL.append(data_label)
        
    output = np.vstack(DATA_ALL)
    output = output.reshape(-1,num_sample,6)
    
    # 这里没将训练测试集单独分开        
    if not os.path.exists('4096_4096_no_scale.h5'):
        with h5py.File('4096_4096_no_scale.h5') as f:
#            sample = np.random.choice(8192, 2048)
            f['data'] = output[:,:,0:3]
            f['pid'] = output[:,:,3]
            f['seglabel'] = output[:,:,4]
            f['obj'] = output[:,:,5]
  • 11
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要制作点云深度学习模型,您可以遵循以下步骤: 1. 数据准备:收集和准备点云数据集。您可以使用各种传感器(例如激光雷达、结构光)来获取点云数据,然后对其进行预处理,例如去噪、点云配准等。 2. 特征提取:选择合适的特征提取方法来从点云数据中提取特征。例如,您可以使用voxel-based方法将点云数据转换为体素网格,并使用卷积神经网络(CNN)对其进行处理。 3. 模型构建:基于您选择的特征提取方法,构建深度学习模型。您可以选择传统的CNN、循环神经网络(RNN)、图神经网络(GNN)等方法来构建模型。 4. 模型训练:使用训练数据集深度学习模型进行训练。在训练过程中,您需要选择合适的损失函数和优化器,以最小化模型预测值和真实值之间的差距。 5. 模型评估:使用测试数据集对模型进行评估,并计算模型的性能指标,例如准确率、召回率、F1值等。 6. 模型应用:将模型应用于实际场景中。例如,您可以使用模型来进行目标检测、物体识别等任务。 ### 回答2: 点云是一种表示物体或场景几何形状的数据结构。点云深度学习模型是使用深度学习方法对点云进行处理和分析的模型。下面是一般的点云深度学习模型设计步骤: 1. 数据预处理:首先,需要将原始点云数据进行预处理。这包括去噪、采样和规范化等步骤。去噪可以通过滤波算法去除噪声数据。采样则可以通过保持点云的形状特征的同时减少点云数据的数量,以降低计算复杂度。规范化可以将点云数据映射到标准坐标系中,方便后续处理。 2. 特征提取:在点云深度学习中,常常需要将点云数据转换为可供深度学习模型使用的特征表示形式。这可以通过手工设计的特征提取算法,如局部几何特征描述符或深度学习方法,如卷积神经网络等。特征提取的目标是提取出含有有用信息的表征,以便后续的分类、分割等任务。 3. 模型设计:根据任务的不同,可以选择不同的深度学习网络架构进行建模。常见的点云深度学习模型包括PointNet、PointNet++、DGCNN等。这些模型主要使用了卷积神经网络结构,以实现对点云的自动特征学习和模式识别。 4. 模型训练:在模型设计完成后,需要使用标注好的数据对模型进行训练。这包括将点云数据输入到模型中,通过反向传播算法更新模型的权重参数。在训练过程中,可以使用一些优化算法,如随机梯度下降(SGD)或Adam,来最小化损失函数并提高模型的性能。 5. 模型评估和应用:在模型训练完成后,需要对模型进行评估和测试。可以使用一些评估指标如准确率、召回率等来评估模型的性能。模型训练好后,可以使用它来进行诸如分类、分割、配准等各种不同的点云处理任务。 总之,建立点云深度学习模型的关键步骤包括数据预处理,特征提取,模型设计,模型训练和模型评估。通过这些步骤可以提高点云处理效果和精度,进而实现更多的应用需求。 ### 回答3: 点云深度学习模型是为了处理点云数据而设计的深度学习网络。以下是创建点云深度学习模型的一般步骤: 1. 数据准备:首先,需要收集或生成点云数据集。这可以通过使用激光雷达扫描物体或环境来获得点云数据,并将其转换为合适的格式,如ASCII或二进制文件。 2. 数据预处理:对点云数据进行预处理是必要的,以确保其适用于深度学习模型。常见的预处理步骤包括去除离群点、点云采样、坐标归一化等。 3. 特征提取:为了使深度学习模型能够有效地处理点云数据,需要将点云转换为适用于深度学习算法的特征表示。常见的方法包括使用体素化(Voxelization)将点云表示为维体素(voxel)表示,或者使用图卷积网络将点云表示为图结构进行处理。 4. 模型设计:选择合适的深度学习模型来处理点云数据。常用的模型包括PointNet、PointNet++、PU-Net等。这些模型可以用于分类、分割或生成任务。可以根据具体任务需求选择最合适的模型。 5. 模型训练:使用标注的点云数据对模型进行训练。训练过程中,需要定义合适的损失函数来评估预测结果与真实标签之间的差异,并使用优化算法(如随机梯度下降)来更新模型的参数以最小化损失。 6. 模型评估:使用测试数据集对训练好的模型进行评估。常见的评估指标包括分类准确率、分割IoU等,根据具体任务需求选择合适的评估指标。 7. 模型应用:训练好的模型可以用于各种点云相关的任务,如目标检测与分类、物体分割、点云重建等。根据实际需求,将模型应用到实际场景中。 总结来说,要设计一个点云深度学习模型,需要进行数据准备、数据预处理、特征提取、模型设计、模型训练、模型评估和模型应用等步骤。这些步骤需要根据具体任务需求和数据特点进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值