人体姿态识别被定义为人体关键点的定位问题,一直以来是计算机视觉领域的重要关注点。这一问题有着一些常见的挑战,比如各式各样的关节姿态,小得难以看见的关节点,遮蔽的关节点,需要根据上下文判断的关节点,而这个领域主流的工作是各式样的关节姿态。
此前的姿态估计都是基于局部的为关节建模,这种方式对于表示能力是很有局限性的,因为它使用局部探测器,只能是为身体关节点之间所有关系的部分子集建立模型,很有局限性。于是作者提出了以整体的方式来预测人体关节点的方法,使用DNN强大的性能来处理人体关节点的预测。DNN有着强大的分类和定位能力,在此之前并没有人来使用DNN(Deep Neural Networks)对人体关节点的定位,作者Alexander Toshev和Christian Szegedy是第一个DNN应用于人体关节点检测的人。
作者将人体姿态估计定为关节点回归的问题,并且给出了如何将DNN用于人体关节点回归的方式,每一关节点的定位使用一整幅图像输入到7层CNN来做回归,这种做法又两个优点:
更进一步,作者使用级联的DNN-based 姿态检测器。这种级联的检测器能够增加关节点定位的精确度。首先在一整幅图像上进行粗略的姿态估计,然后使用多个DNN-based 回归器对关节点的邻域子图像(有更高的分辨率)优化预测结果。
人体的一个姿态可以用 k k k个人体关节点的位置来表示,表示为向量
y = ( ⋯ , y i T , ⋯ ) T , i = { 1 , ⋯ , k } y = (\cdots, y_i ^ T, \cdots)^T, i = \{1, \cdots, k\} y=(⋯,yiT,⋯)T,i={1,⋯,k}
y i y_i yi表示第 i i i个关节点的坐标,一个带有标签的图像表示为 ( x , y ) (x, \textbf{y}) (x,y),检测框 b o x box box由 b = ( b c , b w , b h ) b=(b_c, b_w, b_h) b=(bc,bw,bh)表示, b c b_c bc表示预测之后关节点的位置,表示需要剪裁图像的中心, b w b_w bw表示图像的宽, b h b_h bh表示图像的高,并且使用
N ( y i , b ) = ( 1 / b w 0 0 1 / b h ) ( y i − b c ) (1) N(\textbf{y}_i, b)=\begin{pmatrix} 1/b_w & 0 \\ 0 & 1/b_h \\ \end{pmatrix}(\textbf{y}_i-b_c) \tag{1} N(yi,b)=(1/bw001/bh)(yi−bc)(1)
将每个关节点的图像用这个 b o x box box的绝对坐标转换为相对坐标,并且将关节点 y i y_i yi标准化(这里的标准化也会将关节点周围的坐标相对化),例如 N ( x ) \textbf{N}(x) N(x)表示将整幅图像标准化,就是将坐标原点移到图像中心位置, N ( x ; b ) \textbf{N}(x;b) N(x;b)就是用 b o x ( b c , b w , b h ) box(b_c,b_w,b_h) box(bc,bw,bh)截取图像 x x x对应部分,并且在 b o x box box做标准化处理。 N ( y ; b ) = ( ⋯ , N ( y i ; b ) T , ⋯ ) T N(\textbf{y};b)=(\cdots, N(\textbf{y}_i;b)^T,\cdots)^T N(y;b)=(⋯,N(yi;b)T,⋯)T表示对每个关节点都进行 b o x b box \ b box b的标准化处理。
作者将姿态估计当做回归问题来解决的,作者使用 ψ ( x ; θ ) ∈ R 2 k \psi(x;\theta)\in\textbf{R}^{2k} ψ(x;θ)∈R2k表示一个模型对图像 x x x处理的标准化姿态向量,用下公式表示对预测的姿态向量的绝对坐标表示:
y ∗ = N − 1 ( ψ ( N ( x ) ; θ ) ) (2) y^*=N^{-1}(\psi(N(x);\theta)) \tag{2} y∗=N−1(ψ(N(x);θ))(2)
由公式(2)知,应当也对训练集进行标准化处理:
D N = { f ( N ( x ) , N ( y ) ∣ ( x , y ) ∈ D } (3) D_N = \{ f(N(x),N(\textbf{y})|(x, \textbf{y})\in D\} \tag{3} DN={f(N(x),N(y)∣(x,y)∈D}(3)
所使用的损失函数是L2损失,那么模型可以写为:
arg min θ ∑ ( x , y ) ∈ D N ∑ i = 1 k ∣ ∣ y − ψ ( x ; θ ) ∣ ∣ 2 (4) \mathop{\arg\min}\limits_{\theta}\sum_{(x,y)\in D_N}\sum_{i=1}^k||\textbf{y}-\psi (x;\theta)||^2 \tag{4} θargmin(x,y)∈DN∑i=1∑k∣∣y−ψ(x;θ)∣∣2(4)
模型结构:
C ( 55 × 55 × 96 ) − L R N − P − C ( 27 × 27 × 256 ) − L R N − P − C ( 13 × 13 × 384 ) − C ( 13 × 13 × 256 ) − P − F ( 4096 ) − F ( 4096 ) C(55\times55\times96)-LRN-P-C(27\times27\times256)-LRN-P-C(13\times13\times384)-C(13\times13\times256)-P-F(4096)-F(4096) C(55×55×96)−LRN−P−C(27×27×256)−LRN−P−C(13×13×384)−C(13×13×256)−P−F(4096)−F(4096)
作者使用的CNN回归损失而不是分类损失,预测的关节点和GroundTruth的L2-Loss。由于训练数据量,模型参数很多,所以对图像做了简单数据增强以增加数据量。
初始阶段是可以粗略得到关节点的大概位置,它是基于整幅图像进行上下文推理的,但是它的尺寸被固定到了 220 × 220 220\times220 220×220,而一般数据集里的图片大小都比较大,所以输入的时候会对图像进行下采样,这样的操作使得细节丢失,继而想要优化关节点的位置相对不够精确,但又不能增大图像的尺寸,因为会增加大量的参数和计算量。
为了得到更好的准确率,作者训练了一个级联的姿态回归器。在第一个阶段,先粗略估计出上个部分的姿态轮廓,在下一阶段不断优化关节点的位置。
每一步都使用已经预测的关键点来取出基于这个关键点的邻域,这个子图像将被用于接下来的网络输入,而接下来的网络就会看到更高清的图像从而获取跟多的细节信息,从而达到更高的准确率。
为了优化姿态,作者定义了一个回归框 b o x b i box \ b_i box bi用于从整个图像上获取 y i y_i yi的邻域子图像 b i ( y ; σ ) = ( y i , σ d i a m ( y ) , σ d i a m ( y ) ) b_i(\textbf{y};\sigma)=(\textbf{y}_i,\sigma diam(\textbf{y}),\sigma diam(\textbf{y})) bi(y;σ)=(yi,σdiam(y),σdiam(y)),其中,姿态估计 d i a m ( y ) = diam(\textbf{y}) = diam(y)=对立的关节点之间的距离,具体取决于数据集和相关的姿态定义。
根据以上可以写出初始阶段或者第一阶段的预测姿态,其中 b 0 b^0 b0表示整个图像:
s t a g e 1 : y 1 ← N − 1 ( ψ ( N ( x ; b 0 ) ; θ 1 ) ; b 0 ) (5) stage1:y^1\leftarrow N^{-1}(\psi(N(x;b^0);\theta_1);b_0)\tag{5} stage1:y1←N−1(ψ(N(x;b0);θ1);b0)(5)
后面的阶段就是使用局部图像,即预测关节点邻域的图像,每个关节点会做一次回归。
s t a g e 2 : y i s ← N s − 1 ( ψ i N ( x ; b ) ; θ s ) ; b ) (6) stage2:y^s_i \leftarrow N^{s-1}(\psi_i N(x;b);\theta_s);b) \tag{6} stage2:yis←Ns−1(ψiN(x;b);θs);b)(6)
f o r b = b i ( s − 1 ) for \ b = b^{(s-1)}_i for b=bi(s−1)
b i s ← ( y i s , σ d i a m ( y s ) , d i a m ( y s ) ) b^s_i \leftarrow (y^s_i, \sigma diam(y^s), diam(y^s)) bis←(yis,σdiam(ys),diam(ys))
每个关键点 y i y_i yi对应一个边框 b b b,每个边框 b o x box box都不一样,而且每个预测图像的中心都是取决于上个预测的关节点的坐标,因为深度学习有着强大的学习能力(为了防止过拟合),作者不是简单的使用预测后的数据,而是做了中间数据增强的处理,利用预测点在其邻域内生成多个关节点。该邻域使用的是二维高斯分布 N ( s − 1 ) \mathcal{N}^{(s-1)} N(s−1),均值和方差来源于 ( y i s − 1 − y ) (y^{s-1}_i - y) (yis−1−y),所有样本数据的预测和GroundTruth的差的方差和均值。这里使用 δ \delta δ表示从 N ( s − 1 ) \mathcal{N}^{(s-1)} N(s−1)取出的样本,同样,这里的 δ \delta δ使用的是相对坐标。
D A s = { ( N ( x ; b ) , N ( y i , b ) ) ∣ ( x , y i ) ∼ D , δ ∼ N ( s − 1 ) b = ( y i + δ , σ d i a m ( y ) ) } D^s_A=\{(N(x;b),N(\textbf{y}_i,b))|\\(x,\textbf{y}_i)\sim D,\delta \sim \mathcal{N}^{(s-1)} \\b=(\textbf{y}_i+\delta , \sigma diam(\textbf{y})) \} DAs={(N(x;b),N(yi,b))∣(x,yi)∼D,δ∼N(s−1)b=(yi+δ,σdiam(y))}
在(4)模型的基础上进行修改,模型(4)表示为第一阶段的过程,(8)为后面阶段的过程。
θ s = arg min θ ∑ ( x , y i ) ∈ D A S ∣ ∣ y i − ψ i ( x ; θ ) ∣ ∣ 2 (8) \theta_s=\mathop{\arg\min}\limits_{\theta}\sum_{(x,\textbf{y}_i)\in D^S_A}||\textbf{y}_i-\psi_i (x;\theta)||^2 \tag{8} θs=θargmin(x,yi)∈DAS∑∣∣yi−ψi(x;θ)∣∣2(8)
FLIC(Frames Labeled In Cinema):4000 训练图像 ;1000 测试图像; 10个上身关键点
LSP(Leeds Sports Dataset): 11000 训练 1000 测试; 14个全身关键点
Percentage of Correct Parts (PCP) –> Percent of DetectedJoints (PDJ)
如果两个预测的关节位置与真实肢体关节位置之间的距离最多为肢体长度的一半,则认为肢体被检出PCP是最初用于评估的首选度量,但是它具有惩罚较短的肢体(如下臂)的缺点,这些肢体通常较难检测。–> 为了解决此缺点,最近使用不同的检测标准报告了关节的检测率-如果预测的关节与真实的关节之间的距离在躯干直径的一定范围内,则认为已检测到关节。 通过改变该分数,可以获得针对不同程度的定位精度的检测率。 该度量标准减轻了PCP的缺点,因为所有关节的检测标准都基于相同的距离阈值。 我们将此度量标准称为“检测到的接头百分比”(PDJ)