3D Human Pose Estimation with Spatial and Temporal Transformers

论文翻译与理解:3D Human Pose Estimation with Spatial and Temporal Transformers(2021.10)


Abstract

   Transformer架构已经成为自然语言处理的首选模型,目前正被引入到图像分类、目标检测、语义分割等计算机视觉任务中。此前,在人体姿态估计领域,卷积架构仍然占主导地位。
   针对视频3D人体姿态估计,作者提出一种纯粹基于transformer的方法(不包含卷积结构设计)——PoseFormer。
   具体来讲,针对一段帧序列,作者设计了一种spatial-temporal(时空联合) transformer结构,来对视频序列每一帧中人体关节点之间的联系(空间角度)+帧之间的时间相关性(时间角度),进行综合建模,最后输出center frame的精确三维人体姿态。

Introduction

  1. 什么是Human pose estimation(HPE)?

    • HPE aims to localize joints and build a body representation (e.g. skeleton position) from input data such as images and videos.
    • HPE提供了人体的几何和运动信息,可以应用于多种(人机交互、运动分析、医疗保健等)领域。
  2. HPE当前的工作大致可分为两类:

    • 直接估计方法(direct estimation approaches)
      • 从二维视频/图像直接推断得到三维人体姿态。
    • 从2D到3D的提升方法(2D-to-3D lifting approaches)
      • 先从图像中得到2D姿态估计,再进一步推断3D姿态。
      • 2D姿态检测目前已经能做的狠好了,所以采用这种方法通常比直接估计法要好(2D-to-3D lifting approaches generally outperform direct estimation methods.)。
      • 但也存在问题:2D到3D的映射是non-trivial1 (不平凡)的;由于深度模糊和遮挡问题(depth ambiguity and occlusion),不同的3D姿态在二维平面可能会有相同的2D姿态显示。
      • 为缓解上述问题并保持自然连贯性,多数工作将视频中的时间信息集成到他们的方法之中,比如:使用时序卷积神经网络(TCN)2捕获相邻帧的全局依赖关系,或者循环架构3。但这些措施时间相关窗口都有限,在时间连通性方面具有先天的局限性
  1. Transformer 由于其高效性、可扩展性和强大的建模能力,已经成为自然语言处理的标准。得益于Transformer的自注意力机制,长输入序列之间的全局相关性可以被清晰地捕获。这使得它成为序列数据问题的一个特别合适的架构,因此自然地扩展到3D HPE。

    • transformer在视觉任务中的应用并不容易:需要特定设计才能比肩CNN的性能,需要大规模数据集或数据增强+正则化的小规模数据集,且现有transformer主要用于图像分类,目标检测,分割。怎么用到3D HPE还不好说。
    • 于是有了作者后续的介绍。
  2. 如何在3D HPE中采用Transformer?

Alt

  • 将图像序列中每一帧的2D pose视为一个token,如Fig1(a)所示:共f帧,每帧中有J个关节点,J个关节点数据作为一个token代表该帧的2D pose信息。

    这样做忽视了空间上关节点之间的区别与联系:it ignores the natural distinction of spatial relations (joint-to-joint), leaving potential improvements on the table.后半句leave… on the table应该就是这样设计考虑不到潜在改善信息的意思吧。

  • 将每一帧的每一个关节点坐标视为一个token,如Fig1(b)所示:token太多,内存需求太大,不合理。

  • 所以,需要对每一帧的关节点进行巧妙地编码来保存其空间上的位置关系,同时对视频序列编码后不能生成太多的tokens。

  • 作者说:先前的一些工作只是通过简单的操作将关节点坐标投影到一个潜在的空间,而没有考虑人体关节的运动学相关性

  • 作者提出的PoseFormer狠好克服了上面方案的缺陷:

    • 不仅能够在空间和时间元素上有强大的表征,而且不会对长输入序列产生巨大的token计数。
    • 在两个流行的3D HPE基准数据集Human3.6 M和MPI - INF - 3DHP上,PoseFormer在这两个数据集上都达到了SOTA。
    • 与最先进的方法相比,作者可视化了poseformer估计的3D姿态,并发现其产生了更平滑和更可靠的结果。
    • 总结一下,作者的贡献主要有三:提出了第一个3D HPE 2D-to-3D lifting领域的纯transformer模型,设计了这种高效的Spatial-Temporal Transformer model, 模型在两个经典数据集上(without bells and whistles)达到SOTA。
  • PoseFormer:先利用现成的2D姿态估计器得到二维姿态序列,再进一步输出中心帧的3D姿态。其包含:

    • spatial transformer module:编码帧中的2D joints位置关系,捕捉潜在的特征表示。
    • temporal transformer module:捕获帧序列之间的全局依赖关系。

Related Works:

2D-to-3D Lifting HPE

我把这部分介绍精要地融到了introduction部分。

  1. 目前(截止2021年)广泛应用的2D PoseDetector:
    a. OpenPose
    b. CPN
    c. AlphaPose
    d. HRNet
  2. Martinez等人提出了一个简单而有效的全连接残差网络,从单帧图像中的2D关节点位置回归3D关节点位置。
  3. 视频图像序列估3D人体姿态可以利用其时间信息,进而提高准确性和鲁棒性。Hossain和Little提出了一种使用长短时记忆单元的循环神经网络来利用输入序列中的时间信息。
  4. 此前一些工作利用了时空关系和约束(如骨骼长度和左右对称)。Pavllo等人引入了时间卷积网络,从连续的2D序列中估计2D关键点上的3D姿态。在的基础上,Chen等人增加了骨骼方向模块和骨骼长度模块来确保视频帧之间的时间一致性,Liu等人利用注意力机制来识别显著性帧。
  5. 作者所发现的先前工作的不足:先前最先进的方法依赖于膨胀的时间卷积来捕捉全局依赖关系,这在时间连通性方面具有先天的局限性。此外,这些工作中的大多数使用简单的操作将关节坐标投影到一个潜在的空间,而没有考虑人体关节的运动学相关性。

GNNs in 3D HPE

  1. 人体姿态可以表示为一个以关节为节点,骨骼为边的图。所以图神经网络( Graph Neural Networks,GNNs )也被应用于2D-to-3D HPE问题。
    • Ci等人提出了一种名为局部连接网络( Locally Connected Networks,LCNs )的框架,利用全连接网络和GNN操作来编码局部联合邻域之间的关系。
    • Zhao等解决了图卷积网络( Graph Convolutional Network,GCN )操作的局限性,特别是如何跨节点共享权重矩阵。引入语义图卷积操作学习边的通道权重。
  2. 从图神经网络这个角度来看作者的poseformer:PoseFormer里的Transformer结构可以被看作是一类具有独特的,且具有优势的图操作的图神经网络。(transformer中基于注意力机制得到的权值,实际上就与真实的骨骼线对应,也即节点之间的连接强度由transformer的自注意力机制决定)

Vision Transformers

  • Transformer应用于视觉任务:
    • Carion等人提出了DETR ( DEtection TRansformer )算法用于目标检测和全景分割。
    • Dosovitskiy等人提出了一种纯transformer结构,( Vision Transformer,ViT ),它在图像分类上达到了最先进的性能。然而,ViT是在大规模数据集ImageNet - 21k和JFT300M上训练的,需要巨大的计算资源。
    • 在基于知识蒸馏的基础上,提出了一种数据高效的图像转换器( Dei T ) 。
    • HPE任务:
      • Yang等人提出了一种仅从图像中估计2D姿态的Transformer网络。
      • Lin等人在其方法METRO ( MEsh TRansfOrmer )中将CNNs与Transformer网络相结合,从单张图像中重建三维姿态和网格顶点。属于直接估计的范畴,而作者的poseformer属于2D-to-3D

Method

  作者通过现成的2D位姿检测器(作者实验用的是这个:cascaded pyramid network (CPN))获得每一帧的2D位姿,然后将连续帧的2D位姿序列作为输入来估计中心帧的3D位姿。

Temporal Transformer Baseline

在这里插入图片描述

  1. 每一帧的2D pose 作为一个token输入,并使用transformer捕获输入序列之间的全局依赖关系。
  2. 每个输入的token作为一个patch(similar in terminology to ViT)。

    如何理解这一步?查阅!!

  3. patch embedding是一个可训练的线性投影层,将每个patch嵌入为一个更高维度的特征。(诶,这里大家可能注意到,前面不是说“先前的工作只通过简单的操作将关节点坐标投影到一个潜在的空间,没有考虑人体关节的运动学相关性”吗?,这里感觉也很像诶,别急,继续看下去就知道了)transformer网络利用位置嵌入,保留序列的位置信息。整个过程描述公式如下:
    Z 0 = [ x 1 E ; x 2 E ; . . . ; x f E ] + E p o s Z_{0} = [x^{1}E; x^{2}E; ... ; x^{f}E] + E_{pos} Z0=[x1E;x2E;...;xfE]+Epos
      关于x: { x i ∈ R 1 × ( J ⋅ 2 ) ∣ i = 1 , 2 , . . . , f } \{x^{i} \in \mathbb{R}^{1 \times (J \cdot 2)}| i = 1, 2, ..., f\} {xiR1×(J2)i=1,2,...,f},序列共有f帧/patch/token,J表示每一帧中2D pose joint的数量,2表示二维空间中joint的两个坐标。
      关于E: E ∈ R ( J ⋅ 2 ) × C E \in \mathbb{R}^{(J \cdot 2) \times C} ER(J2)×C 是一个线性投影矩阵; E p o s ∈ R f × C E_{pos} \in \mathbb{R}^{f \times C} EposRf×C 是位置嵌入。
      利用前两个E,将输入序列 X ∈ R f × ( J ⋅ 2 ) X \in \mathbb{R}^{f \times (J \cdot 2)} XRf×(J2) 转换为 Z 0 ∈ R f × C Z_{0} \in \mathbb{R}^{f \times C} Z0Rf×C, C表示嵌入维度。之后 Z 0 Z_{0} Z0送入到Temporal Transformer Encoder中。
  4. self-attention作为transformer的核心,将序列不同位置的嵌入特征相关联。作者的Transformer编码器由多头自注意力模块和多层感知器模块组成。LayerNorm应用于每个块之前,残差连接应用于每个块之后。
  5. 补充知识+承接上文进行公式表示:
    • 缩放点积注意力
      A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T d ) V Q = Z W Q , K = Z W K , V = Z W V Attention(Q,K,V) = Softmax(\frac{QK^{T}}{\sqrt{d}})V \\ Q = ZW_{Q}, K = ZW_{K}, V = ZW_{V} Attention(Q,K,V)=Softmax(d QKT)VQ=ZWQ,K=ZWK,V=ZWV
      其中, d = C , W ∈ R C × C d = C, W \in \mathbb{R}^{C \times C} d=C,WRC×C
    • 多头自注意力:Multi-head Self Attention Layer (MSA)
      M S A ( Q , K , V ) = C o n c a t ( H 1 , H 2 , . . . , H h ) W o u t H i = A t t e n t i o n ( Q i , K i , V i ) , i ∈ [ 1 , . . . , h ] MSA(Q,K,V) = Concat(H_{1}, H_{2}, ..., H_{h})W_{out} \\ H_{i} = Attention(Q_{i}, K_{i}, V_{i}), i \in [1, ..., h] MSA(Q,K,V)=Concat(H1,H2,...,Hh)WoutHi=Attention(Qi,Ki,Vi),i[1,...,h]

    原文对这两块知识当然介绍的比较精简,这里我也只列出关键公式,详细内容
    可以参考上述链接。

  6. Temporal Transformer Encoder structure of L layers:
    Z ℓ ′ = M S A ( L N ( Z ℓ − 1 ) ) + Z ℓ − 1        ℓ = 1 , 2 , . . , L Z ℓ = M L P ( L N ( Z ℓ ′ ) ) + Z ℓ ′        ℓ = 1 , 2 , . . , L Y = L N ( Z L ) Z_{\ell}^{'} = MSA(LN(Z_{\ell-1})) + Z_{\ell-1} ~~~~~~ \ell=1,2,..,L\\ Z_{\ell} = MLP(LN(Z_{\ell}^{'})) + Z_{\ell}^{'}~~~~~~ \ell=1,2,..,L\\ Y = LN(Z_{L}) Z=MSA(LN(Z1))+Z1      =1,2,..,LZ=MLP(LN(Z))+Z      =1,2,..,LY=LN(ZL)
      其中,LN()表示层归一化算子(same as VIT),最终的编码器输出 Y ∈ R f × C Y \in \mathbb{R}^{f \times C} YRf×C,与 Z 0 Z_{0} Z0的尺寸一致。这一Encoder共有L层,每一层的输入输出也都是 f × C f \times C f×C维度。
      为了预测中心帧的三维位姿,将编码器输出 Y Y Y在frame(也即f)维度上取平均,压缩为向量 y ∈ R 1 × C y \in \mathbb{R}^{1 \times C} yR1×C。最后用一个MLP块将输出回归到 y ∈ R 1 × ( J ⋅ 3 ) y \in \mathbb{R}^{1 \times (J \cdot 3)} yR1×(J3),即中心帧的三维位姿。

PoseFormer: Spatial-Temporal Transformer

在讲完上述的Temporal Transformer Baseline后,将原本的patch embedding部分具体实现为spatial tansformer方法,组合成最终的poseformer。

  PoseFormer由3个模块组成:spatial transformer module, temporal transformer module, regression head module
  前一部分的时序transformer baseline主要关注于输入序列(帧与帧)之间的全局依赖性,但是并没有很好的关注到具体某一帧中各个关节点之间的运动关系,因为我们的baseline在初始部分(patch embedding),如果只使用一个简单的线性投影,很难学到一帧图片中joints之间的运动学关系。
  为解决这个难题,可能直观会想到如Fig1(b)所示:将每一帧每一个joint的二维坐标作为一个单独的patch。但很明显这样干patches暴增,直接从 f f f变成 f × J f \times J f×J了,且模型计算复杂度也变为了 O ( ( f ∗ J ) 2 ) O((f * J)^2) O((fJ)2)(这怎么算的,算的是整个模型的计算复杂度吗?需要验证一下)。于是作者提出了他的解决方案:patch embedding也用transformer方法。
  作者用两个transformer分别提取时域(全局)信息和空域(局部)信息,如下图:
在这里插入图片描述

Spatial Transformer Module

该模块从单帧中提取高维特征。但是我觉得还需要我们理论计算验证一下,这样做的模型计算复杂度相较于之前的 O ( ( f ∗ J ) 2 ) O((f * J)^2) O((fJ)2)如何

  1. 很明显,这一块和之前的temporal transformer baseline基本一毛一样,就是输入从f帧图像序列变成了单帧图像中的J个坐标点。
  2. 自然,我们要用transformer来提取一帧图片中的运动学信息,需要把各个关节点编码+多头自注意力…(进行常规标准的transformer encode)。
  3. 那么对于patch embedding编码,这里就可以用较为简单的线性映射(可训练的线性投影),公式如下(我自己写的,原文没有):
    z 0 i = x i E + E S P o s z_{0}^{i} = \textbf{x}^{i}E+ E_{SPos} z0i=xiE+ESPos
       x i ∈ R 1 × ( J ⋅ 2 ) \textbf{x}^{i} \in \mathbb{R}^{1 \times (J \cdot 2)} xiR1×(J2) E S P o s ∈ R J × c E_{SPos} \in \mathbb{R}^{J \times c} ESPosRJ×c 是位置嵌入,输出 z 0 i ∈ R J × c z_{0}^{i} \in \mathbb{R}^{J \times c} z0iRJ×c, c表示spatial嵌入维度。之后 z 0 i z_{0}^{i} z0i送入到Transformer Encoder中。
  4. 对于这个第i帧,具有L层的transformer encoder最终输出为 z L i ∈ R J × c z_{L}^{i} \in \mathbb{R}^{J \times c} zLiRJ×c,然后将此feature送入到temporal tansformer架构中。
Temporal Transformer Module
  1. 前文空间transformer模块为每个单独的帧编码高维特征,那么这里的时间transformer模块就是是建模跨帧序列的依赖关系。
  2. 我们把得到的第i帧 z L i ∈ R J × c z_{L}^{i} \in \mathbb{R}^{J \times c} zLiRJ×c 展成 z i ∈ R 1 × ( J ⋅ c ) \textbf{z}^{i} \in \mathbb{R}^{1 \times (J \cdot c)} ziR1×(Jc)。对所有f帧图片重复上述步骤后,再把所有这些向量拼接起来: Z 0 = { z 1 ; z 2 ; . . . z f } ∈ R f × ( J ⋅ c ) Z_{0} = \{ \textbf{z}^{1}; \textbf{z}^{2}; ... \textbf{z}^{f} \} \in \mathbb{R}^{f \times (J \cdot c)} Z0={z1;z2;...zf}Rf×(Jc)。(我怀疑原文写错了,原文用的不是";“,用的是”,")
  3. 然后再加入位置嵌入: E T P o s ∈ R f × ( J ⋅ c ) E_{TPos} \in \mathbb{R}^{f \times (J \cdot c)} ETPosRf×(Jc)
  4. 对于时间Transformer编码器,采用与空间Transformer编码器相同的架构,由多传感头自注意力模块和MLP模块组成。
  5. 时序编码最终输出: Y ∈ R f × ( J ⋅ c ) Y \in \mathbb{R}^{f \times (J \cdot c)} YRf×(Jc)
Regression Head
  1. 由于是利用f个帧来预测中心帧的3D位姿,那么我们需要把 Y ∈ R f × ( J ⋅ c ) Y \in \mathbb{R}^{f \times (J \cdot c)} YRf×(Jc)降到 Y ∈ R 1 × ( J ⋅ c ) Y \in \mathbb{R}^{1 \times (J \cdot c)} YR1×(Jc),作者是用加权平均实现的(权重也是可学习的参数)。
  2. 最后用一个带Layer Norm的MLP将Y映射为 y ∈ R 1 × ( J ⋅ 3 ) \textbf{y} \in \mathbb{R}^{1 \times (J \cdot 3)} yR1×(J3),就是最后3D位姿的预测结果。
Loss Function
  1. 使用MPJPE (Mean Per Joint Position Error) loss来最小化pre和ground truth之间的误差: L = 1 J ∑ k = 1 J ∣ ∣ p k − p k ^ ∣ ∣ 2 L = \frac{1}{J} \sum_{k=1}^{J} || p_{k} - \hat{p_{k}}||_{2} L=J1k=1J∣∣pkpk^2

Experiments:Implementation Details

一些参数的设定,消融实验等等…


  1. 在数学上,“trivial”这个词译为“平凡”是贴切的,正如其义,就是很简单的,显而易见,不重要的,或者说不是我们特别感兴趣的,意义不大的。反之,就称为非平凡的(nontrivial),我们感兴趣的,具有一定意义的。 ↩︎

  2. https://blog.csdn.net/qq_33331451/article/details/104810419 膨胀技术本身具有有限的时间连通性 ↩︎

  3. RNN架构对于特别长序列的依赖关系,实践中还是不容易捕获的?原文说:recurrent networks are mainly constrained to simply sequential correlation.不知道是不是我这个意思。 ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值