如何获取MediaPipe Holistic姿态关键点的置信度分数
MediaPipe Holistic 单关键点置信度获取方案
官方发布的Python预编译包早期版本确实没有直接暴露单姿态关键点的检测置信度字段,旧版本返回的pose_landmarks结构中每个关键点仅包含x、y、z三个坐标值,和公开反馈的情况一致。目前可行的实现方案分三类,可根据自己的业务需求选择:
- 直接读取内置透传字段(成本最低,适配0.10.0及以上版本)
0.10.0版本之后MediaPipe已经在Python接口透传了BlazePose模型原生输出的两个分数字段,注意不要混淆两个字段的含义:visibility:模型判断关键点是否被遮挡的分数,取值0-1,分数越高代表关键点无遮挡、可见度越好,不是检测位置的置信度presence:模型判断关键点是否存在于画面内的分数,取值0-1,分数越高代表该点真实存在于当前画面的概率越高,大部分场景下可以直接作为关键点的检测置信度使用
读取代码示例:
import cv2 import mediapipe as mp mp_holistic = mp.solutions.holistic # 初始化Holistic模型 holistic = mp_holistic.Holistic( static_image_mode=False, model_complexity=2, min_detection_confidence=0.5 ) cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() if not ret: break img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = holistic.process(img_rgb) if results.pose_landmarks: for point_idx, landmark in enumerate(results.pose_landmarks.landmark): point_presence_score = landmark.presence point_vis_score = landmark.visibility # 后续业务逻辑直接调用两个分数即可 cv2.imshow("frame", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() - 源码编译透传原生置信度(精度最高,适配所有版本)
如果你需要的是模型推理时heatmap峰值对应的位置检测置信度(比presence字段更贴近位置回归的准确程度),官方预编译包没有暴露这个数值,需要自行修改源码编译:- 拉取MediaPipe对应版本的源码,配置Bazel编译环境
- 找到BlazePose后处理对应的PoseLandmarkerCalculator源码,在组装Landmark proto的逻辑中,把模型输出张量里每个关键点对应的heatmap置信度写入Landmark的自定义扩展字段
- 重新编译Python安装包,本地安装后即可直接读取对应数值
这个方案拿到的是模型原生计算的真实置信度,缺点是编译环境配置门槛较高,整个流程大概需要40分钟以上。
- 重投影误差计算近似置信度(零改造成本,适合快速验证)
如果不想升级版本、也不想编译源码,可以通过几何计算得到近似置信度:- 提取MediaPipe返回的3D姿态关键点坐标,通过solvePnP算法计算人体相对于相机的位姿
- 将3D人体模型的标准关键点通过位姿矩阵重投影到2D画面,计算每个MediaPipe输出关键点和重投影点的欧氏距离
- 将距离做0-1归一化处理,距离越小置信度越高,即可得到近似的关键点置信度
这个方案不需要修改MediaPipe任何代码,但是计算结果是近似值,精度低于模型原生输出的置信度,仅适合对精度要求不高的快速验证场景。
注意:目前不存在无需升级版本、无需修改源码、无需近似计算就能直接拿到原生单关键点检测置信度的方案,网上很多教程把
visibility字段当成检测置信度使用,实际业务中如果涉及遮挡场景很容易出问题,需要根据自己的场景判断是否适用。
内容的提问来源于stack exchange,提问作者Ronnen Levinson
相关产品推荐
相关产品推荐

