CMU开源:价值百万美元的多目标人体关键点实时检测

主要内容介绍:

OpenPose是一个利用OpenCV和Caffe并以C++写成的开源库,用来实现多线程的多人关键点实时检测,作者包括Gines Hidalgo, Zhe Cao, Tomas Simon, Shih-En Wei, Hanbyul Joo 以及 Yaser Sheikh。即将加入(但是已经实现!)身体+手势+人脸估计展示:

0

尽管该库使用了Caffe,但是代码还是很容易向其他框架(如Tensorflow 或者Torch 等)中移植。如果你实现了任何这方面的代码,请发出合并请求我们会很乐意在该库中添加你的实现。

OpenPose对于自由的非商业用途的使用是免费的,同时也可以在这种情况下被重新发布。请查看证书了解详情。如果有商业用途请联系作者。

OpenPose库的主要功能性:

  • 多人1518关键点身体位姿估计和渲染:

0 (1)

  • 多人2*21关键点手势估计和渲染(未来1-2月内开源!)

0 (2)

  • 多人70关键点人脸估计和渲染(未来2-3月内开源!)

0 (3)

  • 灵活并且易于配置的多线程模块。
  • 图像,视频以及网络相机读取器。
  • 能够以多种格式(JSON,XML,PNG,JPG,…)保存和加载结果。
  • 用于结果可视化的小型显示窗口以及GUI。
  • 所有这些功能性都封装进了一个易于使用的OpenPose Wrapper类中。

 

姿态估计的成果基于ECCV 2016样例”RealtimeMultiperson Pose Estimation”, Zhe Cao, Tomas Simon, Shih-En Wei, Yaser Sheikh中的C++代码。完整的项目库包含Matlab和Python版本,以及训练代码。

ECCV 2016 姿态估计视频-外链

如何安装:

安装步骤详见Github内的:doc/installation.md文件。

如何快速上手:

大部分用户用例不需要对该库有太深入的了解,这样的用户可能只能够使用Demo或者简单的OpenPoes封装。因此你大可不必太在意OpenPose库中的细节。

样例:

如果在你的用例中你只是想处理一个图像或视频又或者网络相机文件夹并显示或者存储位姿结果。

那么你不必在意OpenPose库的实现细节同时只要阅读doc/demo_overview.md文件中一页的内容就可以了。

OpenPose封装:

在你的用例中如果你打算读取某一特定的图像格式并且/或者添加某个特定的后处理函数并且/或者实现你自己的显示或存储功能。

(几乎可以)不用理会该库本身的实现,只要看一下examples/tutorial_wrapper/.中关于Wrapper的教程即可。

注意:你并不需要修改OpenPose源代码或者例程,这样你将来就能随时无需修改你的代码直接升级OpenPose库。你可以在examples/user_code/中创建你自定义的代码并在OpenPose文件夹下使用make all命令编译它。


OpenPose库:

在你的用例中如果你想要改变内部函数并且/或者扩展它的功能性。首先,请先看一眼样例以及OpenPose封装。其次,阅读以下两个小节:OpenPose概览和功能性扩展。

1.OpenPose概览:在doc/library_overview.md中学习关于我们库源码的基础。

2.功能性扩展:在doc/library_extend_functionality.md中学习如何扩展我们的库。

3.添加一个额外的模块:在doc/library_add_new_module.md中学习如何添加一个额外的模块。

 

Doxygen文档自动生成

你可以通过运行如下命令来生成文档。文档将会在此doc/doxygen/html/index.html生成。你只需要双击就可以打开它(你的默认浏览器会自动显示它)。

cd doc/

doxygen doc_autogeneration.doxygen

如何输出:

1.输出格式

这里有两种可替换的方法用来存储身体各部位的位置信息(x,y,score)。标志write_pose使用OpenCV中cv::FileStorage的默认格式存储(JSON,XML和YML)。然而,JSON格式只有OpenCV3.0以后的版本才支持。因此,标志位write_pose_json专门用来将人体位姿数据以自定义的JSON格式存储。这样一来,每一个JSON文件都有一个people对象数组,其中的每个对象都具有一个body_parts数组,该数组中包含了身体各部位的位置信息和检测置信度,其格式为x1,y1,c1,x2,y2,c2,…坐标x和y可以被归一化至区间[0,1],[-1,1],[0,源尺寸],[0,输出尺寸],等等,这取决于标志位scale_mode。另外,c值是位于区间[0,1]的置信度。

 

1

至于身体部位关键点的顺序,无论是COCO(18个身体部位)还是MPI(15个身体部位),都是由头文件include/openpose/pose/poseParameters.hpp中的POSE_BODY_PART_MAPPING来描述的。拿COCO格式举例:

2

对于热点图的存储格式,并不是独立存储67张热点图(18个身体部位+背景+2*19个PAF文件),而是将这些图垂直拼接起来形成一个巨大的(宽*热点图数量)*(高)矩阵。也就是说该库将热点图按列拼接起来。比如,向量[0,单个热点图宽]包含了第一张热点图,向量[单个热点图宽度+1,2*单个热点图宽]包含了第二章热点图,等等。要注意,有些显示工具在给定的尺寸下不能显示结果图像。然而,Chrome和Firefox能够恰当地打开他们。

存储的顺序是身体部位+背景+PAF文件。其中的任何一类信息都可以用程序的标志位屏蔽掉。如果背景被屏蔽了,那么最终的图像将会是身体部位和PAF信息的组合。身体部位信息和背景遵从POSE_COCO_BODY_PARTS 或 POSE_MPI_BODY_PARTS 中的顺序,同时PAF信息遵循头文件poseParameters.hpp中POSE_BODY_PART_PAIRS指定的顺序。比如,对于COCO格式:

POSE_COCO_PAIRS    {1,2,   1,5,   2,3,   3,4,   5,6,   6,7,   1,8,   8,9,   9,10, 1,11,  11,12, 12,13,  1,0,   0,14, 14,16,  0,15, 15,17,   2,16,  5,17};
其中每一个索引都是POSE_COCO_BODY_PARTS中相应身体部位的键值,比如0对应”Neck”,1对应”RShould”,诸如此类。


2.读取存储的结果

我们使用标准格式(JSON,XML,PNG,JPG,…)来存储结果,这样一来之后就有很多框架可以读取它们,但是你也可以直接在include/openpose/filestream.hpp上使用我们的函数。特别是使用loadData(针对JSON,XML和YML文件)和loadImage(针对例如PNG或者JPG这样的图像格式)将数据加载到cv::Mat格式中。


3.给我们发送反馈

对于研究目的,我们的库是开源的,同时我们也想要持续改善它!所以请让我们知道如果…

1.你发现了任何bug(在功能性或者速度方面)

2.你向某些类或者新的Worker子类中添加了某种功能性,我们可能会将其糅合进我们的库中

3.你知道如何提高速度或者让这个库的任何地方变得简洁

4.你有关于可能的功能性的需求

5.诸如此类

请在GibHub上评论或者发出合并请求!我们会尽快答复你!

 

4.自定义Caffe

我们仅仅修改了一些Caffe的汇编标志和一点点细节。你可以使用你自己的Caffe版本,下面是我们添加和修改的文件:

1.添加的文件:install_caffe.sh;以及Makefile.config.Ubuntu14.example,Makefile.config.Ubuntu16.example,Makefile.config.Ubuntu14_cuda_7.example和Makefile.config.Ubuntu16_cuda_7.example(从Makefile.config.example中抽取)。基本上你必须使能cuDNN。

2.修改的文件:在Makefile中搜索“#OpenPose:”来查找修改过的代码。总的来说我们添加了C++11标志来避免一些旧版机器上的问题。

3.可选项-删除Caffe文件:Makefile.config.example。

4.最后,在你的Caffe版本上运行make all && make distribute 命令并在./Makefile.config.UbuntuX.example(其中X是14或16,取决于你的Ubuntu版本)中修改Caffe目录空间的变量,设置CAFFE_DIR参数为Caffe文件夹中include和lib 所在的路径。

 

引用

如果这对你的研究有所帮助请在你的出版物中引用本文。

 

姿态估计:

3

论文地址:https://arxiv.org/abs/1611.08050

GitHub地址:https://github.com/CMU-Perceptual-Computing-Lab/openpose#output

文章来自:微信公众号 AISDK

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注