基于 Python 和深度学习技术实现的人体姿态识别

news/2024/10/17 17:28:48/

人体姿态识别是计算机视觉领域的一个重要应用,它通过识别人体的关键点和关节位置,能够准确地判断人体的姿态和动作。这项技术可以应用在很多领域,比如运动训练、医疗康复、安保监控等,为人们的生活和工作带来了很大的便利和效益。

基于 Python 和深度学习技术实现的人体姿态识别

在本文中,我们将介绍一种基于 Python 和深度学习技术实现的人体姿态识别方法,通过读取图片或者摄像头捕获的视频流,使用 OpenCV 和 Tensorflow 模型来检测图像中的人体姿态,最终输出一幅图像,标注出身体各个关键点和关节的位置,以及关节之间的连线。

准备工作

在开始实现人体姿态识别之前,我们需要先准备一些必要的工具和材料。首先,需要安装好 Python 环境和相关的库,比如 OpenCV、Tensorflow、Numpy 等。其次,需要下载预训练的 Tensorflow 模型,用于检测图像中的人体姿态。最后,需要一张图片或者摄像头捕获的视频流,作为输入数据。

加载模型和定义参数

在加载模型之前,我们需要先定义一些常量和参数,比如身体部位的编号、关节连线等。具体代码如下:

import cv2
import numpy as np# 定义身体部位编号
body_parts = {0: "Nose",1: "Neck",2: "Right Shoulder",3: "Right Elbow",4: "Right Wrist",5: "Left Shoulder",6: "Left Elbow",7: "Left Wrist",8: "Right Hip",9: "Right Knee",10: "Right Ankle",11: "Left Hip",12: "Left Knee",13: "Left Ankle",14: "Right Eye",15: "Left Eye",16: "Right Ear",17: "Left Ear"
}# 定义关节连线
pose_parts = [[0, 1], [1, 2], [2, 3], [3, 4], [1, 5], [5, 6],[6, 7], [1, 8], [8, 9], [9, 10], [1, 11], [11, 12], [12, 13],[0, 14], [14, 16], [0, 15], [15, 17]
]# 加载预训练的 Tensorflow 模型
net = cv2.dnn.readNetFromTensorflow("graph_opt.pb")

读取图片或者视频流

接下来,我们需要读取图片或者摄像头捕获的视频流,作为输入数据。具体代码如下:

# 读取图片或者视频流
image = cv2.imread("test.jpg")
# cap = cv2.VideoCapture(0)

如果要读取视频流,可以将注释取消掉,并将参数设置为对应的摄像头编号。

处理图像数据

在将图像数据输入到模型之前,我们需要先对图像进行一些处理,将其转换成神经网络需要的输入格式。具体代码如下:

python
# 处理图像数据
blob = cv2.dnn.blobFromImage(image, 1.0, (368, 368), (0, 0, 0), swapRB=False, crop=False)
net.setInput(blob)
output = net.forward()

其中,cv2.dnn.blobFromImage 函数用于将图像转换成神经网络需要的输入格式,即将图像缩放到指定的大小,减去均值,进行归一化等操作。net.setInput 函数用于设置神经网络的输入数据。net.forward 函数用于前向传播计算,得到关键点的坐标。

绘制关键点和关节连线

在得到关键点的坐标之后,我们需要将其绘制出来,以便观察和分析。具体代码如下:

# 绘制关键点和关节连线
points = []
for i in range(len(body_parts)):# 获取可信度prob = output[0, i, 2]# 判断可信度是否达到阈值if prob > 0.5:# 获取关键点坐标x = int

完整代码

import cv2
# 关节标识body_parts={"Nose":0,"Neck":1,"RShoulder":2,"RElbow":3,"RWrist":4,"LShoulder": 5, "LElbow": 6, "LWrist": 7,"RHip":8,"RKnee":9,"RAnkle":10,"LHip":11,"LKnee":12,"LAnkle":13,"REye":14,"LEye":15,"REar":16,"LEar":17}
#关节连线
pose_parts=[["Neck","RShoulder"],["Neck","LShoulder"],["RShoulder","RElbow"],["RElbow","RWrist"],["LShoulder","LElbow"],["LElbow","LWrist"],["Neck","RHip"],["RHip","RKnee"],["RKnee","RAnkle"],["Neck","LHip"], ["LHip","LKnee"], ["LKnee","LAnkle"],["Neck","Nose"],["Nose","REye"], ["REye","REar"],["Nose","LEye"], ["LEye","LEar"]
]
cap=cv2.VideoCapture("a2.jpg")
# cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)
# 加载模型
net=cv2.dnn.readNetFromTensorflow("pose.pb")
while cv2.waitKey(1)<0:ok,frame=cap.read()if not ok:cv2.waitKey()breakwidth=frame.shape[1]height=frame.shape[0]net.setInput(cv2.dnn.blobFromImage(frame,1.0,(368,368),(127,127,127),swapRB=True,crop=False))out=net.forward()out=out[:,:19,:,:]# print(out)points=[]for i in range(len(body_parts)):heatmap=out[0,i,:,:]_,conf,_,point=cv2.minMaxLoc(heatmap)x=(width*point[0])/out.shape[3]y=(height*point[1])/out.shape[2]points.append((int(x),int(y))if conf>0.2 else None)# print(points)for p in pose_parts:partfrom = p[0]partto=p[1]idfrom=body_parts[partfrom]idto=body_parts[partto]if points[idfrom] and points[idto]:# 画线cv2.line(frame,points[idfrom],points[idto],(0,200,0),3)# 画点cv2.ellipse(frame,points[idfrom],(3,3),0,0,360,(0,0,200),cv2.FILLED)cv2.ellipse(frame, points[idto], (3, 3), 0, 0, 360, (0, 0, 200), cv2.FILLED)cv2.imshow("",frame)

效果

在这里插入图片描述


http://www.ppmy.cn/news/107323.html

相关文章

启真医学大模型

启真医学大模型 QiZhenGPT: An Open Source Chinese Medical Large Language Model 本项目利用启真医学知识库构建的中文医学指令数据集&#xff0c;并基于此在LLaMA-7B模型上进行指令精调&#xff0c;大幅提高了模型在中文医疗场景下效果&#xff0c;首先针对药品知识问答发…

X2000 freeRTOS usb_bulk通信

例程 官方例程..\freertos\example\usb\device\gadget_generic_bulk.c&#xff0c;代码如下&#xff1a; #include <common.h> #include <usb/gadget_bulk.h> #include <os.h>static const struct gadget_id bulk_id {.vendor_id 0x1CBE,.product_id 0x…

算法综合应用实验:供给系统问题

目录 实验内容实验流程实验过程伪代码代码实现分析算法复杂度用例测试 总结 实验内容 外星人指的是地球以外的智慧生命。外星人长的是不是与地球上的人一样并不重要&#xff0c;但起码应该符合我们目前对生命基本形式的认识。比如&#xff0c;我们所知的任何生命都离不开液态水…

基于深度学习的人脸识别与人员信息管理软件【python源码+UI界面+功能源码详解】

人脸识别功能演示 摘要&#xff1a;人脸识别&#xff08;Face Recognition&#xff09;是基于人的脸部特征信息进行身份识别的一种生物识别技术&#xff0c;可以用来确认用户身份。本文详细介绍了人脸识别基本的实现原理&#xff0c;并且基于python与pyqt开发了人脸识别与信息管…

C++11新特性:decltype类型推导

上一节所讲的 auto&#xff0c;用于通过一个表达式在编译时确定待定义的变量类型&#xff0c;auto 所修饰的变量必须被初始化&#xff0c;编译器需要通过初始化来确定 auto 所代表的类型&#xff0c;即必须要定义变量。若仅希望得到类型&#xff0c;而不需要(或不能)定义变量的…

计算机视觉实战--OpenCV进行红绿灯识别

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 OpenCV是一个开源的计算机视觉库&#xff0c;可以用于实现各种图像和视频处理任务&#xff0c;包括红绿灯识别。可以帮助自动驾驶汽车、智能交通系统等设备准确地识别红绿灯的状态&#xff0c;以便做出正确的决策。今天&a…

ArcGis系列-java调用GP分析

1,实现流程 创建GPServer,使用ArcgisPro添加GP工具运行,然后使用共享web服务发布运行成功的GP任务根据发布成功的GPServer发布地址&#xff0c;解析出GP服务的输入参数和输出参数前端输入gp服务需要的参数&#xff0c;发送给后端来异步提交后端提交后创建轮询任务等待执行结果…

python常用库汇总

文章目录 文件处理图像处理大数据与科学计算人工智能与机器学习数据库网 络Web 框架安 全 Chardet→字符编码探测器&#xff0c;可以自动检测文本、网页、xml的编码。 colorama →主要用来给文本添加各种颜色&#xff0c;并且非常简单易用。 Prettytable → 主要用于在终端或浏…