MMHuman3D项目中的HumanData数据格式详解
概述
在3D人体建模与姿态估计领域,数据格式的统一和标准化对于模型训练和评估至关重要。MMHuman3D项目中的HumanData数据格式提供了一种高效、统一的方式来存储和处理与人体相关的各种数据,包括关键点、模型参数、图像路径等。本文将深入解析HumanData的设计理念、核心结构和实用功能。
HumanData基础结构
HumanData是Python内置字典的子类,专门用于存储单视角人体图像的相关信息。它具有以下特点:
- 通用基础结构:提供标准化的数据存储框架
- 灵活扩展性:支持自定义数据特性的兼容
- 数据类型支持:原生支持numpy.ndarray和Python内置数据结构
- 转换能力:可轻松转换为PyTorch Tensor(支持CPU和GPU)
核心数据字段详解
1. 路径信息
路径信息用于记录各类图像文件的存储位置:
image_path:图像文件路径列表(N,)segmentation_path(可选):分割图路径列表(N,)depth_path(可选):深度图路径列表(N,)
2. 关键点数据
HumanData采用统一的190个关键点格式(HUMAN_DATA),支持2D和3D关键点的存储:
3D关键点
keypoints3d_smpl/keypoints3d_smplx:(N, 190, 4)数组,包含SMPL/SMPLX模型的3D关键点及置信度keypoints3d_original:(N, 190, 4)数组,原始数据集提供的3D关键点及置信度
2D关键点
keypoints2d_smpl/keypoints2d_smplx:(N, 190, 3)数组keypoints2d_original:(N, 190, 3)数组
每个关键点字段都应有对应的mask字段(如keypoints2d_smpl_mask)标识有效关键点。
3. 检测框数据
检测框采用[x_min, y_min, width, height, confidence]格式:
bbox_xywh:(N, 5)数组,身体检测框face_bbox_xywh、lhand_bbox_xywh、rhand_bbox_xywh(可选):(N, 5)数组,SMPLX模型特有
4. 人体模型参数
支持SMPL和SMPLX两种主流人体模型的参数存储:
SMPL参数
{
'body_pose': (N, 23, 3),
'global_orient': (N, 3),
'betas': (N, 10),
'transl': (N, 3)
}
SMPLX参数
{
'body_pose': (N, 21, 3),
'global_orient': (N, 3),
'betas': (N, 10),
'transl': (N, 3),
'left_hand_pose': (N, 15, 3),
'right_hand_pose': (N, 15, 3),
'expression': (N, 10),
'leye_pose': (N, 3),
'reye_pose': (N, 3),
'jaw_pose': (N, 3)
}
5. 元数据与杂项
config:数据集配置标识meta:包含性别、图像尺寸等元信息misc:数据集特有设置(大小限制在6MB以内)
数据压缩与优化
关键点压缩
由于HUMAN_DATA格式整合了不同数据集的关键点定义,常存在大量缺失值。HumanData提供了高效的压缩机制:
- 压缩过程:
human_data.compress_keypoints_by_mask()
- 数据访问:
get_raw_value():获取压缩后的原始数据- 直接索引:获取填充0后的完整格式数据
- 编辑方式:
- 设置填充数据:
human_data['keypoints2d'] = padded_data - 设置压缩数据:
human_data.set_raw_value('keypoints2d', compressed_data)
文件压缩
支持两种文件格式存储:
- NPZ格式:
human_data.dump('data.npz')
human_data.load('data.npz')
- Pickle格式(适用于大型数据):
human_data.dump_by_pickle('data.pkl')
human_data.load_by_pickle('data.pkl')
数据选择与转换
数据选择
- 按形状选择:
# 获取前10帧
first_ten = human_data.get_value_in_shape('keypoints2d', [10, -1, -1])
# 填充扩展
padded_data = human_data.get_value_in_shape('keypoints2d', [200, 300, -1])
- 时间切片:
# 获取10-20帧
sub_data = human_data.get_slice(10, 21)
# 下采样(间隔3帧)
sub_data = human_data.get_slice(0, 200, 3)
Tensor转换
# 转换为CPU Tensor
tensor_data = human_data.to()
# 转换为GPU Tensor
gpu_data = human_data.to(torch.device('cuda:0'))
MultiHumanData扩展
MultiHumanData继承自HumanData,专门处理多人场景下的数据,主要特点是:
- 帧范围索引:通过
frame_range字段(形状为(N, 2))管理图像与多人数据的对应关系 - 数据组织:每张图像可能对应多个人体数据,通过指针范围进行索引
最佳实践建议
- 坐标系规范:所有数据应已转换到OpenCV相机空间
- 关键点处理:建议保持原始坐标系,不进行root alignment
- 检测框生成:
- 身体检测框建议缩放比例1.2
- 手部和面部检测框建议缩放比例1.0
- 数据验证:充分利用HumanData内置的类型和形状检查机制
通过这种标准化的数据格式,MMHuman3D项目实现了不同数据集和模型之间的无缝对接,大大提高了3D人体建模研究的效率和可重复性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



