OpenPose 调研
背景
我们实验室做人体重建方向比较多,这个OpenPose是人体姿态估计方面非常厉害的项目,通过学习它,有助于入门人体重建。同时,它也是一个在GitHub现在拥有25k star 代码行数约12w行的开源项目,从软件开发的角度,它的设计架构也很值得学习。所以我将进行调研。
下图是OpenPose的一个运行效果。
可以看到每个人都被绘制上了合理的躯干和关节位置,而且这个算法可以实时运行!效果还是不错的。
0.ppt
结合网络资料和我自己的理解,我整理的OpenPose原理ppt:
OpenPose软件设计的ppt:
调研计划
调研主要就是看懂论文,跑明白代码,将由以下部分组成:
- 论文阅读分析
- 下载和编译源代码
- 跑通它提供的一些demo
- 阅读和分析OpenPose的代码架构
1.论文阅读分析
整个OpenPose工作的历程是由几篇工作组成的:
首先是Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields,在这篇论文中他们提出了PAFs算法。
接着是OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields,在这篇工作中,他们对整个系统进行了改进,加快了运行速度和准确性,并整合了身体、脚、手和脸部关键点,最终完成了OpenPose这个开源库。
Abstract
主要说明了OpenPose用了他们提出的PAFs(Part Affinity Fields)算法,比起传统自底向上的系统,有更好的性能表现,具体表现为自底向上的系统随着场景中人数增加,开销也线性增加,而OpenPose却始终保持相同的开销。同时OpenPose是第一个整合了身体、脚、手和脸部关键点的开源实时框架。
1.1 Introduction
1.2 Method
1.2.1
Part Affinity Fields论文理解
如何评价卡内基梅隆大学的开源项目 OpenPose? - 残生十七世的回答 - 知乎
VGG网络:一文读懂VGG网络
深度学习里的concat和add的区别如下
非极大值抑制(Non-Maximum Suppression)
2.下载和编译源代码
虽然它也提供了编译好的二进制包,但是为了研究其结构,我这里还是使用源代码编译的方式。
它文档中指导编译的部分:Compiling and Running OpenPose from Source
编译该项目需要CUDA,直接去官网下载:CUDA Toolkit 11.8 Downloads
2.1 Windows下编译源代码
在windows平台中源码编译比较简单,只需要安装git或者GitHub客户端、CMAKE-GUI、CUDA。
在我的win11 x64中很顺利的编译完成了。
3.运行DEMO
它工程中提供了许多的demo,我这里测试了大部分都可以直接运行,体验非常好!
找到ta的数据集,自己跑一次
4.阅读和分析OpenPose的代码架构
openpose源码阅读总结
根据它在GitHub仓库中留下的信息,这个OpenPose主要是使用C++并使用GPU并行计算,实现了他们实验室的两篇工作:
OpenPose_Realtime_Multi-Person_2D_Pose 和
Hand Keypoint Detection in Single Images using Multiview Bootstrapping
它的文档在/doc/index.html
整个代码结构介绍在 md_doc_very_advanced_library_structure_1_library_deep_overview.html
这篇文档介绍了OpenPose的核心数据结构Array和Datum。
大部分结构都由Temple写成,可以比较通用的用在不同地方。Array是整个OpenPose存储数据的结构,Datum是后面线程返回和输入的数据结构,线程之间通过这个数据结构进行通信。
接着介绍了OpenPose的线程管理:thread。
介绍了thread的创建、运行、管理。由于也是用Temple编写而成,可以方便的将自己的函数挂进这个进程管理。
最后介绍这个系统的核心:多人关键点检测模块。
介绍了Caffe实现的Pose提取器,和如何初始化它。接着介绍如何检测人群的pose,介绍输入值和返回值。然后介绍了将结果渲染回图片的过程,使用PoseRenderer模块(文档与当前实际程序有出入,api参数对不上)。
它的整体代码UML图在UML.pdf