Dexcap复现代码数据预处理全流程(五)——demo_create_hdf5.py

此脚本的主要目的是从此前处理的数据集目录中读取多个子目录(每个子目录也是一个独立的数据集),对数据进行处理,并将处理后的数据保存到HDF5文件中

1 库引用

from dataset_utils import *

2 指定数据集路径

# 定义原始数据集的主目录路径
# 需要替换 [PATH_TO_RAW_DATA_DOWNLOAD] 为实际存放原始数据的路径
dataset_base_dir = '/home/yejiangchen/Desktop/Codes/DexCap-main/data/rawdata_wipe_1-14/save_wipe_1-14'
# dataset_base_dir = '[PATH_TO_RAW_DATA_DOWNLOAD]/save_packaging_wild_1-20'

通过 dataset_base_dir 定义原始数据集的主目录

需要将 [PATH_TO_RAW_DATA_DOWNLOAD] 替换为实际存放数据集的路径

数据集中包含多个子目录,每个子目录对应一个独立的数据集

3 提取子目录路径

# 列出主目录下的所有子目录
# os.listdir(dataset_base_dir): 获取主目录下的所有文件和文件夹名称
# os.path.isdir: 检查路径是否为目录
# os.path.join: 拼接完整路径
sub_dirs = [os.path.join(dataset_base_dir, d) for d in os.listdir(dataset_base_dir) if os.path.isdir(os.path.join(dataset_base_dir, d))]

os.listdir(dataset_base_dir):列出 dataset_base_dir 目录下的所有文件和文件夹

通过 os.path.isdir 过滤掉非目录的项,仅保留子目录

最终 sub_dirs 是一个列表,包含了所有数据子目录的绝对路径

4 对子目录进行排序

# 对子目录按照名称中的最后两位数字进行排序
# extract_dataset_folder_last_two_digits: 自定义函数,提取文件夹名称中的最后两位数字
# 例如:文件夹名称为 "save_data_wipe_1-14_01",提取 "01" 并作为排序依据
dataset_folders = sorted(sub_dirs, key=lambda d: extract_dataset_folder_last_two_digits(os.path.basename(d)))

sorted 对子目录路径进行排序

排序的依据是子目录名称的最后两位数字,通过函数 extract_dataset_folder_last_two_digits 提取

子目录名称如 save_data_wipe_1-14_01,函数会提取01并按照编号顺序排序

5 设定参数

# 定义处理参数
action_gap = 5  # 动作间隔参数,用于指定采样的步长,每隔5个动作采样一次
num_points_to_sample = 10000  # 要从每个数据集中采样的点数,限制采样规模

action_gap: 定义了处理数据时的动作间隔(采样步长),5表示每隔5个动作进行一次采样

num_points_to_sample: 指定了要从每个数据集中采样的点数,10000表示采样10000个点

可根据具体任务或数据规模进行调整

6 生成输出文件名

# 定义输出文件的路径和文件名
# [PATH_TO_SAVE_FOLDER]: 需要替换为实际存储处理结果的路径
# 文件名中包含 action_gap 和 num_points_to_sample,方便标识文件的处理参数
output_hdf5_file = '/home/yejiangchen/Desktop/Codes/DexCap-main/data/rawdata_wipe_1-14/hand_wiping_1-14_{}actiongap_{}points.hdf5'.format(action_gap, num_points_to_sample)
# output_hdf5_file = '[PATH_TO_SAVE_FOLDER]/hand_packaging_wild_1-20_{}actiongap_{}points.hdf5'.format(action_gap, num_points_to_sample)

输出文件保存为 HDF5 格式(Hierarchical Data Format Version 5),适合存储大规模数据

文件名包含了参数 action_gap 和 num_points_to_sample

需要将 [PATH_TO_SAVE_FOLDER] 替换为实际存储处理结果的路径

7 处理数据集并保存

# 调用数据处理函数,生成处理后的HDF5文件
# process_hdf5: 自定义函数,执行数据处理和保存操作
# 参数说明:
#   - output_hdf5_file: 处理后的HDF5文件路径
#   - dataset_folders: 按照名称排序后的数据集目录列表
#   - action_gap: 动作间隔参数,用于控制采样频率
#   - num_points_to_sample: 每个数据集中采样的点数
#   - in_wild_data=True: 使用野外数据
# 注意:process_hdf5 函数需要在 dataset_utils 模块中实现
process_hdf5(output_hdf5_file, dataset_folders, action_gap, num_points_to_sample)
# process_hdf5(output_hdf5_file, dataset_folders, action_gap, num_points_to_sample, in_wild_data=True)

调用 process_hdf5 函数处理数据,并将结果保存到指定的HDF5文件中

遍历 dataset_folders 中的每个子目录,读取数据并根据 action_gap 和 num_points_to_sample 进行采样

处理后的数据统一保存到HDF5文件中

输入参数:

output_hdf5_file:输出文件路径。

dataset_folders:按顺序排列的子目录列表(每个子目录为一个数据集)

action_gap:动作采样间隔

num_points_to_sample:采样点数

in_wild_data=True:表示处理的数据是“野外数据”

8 运行报错

运行时可能会报以下错误:

AttributeError: 'Trimesh' object has no attribute 'as_open3d'

Traceback (most recent call last):
  File "/home/yejiangchen/Desktop/Codes/DexCap-main/STEP2_build_dataset/demo_create_hdf5.py", line 1, in <module>
    from dataset_utils import *
  File "/home/yejiangchen/Desktop/Codes/DexCap-main/STEP2_build_dataset/dataset_utils.py", line 8, in <module>
    leapPybulletIK = LeapPybulletIK()
  File "/home/yejiangchen/Desktop/Codes/DexCap-main/STEP2_build_dataset/pybullet_ik_bimanual.py", line 49, in __init__
    "mesh_list": self._load_meshes(self.Leap_urdf.scene),
  File "/home/yejiangchen/Desktop/Codes/DexCap-main/STEP2_build_dataset/pybullet_ik_bimanual.py", line 77, in _load_meshes
    mesh = g.as_open3d
AttributeError: 'Trimesh' object has no attribute 'as_open3d'

重装一下 trimesh 及 open3d 至对应推荐版本就可以了

trimesh==4.1.3
open3d==0.17.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值