使用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
相关产品推荐
相关产品推荐

