TensorFlow.js MoveNet输出形状不符:为何返回[1,6,56]而非[1,1,17,3]
姿态检测模型输出形状不符问题解答
输入要求
视频帧或图像需表示为形状为192x192x3的int32张量,通道顺序为RGB,值范围为[0, 255]。
输出说明
应为形状为[1, 1, 17, 3]的float32张量:
- 最后维度的前两个通道代表17个关键点的归一化yx坐标(范围[0.0, 1.0]),关键点顺序为:
- nose
- left eye
- right eye
- left ear
- right ear
- left shoulder
- right shoulder
- left elbow
- right elbow
- left wrist
- right wrist
- left hip
- right hip
- left knee
- right knee
- left ankle
- right ankle
- 最后维度的第三个通道代表每个关键点的预测置信度,范围为[0.0, 1.0]
运行代码
const MODEL_PATH = './model'; const EXAMPLE_IMG = document.getElementById('exampleImg'); let movenet = undefined; async function loadAndRunModel() { movenet = await tf.loadGraphModel(MODEL_PATH, {fromTFHub: true}); let imageTensor = tf.browser.fromPixels(EXAMPLE_IMG); console.log(imageTensor.shape); let cropStartPoint = [15, 170, 0]; let cropSize = [345, 345, 3]; let croppedTensor = tf.slice(imageTensor, cropStartPoint, cropSize); let resizedTensor = tf.image .resizeBilinear(croppedTensor, [192, 192], true) .toInt(); console.log(resizedTensor.shape); let tensorOutput = movenet.predict(tf.expandDims(resizedTensor)); // 修正:tensorOutput是Tensor对象,需用array()或data()获取数据 let arrayOutput = await tensorOutput.array(); console.log(arrayOutput); } loadAndRunModel();
问题描述
运行上述代码后,得到的输出张量形状为[1,6,56],与文档描述的[1,1,17,3]不符,请问出现该差异的原因是什么?
原因分析
模型版本不匹配:你加载的是Movenet的MultiPose多姿态检测模型,但文档描述的是SinglePose单姿态检测模型的输出格式。
- MultiPose模型的设计目标是检测图像中最多6个人的姿态,因此输出形状为
[1, 6, 56]:- 第一个维度
1表示批量大小; - 第二个维度
6是模型支持的最大检测人数; - 第三个维度
56包含每个检测目标的完整数据:17个关键点的(x,y,置信度)(共51维)加上检测框的坐标与置信度(共5维),总和为56。
- 第一个维度
- 而SinglePose模型仅专注于检测单个人的姿态,输出结构为
[1,1,17,3],完全匹配文档描述的格式。
- MultiPose模型的设计目标是检测图像中最多6个人的姿态,因此输出形状为
代码细节修正:原代码中
let arrayOutput = await tensorOutput;存在错误,tensorOutput是Tensor对象而非Promise,正确获取输出数组的方式应为await tensorOutput.array()或await tensorOutput.data()。
内容的提问来源于stack exchange,提问作者Kevin Merchant
相关产品推荐
相关产品推荐

