OpenPose 调研

OpenPose 调研

    背景

    我们实验室做人体重建方向比较多,这个OpenPose是人体姿态估计方面非常厉害的项目,通过学习它,有助于入门人体重建。同时,它也是一个在GitHub现在拥有25k star 代码行数约12w行的开源项目,从软件开发的角度,它的设计架构也很值得学习。所以我将进行调研。
    下图是OpenPose的一个运行效果。
    dance_foot
    可以看到每个人都被绘制上了合理的躯干和关节位置,而且这个算法可以实时运行!效果还是不错的。

    0.ppt

    结合网络资料和我自己的理解,我整理的OpenPose原理ppt:

    OpenPose软件设计的ppt:

    调研计划

    调研主要就是看懂论文,跑明白代码,将由以下部分组成:

    1. 论文阅读分析
    2. 下载和编译源代码
    3. 跑通它提供的一些demo
    4. 阅读和分析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的区别如下
    v2-04817784bef75d724d38cc22fcad8e35_720w

    非极大值抑制(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,我这里测试了大部分都可以直接运行,体验非常好!
    QQ--20221107210632

    找到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