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

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

基于 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()
        break
    width=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)

效果

在这里插入图片描述

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
基于深度学习的人体姿态估计是一种通过计算机视觉技术来推断人体姿势的方法。它可以在图像或视频中检测和跟踪人体的关键点,如头部、肩膀、手臂、腿部等,从而实现对人体姿态的准确估计。 在Python中,有许多流行的深度学习框架可以用于人体姿态估计,如TensorFlow、PyTorch和OpenPose等。这些框架提供了预训练的模型和相应的API,使得实现人体姿态估计变得更加简单。 以下是一个基于OpenPose的Python示例代码,用于实现人体姿态估计: ```python import cv2 import numpy as np import matplotlib.pyplot as plt # 加载OpenPose模型 net = cv2.dnn.readNetFromTensorflow('pose_model.pb') # 读取图像 image = cv2.imread('image.jpg') # 图像预处理 blob = cv2.dnn.blobFromImage(image, 1.0, (368, 368), (127.5, 127.5, 127.5), swapRB=True, crop=False) # 输入图像到网络中进行推断 net.setInput(blob) output = net.forward() # 解析输出结果 points = [] for i in range(18): # 获取关键点的置信度图 probMap = output[0, i, :, :] # 找到最大值的位置 minVal, prob, minLoc, point = cv2.minMaxLoc(probMap) # 绘制关键点 if prob > 0.1: cv2.circle(image, (int(point[0]), int(point[1])), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED) cv2.putText(image, "{}".format(i), (int(point[0]), int(point[1])), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, lineType=cv2.LINE_AA) # 保存关键点坐标 points.append((int(point[0]), int(point[1]))) # 可视化结果 plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) plt.axis('off') plt.show() # 相关问题: 1. 什么是人体姿态估计? 2. 有哪些基于深度学习的人体姿态估计框架? 3. 如何使用Python实现基于深度学习的人体姿态估计? 4. 人体姿态估计有哪些应用场景? 5. 如何评估人体姿态估计的准确性? 6. 有没有其他的人体姿态估计算法可以推荐? 7. 如何处理多人姿态估计的问题? 8. 如何优化人体姿态估计的性能? 9. 人体姿态估计在实时应用中的挑战是什么? 10. 人体姿态估计的发展趋势是什么? 11. 有没有开源的人体姿态估计项目可以参考? 12. 如何训练自己的人体姿态估计模型? 13. 人体姿态估计与人脸识别、行为识别等技术有什么关联? 14. 人体姿态估计在医疗领域有哪些应用? 15. 人体姿态估计在安防领域有哪些应用? 16. 人体姿态估计在体育训练领域有哪些应用? 17. 人体姿态估计在虚拟现实和增强现实中有哪些应用? 18. 人体姿态估计的算法原理是什么? 19. 人体姿态估计的性能指标有哪些? 20. 人体姿态估计的数据集有哪些? ``` 希望以上回答能对您有所帮助!如果还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南蓬幽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值