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

news2024/11/29 1:45:29

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

基于 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)

效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler抓包工具之fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 Fiddler弱网测试流程&#xff1a; 一、限速操作…

redis学习记录

前言 1. 什么是Redis&#xff1f;它主要用来什么的&#xff1f; Redis&#xff0c;英文全称是 Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xf…

代码里乐观锁与悲观锁

乐观锁与悲观锁区别 synchronized与cas举例 cas算法自旋 乐观锁原理&#xff1a;cas算法自旋 1.cas算法 2.自旋 乐观锁工具类 Atomiclnteger原子类incrementAndGet方法源码解析

React Fiber架构

说到Fiber&#xff0c;不得不说说他的发展史&#xff1a; React15 架构 React16之前的版本比对更新虚拟DOM的过程是采用循环递归方式来实现的&#xff0c;这种比对方式有一个问题&#xff0c;就是一旦任务开始进行就无法中断&#xff0c;如果应用中数组数量庞大&#xff0c;主…

红黑树及插入过程详解

推荐可视化插入、删除节点的二叉树网站&#xff1a;Red/Black Tree Visualization (usfca.edu) 1. 概述 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff08;Binary Search Tree&#xff09;。它在普通二叉搜索树的基础上通过引入额外的颜色属…

DragGAN图像生成原理与实现

DragGAN图像生成原理与实现 DragGAN模型是什么呢1. DragGAN背景介绍2. 模型方法2.1 算法原理2.1.1 Motion Supervision2.1.2 点跟踪 3. 实现部署步骤3.1 安装PyTorch3.2 安装 DragGAN3.3 运行 DragGAN Demo3.4 功能介绍 项目地址&#xff1a;https://github.com/Zeqiang-Lai/Dr…

衡量有效的质量保证过程的10个基本指标

作者 | Tania Zhydkova 在开发的世界中&#xff0c;有一个永恒的规则&#xff0c;那就是你无法改进无法衡量的东西。当然&#xff0c;这条规则也适用于质量保证。 所生产软件的阵列呈指数级增长&#xff0c;这意味着保证质量所需的测试覆盖率也在以同样的程度增长。这也导致了…

浅谈Web渗透测试

目录 背景介绍 漏洞挖掘 渗透测试 个人看法 Web 渗透测试方法构想 PTES 简介 Web “PTES” 前期交互 信息收集 漏洞建模 漏洞分析 渗透利用 测试报告 Web渗透测试实例 前期交互 信息收集 漏洞建模 漏洞分析 渗透利用 报告 本文包括 背景介绍&#xff0c;We…

上传作品并投票的小程序微信中的微信投票微信小程序

现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。 通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发挥的空间激发参与的热情&#xff0c;又可以让商家和企业实现推广的目的&am…

IDEA 创建 Springmvc 项目

一、概述 在18年的时候就开始接触 SpringBoot &#xff0c;然后就一直在使用它。众所周知 SpringBoot 内嵌 Tomcat&#xff0c;后续再也没有单独新建过Web 项目。作为IDEA 的用户&#xff0c;总想要用它来建一个Web 项目自己跑一跑&#xff0c;但建项目不是我最终目的~~ &…

为什么那么多人劝退软件测试?月薪1万以上的就别点进来了

2023年已经过了快一半了&#xff0c;今天跟大家聊一聊软件测试薪资这个话题 和大家说一句掏心窝的话&#xff1a;直到现在&#xff0c;软件测试依旧是寒门改变命运的一个最佳选择之一&#xff0c;要不是怕被喷&#xff0c;我都想把之一去掉&#xff0c;因为想了半天&#xff0…

【Bert、T5、GPT】fine tune transformers 文本分类/情感分析

【Bert、T5、GPT】fine tune transformers 文本分类/情感分析 0、前言text classificationemotions 数据集data visualization analysisdataset to dataframelabel analysistext length analysis text > tokenstokenize the whole dataset fine-tune transformersdistilbert…

Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

uni-app生命周期有哪些?怎么理解?

uni-app生命周期有哪些&#xff1f;怎么理解&#xff1f; uni-app生命周期有哪些&#xff1f;怎么理解&#xff1f; 文章目录 uni-app生命周期有哪些&#xff1f;怎么理解&#xff1f;前言一、什么是生命周期函数&#xff1f;二、uni-app生命周期分类总结 前言 UNI-APP学习系…

Spring概述、Spring的优势和体系结构

Spring是什么 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse Of Control&#xff1a;反转控制&#xff09;和 AOP&#xff08;Aspect Oriented Programming&#xff1a;面向切面编程&#xff09;为内核。提供了展现层 Sprin…

【重磅】“饶派杯”XCTF车联网安全挑战赛明日开赛!

2023年5月31日&#xff0c;由江西省委网信办、江西省工信厅、上饶市人民政府主办的“饶派杯”XCTF车联网安全挑战赛即将重磅开赛。来自国内外知名高校、自动驾驶汽车企业和科研院所的21支CTF精英战队齐聚上饶&#xff0c;聚焦车联网安全行业的典型漏洞及风险&#xff0c;面向车…

借助chatgpt做一个pdf转word的小工具

因 中午我在一篇公众号文章中发现了一个名为 pdf2docx 的 Python 包&#xff0c;可以将 PDF 文件转换成 Word 文件。但是&#xff0c;这个包不支持将图片型 PDF 转换成 Word&#xff0c;而且需要自己编写代码来实现转换功能。 于是我想&#xff0c;将这个包制作成一个小工具&a…

企业仓库管理系统的设计与实现(ASP.NET,SQL)

开发环境&#xff1a;Microsoft Visual Studio 数据库&#xff1a;Microsoft SQL Server 程序语言&#xff1a;asp.NET(C#)语言 本系统的开发使各大公司所的项目管理更加方便快捷&#xff0c;同时也促使项目的管理变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。…

食物储藏信息管理系统的设计与实现(ASP.NET,SQLServer)

需求分析 食物储藏信息管理系统是一个典型的数据库开发应用程序&#xff0c;由基础信息维护、用户信息维护、食物提醒管理、用户管理、食物管理、系统管理、食物储藏等功能模块组成。 具体功能实现如下&#xff1a; 食物管理&#xff1a;食物管理部门自行添加食物&#xff0c;可…