4

windows编译openpose及在python中调用

 3 years ago
source link: https://xugaoxiang.com/2021/05/29/build-openpose-for-windows-python-api/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
  • 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK