1
1
基于深度学习的人体姿态估计系统 基于YOLO12的人体姿态估计系统 姿态估计系统
本项目已经训练好模型,配置好环境可直接使用,运行效果看上图
项目介绍:
软件:Pycharm+Anaconda
环境:python=3.8 opencv-python PySide6 torch1.9
文件:
1.完整程序文件(.py等)
2.UI界面源文件、图标(.ui、.qrc、.py等)
3.测试图片、视频文件(.jpeg、.mp4、.avi等)
功能: 系统可用于姿态估计识别; 支持图片、视频及摄像头进行检测: 界面可实时显示目标位置、目标总数、置信度等信息: 支持检测结果保存;
①选择图片进行对于姿态估计识别检测。
②选择视频进行对于姿态估计识别检测。
③摄像头进行检测对于姿态估计识别检测。
1
以下文字及代码仅供参考学习使用
✅ 正确理解:基于YOLOv12-Pose的人体姿态估计系统
完整的基于 YOLOv8-Pose 的人体姿态估计系统,支持:
✅ 图片 / 视频 / 摄像头实时检测
✅ 姿态关键点可视化(17个点)
✅ UI界面(PySide6)
✅ 登录验证
✅ 结果保存与信息显示
🎯 项目名称:基于深度学习的人体姿态估计系统(YOLOv8-Pose)
📁 一、项目结构
pose_estimation_system/ ├── models/ │ └── yolov8n-pose.pt # 预训练模型 ├── resources/ │ ├── icons/ # 图标文件 │ └── test_images/ # 测试图片 │ └── test_videos/ # 测试视频 ├── ui/ │ ├── login.ui # 登录界面 │ └── main.ui # 主界面 ├── utils/ │ ├── pose_utils.py # 姿态处理函数 │ └── detect.py # 推理代码 ├── main.py # 主程序入口 └── requirements.txt🧩 二、环境配置(requirements.txt)
python==3.8 torch==1.9.0+cu111 torchvision==0.10.0+cu111 opencv-python==4.5.5 PySide6==6.3.0 ultralytics==8.0.0 numpy==1.21.0安装命令:
conda create -n pose_envpython=3.8conda activate pose_env pipinstall-r requirements.txt🔐 三、登录界面(login.ui→login.py)
1. 使用 Qt Designer 设计.ui文件(可导出)
2.login.py—— 登录逻辑
# login.pyfromPySide6.QtWidgetsimportQApplication,QMainWindow,QWidget,QVBoxLayout,QLabel,QLineEdit,QPushButton,QFramefromPySide6.QtCoreimportQtimportsysclassLoginWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于深度学习的人体姿态估计系统")self.setGeometry(400,200,400,300)central_widget=QWidget()self.setCentralWidget(central_widget)layout=QVBoxLayout(central_widget)title_label=QLabel("<h2>基于深度学习的人体姿态估计系统</h2>")title_label.setAlignment(Qt.AlignCenter)layout.addWidget(title_label)# 用户名和密码输入框self.username_input=QLineEdit()self.username_input.setPlaceholderText("请输入用户名")layout.addWidget(self.username_input)self.password_input=QLineEdit()self.password_input.setPlaceholderText("请输入密码")self.password_input.setEchoMode(QLineEdit.Password)layout.addWidget(self.password_input)login_btn=QPushButton("立即登录")login_btn.clicked.connect(self.login)layout.addWidget(login_btn)deflogin(self):username=self.username_input.text()password=self.password_input.text()ifusername=="123"andpassword=="123":self.close()self.main_window=MainWindow()self.main_window.show()else:QMessageBox.warning(self,"错误","用户名或密码错误!")classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("主界面")self.setGeometry(100,100,1200,800)self.init_ui()definit_ui(self):# 添加主界面内容(图片、视频等)pass🖼️ 四、姿态估计核心:detect.py
# detect.py""" 基于 YOLOv8-Pose 的人体姿态估计 """importcv2importnumpyasnpfromultralyticsimportYOLOimporttorchclassPoseDetector:def__init__(self,model_path="models/yolov8n-pose.pt"):self.model=YOLO(model_path)self.class_names=["person"]self.keypoints_names=["nose","left eye","right eye","left ear","right ear","left shoulder","right shoulder","left elbow","right elbow","left wrist","right wrist","left hip","right hip","left knee","right knee","left ankle","right ankle"]defdetect_pose(self,frame,conf_threshold=0.5):results=self.model(frame,conf=conf_threshold,iou=0.45)poses=[]forresultinresults[0].poses:ifresultisNone:continuekeypoints=result.xyxy.cpu().numpy()[0]# 获取关键点坐标confidences=result.conf.cpu().numpy()[0]boxes=result.boxes.xyxy.cpu().numpy()[0]# 提取关键点kpts=[]foriinrange(17):x,y,conf=keypoints[i]ifconf>0.3:# 关键点置信度阈值kpts.append((int(x),int(y)))else:kpts.append(None)poses.append({'bbox':boxes,'kpts':kpts,'confidence':float(confidences[0])})returnposesdefdraw_pose(self,frame,poses):"""绘制姿态结果"""forposeinposes:bbox=pose['bbox']kpts=pose['kpts']conf=pose['confidence']# 绘制边界框cv2.rectangle(frame,(int(bbox[0]),int(bbox[1])),(int(bbox[2]),int(bbox[3])),(0,255,0),2)cv2.putText(frame,f"Person{conf:.2f}",(int(bbox[0]),int(bbox[1])-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),2)# 绘制关键点fori,ptinenumerate(kpts):ifptisnotNone:cv2.circle(frame,pt,5,(0,0,255),-1)cv2.putText(frame,self.keypoints_names[i],pt,cv2.FONT_HERSHEY_SIMPLEX,0.4,(255,0,0),1)# 连接骨骼connections=[(0,1),(0,2),(1,3),(2,4),(0,5),(0,6),(5,7),(7,9),(6,8),(8,10),(5,11),(6,12),(11,13),(13,15),(12,14),(14,16)]fori,jinconnections:ifkpts[i]isnotNoneandkpts[j]isnotNone:cv2.line(frame,kpts[i],kpts[j],(255,0,0),2)returnframe🖥️ 五、主界面(main.py)
# main.pyfromPySide6.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QHBoxLayout,QFileDialog,QGroupBox,QTextEdit,QSliderfromPySide6.QtGuiimportQPixmap,QImagefromPySide6.QtCoreimportQt,QTimerimportcv2importsysfromdetectimportPoseDetectorclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("人体姿态估计系统")self.setGeometry(100,100,1200,800)self.detector=PoseDetector()self.init_ui()self.timer=QTimer()self.timer.timeout.connect(self.update_frame)self.cap=Nonedefinit_ui(self):central_widget=QWidget()self.setCentralWidget(central_widget)layout=QVBoxLayout(central_widget)# 上方:原始图 vs 检测图top_layout=QHBoxLayout()self.original_label=QLabel("原始图像")self.detected_label=QLabel("检测结果")top_layout.addWidget(self.original_label)top_layout.addWidget(self.detected_label)layout.addLayout(top_layout)# 控制区control_group=QGroupBox("控制面板")control_layout=QVBoxLayout()self.image_btn=QPushButton("上传图片")self.image_btn.clicked.connect(self.load_image)control_layout.addWidget(self.image_btn)self.video_btn=QPushButton("打开视频")self.video_btn.clicked.connect(self.open_video)control_layout.addWidget(self.video_btn)self.camera_btn=QPushButton("打开摄像头")self.camera_btn.clicked.connect(self.open_camera)control_layout.addWidget(self.camera_btn)self.save_btn=QPushButton("保存结果")self.save_btn.clicked.connect(self.save_result)control_layout.addWidget(self.save_btn)self.stop_btn=QPushButton("停止")self.stop_btn.clicked.connect(self.stop_detection)control_layout.addWidget(self.stop_btn)control_group.setLayout(control_layout)layout.addWidget(control_group)# 信息显示区info_group=QGroupBox("检测信息")info_layout=QVBoxLayout()self.info_text=QTextEdit()info_layout.addWidget(self.info_text)info_group.setLayout(info_layout)layout.addWidget(info_group)# 初始化图像标签self.original_label.setPixmap(QPixmap("resources/test_images/default.jpg"))self.detected_label.setPixmap(QPixmap("resources/test_images/default.jpg"))defload_image(self):path,_=QFileDialog.getOpenFileName(self,"选择图片","","Image Files (*.jpg *.png *.bmp)")ifpath:self.current_image=cv2.imread(path)self.display_image(self.current_image,self.original_label)self.detect_and_display()defopen_video(self):path,_=QFileDialog.getOpenFileName(self,"选择视频","","Video Files (*.mp4 *.avi)")ifpath:self.cap=cv2.VideoCapture(path)self.timer.start(30)# 30 FPSdefopen_camera(self):self.cap=cv2.VideoCapture(0)self.timer.start(30)defupdate_frame(self):ret,frame=self.cap.read()ifret:self.display_image(frame,self.original_label)detected_frame=self.detector.draw_pose(frame.copy(),self.detector.detect_pose(frame))self.display_image(detected_frame,self.detected_label)self.update_info(frame)defdetect_and_display(self):ifhasattr(self,'current_image'):detected_frame=self.detector.draw_pose(self.current_image.copy(),self.detector.detect_pose(self.current_image))self.display_image(detected_frame,self.detected_label)self.update_info(self.current_image)defdisplay_image(self,image,label):h,w=image.shape[:2]scale=min(400/w,400/h)new_w,new_h=int(w*scale),int(h*scale)resized=cv2.resize(image,(new_w,new_h))rgb=cv2.cvtColor(resized,cv2.COLOR_BGR2RGB)qimg=QImage(rgb.data,new_w,new_h,new_w*3,QImage.Format_RGB888)pixmap=QPixmap.fromImage(qimg)label.setPixmap(pixmap)defupdate_info(self,frame):poses=self.detector.detect_pose(frame)info=f"目标总数:{len(poses)}\n"fori,poseinenumerate(poses):info+=f"目标{i}: 置信度{pose['confidence']:.2f}\n"self.info_text.setText(info)defsave_result(self):ifhasattr(self,'current_image'):path,_=QFileDialog.getSaveFileName(self,"保存结果","","PNG Image (*.png)")ifpath:cv2.imwrite(path,self.current_image)QMessageBox.information(self,"成功","结果已保存!")defstop_detection(self):self.timer.stop()ifself.cap:self.cap.release()self.cap=NonedefcloseEvent(self,event):ifself.cap:self.cap.release()event.accept()defmain():app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec_())if__name__=="__main__":main()📦 六、运行方式
- 下载预训练模型:
wgethttps://github.com/ultralytics/assets/releases/download/v8.0.0/yolov8n-pose.pt -O models/yolov8n-pose.pt- 运行程序:
python main.pyYOLOv8-Pose可轻松构建高性能人体姿态估计系统,支持多模态输入,具备工业级应用潜力。