文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
目录
OpenPose是一种先进的实时多人人体关键点检测和全身姿态估计的深度学习框架,由Carnegie Mellon University和Adobe Research开发。它的核心原理是通过深度卷积神经网络(CNN)和条件随机场(CRF)相结合的方式,对图像或视频中的多个人体进行全身姿态估计和关键点检测。OpenPose能够同时识别并定位25个身体关节,包括面部、手部、脚部以及身体的主要部位,这对于动作捕捉、人体跟踪、游戏交互、医学影像分析等领域具有重要意义。
OpenPose的架构分为两个主要部分:一是多尺度金字塔网络(Multi-Person Pose Estimation Network),用于检测人体轮廓和关键点;二是人体部件解码器(Part Affinity Fields),用于确定每个关键点与其周围其他关键点的关系。网络采用级联结构,先进行粗略的人体检测,再逐步细化到关键点定位,提高了效率和准确性。
此外,OpenPose还具有以下特点:
- 支持2D实时多人关键点检测,能够检测15、18或25个身体/脚部关键点,包括6个脚部关键点。
- 支持2x21个手部关键点和70个面部关键点的检测,但这些的运行时间依赖于检测到的人数。
- 支持3D单人关键点检测,以及相机参数的校准工具箱。
- 支持多种输入源,包括图像、视频、网络摄像头、Flir/Point Grey相机、IP相机等,也支持自定义输入源。
- 输出包括基本图像和关键点显示/保存,以及关键点的数组类,支持自定义输出代码。
OpenPose的安装和使用相对简单,提供了命令行演示和C++/Python API,方便用户根据自己的需求进行功能扩展和自定义。它是开源的,主要用于研究目的,并鼓励社区提供反馈和贡献代码。
OpenPose算法的改进和优化也在持续进行中,包括数据增强、网络结构优化、多尺度特征融合以及关键点后处理等,以提高模型的准确性和鲁棒性。此外,OpenPose的论文和代码是开源的,为学术界和工业界提供了宝贵的资源,促进了人体姿态估计技术的发展。
1.准备环境
1.1直接下载安装好的包
我的电脑只有CPU,所以只安装Cpu版本的openpose
https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases
下载完了openpose-1.7.0-binaries-win64-cpu-python3.7-flir-3d.zip文件,然后在相应的目录解压文件。
1.2 下载源码编译
如果下载源码编译,网上有很多教程,自行谷歌一下
2. 下载模型
解压该Zip文件,找到getBaseModels.bat文件,双击运行getBaseModels.bat文件即可自动下载所需要的文件,由于我们公司可以连外网,下载比较快。
3.测试小例子
进入python目录,运行测试小例子
python运行该代码:
# From Python
# It requires OpenCV installed for Python
import sys
import cv2
import os
from sys import platform
import argparse
try:
# Import Openpose (Windows/Ubuntu/OSX)
dir_path = os.path.dirname(os.path.realpath(__file__))
try:
# Change these variables to point to the correct folder (Release/x64 etc.)
sys.path.append(dir_path + '/../bin/python/openpose/Release');
os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../x64/Release;' + dir_path + '/../bin;'
import pyopenpose as op
except ImportError as e:
print(
'Error: OpenPose library could not be found. Did you enable `BUILD_PYTHON` in CMake and have this Python script in the right folder?')
raise e
# Flags
parser = argparse.ArgumentParser()
parser.add_argument("--image_path", default="../examples/media/COCO_val2014_000000000192.jpg",
help="Process an image. Read all standard formats (jpg, png, bmp, etc.).")
args = parser.parse_known_args()
# Custom Params (refer to include/openpose/flags.hpp for more parameters)
params = dict()
params["model_folder"] = "../models/"
# Add others in path?
for i in range(0, len(args[1])):
curr_item = args[1][i]
if i != len(args[1]) - 1:
next_item = args[1][i + 1]
else:
next_item = "1"
if "--" in curr_item and "--" in next_item:
key = curr_item.replace('-', '')
if key not in params: params[key] = "1"
elif "--" in curr_item and "--" not in next_item:
key = curr_item.replace('-', '')
if key not in params: params[key] = next_item
# Construct it from system arguments
# op.init_argv(args[1])
# oppython = op.OpenposePython()
# Starting OpenPose
opWrapper = op.WrapperPython()
opWrapper.configure(params)
opWrapper.start()
# Process Image
datum = op.Datum()
imageToProcess = cv2.imread(args[0].image_path)
datum.cvInputData = imageToProcess
opWrapper.emplaceAndPop(op.VectorDatum([datum]))
# Display Image
print("Body keypoints: \n" + str(datum.poseKeypoints))
cv2.imshow("OpenPose 1.7.0 - Tutorial Python API", datum.cvOutputData)
cv2.imwrite("d:\\ddd.jpg", datum.cvOutputData)
cv2.waitKey(0)
except Exception as e:
print(e)
sys.exit(-1)
输出结果: