TensorFlow姿势分类模型推理报错:预期shape=(None,99)实际为(None,3)如何解决
TensorFlow ANN模型与MediaPipe关键点输入维度不匹配解决方案
问题根因
报错的核心是推理阶段的输入张量维度和模型训练时约定的输入维度不匹配:
- 训练阶段你已将MediaPipe输出的(33,3)关键点张量平铺为99维的一维向量,单样本输入shape为(99,),添加batch维度后的批量输入shape为
(None, 99),和模型输入要求一致 - 推理阶段你直接传入原始的(33,3)二维张量,模型会自动将第一维33识别为batch大小,第二维3识别为单样本特征维度,因此触发期望shape为
(None, 99)、实际得到(None, 3)的不匹配报错
修复步骤
需保证推理阶段的预处理逻辑和训练阶段完全对齐,按以下顺序处理输入即可:
- 先对MediaPipe输出的(33,3)原始关键点调用训练时使用的姿势嵌入归一化函数做处理,保证推理输入的数据分布和训练集一致,避免准确率下降
- 对归一化后的(33,3)张量做展平操作,转换为99维的一维向量
- Numpy数组处理:
flatten_kp = normalized_kp.flatten() - TensorFlow张量处理:
flatten_kp = tf.reshape(normalized_kp, (-1,))
- Numpy数组处理:
- 为展平后的向量新增batch维度,得到符合模型要求的
(1, 99)输入shape- Numpy数组处理:
model_input = np.expand_dims(flatten_kp, axis=0) - TensorFlow张量处理:
model_input = tf.expand_dims(flatten_kp, axis=0)
- Numpy数组处理:
完整推理预处理示例
import numpy as np # 从MediaPipe结果中提取关键点,得到shape为(33,3)的numpy数组 mp_keypoints = np.array([[lm.x, lm.y, lm.z] for lm in results.pose_landmarks.landmark]) # 1. 调用训练时使用的姿势嵌入归一化函数(替换为你自己的实现) normalized_kp = your_pose_embedding_func(mp_keypoints) # 2. 展平为99维向量 flatten_kp = normalized_kp.flatten() # 3. 扩展batch维度得到(1,99)的模型输入 model_input = np.expand_dims(flatten_kp, axis=0) # 执行预测 pred_result = model.predict(model_input, verbose=0)
注意事项
- 如果需要批量处理多帧关键点,直接按帧维度堆叠展平后的99维向量即可,最终输入shape为
(批量大小, 99)就符合模型要求 - 必须保证推理和训练的归一化逻辑完全一致,比如是否做了相对肩髋中点的坐标偏移、是否做了尺度归一化等,否则会出现推理准确率远低于训练准确率的问题
内容的提问来源于stack exchange,提问作者HotWheels
相关产品推荐
相关产品推荐

