人体姿态估计相关理论

姿态估计论文汇总 Stacked Hourglass/CPN/Simple Baselines/MSPN/HRNet
制作自己的COCO关键点数据集
关键点之热力图Heatmap与坐标FC回归1
关键点之热力图Heatmap与坐标FC回归2
关键点检测——标签(Ground Truth)构建——Coordinate、Heatmap和Heatmap + Offsets
人体姿态估计数据集:MPII、COCO与 AI Challenger 的标注格式可视化
人体姿态估计_CVPR2020_heatmap
2D关键点检测之HRNet
human motion
FrankMocap
视频人体动作捕捉技术
SMPLX
多视角相机标定
人体动作捕捉格式BVH及其与三维坐标的转换
human3.6m数据集中的 3D信息格式解析,涉及到旋转轴即三个旋转自由度组成的旋转向量,有3D信息相当于有2D信息,可以用来训练图片转2D,图片转3D,2D转3D

两种骨骼关节点检测方式

基于深度学习的人体骨骼关节点的检测方式主要包含两种:一种是利用网络直接回归关节点的数值坐标位置;一种是利用网络生成关节点热力图表示,之后从热力图中提取出关节点的数值坐标。

基于坐标回归的检测方式

在这里插入图片描述
骨骼关节点在图片上直观表示为目标点的空间位置,因此直接从图片中回归出骨骼关节点的坐标位置是非常符合人体姿态估计的定义的。基于坐标回归的骨骼关节点检测整体流程如图 2-1 所示。首先使用卷积神经网络对输入的图像进行预测得到 K 个关节点的数值坐标,之后与数据集给定的关节点真实数值坐标进行误差计算,利用反向传播算法对卷积神经网络的参数进行更新;推理时,使用已训练的卷积神经网络对待预测图像进行处理,即可得到图像中人体骨骼关节点的坐标位置。DeepPose首次使用深度学习直接从图像中回归骨骼关节点的坐标位置。基于坐标回归的骨骼关节点检测方式简单直接,由于人体姿态估计数据集的真实标签对应图像中骨骼关节点的数值坐标位置,因此该检测方式可以实现网络端到端的训练。

基于高斯热图的检测方式

在这里插入图片描述
基于高斯热图的骨骼关节点检测整体流程如图 2-2 所示。首先使用数据集给定的真实关节点数值坐标生成真实关节点高斯热图,之后使用卷积神经网络对输入的图像进行处理得到预测的 K 张关节点高斯热图,其中 K 为待预测的关节点个数。训练时,使用关节点均方误差损失函数计算预测高斯热图与真实高斯热图之间的误差,之后利用反向传播算法对卷积神经网络的参数进行更新;推理时,使用已训练的卷积神经网络对待预测图像进行处理,得到 K 张关节点高斯热图,之后使用转换算法从 K 个预测高斯热图中提取出骨骼关节点的数值坐标。通常情况下,基于高斯热图的骨骼关节点检测算法的输入为 256×256×3 的 RGB 图像,输出为64×64×K 的高斯热图。输出 64×64×K 的高斯图,保证了较大的感受野,使得网络更加具有泛化性,理论上增大输出高斯热图的分辨率可以提升性能,但计算量、参数量也会随之增大。因此,一般情况下使用输入分辨率的四分之一作为输出分辨率。

两种检测方式的对比

基于坐标回归的骨骼关节点检测方式可以直接输出图像中关节点的数值坐标,使得网络实现端到端的全微分训练。通常情况下基于该检测思路设计的深度卷积神经网络最后一层采用全连接方式生成数值坐标,由于全连接层自身的缺点,导致训练完成的网络严重依赖于训练数据的分布特性,从而造成非常严重的过拟合,降低了网络的空间泛化能力。基于高斯热图的骨骼关节点检测方式设计的深度卷积神经网络最后一层采用卷积操作生成 K 张分辨率为原输入图像四分之一的高斯热图。在输入分辨率相同的条件下,由于高斯热图具有更大的分辨率,所涵盖的语义信息远多于全连接层生成的数值坐标,因此与基于坐标回归的检测方式相比,具有更好的空间泛化能力,关节点检测精度更优。然而由于数据集原始标签为关节点数值坐标,基于高斯热图的检测方式得到的 K 张高斯热图需要经过后处理提取对应的数值坐标,因此模型不是端到端的全微分模型。此外,基于高斯热图检测方式设计的深度学习模型,其输出分辨率为 64×64,与基于坐标回归的检测方式相比显存占用多、训练速度慢。同时,由于高斯热图的输出是整数值,而全连接层可以实现浮点数的输出,因此,基于高斯热图的检测方式会造成一定程度的精度丢失,称之为量化误差。
综上所述,基于坐标回归的骨骼关节点检测方式的优缺点如下:(1)优点是模型处理速度快,整体是端到端的全微分模型;(2)缺点是模型泛化性能差,关节点检测精度低。基于高斯热图的骨骼关节点检测方式的优缺点如下:(1)优点是模型空间泛化能力强,关节点检测精度高,模型性能好;(2)缺点是模型不是端到端全
微分模型,占用计算资源多,整数输出会损失部分精度。
此外,针对高斯热图的骨骼关节点检测方式存在的量化误差问题,Xiao等人提出了将高斯热图和坐标回归结合起来的检测方式,Zhang等人从图像编解码角度出发,提出了一种基于分布感知的坐标表征方式用于人体姿态估计。Huang等人提出了一种无偏数据处理方式用于人体姿态估计。其中 Zhang 和 Huang 两人提出的方法是与模型无关的,可以应用到任意模型的数据预处理和后处理,然而在一定程度上增加了时间消耗。因此,Yang等人在上述两种方法的基础上,进一步提出了一种耗时少、性能更好的与模型无关的数据处理方法。

两种多人姿态估计检测思路

前文讲述了两种骨骼关节点的检测方式,实际应用中主要是面向多人的人体姿态估计。基于深度学习的多人人体姿态估计主要有两种实现思路,一种是自上而下:先检测人体,再检测人体的关节点;一种是自底向上:先检测图像中所有的关节点,之后使用聚类等方法分配关节点至所属人体。本节首先介绍自上而下的多人人体姿态检测方法,其次介绍自底向上的多人人体姿态估计算法。

自上而下

自上而下的多人人体姿态估计算法思路如图所示,首先使用目标检测算法定位出图像中的人体目标框,之后使用前述的单人人体姿态估计算法进行骨骼关节点的检测。从算法思路可以看出,自上而下的多人人体姿态估计算法不仅可以获得骨骼关节点的坐标,同时还可以获得关节点所属个体。
在这里插入图片描述
自上而下的多人人体姿态估计算法常与目标检测算法结合使用。目标检测算法分为一阶段目标检测和两阶段目标检测,其中一阶段目标检测将目标检测框视为回归问题,直接利用卷积神经网络从图像中回归出目标物体的边界框坐标,常用的方法有 Yolo[52]、SSD[53]等。两阶段目标检测首先利用滑动窗口方法生成一系列边界候选框,之后对每个候选框进行分类校准,得到最终的目标边界框,常用的方法有 R-CNN[54]、Fast R-CNN[55]、Faster R-CNN[56]等。Hourglass[16]、CPM[15]、SimpleBaseline[57]、HRNet[17]等通常作为自上而下的多人人体姿态估计算法中的单人人体姿态估计器。常用目标检测算法的性能如表 2-1 所示,可以看到一阶段目标检测算法普遍比两阶段目标检测算法速度快。
在这里插入图片描述

自底向上

在这里插入图片描述
自底向上的多人人体姿态估计算法思路[51]如图 2-4 所示,首先检测出图像中所有的关节点,之后使用关节点匹配算法将检测到的关节点分配到所属个体,从而完成多人人体姿态估计的任务。可以看出,自底向上的多人人体姿态算法思路更符合人体姿态估计的定义:从图像中检测定位出骨骼关节点所在的坐标,从而构建人体姿态。自底向上的多人人体姿态估计算法的难点在于如何对检测到的关节点进行分配。
Cao[40]等人提出 OpenPose 算法,该算法基于部件亲和力场的约束思想,通过贪婪算法分配所检测到的关节点,荣获了 2016 年 COCO 人体关节点检测挑战大赛的冠军。HigherNet[58]在 HRNet[17]的基础上对其进行改进,提出了一种高分辨率自底向上的多人人体姿态估计算法,训练时使用多分辨率监督方式,推理时使用多分
辨率聚合方式,解决了自底向上的多人人体姿态估计中的尺度变化问题,能够更精确的定位图像中的关节点,实验表明该方法不仅是当时最优的自底向上的方法,而且在拥挤场景下也具有很强的稳健性。

两种检测思路的对比分析

自上而下的多人人体姿态估计思路首先需要检测出图像中所有的人体边界框,之后对每个人体使用单人姿态估计算法检测骨骼关节点。当目标检测算法对图像中的人体存在漏检或者误检的情况时,都会导致第二阶段单人人体姿态估计算法失效。此外,当图像中存在较为密集的人体时,各个人体之间的互遮挡比较严重,会存在两个人体检测框虽然针对的是不同人体,但实际上在第二阶段单人人体姿态估计时,只会针对一个人体进行姿态估计,从而忽略了对另外一个被遮挡人体进行姿态估计。自上而下的多人人体姿态估计的一个预先假设是人体框中只包含一个人体,为此,Khirofkar[59]等人提出了基于 MHAB 的 MHPNet 模型,该模型可以自适应的选择预测对象,从而了克服预先假设的局限性。
自底向上的多人人体姿态估计思路首先需要检测出给定图像中所有的骨骼关节点,之后通过使用关节点匹配算法将检测到的关节点分配到所属个体上。因此,自底向上的多人人体姿态估计方法依赖于关节点检测算法和关节点匹配算法的精度。关节点检测算法精度高意味着网络可以很好的检测图像中的所有关节点。关节点匹配算法是自底向上多人人体姿态估计方法的关键,它不仅影响最终各个人体的所属关节点的检测精度,同时还决定了姿态估计算法的运行速度。此外,基于高斯热图进行自底向上的多人人体姿态估计时,通常情况下假设高斯核的标准差是固定的,然而在人体尺度变化大和标签模糊的条件下,对于各个关节点使用相同的高斯核标准差是不太合理的,因此,Luo[60]等人提出了尺度自适应热图回归(SAHR)方法用于自适应地调整每个关节点的高斯核标准差,在 COCO test-dev 数据集上实现了基于自底向上的多人姿态估计的最优性能。
综上,自上而下的多人人体姿态估计算法采用分而治之的思想进行设计,自底向上的多人人体姿态估计思路更符合人体姿态估计的任务定义。自上而下的思路检测精度高,自底向上的思路检测速度快。随着目标检测算法的发展,速度不再是自上而下方法的发展瓶颈,进一步提升单人人体姿态估计算法的精度显得尤为重要。

热力图生成方式

将关键点 (x,y) 坐标转化为 NxN heatmap.
相对于直接回归关键点 groundtruth 为 (x, y) 而言.
groundtruth 由 (x, y) 变为 heatmap 形式,
这里探索了几种不同的生成 heatmap 的方法.

import time
import numpy as np
import cv2
import matplotlib.pyplot as plt


def CenterLabelHeatMap(img_width, img_height, c_x, c_y, sigma):
    X1 = np.linspace(1, img_width, img_width)
    Y1 = np.linspace(1, img_height, img_height)
    [X, Y] = np.meshgrid(X1, Y1)
    X = X - c_x
    Y = Y - c_y
    D2 = X  X + Y  Y
    E2 = 2.0  sigma  sigma
    Exponent = D2 / E2
    heatmap = np.exp(-Exponent)
    return heatmap


# Compute gaussian kernel
def CenterGaussianHeatMap(img_height, img_width, c_x, c_y, variance):
    gaussian_map = np.zeros((img_height, img_width))
    for x_p in range(img_width):
        for y_p in range(img_height):
            dist_sq = (x_p - c_x) * (x_p - c_x) + \
                      (y_p - c_y) * (y_p - c_y)
            exponent = dist_sq / 2.0 / variance / variance
            gaussian_map[y_p, x_p] = np.exp(-exponent)
    return gaussian_map


image_file = 'test.jpg'
img = cv2.imread(image_file)
img = img[:,:,::-1]

height, width,_ = np.shape(img)
cy, cx = height/2.0, width/2.0

start = time.time()
heatmap1 = CenterLabelHeatMap(width, height, cx, cy, 21)
t1 = time.time() - start

start = time.time()
heatmap2 = CenterGaussianHeatMap(height, width, cx, cy, 21)
t2 = time.time() - start

print(t1, t2)

plt.subplot(1,2,1)
plt.imshow(heatmap1)
plt.subplot(1,2,2)
plt.imshow(heatmap2)
plt.show()

print('End.')

(t1, t2): (0.020607948303222656, 0.6914258003234863)
在这里插入图片描述

CPM 给出的 C++ 实现:

template<typename Dtype>
void DataTransformer<Dtype>::putGaussianMaps(Dtype* entry, Point2f center, int stride, int grid_x, int grid_y, float sigma){
  //LOG(INFO) << "putGaussianMaps here we start for " << center.x << " " << center.y;
  float start = stride/2.0 - 0.5; //0 if stride = 1, 0.5 if stride = 2, 1.5 if stride = 4, ...
  for (int g_y = 0; g_y < grid_y; g_y++){
    for (int g_x = 0; g_x < grid_x; g_x++){
      float x = start + g_x * stride;
      float y = start + g_y * stride;
      float d2 = (x-center.x)(x-center.x) + (y-center.y)(y-center.y);
      float exponent = d2 / 2.0 / sigma / sigma;
      if(exponent > 4.6052){ //ln(100) = -ln(1%)
        continue;
      }
      entry[g_y*grid_x + g_x] += exp(-exponent);
      if(entry[g_y*grid_x + g_x] > 1) 
        entry[g_y*grid_x + g_x] = 1;
    }
  }
} 
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值