numpy数组维度在人体关键点时序3D数据集构建中的正确应用
动态生成人体3D关键点数据集的维度不匹配问题解决方案
你遇到的维度不匹配问题核心原因是:固定维度的数组要求预先确定所有维度大小,而你运行时的帧数、单帧人数都是可变的,直接预分配3D/4D数组自然会出错。可以按以下几种方案处理:
方案1:动态列表缓存+采集完成后对齐补全
这是兼容性最高、适用所有场景的方案:
- 初始化空列表
raw_frames作为缓存,每采集一帧就把当前帧的(n, 19, 3)矩阵(单人场景n=1)追加到列表中,该步骤无任何预定义维度要求,不会触发维度错误 - 采集全部结束后,先统计总帧数和单帧最大人数,再构造统一维度的4D数组,缺人、缺关键点的位置用
NaN或自定义占位值填充:import numpy as np # 运行时逐帧添加数据 raw_frames = [] for _ in 采集流程: # 单帧输出为 (n, 19, 3) 的矩阵,n为当前帧检测到的人数 single_frame_data = 运行时获取的关键点矩阵() raw_frames.append(single_frame_data) # 对齐补全为规则4D数组 total_frames = len(raw_frames) max_persons = max(frame.shape[0] for frame in raw_frames) dataset = np.full((total_frames, max_persons, 19, 3), fill_value=np.nan) for frame_idx, frame_data in enumerate(raw_frames): curr_person_num = frame_data.shape[0] dataset[frame_idx, :curr_person_num, :, :] = frame_data
方案2:使用框架原生不规则张量
如果后续直接用PyTorch/TensorFlow做模型训练,不需要转成规则数组,可以直接用动态维度的不规则张量存储,无需补全:
- PyTorch 场景使用
NestedTensor,可直接传入不同长度的帧数据列表构造,支持绝大多数张量运算 - TensorFlow 场景使用
RaggedTensor,支持动态人数维度,无需预先指定大小
方案3:动态扩展存储格式
如果需要将数据集落地到本地,不要直接存储固定形状的numpy数组,选择支持动态扩展的存储格式即可:
- 轻量场景用JSON/MessagePack存储结构化数据:每帧存储
frame_id、person_count、keypoints三个字段,读取时可按需转换为数组 - 大数据量场景用HDF5格式存储:支持动态扩展维度的数据集,可预先开启可扩展的帧维度,运行时逐帧写入即可
内容的提问来源于stack exchange,提问作者pacours
相关产品推荐
相关产品推荐

