AI健身教练开发日记:从骨骼检测到动作评分
引言
你是否也遇到过这样的困境:想开发一个智能健身APP,却被动作分析模块卡住?作为全栈开发者,我们往往擅长前后端开发,但当涉及到计算机视觉和AI模型部署时,环境配置就成了拦路虎。特别是参加48小时编程比赛时,谁会为了短期项目去买昂贵的显卡呢?
这就是为什么我们需要按天计费的GPU开发环境。本文将带你一步步实现一个AI健身教练的核心功能——从人体骨骼关键点检测到动作评分。整个过程不需要你购买任何硬件,只需一个预配置好的开发环境,就能快速搭建原型。
人体骨骼关键点检测(Pose Estimation)是计算机视觉的基础技术,它通过识别图像中人体关节的位置(如肩膀、肘部、手腕等),构建出人体的"火柴人"模型。有了这个模型,我们就能分析用户的健身动作是否标准,计算动作幅度,甚至给出改进建议。
1. 环境准备:快速搭建开发平台
1.1 选择适合的开发环境
对于短期项目或比赛,我强烈推荐使用预配置的云GPU环境。这些环境通常已经安装了PyTorch、OpenCV等常用库,省去了繁琐的环境配置时间。
在CSDN星图镜像广场,你可以找到包含人体姿态估计相关库的预置镜像,如:
- PyTorch + CUDA基础镜像
- OpenPose预装镜像
- MMPose全家桶镜像
1.2 一键部署开发环境
选择好镜像后,部署非常简单:
# 以PyTorch基础镜像为例 docker pull pytorch/pytorch:latest docker run -it --gpus all -p 8888:8888 pytorch/pytorch:latest这样你就获得了一个包含GPU支持的PyTorch开发环境,可以直接开始编码。
2. 实现骨骼关键点检测
2.1 选择适合的模型
对于健身应用,我们需要平衡精度和速度。以下是几个常用选择:
- OpenPose:检测精度高,支持多人检测,但速度较慢
- MoveNet:Google推出的轻量级模型,速度快但只支持单人
- MMPose:模块化设计,方便定制和扩展
2.2 使用预训练模型快速实现
以MoveNet为例,下面是实现关键点检测的完整代码:
import tensorflow as tf import cv2 import numpy as np # 加载MoveNet Lightning模型 model = tf.saved_model.load('movenet_singlepose_lightning') movenet = model.signatures['serving_default'] # 处理输入图像 def process_image(image_path): image = tf.io.read_file(image_path) image = tf.image.decode_jpeg(image) image = tf.expand_dims(image, axis=0) image = tf.cast(tf.image.resize_with_pad(image, 192, 192), dtype=tf.int32) return image # 运行推理 image = process_image('test.jpg') output = movenet(image) keypoints = output['output_0'].numpy()[0][0] # 可视化结果 def draw_keypoints(image, keypoints): for y, x, confidence in keypoints: if confidence > 0.3: # 只绘制置信度高的关键点 cv2.circle(image, (int(x*image.shape[1]), int(y*image.shape[0])), 5, (0,255,0), -1) return image original_image = cv2.imread('test.jpg') result_image = draw_keypoints(original_image, keypoints) cv2.imwrite('result.jpg', result_image)这段代码能在几秒内完成一个人的骨骼关键点检测,非常适合快速原型开发。
3. 从骨骼点到动作评分
3.1 计算关节角度
有了关键点位置,我们可以计算关节角度来判断动作是否标准。以深蹲为例:
def calculate_knee_angle(left_hip, left_knee, left_ankle): # 将坐标转换为向量 thigh = np.array(left_hip) - np.array(left_knee) shin = np.array(left_ankle) - np.array(left_knee) # 计算夹角(弧度) cosine_angle = np.dot(thigh, shin) / (np.linalg.norm(thigh) * np.linalg.norm(shin)) angle = np.arccos(cosine_angle) # 转换为角度 return np.degrees(angle) # 假设我们已经获取了关键点坐标 left_hip = [keypoints[11][1], keypoints[11][0]] # y,x left_knee = [keypoints[13][1], keypoints[13][0]] left_ankle = [keypoints[15][1], keypoints[15][0]] knee_angle = calculate_knee_angle(left_hip, left_knee, left_ankle) print(f"膝关节角度: {knee_angle:.1f}°")3.2 动作评分系统
基于关节角度和位置关系,我们可以设计简单的评分规则:
def squat_score(knee_angle, hip_angle): # 理想深蹲角度范围 ideal_knee = (90, 120) ideal_hip = (60, 90) # 计算偏离程度 knee_dev = max(0, ideal_knee[0]-knee_angle, knee_angle-ideal_knee[1]) hip_dev = max(0, ideal_hip[0]-hip_angle, hip_angle-ideal_hip[1]) # 计算得分(0-100) score = 100 - (knee_dev + hip_dev) * 2 return max(0, min(100, score)) # 示例使用 squat_score = squat_score(knee_angle, hip_angle) print(f"深蹲动作得分: {squat_score}/100")4. 优化与部署技巧
4.1 性能优化建议
- 模型选择:比赛场景优先选择轻量级模型(如MoveNet)
- 分辨率调整:适当降低输入图像分辨率可显著提升速度
- 批处理:如果有多个用户,使用批处理提高GPU利用率
4.2 常见问题解决
- 关键点抖动:加入简单滤波算法平滑关键点轨迹
- 遮挡处理:使用历史帧信息预测被遮挡关节位置
- 多人场景:切换到支持多人检测的模型(如OpenPose)
4.3 快速部署API服务
使用Flask快速创建评分API:
from flask import Flask, request, jsonify import cv2 import numpy as np app = Flask(__name__) @app.route('/analyze', methods=['POST']) def analyze(): # 获取上传的图像 file = request.files['image'] image = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR) # 这里添加骨骼检测和评分逻辑 # ... return jsonify({ 'score': squat_score, 'angles': { 'knee': knee_angle, 'hip': hip_angle } }) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)总结
通过本文的实践,我们完成了AI健身教练的核心功能开发:
- 快速搭建环境:使用预配置的GPU镜像,省去环境配置时间
- 骨骼关键点检测:选择适合的模型(如MoveNet)实现实时检测
- 动作评分系统:基于关节角度设计简单的评分逻辑
- API服务部署:使用Flask快速创建评分接口
现在,你可以将这些模块整合到你的健身APP原型中,在比赛中展示你的AI能力了。记住,原型开发的关键是快速验证核心功能,不必追求完美。有了这个基础,你可以继续扩展更多健身动作的分析和评分功能。
💡获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。