环境
- 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/3e9471747048