QuaterNet数据预处理全解析:从原始动作捕捉数据到四元数序列转换
QuaterNet数据预处理全解析:从原始动作捕捉数据到四元数序列转换
【免费下载链接】QuaterNetProposes neural networks that can generate animation of virtual characters for different actions.项目地址: https://gitcode.com/gh_mirrors/qu/QuaterNet
QuaterNet是一个专注于虚拟角色动画生成的神经网络项目,其核心功能是将动作捕捉数据转换为流畅的四元数序列,为虚拟角色提供自然逼真的动作表现。本文将详细介绍QuaterNet的数据预处理流程,帮助新手用户理解如何从原始动作捕捉数据得到可用的四元数序列。
数据预处理的重要性
数据预处理是QuaterNet项目中至关重要的一步,它直接影响后续模型训练的效果和动画生成的质量。原始动作捕捉数据通常存在噪声、格式不统一等问题,需要经过一系列处理才能转化为模型可以接受的输入格式。
数据预处理工具介绍
QuaterNet提供了两个主要的数据预处理脚本,分别用于短期动作和长期动作的数据准备:
prepare_data_short_term.py:用于处理短期动作数据,如Human3.6M数据集prepare_data_long_term.py:用于处理长期动作数据,如 locomotion 数据集
短期动作数据预处理流程
1. 数据下载与提取
prepare_data_short_term.py首先会从指定URL下载Human3.6M数据集的指数映射格式文件,并将其解压到指定目录。代码如下:
h36m_dataset_url = 'http://www.cs.stanford.edu/people/ashesh/h3.6m.zip' h36m_path = output_directory + '/h3.6m.zip' urlretrieve(h36m_dataset_url, h36m_path) with zipfile.ZipFile(h36m_path, 'r') as archive: archive.extractall(output_directory)2. 数据读取与解析
下载完成后,脚本会读取CSV格式的动作捕捉文件,并将其解析为NumPy张量。解析函数如下:
def read_file(path): data = [] with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') for row in reader: data.append(row) data = np.array(data, dtype='float64') return data.reshape(data.shape[0], -1, 3)3. 数据清洗与转换
原始数据中包含一些不需要的信息,如第一个关节的平移数据。脚本会先丢弃这些数据,然后将指数映射格式的旋转数据转换为四元数表示:
# 丢弃第一个关节的平移数据 data = data[:, 1:] # 转换为四元数并修复对极表示 quat = expmap_to_quaternion(-data) quat = qfix(quat)4. 数据保存
处理完成后,脚本会将数据保存为压缩的NPZ格式,方便后续模型训练使用:
np.savez_compressed(output_file_path, trajectories=out_pos, rotations=out_rot, subjects=out_subjects, actions=out_actions)四元数转换核心函数解析
expmap_to_quaternion函数
expmap_to_quaternion函数用于将指数映射(轴角表示)转换为四元数。该函数实现了"Practical Parameterization of Rotations Using the Exponential Map"中的稳定公式:
def expmap_to_quaternion(e): theta = np.linalg.norm(e, axis=1).reshape(-1, 1) w = np.cos(0.5*theta).reshape(-1, 1) xyz = 0.5*np.sinc(0.5*theta/np.pi)*e return np.concatenate((w, xyz), axis=1).reshape(original_shape)qfix函数
qfix函数用于确保四元数在时间维度上的连续性,通过选择两个连续帧之间具有最小距离(或最大点积)的表示(q或-q)来实现:
def qfix(q): result = q.copy() dot_products = np.sum(q[1:]*q[:-1], axis=2) mask = dot_products < 0 mask = (np.cumsum(mask, axis=0)%2).astype(bool) result[1:][mask] *= -1 return result长期动作数据预处理
长期动作数据预处理主要通过prepare_data_long_term.py脚本完成。与短期数据处理类似,它也包含数据读取、清洗和转换等步骤。其中,四元数转换同样依赖于common/quaternion.py中的qfix函数:
rot = qfix(anim.rotations.qs) # 局部关节旋转作为四元数数据预处理完整工作流
综合来看,QuaterNet的数据预处理工作流可以总结为以下几个关键步骤:
- 下载并提取原始动作捕捉数据集
- 读取并解析原始数据文件
- 清洗数据,去除不需要的信息
- 将旋转数据从指数映射格式转换为四元数表示
- 修复四元数的对极表示,确保时间连续性
- 保存处理后的数据,供模型训练使用
通过这个流程,原始的动作捕捉数据被转换为适合QuaterNet模型输入的四元数序列,为后续的动画生成奠定了坚实的基础。
如何运行数据预处理脚本
要运行QuaterNet的数据预处理脚本,首先需要克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/qu/QuaterNet然后分别运行短期和长期数据预处理脚本:
python prepare_data_short_term.py python prepare_data_long_term.py运行完成后,处理好的数据将保存在datasets目录下,可供后续的模型训练使用。
通过本文的介绍,相信您已经对QuaterNet的数据预处理流程有了清晰的了解。这个流程虽然简单,但却是保证动画生成质量的关键步骤。希望本文能帮助您更好地理解和使用QuaterNet项目。
【免费下载链接】QuaterNetProposes neural networks that can generate animation of virtual characters for different actions.项目地址: https://gitcode.com/gh_mirrors/qu/QuaterNet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考