此脚本的主要目的是从此前处理的数据集目录中读取多个子目录(每个子目录也是一个独立的数据集),对数据进行处理,并将处理后的数据保存到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
标签:采样,num,hdf5,demo,py,子目录,dataset,points
From: https://blog.csdn.net/qq_28912651/article/details/144952325