You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:45:36