Openpose原理总结

news2024/12/28 12:29:42

Openpose是一种开源的实时多人姿态估计库,由卡耐基梅隆大学开发。它通过分析图像或视频中的人体关键点来估计人体的姿态,识别身体的各个部分,并推断出人体的姿势信息。
Openpose能够同时检测和跟踪多个人的姿态,可以用于人机交互、运动分析、动作捕捉、虚拟现实等各种应用领域。
它的工作原理是利用卷积神经网络对输入图像进行特征提取,并使用卷积层、池化层、上采样等操作进行特征融合和输出。Openpose在计算机视觉领域具有重要的应用价值,并且被广泛使用。

openpose是一种实时检测图像中多人的二维姿势的方法 。面临下面三项挑战:

第一,每张图像可能包含未知数量的人,他们可能出现在任何位置或规模。

第二,由于接触、遮挡或肢体衔接,人与人之间的互动会引起复杂的空间干扰,使得身体部分的关联变得困难。

第三,运行时的复杂性往往随着图像中人的数量而增加,使实时性能成为一个挑战 。
1.png
整体流程如下:

  1. 将整个图像作为网络输入,预测出一组身体部位位置的二维置信度图S(如图b)和一组部位亲和域(PAF)的二维矢量场L(如图c,它编码了部位之间的关联程度)。
  2. 通过贪婪推理对置信图和PAF进行解析(如图d),输出图像中所有人物的二维关键点。

其中身体部位的二维置信度图S={S_1, S_2, S_3, …, S_j},每个部位一个S_j∈R^(w×h)。部位亲和域的二维矢量场L={L_1, L_2,…, L_c},每个肢体一个,L_c∈R^(w×h×2)。

网络架构

2.png
总体结构如图3所示,首先通过特征提取网络F(论文用的VGG-19)进行特征提取,将得到的特征层输入接下来的网络。后续网络被分成两个分支:顶部分支(以米黄色显示)预测置信图,底部分支(以蓝色显示)预测亲和场。

每个阶段都有中间监管,用于补充梯度,解决梯度消失的问题,确保结果不会向着错误的方向发展 。

stage t

在Stage 1,网络接收特征提取网络的输出,产生一组检测置信度映射S1=ρ1(F)和一组部分亲和域L1=φ1(F),其中ρ1和φ1是用于在阶段1进行推理的网络结构。
3.png
在Stage t (t>1),我们将特征提取网络输出的特征层和前一个Stage阶段生成的S_(t-1)和L_(t-1)连接输入,用来精细化预测。其中ρt和φt是用于在阶段1进行推理的网络结构。

Loss

网络结尾,应用了两个损失函数,分别用于优化身体部位的二维置信度图和部位亲和域的二维矢量场
4.png
如上图所示,4.1.png优化身体部位的二维置信度图,其中4.2.png是真实的置信度图。4.3.png优化部分亲和域,其中4.4.png为真实的部位亲和域的二维矢量场。W§是一个掩码,当注释在图像位置P中消失时该掩码使该位置数据失效。
总体的损失函数是:

5.png
了解了上面的网络结构,出现了几个疑问:

1.训练时,基于真实标签的置信度图4.2.png是如何生成的?

部分检测的置信度图 (PCM)

参考文章:https://zhuanlan.zhihu.com/p/360541947

该节解决了上面的第一个问题:训练时,基于真实标签 的置信度图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQGLFXuM-1688896277814)(./imgs/4.2.png)]是如何生成的?

当图像只出现一个人时,每个置信度图中有一个峰值,代表一个部位。

6.png
当图像出现多个人时,为每个人每个部位生成单独的置信度图6.1.png,其中j代表部位 j,k代表人k,6.2.png用来控制峰值的扩散。

为什么采用公式(6)呢?

该公式代表着在关节点上的像素的置信度为1,其周围像素点根据距离呈高斯分布扩散,距离越远,置信度越低;距离越
近,置信度越高。 参考文章博主进行了更形象的解释!!!

之后,网络真实输出的置信度图是通过最大运算符对单个可信度图进行的聚合 :
7.png
这里第一次看的时候比较疑惑为什么每个节点取k个人中最大的,这样相当于只有一个人的信息了,如何预测呢?

后来明白了,该小结上面的内容是在训练的时候做的事情,确实是每个部位只生成一个置信度图,一共19个(18个节点加背景图)

在测试时,我们预测置信图,并通过进行非最大限度的抑制来获得身体部位的候选位置 ,如图4第一行所示

8.png
比如通过预测置信度图,并通过非最大限度的抑制获得左眼(e1, e2, e3),左耳(r1, r2, r3, r4),之后通过PAF将节点正确连接起来。

部分关联的部分亲和域 (PAF)

9.png
该部分的输入是一组检测到的身体部位(训练时是标注好的,测试时是通过置信图预测的),如图5(a)中蓝色点和红色点所示。

部分亲和场是一个二维矢量场,保留了肢体支撑区域的位置和方向信息(如图5©所示),那么是如何定义的呢?

利用下面的公式:
11.png
这里面,一些定义如下图所示:
10.png
p是第k个人,部位c上的一点。v是p所在的肢体骨骼方向上的单位向量,x_jk是第k个人部位j的位置。那么p点在该肢体上的范围如下:
12.png
到这里我们便得到了部分亲和场,训练时到这里也就可以去计算损失了。
接下来是测试的时候做的事情

**我们有了检测到的一组身体部位,结合上面求的部分亲和场,接下来可以计算两个节点之间的肢体关联置信度:**公式如下
13.png
其中,d_j2和d_j1是两个关节的坐标。**p(u)**是通过均匀采样u的方式插值两个候选身体部位和的位置得到的位置 ,如下公式
14.png
节点有了,关系大小可以用置信度表示了,这很像图的特性,下面也是用二分图进行的节点分配:具体如何做的呢?

首先,我们计算出两个部位的所有连接的权重,即E,生成矩阵。

下面举一个例子:假设有左耳={r_1, r_2, r_3, r_4},左眼={e_1, e_2, e_3},通过计算每个耳到眼的E值可以得到下列矩阵(值乱写的,正常应该是通过公式10生成的):
16.png

该二维矩阵代表了一个二分图,类似下面:
15.png
接下来找到权重最大组合
首先明确约束,二分图中所有边不能公用一个顶点,这也很好理解,假设我们r3和e3连接了,即一个人的骨骼配对了,怎么可能再将另外一个人的骨骼节点和这个配对了的人的骨骼节点进行相连呢。

我们就是再上面提到的约束基础上寻找最大的权重组合,如下:
17.png
从该图能看出,与r1置信度最大的是e4,但是却不能被分配到一起,因为e4和r4的置信度更大。为了得到最大的权重总和,必须让r4和e4相连,r1与其余的节点相连。到这里就是所有的思想步骤了!!!

知道了权重最大组合的思想,再看数学表达就容易了很多:

假设我们有多人的身体部位候选集18.png
其中J代表身体部位j,N_j代表身体部位j有多少个候选位置,19.png代表部位j的第m个侯选位置。

我们定义了下面的公式用来判断关节是否连接:

20.png
其中21.png属于(0, 1),代表着关节22.png21.png是否连接。同时为了达到上面二分图所有边不能公用一个顶点的效果,对该公式中的m和n做出约束。

24.png
最后,就是权重最大组合的公式:

25.png
26.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二.《泽诺尼亚》明文CALL

了解发包函数 1.一款网络游戏,必定是会发包的,对于PC端而言,想要进行网络通讯,就拿最简单的CS架构而言势必会调用win32 API函数或底层函数 2.这里列举出常用的API如:send sendto wsasend wspsend 3.有一些正向开发经验的同学,肯定是见过这几个函数的 4.接下来我们来看看这款…

JavaEE——介绍并简单使用线程池

文章目录 一、 什么是线程池二、Java中线程池的运用1. 创建线程池中的问题2. 标准库中线程池的使用 三、自主实现一个简单的线程池 一、 什么是线程池 所谓线程池,其实和字符串常量池,数据库连接池十分相似,就是设定一块区域,提前…

打印机常见故障解决参考方法

1、首先检查打印机电源线连接是否可靠或电源指示灯是否点亮,然后再次打印文件,仍不能打印,请看下一步。 2、检查打印机与计算机之间的信号传输线是否可靠连接,检查并重新连接,如果打印机仍不能打印,请看下一…

Java线程Thread类常用方法

文章目录 1. start():启动线程,使其执行run()方法中的代码。2. run():线程的执行逻辑,需要在该方法中定义线程要执行的代码。3. sleep(long millis):使当前线程暂停指定的毫秒数,进入阻塞状态。4. join()&a…

【C++】红黑树封装map和set

文章目录 一、map和set源码剖析二、红黑树的迭代器1.begin()与end()2.operator()与operator--() 三、set的模拟实现四、map的模拟实现五、完整代码实现1.RBTree.h2.set.h3.map.h5.Test.cpp 一、map和set源码剖析 我们知道,map和set的底层是红黑树,但是我…

如何用Python快速搭建一个文件传输服务

当我的朋友需要把他电脑上面的文件从他的电脑传递到我电脑上的时候,我只需要启动服务 启动服务! 他打开web界面 就能把文件传递到我电脑上(还能够实时显示进度) 文件就已经在我电脑上的uploads文件夹里面了 项目结构如下 templat…

python浮点运算不准确

1.问题 1.12.2的最后结果并不等于3.3 2. 解决方法 错误示范 引入了Decimal计算,但是计算类型是float型,依然计算不准确 正确解决方法 把类型转化为字符串引入计算

动手实战 | 使用 Transformers 包进行概率时间序列预测

最近使用深度学习进行时间序列预测而不是经典方法涌现出诸多创新。本文将为大家演示一个基于 HuggingFace Transformers 包构建的概率时间序列预测的案例。 概率预测 通常,经典方法针对数据集中的每个时间序列单独拟合。然而,当处理大量时间序列时&…

spring中的扩展点解析以及实践使用

文章目录 1、ApplicationContextInitializer2、BeanDefinitionRegistryPostProcessor3、BeanFactoryPostProcessor4、InstantiationAwareBeanPostProcessor5、SmartInstantiationAwareBeanPostProcessor6、BeanFactoryAware7、ApplicationContextAwareProcessor8、BeanNameAwar…

查找文件所在的具体位置

Linux Command 命令: find – walk a file hierarchy (遍历文件层次结构) ;DESCRIPTION 描述: 在指定目录下查找文件和目录, 可以使用不同的选项来过滤和限制查找的结果 ; Grammar Format $ find <在哪个路径下查找> <可选参数…> 常用选项 -name <pattern>…

【javaEE面试题(四)线程不安全的原因】【1. 修改共享数据 2. 操作不是原子性 3. 内存可见性 4. 代码顺序性】

4. 多线程带来的的风险-线程安全 (重点) 4.1 观察线程不安全 static class Counter {public int count 0;void increase() {count;} } public static void main(String[] args) throws InterruptedException {final Counter counter new Counter();Thread t1 new Thread(()…

VMware16.0安装教程和创建

许可证&#xff1a; ZF3R0-FHED2-M80TY-8QYGC-NPKYFYF390-0HF8P-M81RQ-2DXQE-M2UT6ZF71R-DMX85-08DQY-8YMNC-PPHV8设置网络 添加镜像 下载centos7镜像网址https://mirrors.aliyun.com/centos/7/isos/x86_64/?spma2c6h.25603864.0.0.d7724511YPrZpg win10镜像地址https://ww…

Linux+Docker+Gitlab+Jenkins+虚拟内存

最近想研究一下怎么自动化发布项目,于是找到了gitlab+jenkins这个组合,正好借机也研究一下最近很火的docker技术。本篇共分为五部分,分别为安装要求,内存虚拟化,安装docker,安装gitlab,安装jenkins。 一、 安装要求 1 Docker安装要求: 1.1 操作系统 Docker只支持64…

unittest单元测试

java的单元测试框架Junit和TestNG&#xff0c;python里面也有单元测试框架-unittest,相当于是一个python版的junit。python里面的单元测试框架除了unittest,还有一个pytest框架&#xff0c;但是用的比较少 unittest注意点&#xff1a; 导入unittest模块 类名的第一个字母大写&…

代码随想录算法学习心得 40 | 139. 单词拆分、背包问题总结...

一、单词拆分 链接&#xff1a;力扣 描述&#xff1a;给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 思路如下&…

【Linux | Shell】Linux 安全系统 —— 用户、组、文件权限 - 阅读笔记

目录 一、Linux 的安全性1.1 /etc/passwd 文件1.2 /etc/shadow 文件1.3 添加新用户 —— useradd1.4 删除用户 —— userdel1.5 修改用户 —— usermod、passwd、chpasswd 二、使用 Linux 组2.1 /etc/group 文件2.2 创建新组 —— groupadd2.3 修改组 —— groupmod 三、理解文…

Jenkins可持续集成Python自动化脚本

目录 前言 一、Jenkins搭建在Windows上 二、Jenkins搭建在Linux上 &#x1f381;更多干货 完整版文档下载方式&#xff1a; 本文讲解Jenkins如何每次定时的从SVN服务器上拉取最新的代码并执行本地库里的脚本 前言 1、本地代码库目录F:\5i5jautest内有测试文件all_tests.…

Attention,注意力机制

在机器视觉任务中&#xff0c;每一张图片都有重点区域&#xff0c;而非每一个像素对模型理解图片都同等重要。 在自然语言处理任务中&#xff0c;每一段文字都有重点词语&#xff0c;而非每一个字对模型理解语句都同等重要。 如此&#xff0c;在神经网络模型中引入注意力&#…

做投票小程序线上投票制作制作图片投票链接如何做投票小程序

小程序投票活动如何做&#xff1f;很多企业在运营当中&#xff0c;都会通过投票活动来进行推广&#xff0c;从而达到吸粉、增加用户粘度等效果。而此类投票活动&#xff0c;通过小程序就可以实现&#xff0c;操作简单。 我们现在要以“时尚新态度”为主题进行一次投票活动&…

WiFi 时钟+本地温度

[ WiFi 时钟 ] [ WiFi 天气时钟 ] [ WiFi 时钟本地温度 ] 夏天到了&#xff0c;显示器上放一个时钟&#xff0c;顺便实时测量本地室温&#xff0c;看看空调工作是否正常也算是个实用制作。 用到零件共 4 个&#xff1a; 400孔面包板 &#xff08; 大号…