ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MediaPipe pose_landmark 模块深度解析:四个 PoseLandmark 子图的架构、数据流与实现原理

MediaPipe pose_landmark 模块深度解析:四个 PoseLandmark 子图的架构、数据流与实现原理 MediaPipe pose_landmark 模块深度解析四个 PoseLandmark 子图的架构、数据流与实现原理【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe导读本文以 MediaPipe 仓库中 mediapipe/modules/pose_landmark/README.md 为骨架深入剖析人体姿态关键点Pose Landmark模块的核心实现PoseLandmarkByRoiCpu、PoseLandmarkByRoiGpu、PoseLandmarkCpu、PoseLandmarkGpu四个可复用子图Subgraph的输入输出契约、内部计算管线与协作关系。读完本文你将掌握该模块 33 个人体关键点的编号含义、ROI感兴趣区域驱动的两阶段检测-跟踪机制、CPU/GPU 两种执行路径的差异、模型复杂度lite/full/heavy的切换原理以及 One Euro 滤波等时间平滑策略并能在自己的 MediaPipe 图中直接复用这些子图。模块概览四个子图及其定位pose_landmark模块位于 mediapipe/modules/pose_landmark 目录下README 以表格形式列出了模块对外暴露的四个核心子图子图注册名类型作用输入/推理执行位置PoseLandmarkByRoiCpuPoseLandmarkByRoiCpu在给定 ROI 内检测单个人体的姿态关键点关键点编号方案见 pose_landmark_topology.svgCPU 输入ImageFrame推理在 CPU 执行XNNPACK 委托PoseLandmarkByRoiGpuPoseLandmarkByRoiGpu在给定 ROI 内检测单个人体的姿态关键点GPU 输入GpuBuffer推理在 GPU 执行PoseLandmarkCpuPoseLandmarkCpu对整帧图像检测单个人体的姿态关键点内部自动完成姿态检测与关键点回归CPU 输入推理在 CPU 执行PoseLandmarkGpuPoseLandmarkGpu对整帧图像检测单个人体的姿态关键点GPU 输入推理在 GPU 执行这四个子图构成了整帧入口PoseLandmarkCpu/Gpu→ ROI 定位PoseDetectionToRoi、PoseLandmarksToRoi→ ROI 内关键点回归PoseLandmarkByRoiCpu/Gpu的完整分层前两者面向最终用户负责全图的姿态检测与跟踪后两者是内部复用单元只关心给定的 ROI 里有没有人、关键点在哪。在 BUILD 中这四个子图通过mediapipe_simple_subgraph宏注册为可被其他图直接以 Calculator 形式引用的节点如register_as PoseLandmarkCpu上层图如 pose_tracking_cpu.pbtxt只需声明calculator: PoseLandmarkCpu即可使用。33 个姿态关键点拓扑编号与坐标系约定README 中引用的 pose_landmark_topology.svg 定义了本模块输出的关键点拓扑。根据 pose_landmark_by_roi_cpu.pbtxt 与 pose_landmark_cpu.pbtxt 中注释的完整编号清单33 个关键点依次为头部0-100 鼻尖1 左眼内2 左眼3 左眼外4 右眼内5 右眼6 右眼外7 左耳8 右耳9 嘴左10 嘴右躯干与上肢11-2211 左肩12 右肩13 左肘14 右肘15 左腕16 右腕17 左手小指18 右手小指19 左手食指20 右手食指21 左手拇指22 右手拇指下肢23-3223 左髋24 右髋25 左膝26 右膝27 左踝28 右踝29 左足跟30 右足跟31 左脚趾尖32 右脚趾尖。子图输出两类坐标系下的关键点LANDMARKSNormalizedLandmarkList归一化像素坐标表示3D 人体对象投影到 2D 图像表面后的关键点位置WORLD_LANDMARKSLandmarkList以两髋中点为原点的真实世界 3D 坐标单位为米拓扑与 LANDMARKS 完全一致但描述的是 3D 对象本身。这两套坐标同时输出的设计使得上层应用既可以做 2D 叠加渲染也可以直接做 3D 姿态分析例如计算关节角度、估计动作幅度。PoseLandmarkByRoiCpu / ByRoiGpuROI 内关键点回归子图这是模块中最底层的单次回归单元。README 指出它detects landmarks of a single body pose且要求执行时在mediapipe/modules/pose_landmark/下存在pose_landmark_lite.tflite、pose_landmark_full.tflite或pose_landmark_heavy.tflite三者之一具体加载哪个由MODEL_COMPLEXITY输入侧包决定。输入输出契约以 pose_landmark_by_roi_cpu.pbtxt 为例该子图暴露的接口为方向标签类型说明输入流IMAGE:imageImageFrameGPU 版为 GpuBuffer待处理的图像输入流ROI:roiNormalizedRect图像中人体所在的感兴趣区域输入侧包ENABLE_SEGMENTATIONbool是否预测分割掩膜未指定时默认 false输入侧包MODEL_COMPLEXITYint模型复杂度 0/1/2未指定时默认 1输出流LANDMARKS:landmarksNormalizedLandmarkListROI 内 33 个姿态关键点输出流AUXILIARY_LANDMARKSNormalizedLandmarkList用于推导下一帧 ROI 的辅助关键点输出流WORLD_LANDMARKSLandmarkList真实世界 3D 关键点米原点在两髋中点输出流SEGMENTATION_MASKImageCPU 为 VEC32F1GPU 为 RGBA人体分割掩膜可选图中注释还给出了一个标准的实例化片段可直接复制到自定义图中node { calculator: PoseLandmarkByRoiCpu input_side_packet: MODEL_COMPLEXITY:model_complexity input_side_packet: ENABLE_SEGMENTATION:enable_segmentation input_stream: IMAGE:image input_stream: ROI:roi output_stream: LANDMARKS:landmarks output_stream: SEGMENTATION_MASK:segmentation_mask }需要注意的一个边界行为如果给定 ROI 内不存在人体则该时间戳下LANDMARKS流不会产生输出包MediaPipe 框架会内部通知下游 Calculator 该包的缺失避免它们无谓地阻塞等待。这要求下游节点能够容忍空时间戳。内部计算管线从 pose_landmark_by_roi_cpu.pbtxt 可以看出子图内部依次执行四类节点图像属性ImagePropertiesCalculator读取输入图尺寸供后续坐标反投影使用ROI 裁剪与张量化ImageToTensorCalculator将 ROI 裁剪并变换为 256×256 的张量keep_aspect_ratio: true保持 ROI 宽高比因此在张量四周可能产生 letterbox黑边填充同时输出LETTERBOX_PADDING与MATRIX变换矩阵供坐标还原输入张量归一化到 [0.0, 1.0]。GPU 版额外设置了gpu_origin: TOP_LEFT以对齐 GPU 纹理坐标系模型推理PoseLandmarkModelLoader根据MODEL_COMPLEXITY加载对应 tflite 模型InferenceCalculator执行推理。CPU 版显式配置了delegate { xnnpack {} }XNNPACK 委托GPU 版不指定委托而走默认 GPU 路径解码与反投影TensorsToPoseLandmarksAndSegmentation把输出张量解码为关键点、辅助关键点、世界坐标与分割掩膜PoseLandmarksAndSegmentationInverseProjection结合IMAGE_SIZE、ROI、LETTERBOX_PADDING与MATRIX把 ROI 局部坐标反投影回整帧图像的全局坐标。其中ROI 局部坐标 → 整图全局坐标的反投影是 ROI 子图与整帧子图正确衔接的关键上层传入的 ROI 是归一化矩形内部裁剪后模型看到的是 letterbox 图像所有关键点必须先按 letterbox 偏移修正、再按变换矩阵映射回原始图像输出的坐标才能与原始图像对齐。相关依赖 Calculator 在 BUILD 中注册为pose_landmarks_and_segmentation_inverse_projection包括LandmarkProjectionCalculator、WorldLandmarkProjectionCalculator与LandmarkLetterboxRemovalCalculator等。CPU 版与 GPU 版的差异对比 pose_landmark_by_roi_gpu.pbtxt差异集中在输入图像类型ImageFrameCPUvs GpuBufferGPU张量变换GPU 版ImageToTensorCalculator增加gpu_origin: TOP_LEFT推理CPU 版InferenceCalculator显式声明 XNNPACK 委托GPU 版不声明分割掩膜输出格式CPU 为ImageFormat::VEC32F1单通道浮点图GPU 为 RGBA 且 R 与 A 通道携带相同掩膜值便于在 GPU 渲染管线中直接使用。PoseLandmarkCpu / PoseLandmarkGpu整帧检测与跟踪子图PoseLandmarkCpu与PoseLandmarkGpu是面向整帧图像的高层子图。README 描述其为Detects landmarks of a single body pose而 pose_landmark_cpu.pbtxt 进一步点明其设计目标尽可能跳过姿态检测pose detection利用上一帧已检测/预测的关键点处理新图像——这是实时姿态跟踪性能的核心来源。输入输出契约相比 ROI 子图整帧子图新增了三个与跟踪相关的输入侧包输入侧包类型默认行为作用SMOOTH_LANDMARKSbooltrue是否跨帧滤波关键点以减小抖动ENABLE_SEGMENTATIONboolfalse是否预测分割掩膜SMOOTH_SEGMENTATIONbooltrue是否跨帧滤波分割掩膜MODEL_COMPLEXITYint1可选 0/1/2关键点模型复杂度精度与延迟随数值上升USE_PREV_LANDMARKSbool缺省或 true是否用上一帧关键点辅助定位当前帧关键点输出方面除LANDMARKS、WORLD_LANDMARKS、SEGMENTATION_MASK外还额外暴露三个调试/扩展输出DETECTION检测到的人体 Detection、ROI_FROM_LANDMARKS由关键点推导的 ROI与ROI_FROM_DETECTION由检测框推导的 ROI。检测-跟踪两阶段循环机制从 pose_landmark_cpu.pbtxt 的节点拓扑可以还原出完整的控制流上一帧 ROI 门控GateCalculator在USE_PREV_LANDMARKS为真时放行上一帧由关键点推导出的 ROI存在性检测PacketPresenceCalculator判断是否存在来自上一帧的 ROI姿态检测节流第二个GateCalculator在存在上一帧 ROI时直接丢弃当前帧图像不再做姿态检测否则放行图像触发新一轮PoseDetectionCpu姿态检测。这就是尽量跳过姿态检测的实现方式ROI 生成PoseDetectionToRoi把检测框转换为 ROI同时由上一帧关键点通过PoseLandmarksToRoi生成候选 ROIROI 合并MergeCalculator优先选择上一帧关键点 ROI存在时跳过检测分支否则采用检测 ROI得到pose_rectROI 内回归将pose_rect与整帧图像送入PoseLandmarkByRoiCpu/Gpu完成关键点回归反馈回路PreviousLoopbackCalculator把当前帧由关键点推导的 ROI 缓存待下一帧到达时以下一帧时间戳重新发出形成检测-跟踪的闭环。图中通过input_stream_info { tag_index: LOOP back_edge: true }显式声明了回边注释说明首帧到达时会触发一次 timestamp bound 更新以跳启反馈回路。这套机制意味着只要上一帧成功跟踪到人体当前帧就完全跳过昂贵的姿态检测pose_detection 模块仅执行 ROI 内的轻量关键点回归从而显著提升实时吞吐。滤波与掩膜后处理回归结果在输出前还要经过两级平滑见下文滤波子图详解分割掩膜则经PoseSegmentationFiltering滤波后由FromImageCalculator从统一的 Image 类型转换为 CPU 的 ImageFrame或 GPU 的 GpuBuffer再对外输出。模型复杂度MODEL_COMPLEXITY 与三档模型切换MODEL_COMPLEXITY是贯穿全部子图的关键参数取值为0、1、2三个整数README 及各 pbtxt 注释均指出关键点精度与推理延迟通常会随复杂度数值增大而上升未指定时默认 1。其底层实现位于 pose_landmark_model_loader.pbtxtSwitchContainer以model_complexity为选择信号通过三个ConstantSidePacketCalculator分别映射到三份模型资源复杂度 0 →mediapipe/modules/pose_landmark/pose_landmark_lite.tflite复杂度 1 →mediapipe/modules/pose_landmark/pose_landmark_full.tflite复杂度 2 →mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite随后ResourceProviderCalculator以资源方式读取模型文件TfLiteModelCalculator将其转换为tflite::FlatBufferModel作为MODEL输出侧包交给InferenceCalculator。三份模型文件由 BUILD 中的mediapipe_files声明pose_landmark_lite.tflite、pose_landmark_full.tflite、pose_landmark_heavy.tflite运行前需确保对应路径存在。实际部署时轻量级应用可选用 lite 以降低延迟对精度敏感的应用可选用 heavy并通过输入侧包在运行期动态切换无需改动图结构。时间平滑PoseLandmarkFiltering 与 One Euro 滤波针对视频流的抖动问题模块提供了 pose_landmark_filtering.pbtxt 子图注册名PoseLandmarkFiltering对三类关键点分别做可见性平滑 坐标平滑关键点可见性visibility经VisibilitySmoothingCalculator低通滤波alpha: 0.1关键点坐标经LandmarksSmoothingCalculator使用One Euro 滤波器其中归一化关键点配置为min_cutoff: 0.05、beta: 80.0、derivate_cutoff: 1.0。注释给出的参数含义非常实用min_cutoff 0.05 在关键点静止时产生约 0.01 的 EMA 系数beta 80.0 配合 min_cutoff 0.05 在快速运动时产生约 0.94 的 EMA 系数derivate_cutoff 1.0 对应约 0.17 的速度 EMA系数——即静止时强烈平滑、运动时快速跟随的自适应特性世界坐标关键点同样使用 One Euro 滤波min_cutoff: 0.1、beta: 40.0并设置disable_value_scaling: true因为世界坐标以米为单位的真实 3D 坐标其尺度不依赖人体在图像中的大小辅助关键点平滑强度更高min_cutoff: 0.01、beta: 10.0注释解释这是为了让用于下一帧 ROI 裁剪的辅助关键点在人体静止时非常稳定同时仍能对突然运动做出足够响应。整个滤波开关由SwitchContainer根据ENABLE输入侧包在不过滤no_filter与One Euro 滤波之间切换对应SMOOTH_LANDMARKS参数。分割掩膜则由 pose_segmentation_filtering.pbtxt 中的SegmentationSmoothingCalculator做跨帧平滑受SMOOTH_SEGMENTATION控制以PreviousLoopbackCalculator实现帧间回边。ROI 推导从关键点与检测框到归一化矩形ROI 是连接检测与回归两阶段的桥梁模块内有两个 ROI 推导子图pose_landmarks_to_roi.pbtxtPoseLandmarksToRoi将关键点列表经LandmarksToDetectionCalculator转为紧密包围全部关键点的 Detection再由AlignmentPointsRectsCalculator依据中心与对齐点rotation_vector_start_keypoint_index: 0、end: 1、目标角 90°生成带旋转的矩形最后经RectTransformationCalculator以训练期一致的边距放大scale_x: 1.25、scale_y: 1.25、square_long: true取长边构正方形得到用于下一帧裁剪的归一化 ROIpose_detection_to_roi.pbtxtPoseDetectionToRoi将姿态检测框转换为同样经过 1.25 倍放大的 ROI作为没有上一帧关键点可用时的初始化路径。其注释明确说明该图后续可能变更不应被直接使用即这两个子图是内部实现细节上层用户应通过PoseLandmarkCpu/Gpu间接使用。端到端示例pose_tracking_cpu 中的组合方式要理解这四个子图如何被真实应用可参考 pose_tracking_cpu.pbtxt该图以input_video为输入先用FlowLimiterCalculator做背压节流首帧直通之后等待下游完成后才放行下一帧将图中在飞图像数限制为 1防止实时移动应用中出现排队导致的延迟与内存膨胀再把节流后的图像送入PoseLandmarkCpu并开启ENABLE_SEGMENTATION最终由PoseRendererCpu子图将关键点、分割掩膜、检测框与 ROI 一并渲染到output_video上同时透出pose_landmarks流供业务消费。对应地pose_tracking_gpu.pbtxt 使用PoseLandmarkGpu与PoseRendererGpu其余拓扑保持一致。渲染子图pose_renderer_cpu.pbtxt、pose_renderer_gpu.pbtxt以及关键点到渲染数据的转换子图 pose_landmarks_to_render_data.pbtxt 均在 graphs/pose_tracking/subgraphs 目录下可作为自绘关键点连接线的参考实现。构建与复用指引pose_landmark模块的 Bazel 目标定义在 BUILD 中对外注册了pose_landmark_cpu、pose_landmark_gpu、pose_landmark_by_roi_cpu、pose_landmark_by_roi_gpu、pose_landmark_filtering、pose_segmentation_filtering、pose_landmark_model_loader、pose_detection_to_roi、pose_landmarks_to_roi等mediapipe_simple_subgraph目标以及三份 tflite 模型的mediapipe_files声明。依赖关系清晰可查pose_landmark_cpu依赖pose_detection_cpu、pose_landmark_by_roi_cpu、pose_landmark_filtering、pose_landmarks_to_roi等天然形成了检测→ROI→回归→平滑的分层依赖链。在自定义应用图中复用本模块推荐两种方式整帧入口直接实例化PoseLandmarkCpu或PoseLandmarkGpu只需提供IMAGE流与若干可选输入侧包适合大多数场景ROI 入口若你的应用已有独立的姿态检测或区域提议例如人脸/手部 ROI 管线可实例化PoseLandmarkByRoiCpu/Gpu自行提供ROI流从而跳过模块内部的检测逻辑获得更低的端到端延迟。需要注意的运行前提执行时mediapipe/modules/pose_landmark/下必须存在与MODEL_COMPLEXITY对应的 tflite 模型文件PoseLandmarkCpu/Gpu额外要求mediapipe/modules/pose_detection/pose_detection.tflite存在见 pose_landmark_cpu.pbtxt 注释。本文所述输入输出契约与默认值均以当前仓库 mediapipe/modules/pose_landmark 目录下的 pbtxt 源码为准若你使用的 MediaPipe 版本不同请以对应版本的子图定义为最终依据。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表