环境
- windows 10 64bit
- openpose 1.7.0
- cuda 11.1
- cudnn 8.0.5.39
- visual studio 2019
- cmake 3.20.2
视频看这里
YouTube
Bilibili
基础环境安装
cuda 和 cudnn 的部分,这个前面讲过了,不会的话,看这篇
由于需要使用到 cmake-gui,因此还需要去下载安装 cmake,地址: https://cmake.org/download/,安装文件拉下来傻瓜式安装,将安装路径加入系统环境变量 Path 中

编译openpose
这里使用的源码是1.7.0版本,地址是:https://github.com/CMU-Perceptual-Computing-Lab/openpose/archive/refs/tags/v1.7.0.zip,下载后解压,在源码根目录新建个文件夹 build,这个文件夹是用来存放编译生成的文件的。另外,openpose 还依赖 caffe 和 pybind11 (这是为了能在 python 中去调用 openpose 的 api )
下载 zip 文件后解压,分别存放在 3rdparty\caffe 和 3rdparty\pybind11


打开 cmake-gui,填写源码位置和编译后产生的文件的位置,也就是上面刚创建的 build 目录

接下来点击下方的 Configure


这个步骤,会去下载几个主要的依赖,包括 opencv、caffe、caffe3rdparty,还有工程中需要用到的模型文件。

这里经常会碰到网络问题而导致某些文件下载失败,从而导致 Configure 失败。

如果 cmake-gui 一直不成功,可以逐个去下载所需要的软件包。
模型文件可以通过双击执行 models\getModels.bat 脚本进行下载

而依赖的 caffe 和 opencv 则可以进入到文件夹 3rdparty/windows,依次执行几个 bat 脚本文件下载

接下来,就可以点击 Generate 生成 visual studio 的解决方案了
如果出现下面类似的错误,就是因为之前的几个依赖,没有下载好导致的,最简单的方法就去看看下载下来的几个 zip 包大小是否正常

目前1.7.0依赖于 caffe、caffe3rdparty、freeglut、opencv 和 spinnaker 这5个包,自行下载后解压,注意解压后文件夹的名称和文件目录结构,如下图


接下来就可以继续点击 Generate

成功之后,点击 Open Project 进入 visual studio

右键点击解决方案中的 OpenPoseDemo,选择 生成,开始编译

结果报错了

看错误提示
calling a __host__ function("__floorf") from a __global__ function("op::resize8TimesKernel<float> ") is not allowed openpose F:\dl\openpose-1.7.0\src\openpose\net\resizeAndMergeBase.cu 142
为解决这个问题,需要修改相应报错的源文件,将 floor 改为 floorf,包括 openpose-1.7.0\include\openpose_private\gpu\cuda.hu 和 openpose-1.7.0\src\openpose\net\resizeAndMergeBase.cu
修改完成后再次编译,就可以成功了

demo测试
右击解决方案中的 OpenPoseDemo,选择设为启动项目

点击 visual studio 中的本地 windows 调试器,运行程序,由于接着 usb 摄像头,openpose 打开了摄像头进行预测

如果想使用某个视频文件来跑跑 OpenPoseDemo,可以在 visual studio 中增加命令行参数,方法是右键打开解决方案中的 OpenPoseDemo,选择属性

选择调试,然后在命令行参数处添加
--video F:\dl\openpose-1.7.0\examples\media\video.avi

最后重新运行

openposedemo常用参数
预测视频
OpenPoseDemo.exe --video examples\media\video.avi
如果想讲预测后的视频保存下来,可以将预测结果保存成图片
OpenPoseDemo.exe --video examples\media\video.avi --write_images examples\media\images
预测图片,将图片文件放在文件夹中
OpenPoseDemo.exe --image_dir examples\media
使用 face、hand 模型,这里以图片预测为例,视频也一样。需要更多的 gpu memory
OpenPoseDemo.exe --image_dir examples\media --face --hand
保存关键点信息,json 格式
OpenPoseDemo.exe --video examples\media\video.avi --write_json examples\media\
在python中调用
在 cmake-gui 中勾选 BUILD_PYTHON 和 BUILD_UNITY_SUPPORT 编译选项

重新 Configure 和 Generate,在打开 visual studio 后,选中 pyopenpose,启动生成。待代码编译完成后,会在 build\x64\Debug 下生成 openposed.dll 文件,在 build\python\openpose\Debug 下生成 pyopenpose.cp38-win_amd64.pyd 文件,这2个文件非常重要,后面在执行 python 示例代码时会用到。
接下来进入到 python 的示例代码目录,这里跑一下 01_body_from_image.py,运行之前,需要做一点点修改,主要是4个路径的修改
if platform == "win32":
# Change these variables to point to the correct folder (Release/x64 etc.)
# 第一处
sys.path.append(dir_path + '/../../build/python/openpose/Debug');
# sys.path.append(dir_path + '/../../python/openpose/Release');
# os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../x64/Release;' + dir_path + '/../../bin;'
# 第二处
os.environ['PATH'] = os.environ['PATH'] + ';' + dir_path + '/../../build/x64/Debug;' + dir_path + '/../../build/bin;'
import pyopenpose as op
# 测试图片的路径和模型文件夹的路径也都要改一下
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/"
然后执行
python 01_body_from_image.py

openpose 输出的关键点信息如下图,总共有25个关节点

序列对应的关节名称如下
{0, "Nose"},
{1, "Neck"},
{2, "RShoulder"},
{3, "RElbow"},
{4, "RWrist"},
{5, "LShoulder"},
{6, "LElbow"},
{7, "LWrist"},
{8, "MidHip"},
{9, "RHip"},
{10, "RKnee"},
{11, "RAnkle"},
{12, "LHip"},
{13, "LKnee"},
{14, "LAnkle"},
{15, "REye"},
{16, "LEye"},
{17, "REar"},
{18, "LEar"},
{19, "LBigToe"},
{20, "LSmallToe"},
{21, "LHeel"},
{22, "RBigToe"},
{23, "RSmallToe"},
{24, "RHeel"},
{25, "Background"}
常见问题
out of memory
如果是使用显存较小的显卡,比如 1050Ti,它只有4G的显存,在正常跑视频测试的时候就会报错
Check failed: error == cudaSuccess (2 vs. 0) out of memory.
据项目作者所说,要运行 openpose,至少需要 4G 。默认情况,caffe 会占用大约 12G,如果使用 cudnn 的话,就能降低至 2.2G,这个是针对人体25个关键点检测而言的,如果是 COCO 的话,大概是 1.5G
碰到上述问题,可以通过减小网络大小来解决,使用参数 --net_resolution,如
OpenPoseDemo.exe --video examples\media\video.avi --net_resolution 320x320
需要说明一点的是,网络小了,速度变快了,但是准确率就会降低
cudaSuccess (3 vs. 0)
Check failed: error == cudaSuccess (3 vs. 0) initialization error *** Check failure stack trace: **
这个一般是 nvidia 的驱动版本低了,直接使用 Geforce Experience 进行版本更新,这里我碰到过更新报错的情况,也不清楚是怎么回事,就是安装不上,这时可以到 nvidia 的官网去下载 exe 文件进行版本更新
资源下载
已经将1.7.0所需的所有文件都打包了,需要的话自行下载,链接:https://pan.quark.cn/s/149d97cb9c69