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

使用PoseNet实现深蹲检测并触发W键时遇AttributeError问题求助

问题解决:AttributeError: module 'posenet' has no attribute 'estimate_poses'

错误原因

你编写的代码调用了posenet.estimate_poses方法,但当前安装的posenet模块并没有这个API——不同的PoseNet封装库接口差异很大,你的代码逻辑可能来自某个特定版本的PoseNet实现,但实际安装的库不匹配。另外你提到的OpenPose和PoseNet是两个独立的姿势估计模型,OpenPose安装正确不影响PoseNet的使用。

修正方案

1. 适配PyPI官方posenet库的代码

以PyPI上的posenet库(安装命令:pip install posenet)为例,正确的姿势估计流程需要先加载模型、预处理图像、运行预测再解析结果,而非直接调用estimate_poses。以下是修正后的完整代码:

import posenet
import cv2
import tensorflow as tf
import pyautogui

# 加载PoseNet模型(可选50/75/101,数值越大精度越高、速度越慢)
model = posenet.load_model(101)
output_stride = model.output_stride

# 初始化摄像头
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 将OpenCV的BGR图像转换为RGB格式(PoseNet要求输入为RGB)
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # 预处理图像,适配模型输入尺寸
    input_image, output_scale = posenet.process_input(
        image_rgb,
        scale_factor=0.7125,
        output_stride=output_stride
    )

    # 运行模型预测姿势关键点
    with tf.Session(graph=model) as sess:
        heatmaps, offsets, displacement_fwd, displacement_bwd = sess.run(
            model.outputs,
            feed_dict={'image:0': input_image}
        )

    # 解析检测到的人体姿势
    poses, _ = posenet.decode_multiple_poses(
        heatmaps.squeeze(axis=0),
        offsets.squeeze(axis=0),
        displacement_fwd.squeeze(axis=0),
        displacement_bwd.squeeze(axis=0),
        output_stride=output_stride,
        max_pose_detections=10,
        min_pose_score=0.15
    )

    # 将姿势坐标缩放回原图像尺寸
    poses = posenet.scale_poses(poses, output_scale)

    # 深蹲检测逻辑
    for pose in poses:
        # 获取臀部和膝盖关键点(PoseNet标准索引:左臀11、右臀12、左膝13、右膝14)
        left_hip = pose.keypoints[11]
        right_hip = pose.keypoints[12]
        left_knee = pose.keypoints[13]
        right_knee = pose.keypoints[14]

        # 过滤低置信度的关键点,避免误判
        if (left_hip.score < 0.5 or right_hip.score < 0.5 or
            left_knee.score < 0.5 or right_knee.score < 0.5):
            continue

        # 图像坐标系y轴向下,臀部y值大于膝盖时判定为深蹲姿态
        if left_hip.y > left_knee.y and right_hip.y > right_knee.y:
            # 使用pyautogui模拟按下W键(需先安装:pip install pyautogui)
            pyautogui.press('w')
            cv2.putText(frame, "Squat!", (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    # 绘制关键点和骨骼(可选,方便可视化姿态)
    for pose in poses:
        posenet.draw_keypoints(frame, pose.keypoints, min_score=0.5)
        posenet.draw_skeleton(frame, pose.keypoints, min_score=0.5)

    # 显示画面
    cv2.imshow("PoseNet Squat Detector", frame)
    # 按Esc键退出程序
    if cv2.waitKey(1) == 27:
        break

# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()

2. 关键注意事项

  • 原代码中的cv2.waitKey(100)无法模拟按键操作,必须使用pyautogui或pynput这类第三方库实现,安装命令为pip install pyautogui
  • 如果你使用的是其他PoseNet实现(如TensorFlow Hub官方模型、tf-pose-estimation等),需要对应调整代码逻辑以匹配其API
  • 加入关键点置信度过滤能有效减少误判,避免使用低精度的关键点进行姿态判断

内容的提问来源于stack exchange,提问作者tomoegozen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:48:11