QuaterNet数据预处理全解析:从原始动作捕捉数据到四元数序列转换

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的数据预处理工作流可以总结为以下几个关键步骤:

  1. 下载并提取原始动作捕捉数据集
  2. 读取并解析原始数据文件
  3. 清洗数据,去除不需要的信息
  4. 将旋转数据从指数映射格式转换为四元数表示
  5. 修复四元数的对极表示,确保时间连续性
  6. 保存处理后的数据,供模型训练使用

通过这个流程,原始的动作捕捉数据被转换为适合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),仅供参考