抽取modelnet40_ply_hdf5_2048数据集的子类集制作h5点云

24 篇文章 0 订阅
12 篇文章 1 订阅

本文参考: 用modelnet40_ply_hdf5_2048数据集制作txt点云数据集(抽取特定类别)_好好学习嘻嘻的博客-CSDN博客

最近要做modelnet10的分类问题,发现网上没有modelnet10的hd5文件资源,自己使用off文件又不会制作,那就使用modelnet40_ply_hdf5_2048制作我们的modelnet10_ply_hdf5_2048文件吧。只看到有人使用modelnet40_ply_hdf5_2048制作了每个点云的txt文档,具体如何制作hd5文件没有其他的资料。本文简单的制作了一下,如有不对的地方,欢迎指正。

modelnet40_ply_hdf5_2048数据集下载地址为:https://shapenet.cs.stanford.edu/media/modelnet40_ply_hdf5_2048.zip

打开和创建 h5py 文件

新建一个hdf5文件,文件名是tutorial.h5, 写的模式,描述为test file。

f = open_file('tutorial.h5',mode='w',title='test file')

HDF5 文件通常像标准 Python 文件对象一样工作。它们支持 r / w / a 等标准模式,并且在不再使用时应关闭。但是,显然没有“text”与“binary”模式的概念。 

文件名可以是字节字符串或 unicode 字符串。有效mode是:

mode说明
r只读,文件必须存在
r+读 / 写,文件必须存在
w创建文件,已经存在的文件会被覆盖掉
w- / x创建文件,文件如果已经存在则出错
a打开已经存在的文件进行读 / 写,如果不存在则创建一个新文件读 / 写(默认)

在当前目录下会生成一个 myh5py.hdf5 文件

import os
import sys
import numpy as np
import h5py
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.clear()
sys.path.append(BASE_DIR)
print(sys.path)
print(BASE_DIR)

# label2sub_class = (1, 2, 3, 4, 5, 6, 7, 8, 9)
label2sub_class = (2, 4, 8, 12, 14, 19, 28, 30, 33, 38)


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


def load_h5(h5_filename):
    h5f = h5py.File(h5_filename)
    data = h5f['data'][:]
    label = h5f['label'][:]
    normal = h5f['normal'][:]
    return data, label, normal


def loadDataFile(filename):
    return load_h5(filename)


# 写入文件
def write_data2h5(file_name, label, h5data, h5normal):
    h5f = h5py.File(file_name, 'w')
    h5f['label'] = label
    h5f['data'] = h5data
    h5f['normal'] = h5normal
    h5f.close()
    # h5f.create_dataset(label, data=h5data)


# 由于 train_files 的路径设定为 .../data/modelnet40_ply_hdf5_2048/...',在这里我们不做修改
TRAIN_FILES = getDataFiles(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'))
TEST_FILES = getDataFiles(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'))

# 本人的存储路径,modelnet40_ply_hdf5_2048有5个train文件,在这里也是5个。两个test文件,本人如是
# ...//data/mydata/...为本人存放数据的路径
filename_train0 = BASE_DIR + '/data/mydata/ply_data_train0.h5'  # 创建点云的路径
filename_train1 = BASE_DIR + '/data/mydata/ply_data_train1.h5'  # 创建点云的路径
filename_train2 = BASE_DIR + '/data/mydata/ply_data_train2.h5'  # 创建点云的路径
filename_train3 = BASE_DIR + '/data/mydata/ply_data_train3.h5'  # 创建点云的路径
filename_train4 = BASE_DIR + '/data/mydata/ply_data_train4.h5'  # 创建点云的路径

filename_test0 = BASE_DIR + '/data/mydata/ply_data_test0.h5'  # 创建点云的路径
filename_test1 = BASE_DIR + '/data/mydata/ply_data_test1.h5'  # 创建点云的路径

file_length2train = len(TRAIN_FILES)
file_length2test = len(TEST_FILES)

label_list2sub_class = []
data_list2sub_class = []
normal_list2sub_class = []
for fn in range(len(TRAIN_FILES)):
    current_data, current_label, current_normal = loadDataFile(TRAIN_FILES[fn])
    current_label = np.squeeze(current_label)
    label_length = len(current_label)
    if fn == 0:
        for j in range(label_length):
            label = current_label[j]
            if label in label2sub_class:
                data = current_data[j]
                normal = current_normal[j]
                label_list2sub_class.append(current_label[j])
                data_list2sub_class.append(current_data[j])
                normal_list2sub_class.append(current_normal[j])
        write_data2h5(filename_train0, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
        label_list2sub_class.clear()
        data_list2sub_class.clear()
        normal_list2sub_class.clear()
    elif fn == 1:
        for j in range(label_length):
            label = current_label[j]
            if label in label2sub_class:
                label_list2sub_class.append(current_label[j])
                data_list2sub_class.append(current_data[j])
                normal_list2sub_class.append(current_normal[j])
        write_data2h5(filename_train1, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
        label_list2sub_class.clear()
        data_list2sub_class.clear()
        normal_list2sub_class.clear()
    elif fn == 2:
        for j in range(label_length):
            label = current_label[j]
            if label in label2sub_class:
                label_list2sub_class.append(current_label[j])
                data_list2sub_class.append(current_data[j])
                normal_list2sub_class.append(current_normal[j])
        write_data2h5(filename_train2, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
        label_list2sub_class.clear()
        data_list2sub_class.clear()
        normal_list2sub_class.clear()
    elif fn == 3:
        for j in range(label_length):
            label = current_label[j]
            if label in label2sub_class:
                label_list2sub_class.append(current_label[j])
                data_list2sub_class.append(current_data[j])
                normal_list2sub_class.append(current_normal[j])
        write_data2h5(filename_train3, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
        label_list2sub_class.clear()
        data_list2sub_class.clear()
        normal_list2sub_class.clear()
    elif fn == 4:
        for j in range(label_length):
            label = current_label[j]
            if label in label2sub_class:
                label_list2sub_class.append(current_label[j])
                data_list2sub_class.append(current_data[j])
                normal_list2sub_class.append(current_normal[j])
        write_data2h5(filename_train4, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
        label_list2sub_class.clear()
        data_list2sub_class.clear()
        normal_list2sub_class.clear()


for fn in range(len(TEST_FILES)):
    current_data, current_label, current_normal=loadDataFile(TEST_FILES[fn])
    current_label = np.squeeze(current_label)
    label_length2test = len(current_label)
    if fn == 0:
        for j in range(label_length2test):
            label = current_label[j]
            if label in label2sub_class:
                label_list2sub_class.append(current_label[j])
                data_list2sub_class.append(current_data[j])
                normal_list2sub_class.append(current_normal[j])
        write_data2h5(filename_test0, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
        label_list2sub_class.clear()
        data_list2sub_class.clear()
        normal_list2sub_class.clear()
    else:
        for j in range(label_length2test):
            label = current_label[j]
            if label in label2sub_class:
                label_list2sub_class.append(current_label[j])
                data_list2sub_class.append(current_data[j])
                normal_list2sub_class.append(current_normal[j])
        write_data2h5(filename_test1, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
        label_list2sub_class.clear()
        data_list2sub_class.clear()
        normal_list2sub_class.clear()

上面的代码比较冗长,low了点,本人就不删了,便于理解,下面为简洁的。 

import os
import sys
import numpy as np
import h5py
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.clear()
sys.path.append(BASE_DIR)
print(sys.path)
print(BASE_DIR)

# label2sub_class = (1, 2, 3, 4, 5, 6, 7, 8, 9)
label2sub_class = (2, 4, 8, 12, 14, 19, 28, 30, 33, 38)


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


def load_h5(h5_filename):
    h5f = h5py.File(h5_filename)
    data = h5f['data'][:]
    label = h5f['label'][:]
    normal = h5f['normal'][:]
    return data, label, normal


def loadDataFile(filename):
    return load_h5(filename)


# 写入文件
def write_data2h5(file_name, label, h5data, h5normal):
    h5f = h5py.File(file_name, 'w')
    h5f['label'] = label
    h5f['data'] = h5data
    h5f['normal'] = h5normal
    h5f.close()
    # h5f.create_dataset(label, data=h5data)


# 由于 train_files 的路径设定为 .../data/modelnet40_ply_hdf5_2048/...',在这里我们不做修改
TRAIN_FILES = getDataFiles(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/train_files.txt'))
TEST_FILES = getDataFiles(os.path.join(BASE_DIR, 'data/modelnet40_ply_hdf5_2048/test_files.txt'))

# 本人的存储路径,modelnet40_ply_hdf5_2048有5个train文件,在这里也是5个。两个test文件,本人如是
# ...//data/mydata/...为本人存放数据的路径
filename_train0 = BASE_DIR + '/data/mydata/ply_data_train0.h5'  # 创建点云的路径
filename_train1 = BASE_DIR + '/data/mydata/ply_data_train1.h5'  # 创建点云的路径
filename_train2 = BASE_DIR + '/data/mydata/ply_data_train2.h5'  # 创建点云的路径
filename_train3 = BASE_DIR + '/data/mydata/ply_data_train3.h5'  # 创建点云的路径
filename_train4 = BASE_DIR + '/data/mydata/ply_data_train4.h5'  # 创建点云的路径

filename_test0 = BASE_DIR + '/data/mydata/ply_data_test0.h5'  # 创建点云的路径
filename_test1 = BASE_DIR + '/data/mydata/ply_data_test1.h5'  # 创建点云的路径

file_length2train = len(TRAIN_FILES)
file_length2test = len(TEST_FILES)

label_list2sub_class = []
data_list2sub_class = []
normal_list2sub_class = []
for fn in range(len(TRAIN_FILES)):
    current_data, current_label, current_normal = loadDataFile(TRAIN_FILES[fn])
    current_label = np.squeeze(current_label)
    label_length = len(current_label)
    for j in range(label_length):
        label = current_label[j]
        if label in label2sub_class:
            data = current_data[j]
            normal = current_normal[j]
            label_list2sub_class.append(current_label[j])
            data_list2sub_class.append(current_data[j])
            normal_list2sub_class.append(current_normal[j])
    if fn == 0:
        write_data2h5(filename_train0, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
    elif fn == 1:
        write_data2h5(filename_train1, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
    elif fn == 2:
        write_data2h5(filename_train2, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
    elif fn == 3:
        write_data2h5(filename_train3, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
    elif fn == 4:
        write_data2h5(filename_train4, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
    label_list2sub_class.clear()
    data_list2sub_class.clear()
    normal_list2sub_class.clear()


for fn in range(len(TEST_FILES)):
    current_data, current_label, current_normal=loadDataFile(TEST_FILES[fn])
    current_label = np.squeeze(current_label)
    label_length2test = len(current_label)
    for j in range(label_length2test):
        label = current_label[j]
        if label in label2sub_class:
            label_list2sub_class.append(current_label[j])
            data_list2sub_class.append(current_data[j])
            normal_list2sub_class.append(current_normal[j])
    if fn == 0:
        write_data2h5(filename_test0, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
    else:
        write_data2h5(filename_test1, label_list2sub_class, data_list2sub_class, normal_list2sub_class)
    label_list2sub_class.clear()
    data_list2sub_class.clear()
    normal_list2sub_class.clear()

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: modelnet40_ply_hdf5_2048是一个数据集的名称,其中包含了40个不同种类的3D模型的点云数据。这个数据集的每个模型都被采样成了2048个点,并且以.hdf5格式存储。这个数据集通常被用于3D物体识别和分类的研究中。 ### 回答2: modelnet40_ply_hdf5_2048是一个深度学习模型的数据集数据集ModelNet40为基础,将3D模型换为点云数据,并使用plyhdf5格式进行存储。ModelNet40是一个包含40种不同物体的3D CAD模型数据集,其中每种物体有55个不同角度的模型。ModelNet40的目的是让研究人员在3D物体识别和分类方面进行实验和评估,而modelnet40_ply_hdf5_2048提供了这些模型的点云表示,方便研究人员进行深度学习实验。 另一个关键的点是“2048”,它是指点云数据集中每个点的维数。这意味着每个点由三个坐标和多个其他特征组成,以支持更高级别的分类任务。这些数据点经过预处理和缩放,以使每个坐标值在-1到1之间,从而使得模型学习更有效。 此外,modelnet40_ply_hdf5_2048还包含了许多帮助研究人员进行深度学习实验的其他特征,如每个点的RGB颜色值和法向量等。同时,在提供数据集方面,modelnet40_ply_hdf5_2048也帮助确保了数据的一致性和可重复性。 总的来说,modelnet40_ply_hdf5_2048可用于用于进行基于点云的3D物体分类任务的深度学习实验,对于想要研究3D物体识别和建模的研究人员来说是一个极其有用的工具。 ### 回答3: modelnet40_ply_hdf5_2048是一个数据集的名称。这个数据集主要是用于实现3D物体识别且含有40个不同类别的物体模型。数据集中每个物体模型都是基于点云数据表示的,以此来表示3D物体的形状和几何结构信息。这个数据集中含有数量多达 12,311 个数据点,其中包含了2048维的点云信息,并且每个数据都标注了与之对应的物体的类别信息。这个数据集的主要应用场景是图像识别和计算机视觉任务。 这个数据集的使用场景主要包括两个方面。首先,可以将该数据集用于训练和测试深度学习模型,以此来实现对3D物体的识别。例如,可以使用此数据集来训练相应的分类网络模型,然后在测试中验证其分类效果。其次,这个数据集可以用于测试处理点云数据的各种算法和方法的性能。例如,可以使用该数据集作为验证数据源来测试点云处理算法的性能和准确度,进一步优化算法设计和改进算法性能。 总之,modelnet40_ply_hdf5_2048是一个应用广泛的3D物体数据集,包含着丰富的3D物体点云数据,能够方便地用于深度学习模型的训练、测试,以及各种算法方法的性能测试。它的出现对于促进图像识别、计算机视觉、模式识别等相关领域的发展,具有一定的重要性和意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值