单位:海康威视,西安交大
pdf:openaccess.thecvf.com/content/CVPR2022
Github:https://github.com/hikvision-research/opera
导读:
流行的人体估计算法主要有两种分类:自下而上(先检测关节点,再把关节点关联合成人体)或自上而下(先检测人体再估计他的关节点)。继YOLO框架(实时的流行的目标检测器)内含端到端地检测Pose后,Transformer框架也能端到端地实现姿态估计。那么,人体或关节点是如何在该框架下被定位呢?Look look吧。
当前多人姿态估计的方法通常分开处理定位和关节点关联。本篇提出了第一个完全端到端的基于TRansformer的人体姿态(Pose Estimation)估计架构,即PETR。该方法将姿态估计看成一个分层的集合预测问题,有效去掉很多手工设计的模块,如RoI裁剪,NMS和分组后处理等。它学习了多姿态查询去直接推测一组整体姿态。然后一个关节点检测器用于进一步细化这个姿态,通过探索人体关节点之间的运动学关系。通过注意力机制,该方法能够自适应地关注与目标点最相关的特征,这将很大程度上克服特征错位问题,并显著提升了性能。在MS COCO和CrowdPose基准上大量实验,验证了该方法的先进性。
图1a所示是自上而下方法的范式,其缺陷有:姿态估计的性能严重依赖人体检测器的性能,特别在复杂场景下;其次,由于使用了两个隔离的检测器,运算量大,并且其与分割的人体实例的数量线性增加。对于自下而上的方法,如图1b所示。在关节点关联阶段通常采用启发式的,手工的后处理等复杂操作。
当前,有不少单阶段的方法实现姿态估计。如SPM提出了一种结构画的姿态表征,将人体实例和关节点位置的表征统一。FCPose和InsPose使用动态的实例感知的全卷积网络。这些方法通常需要裁剪感兴趣区域,后处理去分组关键点,在性能和速度速度上取得了较好的平衡。但是,他们依赖热力图、分数图和手工的NMS(非最大抑制)后处理上的“峰值”,这仍然没有端到端的优化。
启发于目标检测中的范式,我们提出了一种全端到端Transformer的框架,通过将人体姿态估计归纳成一个分层的集合预测问题,将人体实例和细颗粒度的人体关节点位置统一起来。在给出多随机初始化的姿态询问后,一个姿态decoder学习推测目标的关系,并在全局图像上下文中估计一组实例感知的姿态。然后,一组关节点decoder被设计去探索在不同关节点之间的结构化关系和进一步优化整个身体的姿态。
PETR超过了当前单阶段和自下而上的所有方法,并与自上而下的方法也有可比性。此外,PETR在密集场景下也表现良好,在CrowdPose上建立以领先的优势。
The overall architecture of PETR. C3 to C5 are multi-scale feature maps extracted from the backbone network (e.g., ResNet50). The visual feature encoder takes the flattened image features as inputs and refines them. Given N pose queries and the refined multi-scale feature tokens, pose decoder predicts N full-body poses in parallel. After that, an additional joint decoder takes each scattered pose (i.e., kinematic joints of each pose) as its reference points and outputs the refined pose as final results. K is the number of keypoints for each instance (e.g., K = 1 7 in COCO [21] dataset).
PETR的整体架构。C3-C5是从ResNet50中提取的多尺度特征。一个视觉特征编码器将这些扁平化的特征当做输入,并进行细化。给出N个姿态询问和细化的多尺度特征tokens,姿态编码器预测并行地预测N个整个身体的姿态。过后,一个附加的关节编码器将每个分散的姿态(即每个姿态的运动学关节点)作为其参考点,并输出细化的姿态作为最终结果,K是每个人体实例中关节点数量,在COCO集上K=17。
如上图所示,该框架主要包含三个关键的模块:一个视觉特征encoder,pose decoder和joint decoder。其中,视觉特征encoder用于细化从骨架中提取的多尺度特征图;pose decoder用于预测多个整体的姿态;joint decoder用于进一步在关节点层面细化整体姿态。
给出一张图片 I ∈ R H × W × 3 I \in R^{H \times W \times 3} I∈RH×W×3,我们提取了一个多尺度特征图 C 3 , C 4 , C 5 C_3,C_4,C_5 C3,C4,C5从ResNet骨架的最后三个阶段。这个多尺度特征图通过一个空间注意的全连接层投影到具有256个通道的特征图,然后拉伸到特征令牌 C 3 ′ , C 4 ′ , C 5 ′ C_3^\prime ,C_4^\prime , C_5^\prime C3′,C4′,C5′中。特别的, C i ′ C_i^\prime Ci′的形状是 L i × 256 , L i = H 2 i × W 2 i L_i \times 256, L_i= \frac{H}{2^i}\times \frac{W}{2^i} Li×256,Li=2iH×2iW。然后,将三者合并到一起,即 [ C 3 ′ , C 4 ′ , C 5 ′ ] [C_3^\prime ,C_4^\prime , C_5^\prime] [C3′,C4′,C5′]作为visual encoder的输入;visual encoder输出细化后的多尺度特征token F ∈ R L × 256 F \in R^{L \times 256} F∈RL×256,其中 L = L 3 + L 4 + L 5 L = L_3 + L_4 + L_5 L=L3+L4+L5是整个tokens的数量。然后,N个随机初始化的姿态询问器被用于直接推导N个整体的姿态和他们对应的置信度分数,在全局上下文背景下。最后,我们将完整个体的姿态分散到一系类的关节点中,并采用关节编码器进一步细化它们。
高分辨率的多尺度特征图对于姿态估计任务很重。由于多头注意力模块具有输入尺度的平方复杂度,我们采用可变形的注意力模块来实现特征编码。
由于可变行模型的低复杂度,编码器能够合并和细化这些多尺度特征。具体来说,每一个编码器包含一个多尺度的可变行注意力模型和一个FFN网络。为了确定每个特征token处在哪个特征级别,我们添加了尺度级别的嵌入,在位置嵌入的基础上。该编码器由6个叠加的可变形行编码层构成。然后,我们获取到细化后的多尺度视觉特征记忆 F F F。
在姿态编码器中,我们主要目的是推导一组整体姿态集合,在全局上下文(即特征记忆 F F F)背景下。与视觉特征编码器相似,我们是用可变形的注意力模块去构建pose decoder,因为效率的问题。特别的,给出N个随机初始化的姿态询问键 Q p o s e ∈ R N × D Q_{pose} \in R^{N \times D} Qpose∈RN×D,pose decoder的输出N个身体的姿态 { P i } i = 1 N ∈ R N × 2 K \{P_i\}_{i=1}^N \in R^{N \times 2K} {Pi}i=1N∈RN×2K,其中 P i = { ( x i j , y i j ) } j = 1 K P_i=\{(x_i^j,y_i^j)\}_{j=1}^K Pi={(xij,yij)}j=1K 表示第 i t h i^{th} ith个人的K个关节点的坐标,D表示询问键的维度。
下图是其具体的架构:
Detailed structure of the pose decoder. Given N pose queries, the pose decoder outputs N instance-aware full-body poses. The progressive deformable cross-attention module can attend to the visual features most relevant to the target keypoints.
首先,询问嵌入键被输入到自注意力模块中用于pose之间的交互,即pose-to-pose注意力。然后,每一个询问键从多尺度特征记忆F中通过可变形的交叉注意力模块(即feature-to-pose)提取特征。在该交叉注意力模块中输出K个推导位置,作为一个体姿态的初始位置。随后,这些实例注意的询问特征输入到多任务预测头中,其中分类头通过线性映射层来预测每个目标的置信度;姿态回归头使用隐含层个数为256的MLP去预测K个推导点的相对位置偏移。pose decoder有三个编码层顺序构成。
与一些方法仅使用最后的编码器层去预测姿态坐标,我们借助所有编码器层去逐渐估计姿态坐标。特别地,每一层基于前一层的预测去细化姿态。规范来讲,给出 ( d − 1 ) t h (d-1)^{th} (d−1)th编码层预测的归一化姿态 P d − 1 P_{d-1} Pd−1,第 d t h d^{th} dth编码层细化该姿态为:
P d = σ ( σ − 1 ( P d − 1 ) + Δ P d ) , P_d = \sigma(\sigma^{-1}(P_{d-1})+\Delta P_d), Pd=σ(σ−1(Pd−1)+ΔPd),
其中 Δ P d \Delta P_d ΔPd是第 d t h d^{th} dth层预测的偏移, σ , σ − 1 \sigma,\sigma^{-1} σ,σ−1表示sigmoid和反sigmoid操作。初始的推导位置 P 0 P_0 P0是随机初始化的矩阵,在训练过程中和模型参数联合更新。因此,这种渐进式的可变行交叉注意力模块能够关注与目标关键点最相关的视觉特征,这从本质上克服了特征错位问题。
如上图,关节点编码器joint decoder被提出来用于探索关节点之间结构化的联系,并进一步在关节点层面细化所有个体姿态。我们采用可变形的注意力模块去构建我们的joint decoder,正如pose decoder中采用的一样。更细致地讲,给出K个随机初始化的joint询问 Q j o i n t ∈ R K × D Q_{joint} \in R^{K \times D} Qjoint∈RK×D,joint decoder 将先前pose decoder预测的每一个体姿态的关节点位置作为他们的初始推导点,然后进一步细化这些关节点位置。所有姿态能够并行处理,因为他们在joint decoder是独立的。
这些关节点询问键首先通过一个自注意力模块进行互相交互,即joint-to-joint注意力。然后通过一个可变形的交叉注意力模块即feature-to-joint去提取视觉特征。随后,一个joint预测头通过MLP去预测2D关节位移 Δ J = ( Δ x , Δ y ) \Delta J=(\Delta x, \Delta y) ΔJ=(Δx,Δy)。与pose decoder相似,这个关节点坐标也是渐进式的细化的。规范来讲, J d − 1 J_{d-1} Jd−1代表第 ( d − 1 ) t h (d-1)^{th} (d−1)th层预测后归一化的关节点坐标,第 d t h d^{th} dth编码层的预测为:
J d = σ ( σ − 1 ( J d − 1 ) + Δ J d ) , J_d = \sigma(\sigma^{-1}(J_{d-1})+\Delta J_d), Jd=σ(σ−1(Jd−1)+ΔJd),,其中 J 0 J_0 J0是pose编码器预测的姿态的关节点位置。
借鉴前人方法,采用基于集合的Hungarian损失,它对每个真实位姿强制唯一的预测。分类损失函数记为 L c l s L_{cls} Lcls在分类头中被使用, L 1 损 失 记 为 L_{1}损失记为 L1损失记为L_{1} 和 和 和OKS损失记为 L o k s L_{oks} Loks,分别用于姿态回归头和关节回归头的损失函数。
OKS损失
最常用的 L 1 L_1 L1损失对于大小姿态具有不同的尺度,即使他们有相似的相对误差。为了消除这个问题,我们提出采用使用OKS损失,可以表述为:
L o k s ( P , P ∗ ) = ∑ i K e x p ( − ∣ ∣ P i − P i ∗ ∣ ∣ / 2 s 2 k i 2 ) δ ( v i > 0 ) ∑ i K δ ( v i > 0 ) L_{oks}(P,P^*) = \frac{\sum_i^Kexp(-||P_i-P_i^*||/2s^2k_i^2)\delta(v_i>0)}{\sum_i^K \delta(v_i>0)} Loks(P,P∗)=∑iKδ(vi>0)∑iKexp(−∣∣Pi−Pi∗∣∣/2s2ki2)δ(vi>0)
其中 ∣ ∣ ⋅ ∣ ∣ ||\cdot|| ∣∣⋅∣∣是第 i i i个预测点与真实点的欧式距离。这个OKS损失被归一化,考虑了每个人体实例的尺度,和关节点不同重要性。
Heatmap loss
类似,我们考虑了辅助的热力图回归训练以快速收敛。我们收集了视觉编码层输出 C 3 C_3 C3的特征tokens,并重塑这个tokens回到原始的空间结构,表示为 F C 3 ∈ R ( H / 8 ) × ( W / 8 ) × D F_{C_3}\in R^{(H/8) \times (W/8) \times D} FC3∈R(H/8)×(W/8)×D。我们采用了一个可变形的transformer encoder去产生热力图预测。然后,我们在预测的和真实的热力图之间计算一个变体的focal loss,也叫焦点损失,记为 L h m L_{hm} Lhm。热力图分支仅用于辅助训练,在推理阶段会去掉。
整体损失
规范起来,该模型的所有的损失函数表述为:
L = L c l s + λ 1 L r e g + λ 2 L o k s + λ 3 L h m L = L_{cls}+\lambda_1L_{reg}+\lambda_2L_{oks}+\lambda_3L_{hm} L=Lcls+λ1Lreg+λ2Loks+λ3Lhm
其中, λ 1 , λ 2 , λ 3 \lambda_1,\lambda_2,\lambda_3 λ1,λ2,λ3表示对应的损失权值。
这里将不同范式的方法进行了统一对比:1、自上而下的方法如HRNet目前还处在统治地位;2、单阶段端到端的方法,以Swin-L作为骨架的PETR取得了超过自下而上的方法的AP,即71.2%。
PETR在不同骨架下,取得了增量式的性能增长,同时比其他网络需要更少的推理时间。
PETR创新将姿态估计当成一组集合的回归问题,基于层次化的特征图,分别提出了Pose编码器和Joint编码器,两者具有类似的结构,都采用可变形的注意力模块,通过询问的方式加强Pose与特征、Joint与特征之间的联系,并以一种渐进式的学习方式细化姿态的位置输出,取得了性能和速度的双重提高,值得借鉴!