欢迎关注我的公众号 [极智视界],获取我的更多经验分享
大家好,我是极智视界,本文来介绍 实战实时、多人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.py
、demo_camera.py
、demo_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