加微信进交流群:xituxiaoshutong100

windows编译openpose及在python中调用

算法 迷途小书童 4评论

环境

  • windows 10 64bit
  • openpose 1.7.0
  • cuda 11.1
  • cudnn 8.0.5.39
  • visual studio 2019
  • cmake 3.20.2

视频看这里

Youtube

Bilibili

基础环境安装

cudacudnn的部分,这个前面讲过了,不会的话,看这篇

windows 10安装CUDA和cuDNN

由于需要使用到cmake-gui,因此还需要去下载安装cmake,地址: https://cmake.org/download/,安装文件拉下来傻瓜式安装,将安装路径加入系统环境变量Path

openpose windows

编译openpose

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

caffe

pybind11

下载zip后解压,分别存放在3rdparty\caffe3rdparty\pybind11

openpose windows

openpose windows

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

openpose windows

接下来点击下方的Configure

openpose windows

openpose windows

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

openpose windows

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

openpose windows

如果cmake-gui一直不成功,可以逐个去下载所需要的软件包。

模型文件可以通过双击执行models\getModels.bat脚本进行下载

openpose windows

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

openpose windows

接下来,就可以点击Generate生成visual studio的解决方案了

如果出现下面类似的错误,就是因为之前的几个依赖,没有下载好导致的,最简单的方法就去看看下载下来的几个zip包大小是否正常

openpose windows

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

openpose windows

openpose windows

接下来就可以继续点击Generate

openpose windows

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

openpose windows

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

openpose windows

结果报错了

openpose windows

看错误提示

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.huopenpose-1.7.0\src\openpose\net\resizeAndMergeBase.cu

修改完成后再次编译,就可以成功了

openpose windows

demo测试

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

openpose windows

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

openpose windows

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

openpose windows

选择调试,然后在命令行参数处添加

--video F:\dl\openpose-1.7.0\examples\media\video.avi

openpose windows

最后重新运行

openpose windows

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

使用facehand模型,这里以图片预测为例,视频也一样。需要更多的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'编译选项

openpose windows

重新ConfigureGenerate,在打开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 windows

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

openpose windows

序列对应的关节名称如下

{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

需要说明一点的是,网络小了,速度变快了,但是准确率就会降低

资源下载

已经将1.7.0所需的所有文件都打包了,需要的话自行下载

链接:https://pan.baidu.com/s/1RBeuuZVTnn13iDSeFLttVA
提取码:ncvb

参考资料

喜欢 (2)
发表我的评论
取消评论

表情
(4)个小伙伴在吐槽
  1. Error: OpenPose library could not be found. Did you enable `BUILD_PYTHON` in CMake and have this Python script in the right folder? No module named 'pyopenpose' 博主,我按照你的教程已经改了地址,但是它依旧会报错,这是为什么呢,您分享的文件我也使用了,但还是有相同的问题
    匿名2021-09-14 17:28 (4天前)回复
    • 编译参数正确的话,那应该还是库路径的问题
      迷途小书童2021-09-14 23:00 (3天前)回复
  2. G:\anaconda\python.exe: can't open file '.\01_body_from_image': [Errno 2] No such file or directory 博主你好,请问这个报错应该怎么修复呢
    匿名2021-09-10 16:30 回复
    • 图片路径不对,修改下就好
      迷途小书童2021-09-13 00:37 (5天前)回复