极智项目 | 实战实时、多人2D人体姿态识别之OpenPose

欢迎关注我的公众号 [极智视界],获取我的更多经验分享

大家好,我是极智视界,本文来介绍 实战实时、多人2D人体姿态识别之OpenPose。

本文介绍的 实战实时、多人2D人体姿态识别之OpenPose,提供完整的可以一键执行的项目工程源码,获取方式有两个:

(1) 本文工程项目资源下载,链接:https://download.csdn.net/download/weixin_42405819/88567433

(2) 【推荐】加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq

实时多人二维姿态估计是将人体行为理解更好落地的重要途径。基于 OpenPose 的 Realtime、Multi-Person 二维人体姿态估计方法采用了一种非参数化表示方法,被称为 "Part Affinity Fields"(PAFs),以学习将图像中的身体部位与个体关联起来。这个 Bottom-up 的人体姿态估计系统能够在多人的情况下实现高准确性和实时检测。跟之前的 AlphaPose 不同,AlphaPose 是属于两阶段的姿态估计方法,首先先进行目标检测,然后再进行姿态估计,这样会更准但会更加耗时 (对 AlphaPose 感兴趣的同学可以爬楼《极智项目 | 实战人体姿态识别之AlphaPose》)。相比之下,OpenPose 的特点也是十分明显的,就是它更加轻量、更加实时,所以对于项目的实际部署会更加友好一些。对于 OpenPose 算法原理部分的解读可以翻看我的文章《极智AI | Realtime Multi-Person人体姿态估计之OpenPose》。

在拿到项目代码后,进行开发环境的配置,用 Anaconda3 管理 py 环境 (这可能是我的习惯作风了,当然这是好的习惯),如下,

# 安装Anaconda3的过程略过
# 采用conda来进行py环境的管理
conda create -n openpose_py37 python=3.7# 激活py环境
conda activate openpose_py37# 进入到项目目录
cd # 使用py依赖
# 安装torch和torchvision ==> 我这里特意把这两个Package也放在项目里打包了
pip install 3rdparty/torch-1.10.1+cu111-cp37-cp37m-linux_x86_64.whl 3rdparty/torchvision-0.11.2+cu111-cp37-cp37m-linux_x86_64.whl
# 继续安装依赖
pip install -r requirement.txt

这样开发环境就安装好了。

接着可以使用 OpenPose 执行推理进行人体姿态估计,项目中提供了三个测试脚本,分别是 demo_local_pic.pydemo_camera.pydemo_video.py,其中,

  • demo_local_pic.py ==> 检测本地图片使用;==> 检测图片;
  • demo_camera.py ==> 打开摄像头取图检测;==> 检测图片;
  • demo_video.py ==> 打开摄像头拉流检测,也就是直接检测视频流;==> 检测视频流;

由于我的服务器上没有安装摄像头,所以下面重点来介绍检测本地图片的脚本使用。demo_local_pic.py 脚本内容如下,其中添加了一些主要的备注,比如模型加载、图片加载、检测结果保存的配置等,

import cv2
import matplotlib.pyplot as plt
import copy
import numpy as npfrom src import model
from src import util
from src.body import Body
from src.hand import Hand# 加载模型
body_estimation = Body('model/body_pose_model.pth')
hand_estimation = Hand('model/hand_pose_model.pth')# 加载待检测的图片 ==> 这里可以自行修改
test_image = 'images/ski.jpg'
oriImg = cv2.imread(test_image)  # B,G,R order
candidate, subset = body_estimation(oriImg)
canvas = copy.deepcopy(oriImg)
canvas = util.draw_bodypose(canvas, candidate, subset)
# detect hand
hands_list = util.handDetect(candidate, subset, oriImg)all_hand_peaks = []
for x, y, w, is_left in hands_list:# cv2.rectangle(canvas, (x, y), (x+w, y+w), (0, 255, 0), 2, lineType=cv2.LINE_AA)# cv2.putText(canvas, 'left' if is_left else 'right', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# if is_left:# plt.imshow(oriImg[y:y+w, x:x+w, :][:, :, [2, 1, 0]])# plt.show()peaks = hand_estimation(oriImg[y:y+w, x:x+w, :])peaks[:, 0] = np.where(peaks[:, 0]==0, peaks[:, 0], peaks[:, 0]+x)peaks[:, 1] = np.where(peaks[:, 1]==0, peaks[:, 1], peaks[:, 1]+y)# else:#     peaks = hand_estimation(cv2.flip(oriImg[y:y+w, x:x+w, :], 1))#     peaks[:, 0] = np.where(peaks[:, 0]==0, peaks[:, 0], w-peaks[:, 0]-1+x)#     peaks[:, 1] = np.where(peaks[:, 1]==0, peaks[:, 1], peaks[:, 1]+y)#     print(peaks)all_hand_peaks.append(peaks)canvas = util.draw_handpose(canvas, all_hand_peaks)plt.imshow(canvas[:, :, [2, 1, 0]])
plt.axis('off')
plt.show()# 保存检测结果 ==> 这里的文件名、文件路径可自行修改
plt.savefig("res.png", bbox_inches='tight')

下面展示了一些效果图,

可以看到,检测的效果还是不错的。

好了,以上分享了 实战实时、多人2D人体姿态识别之OpenPose,并提供完整的项目源码。希望我的分享能对你的学习有一点帮助。


【极智视界】

《极智项目 | 实战实时、多人2D人体姿态识别之OpenPose》

畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球,星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。一定会对你学习有所帮助,也一定非常好玩,并持续更新更加有趣的项目。https://t.zsxq.com/0aiNxERDq

​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网中基于信任的安全性调查研究:挑战与问题

A survey study on trust-based security in Internet of Things: Challenges and issues 文章目录 a b s t r a c t1. Introduction2. Related work3. IoT security from the one-stop dimension3.1. Output data related security3.1.1. Confidentiality3.1.2. Authenticity …

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线,并算出斜率、角度-判断时间,分针与时针 (度数)。数据可更换自己的,程序已调通,可直接运…

Python潮流周刊:Twitter 的强敌 Threads 是用 Python 开发的!

🦄文章&教程 1、聊一聊 Python 和 Golang 的垃圾回收 常见的垃圾回收算法有哪些,它们的优缺点是什么?Python 的垃圾回收机制由什么组成,如何解决内存泄漏问题?Golang 的垃圾回收机制又是怎样的,如何解…

大数据 DataX-Web 详细安装教程

目录 一、DataX-Web 介绍 1.1 DataX-Web 是什么 1.2 DataX-Web 架构 二、DataX-Web 安装部署 2.1 环境要求 2.2 安装 2.3 部署 2.4 数据库初始化 2.5 配置 2.6 启动服务 2.6.1 一键启动所有服务 2.6.2 一键取消所有服务 2.7 查看服务(注意&#xff01…

AtomicReference原子引用类-线程安全

简介与作用: AtomicReference是Java中的一个原子类,它的主要作用是提供了一种原子操作的方式来更新对象的引用。它通常用于多线程环境下,用来解决并发访问共享对象时可能出现的竞态条件问题。 (实际开发中用于某个数据模型更新&a…

【pandas】数据透视表【pivot_table】

pivot_table pandas的pivot_table函数是一个非常有用的工具,用于创建一个数据透视表,这是一种用于数据总结和分析的表格形式。 以下是pivot_table的基本语法: pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean,…

Python---函数的参数类型----位置参数(不能顺序乱)、关键词参数(键值对形式,顺序可乱)

位置参数 理论上,在函数定义时,可以为其定义多个参数。但是在函数调用时,也应该传递多个参数,正常情况,要一一对应。 相关链接:Python---函数的作用,定义,使用步骤(调用…

OpenCV- 学习笔记(Python)图像处理基础

本专栏:主要记录OpenCV(Python)学习笔记 OpenCV 图像处理基础 灰度图 import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline ​ imgcv2.imread(cat.jpg) img_gray…

Leetcode—94.二叉树的中序遍历【简单】

2023每日刷题(四十) Leetcode—94.二叉树的中序遍历 C语言实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array mus…

FFmpeg零基础学习(一)——初步介绍与环境搭建

目录 前言正文一、开发环境二、搭建环境三、测试代码End、遇到的问题2、Qt 在线安装容易报错,断开问题1、在线安装QMaintainTool很慢2、Qt5.15 无法调试FFmpeg 参考 前言 FFmpeg是一个开源的跨平台多媒体处理框架,它包含了一组用于处理音频、视频、字幕…

Python函数式编程:让你的代码更优雅更简洁

概要 函数式编程(Functional Programming)是一种编程范式,它将计算视为函数的求值,并且避免使用可变状态和循环。 函数式编程强调的是函数的计算,而不是它的副作用。 在函数式编程中,函数是第一类公民&a…

路由器DHCP分配IP地址规则

路由器DHCP分配IP地址的机制: 先设置一个IP地址池,假设是192.168.1.100-192.168.1.199一共100个。 来一个请求,看一下是不是以前请求过的地址,如果是,还是返回以前给过的IP,然后将到期时间(有些路由器默认…