OpenPose 编译指引(含 python 接口)


前言

OpenPose 人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以 Caffe 为框架开发的开源库。

可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用。

官方 Release 版是没有 python 接口的(但是有 python 样例),所以其他程序要调用 openpose 接口就必须自己编译。

环境要求

  • Windows10-x64
  • Nvidia Driver-496.49
  • CUDA-10.0
  • Python-3.8
  • CMake-3.22.1
  • VisualStudio-2017
  • OpenPose-1.7.0
  • caffe-1.0
  • pubind11-2.8.1

上述环境为本项目构建时使用的版本,建议新手同学要么自行查找兼容关系要么严格遵守,毕竟涉及深度学习的计算项目对版本(尤其是硬件版本)要求较高、兼容性问题突出,版本并非越新越好。

预操作

  1. 官网下载并安装最新的 CMake(本项目构建时为 3.22.1)
  2. 到官网下载并安装 Visual Studio Community 2017 (version 15.9) (目前测试只有 2017 版本正常,太新的版本编译时会报奇怪的错误)
  3. 根据个人的 NVIDIA 显卡版本,到官网下载或更新驱动(未测试过 AMD,可能不支持)
  4. 执行命令 nvidia-smi 查看显卡的硬件信息(主要关注第一行【驱动版本】和【CUDA 版本】)

  1. 官网下载安装兼容的 CUDA (本项目构建时为 10.0,主要是为了使用 CUDA 的编译器 nvcc)

CUDA 与能够使用它的 Nvidia 驱动版本
CUDA Toolkit Driver Version
CUDA 11.1 (11.1.0) >= 455.23.04
CUDA 11.0 (11.0.171) >= 450.36.06
CUDA 10.2 (10.2.89) >= 440.33
CUDA 10.1 (10.1.105) >= 418.39
CUDA 10.0 (10.0.130) >= 410.48
CUDA 9.2 (9.2.88) >= 396.26
CUDA 9.1 (9.1.85) >= 390.46
CUDA 9.0 (9.0.76) >= 384.81
CUDA 8.0 (8.0.61 GA2) >= 375.26
CUDA 8.0 (8.0.44) >= 367.48
CUDA 7.5 (7.5.16) >= 352.31
CUDA 7.0 (7.0.28) >= 346.46

CUDA 的全称是 Compute Unified Device Architecture,一般指的是 CUDA Toolkit。

按照 NVIDIA 官方的说法,CUDA 是一个并行计算平台和编程模型,能够使得使用 GPU 进行通用计算变得简单和优雅。

简而言之,CUDA 是 NVIDIA 为了帮助大家更好地使用他们生产的 GPU 而开发的一个辅助工具。

打比喻就是,汽车厂商(NVIDIA)卖给你了车(GPU),帮你请了司机(显卡驱动),又负责教司机如何开车开得简单又优雅(CUDA)。

不要过于追求新版的 CUDA,更高级的 CUDA 工具包只有更高级别的驱动才能学会

OpenPose 源码下载

  1. 下载 OpenPose 项目: git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose
  2. 在项目根目录下执行命令 git submodule update --init --recursive 递归下载子模块 caffepybind11
  3. 若下载子模块失败,请手动修改 .gitmodules 中的 urlgit ssh 连接,再重新执行命令 git submodule update --init --recursive 尝试下载(若还是下载失败,你可能需要设置 git 代理翻墙了)

OpenPose 依赖和模型下载

官方脚本位置:

  • openpose/3rdparty/windows/getCaffe.bat
  • openpose/3rdparty/windows/getCaffe3rdparty.bat
  • openpose/3rdparty/windows/getFreeglut.bat
  • openpose/3rdparty/windows/getOpenCV.bat
  • openpose/3rdparty/windows/getSpinnaker.bat
  • openpose/models/getModels.bat

若某些依赖或模型下载失败,可执行对应脚本重新下载。

编译 OpenPose

  1. 假设工程的根目录为 ${REPO_ROOT_DIR} (建议在 OpenPose 项目的上一级目录)
  2. 新建目录 ${REPO_ROOT_DIR}/build
  3. 运行 CMake,设置 openpose 源代码目录为 ${REPO_ROOT_DIR}/openpose,设置 openpose 编译目录为 ${REPO_ROOT_DIR}/build

  1. 点击 Configure, 选择所安装的 Visual Studio 版本为 Visual Studio 15 2017,选择 Platform 为 x64,点击 Finish

  1. 此时会自动生成 CMake 配置,等待下方信息框显示 Configuring done,然后增加勾选:
    • BUILD_PYTHON: 提供 python 接口
    • DOWNLOAD_BODY_COCO_MODEL: 提供 COCO 模型
    • DOWNLOAD_BODY_MPI_MODEL: 提供 MPI 模型

其实 DOWNLOAD_xxxx_MODEL 都可以全部勾上,这些就是前面下载的全部动作训练模型文件,其中 COCO 和 MPI 模型识别关节点最多,而且是基于标准 CUDA 运行的,这两者也各有不同的优缺点。

  1. 点击 Genetate 按钮,此时会生成 Visual Studio 工程文件,等待下方信息框显示 Genetate done

  1. 并点击 Open Project 触发 Visual Studio 打开工程(此后不再需要 CMake)
  2. 在 Visual Studio 上方的【活动解决方案配置】中选择 Release,【活动解决方案平台】中选择 x64
  3. 右键点击 pyopenpose,点击【生成】等待工程发布即可

生成过程中,将会产生非常多的 warning,它们是因为中文编码与英文不兼容导致的,无需理会

  1. 在【输出】看到 生成: 成功 2 个,失败 0 个,最新 0 个,跳过 0 个 即表示工程发布成功

生成 python 库

此时需要的 python 库文件已全部生成好。

但因为文件过于分散,这里写了一个 powershell 脚本 gen_oplib.ps1,将其放在 ${REPO_ROOT_DIR} 运行即可一键生成名为 oplib 的 python 库:

# 生成 openpose 库文件
# ------------------------------------------------
# 示例: ./gen_oplib.ps1
# ------------------------------------------------

Write-Output "Genetate OpenPose Library ..."

$OP_LIB_DIR = "./oplib"
If(!(Test-Path $OP_LIB_DIR)) {
    New-Item -ItemType Directory -Path $OP_LIB_DIR
}

Write-Output "Copy [pyopenpose.cp3x-win_amd64.pyd] ..."
Copy-Item "build/python/openpose/Release/*.pyd" -Destination $OP_LIB_DIR

Write-Output "Copy [__init__.py] ..."
Copy-Item "build/python/openpose/__init__.py" -Destination $OP_LIB_DIR

Write-Output "Copy [openpose.dll] ..."
Copy-Item "build/x64/Release/openpose.dll" -Destination $OP_LIB_DIR

Write-Output "Copy [bin] ..."
Copy-Item "build/bin/*" -Destination $OP_LIB_DIR

Write-Output "Copy [models] ..."
Copy-Item "openpose/models" -Destination $OP_LIB_DIR -Recurse

Write-Output "Finish ."

使用时 python 可直接调用这个库:

# 调用 openpose 接口示例
# ------------------------------------------------
from oplib import pyopenpose as op
opWrapper = op.WrapperPython()

相关文档

原理:

安装:

使用:


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
 上一篇
弹无虚发?视觉 AI 杀疯了! 弹无虚发?视觉 AI 杀疯了!
本文从视觉 AI 的背景、原理(人体姿态识别)、实机演示三个角度阐述黑色产业的形成和危害,最后回归本质,从原理重新出发,以魔法打败魔法,谈谈如何对抗这类黑产的思路。
2022-05-04
下一篇 
浅出狼人杀 浅出狼人杀
《深入浅出狼人杀》的姐妹篇(后篇):主要讲解博弈论在狼人杀中的典型应用,教你如何在游戏中立于不败之地!
2021-10-25
  目录