MoveNet流程解析

MoveNet是一个基于CenterNet模型的轻量级人体姿态估计模型,由Google于2021年提出。MoveNet采用自下而上的检测策略,能够检测人体的17个关键点,包括头部、颈部、肩部、肘部、手腕、髋部、膝盖和脚踝等关键点。其轻量级设计使其可以在计算资源受限的设备上运行,例如移动设备和嵌入式设备。此外,MoveNet还具有高效的推理速度和较低的模型大小,使其适合实时的应用场景,如健身跟踪、手势识别和虚拟试衣等。
模型主要分为三部分:Backbone、Header、后处理
Backbone:特征提取器采用MobileNet2+特征金字塔(FPN),实现高分辨率(步长为4)且语义丰富的特征图。高分辨率(步长为4)的理解:步长为4就意味着特征图上的一个像素点对应着原图像44的像素点,因此特征图具有高分辨的特征。
主干网络
Header:经过Backbone网络后输出四个Header,如下图所示:
在这里插入图片描述
B代表batchsize 、h,w代表特征图的宽高、k代表预测人体检测关键点的数量
Center:预测人体的几何中心点。数据预处理:官方博客采用,将所有人的关键点求算术平均数(arithmetic mean)解出中心点的坐标。
Keypoint Regression:预测特征图中每个人的k个关键点与其中心坐标偏移值,分为x,y值,所有有2k通道。
Keypoint Heatmap:当前特征图中所有人的关键点
Local Offsets:每个关键点的偏移场。降采样会导致特征图存在量化误差,即实际原图(192
192)x=0与x=3映射到特征图中(48*48)是同一个像素点,因此需要加一个偏移。
通过Backbone提取出4个Header后,通过下图的后处理部分,获取最靠近图片中心的人体所有关键点信息
在这里插入图片描述
第一步:对于Center Head,与一个图片中心位置加权矩阵相乘,选出最靠近图像中心的人体中心的坐标

第二步:根据选出的人体中心点坐标,从Regression Head 通道中选取对应的关键点x、y值坐标,得到最靠近图像中心的人体的粗略的关键点信息。

第三步:根据粗略的关键点信息,构造一个以这个关键点坐标为中心生成一个权重矩阵,直接以等差数列0-47(47的原因是当关键点信息在边界时能够覆盖整个特征图(48*28)),中心点最小为0,往外依次递增的权重系数矩阵。然后用Heatmap Header除于这个权重矩阵,求解出来的结果最大的就是该人体的关键点。原因:如果Heatmap中这个关键点与粗略关键点最靠近,说明这个关键点就属于最靠近图像中心的人的关键点,求解出来的结果也是最大的。

第四步:根据坐标点将Local offset Header中对应的偏移值加上就可以得到结果了

参考链接:
2021轻量级人体姿态估计模型修炼之路(附谷歌MoveNet复现经验)

Next-Generation Pose Detection with MoveNet and TensorFlow.js

### 使用 MoveNet 进行姿态估计的方法 MoveNet 是一种轻量级的人体姿态估计框架,适用于多种应用场景。以下是关于如何使用 MoveNet 的详细介绍。 #### 安装依赖库 为了运行 MoveNet,需要安装必要的 Python 库以及 PyTorch 框架。可以通过以下命令完成环境配置: ```bash pip install torch torchvision pip install tensorflow_hub # 如果需要加载 TensorFlow Hub 上的预训练模型 ``` 如果计划在 GPU 设备上加速推理过程,则需确保已正确安装 CUDA 和 cuDNN 支持[^1]。 --- #### 加载预训练模型 PyTome 提供了两种主要版本的 MoveNet 模型:`Thunder`(高精度版)和 `Lightning`(快速版)。可以根据具体需求选择合适的模型。 对于 Thunder 版本: ```python import torch from movenet.models import MoveNet model = MoveNet(model_type="thunder", pretrained=True) model.eval() ``` 对于 Lightning 版本: ```python model = MoveNet(model_type="lightning", pretrained=True) model.eval() ``` 上述代码片段展示了如何通过官方 API 导入并初始化预训练模型。 --- #### 输入数据准备 MoveNet 接受标准化后的 RGB 图像作为输入,通常建议将图像调整为固定大小 (256x256 或更高分辨率),以便提高预测性能。 以下是一个简单的图像预处理流程: ```python from PIL import Image import numpy as np from torchvision.transforms.functional import to_tensor, resize def preprocess_image(image_path): image = Image.open(image_path).convert('RGB') resized_image = resize(image, size=(256, 256)) # 调整尺寸至 256x256 input_tensor = to_tensor(resized_image) # 转换为张量 normalized_input = input_tensor.unsqueeze(0) # 添加批次维度 return normalized_input ``` 调用该函数即可获取适配 MoveNet 的输入张量[^3]。 --- #### 执行前向传播 准备好输入数据后,可以直接将其传递给模型以获得人体关键点坐标。 示例代码如下: ```python input_tensor = preprocess_image("example.jpg") # 替换为目标图片路径 with torch.no_grad(): keypoints_with_scores = model(input_tensor) print(keypoints_with_scores.shape) # 输出形状应为 [batch_size, num_keypoints, 3] ``` 返回的结果包含每帧中检测到的关键点位置及其置信度分数。 --- #### 后处理与可视化 最后一步是对输出结果进行解析,并绘制人体骨架图用于展示效果。可借助 OpenCV 或 Matplotlib 工具包实现这一功能。 样例代码: ```python import cv2 import matplotlib.pyplot as plt def draw_skeleton(image, keypoints, threshold=0.2): skeleton_edges = [ (5, 7), (7, 9), (6, 8), (8, 10), (11, 13), (13, 15), (12, 14), (14, 16), (11, 12), (5, 6), (5, 11), (6, 12) ] for edge in skeleton_edges: kp_a, kp_b = keypoints[edge[0]], keypoints[edge[1]] if kp_a[-1] >= threshold and kp_b[-1] >= threshold: # 置信度过滤 pt_a = tuple(map(int, kp_a[:2])) pt_b = tuple(map(int, kp_b[:2])) cv2.line(image, pt_a, pt_b, color=(0, 255, 0), thickness=2) return image # 绘制骨骼结构 image = cv2.imread("example.jpg") keypoints = keypoints_with_scores.squeeze().numpy() * image.shape[1::-1] result_image = draw_skeleton(image.copy(), keypoints) plt.imshow(cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB)) plt.axis('off'); plt.show() ``` 此脚本会生成带有标注骨骼线条的最终效果图[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值