MediaPipe姿态检测TFLite模型输出形状解析与使用咨询
MediaPipe Pose TFLite模型Android端输出解析与使用指南
你遇到的问题是因为直接调用的TFLite模型输出是原始多任务结果,而模型卡片标注的[33,5]是经过后处理的最终关键点格式。以下是五个输出的具体含义和使用方法:
输出含义详解
MediaPipe的Pose Landmark TFLite模型是多任务模型,输出包含关键点回归值、人体置信度、热力图和偏移量,用于高精度关键点定位:
- 输出0 ([1, 195]):包含33个关键点的原始回归数据(前165个元素,对应
33*5)+ 模型内部辅助参数(剩余30个,可忽略)。每个关键点的5个参数依次是:归一化x坐标、归一化y坐标、深度z值、可见度置信度、存在性置信度。 - 输出1 ([1, 1]):人体存在置信度,取值0-1,大于0.5可认为图像中存在人体。
- 输出2 ([1, 256, 256, 1]):高分辨率关键点热力图,用于精确定位关键点位置。
- 输出3 ([1, 64, 64, 1]):低分辨率热力图,用于快速初步定位。
- 输出4 ([1, 117]):关键点偏移量数据,结合热力图可进一步优化坐标精度(可选步骤)。
代码示例:提取并处理关键点
以下是从输出中提取33个关键点并转换为像素坐标的Java代码:
try { PoseDetection model = PoseDetection.newInstance(getApplicationContext()); // 创建输入(注意输入图像需和模型要求的224x224尺寸匹配) TensorBuffer inputFeature0 = TensorBuffer.createFixedSize(new int[]{1, 224, 224, 3}, DataType.FLOAT32); inputFeature0.loadBuffer(imageBuffer); // 运行推理 PoseDetection.Outputs outputs = model.process(inputFeature0); TensorBuffer outputFeature0 = outputs.getOutputFeature0AsTensorBuffer(); TensorBuffer outputFeature1 = outputs.getOutputFeature1AsTensorBuffer(); // 1. 检查人体存在置信度 float personConfidence = outputFeature1.getFloatArray()[0]; if (personConfidence < 0.5f) { model.close(); return; // 无人体,终止处理 } // 2. 提取33个关键点数据 float[] rawLandmarkData = outputFeature0.getFloatArray(); float[][] landmarks = new float[33][5]; for (int i = 0; i < 33; i++) { // 从原始数据中复制每个关键点的5个参数 System.arraycopy(rawLandmarkData, i * 5, landmarks[i], 0, 5); } // 3. 将归一化坐标转换为像素坐标(假设输入图像宽高为224x224) int inputWidth = 224; int inputHeight = 224; for (int i = 0; i < 33; i++) { float pixelX = landmarks[i][0] * inputWidth; float pixelY = landmarks[i][1] * inputHeight; float depthZ = landmarks[i][2]; float visibility = landmarks[i][3]; float presence = landmarks[i][4]; // 这里可以使用关键点的像素坐标和置信度进行后续绘制或计算 // Log.d("PoseLandmark", "Point " + i + ": (" + pixelX + ", " + pixelY + ") Visibility: " + visibility); } model.close(); } catch (IOException e) { e.printStackTrace(); }
额外说明
- 模型卡片标注的
[33,5]是后处理后的逻辑输出,而非TFLite模型的原始输出。原始输出包含辅助定位的热力图和偏移量,是为了实现更高精度的关键点检测。 - 如果不需要自定义处理,推荐直接使用MediaPipe Android SDK的Pose解决方案,它已经封装了所有后处理逻辑,无需手动解析TFLite输出。
内容的提问来源于stack exchange,提问作者EinePriseCode
相关产品推荐
相关产品推荐

