paper title: Learnable Triangulation of Human Pose
paper link:https://arxiv.org/abs/1905.05754
oral or demo video:https://conftube.com/video/zem03fZWLrQ?tocitem=100
project: -
github: https://github.com/facebookresearch/frankmocap
conf & anthor: ICCV 19, Karim Iskakov(Samsung AI) et al;
arXiv submit v1:2019.05
这篇文章两种多相机人体姿态估计的方法,两种方法都蕴含了“可学习的三角剖分”思想,使实现准确的人体姿态估计所需要的的相机视图的数目显著减少。这两种方案都是完全可微分的,可以实现端到端的训练。
1.单视图3D姿态估计
(1) 先做2D姿态估计,然后通过一个网络实现2D到3D的变换;如A simple yet effective baseline for 3d human pose estimation,3D human pose estimation in video with temporal convolutions and
semi-supervised training ;
(2) 直接使用卷积网络从图像中计算出3D关节点的位置,如Integral Human Pose Regression;
(3) 基于卷积网络和模型优化方法实现3D姿态估计,如SMPL系列论文,frankmocap;
2.多视图3D姿态估计
(1) 将多个视图的2D关键点整合成一个batch,然后送到一个包含多个阶段的全连接网络中,得到3D的结果,如A generalizable approach for multi-view 3D human pose
regression
;
(2) 使用体积化的姿态表示方法来实现3D姿态估计,如Panoptic Studio:A Massively Multiview System for Social Interaction Capture,Harvesting Multiple Views for Marker-less 3D Human Pose Annotations;
(3) 从2D关节点位置中推算3D位置,并使用多个阶段的网络串联,3D结果反馈到2D,Rethinking Pose in 3D: Multi-stage Refinement and Recovery for Markerless
Motion Capture;
论文中系统的输入是来自多个已同步的相机的图像,输出是人体关节点的3D坐标。每一时刻的图像数据都是独立处理的,没有使用任何时间上的信息。对于每一帧数图像,先检测人体,然后使用“simple baseline”论文中的网络进行2D关键点检测,得到结果 g g g,然后经过一个转置卷积得到产生heatmap,得到结果 f f f,之后通过1X1的卷积得到可解释的heapmap,称之为 h h h。然后再整合多个视图的信息推断关节点的3D位置信息。
1.Algebraic triangulation方法
代数三角方法是使用三角测量的方式从多个相机视图的2D人体关键点重建人体3D关键点的坐标。
对于每一个关键点 j j j都是独立处理的。从2D人体关键点检测网络,可以得到关键点的heatmap:
H c , j = h θ ( I c ) j H_{c,j} = h_{\theta}(I_{c})_{j} Hc,j=hθ(Ic)j
其中:
下面就是计算heatmap上的关节点的2D坐标,首先计算heapmap值的softmax:
H c , j ′ = e x p ( α H c , j ) / ( ∑ r x = 1 W ∑ r y = 1 H e x p ( α H c , j ( r ) ) ) H^{'}_{c,j} = exp(\alpha H_{c,j})/(\sum^{W}_{r_{x}=1}\sum^{H}_{r_{y}=1}exp(\alpha H_{c,j}(r))) Hc,j′=exp(αHc,j)/(rx=1∑Wry=1∑Hexp(αHc,j(r)))
其中:
做完softmax之后,获取2D关键点坐标一种简单的方法是直接取heatmap中最大值的坐标作为关键点的2D坐标。文中采用的是一种称为“soft-argmax”的方法:
x c , j = ∑ r x = 1 W ∑ r y = 1 H r ⋅ ( H c , j ′ ( r ) ) x_{c,j} = \sum^{W}_{r_{x}=1}\sum^{H}_{r_{y}=1} r·(H^{'}_{c,j}(r)) xc,j=rx=1∑Wry=1∑Hr⋅(Hc,j′(r))
实际上就是所有的坐标值乘以对应位置上的heatmap值,并加起来;经过上一步的softmax之后,所有的heatmap值都已经转换为0-1之间并且加和为1之间的数值,可认为是一个坐标的权重,这里相当于是把所有的坐标加权求和(x,y独立处理),得到"综合"之后的坐标值,作为2D关节点坐标。其中 α \alpha α设置为100,在训练开始时soft-argmax输出的坐标很接近于heatmap中最大值的那个坐标。
这里2D坐标数据有一点需要说一下,2D关键点检测网络的输入是裁剪的人体区域图片,并不是原始图像,所以这里计算出来的2D坐标实际上是在裁剪图像上的坐标,所以应该要再转换到原始图像中的坐标,才可以在下一步三角重构中进行计算。不过文章的代码中并没有这一步骤,而是直接改变相机的内参来实现这一转换,可见issue #48。
计算出2D坐标之后,可以根据线性代数三角求解3D坐标:
A j y ^ j = 0 A_{j}\hat{y}_{j} = 0 Ajy^j=0
其中:
通常在三角重构中,是假设所有相机都是独立并且同等权重的,但是在有些视图中,由于视角、遮挡的原因,2D关键点的检测结果可能并不是十分可靠,所以文章提出了一个可学习的权重的概念,为三角重构中每个视图增加一个权重:
( w j ∗ A j ) y ^ j = 0 (w_{j} * A_{j})\hat{y}_{j} = 0 (wj∗Aj)y^j=0
其中:
相机视图的权重是通过2D关键点检测的骨干网络接一个额外的小网络 q q q(2层卷积+平均池化+3层全连接)得到:
w c , j = ( q ϕ ( g θ ( I c ) ) ) j w_{c,j} = (q^{\phi}(g^{\theta}(I_{c})))_{j} wc,j=(qϕ(gθ(Ic)))j
其中:
损失函数方面,采用soft MSE:
L j a l g ( θ , ϕ ) = { M S E ( j j , y j g t ) , i f M S E ( j j , y j g t ) < α M S E ( j j , y j g t ) 0.1 ⋅ α 0.9 otherwise L^{alg}_{j}(\theta,\phi) = \begin{cases} MSE(j_{j},y^{gt}_{j}), if MSE(j_{j},y^{gt}_{j}) < \alpha\\ MSE(j_{j},y^{gt}_{j})^{0.1}·\alpha^{0.9} & \text{otherwise} \end{cases} Ljalg(θ,ϕ)={MSE(jj,yjgt),ifMSE(jj,yjgt)<αMSE(jj,yjgt)0.1⋅α0.9otherwise
其中 α \alpha α是损失的阈值,设置为 ( 20 c m ) 2 (20cm)^2 (20cm)2。
2.Volumetric triangulation方法
上述的基于代数三角的方法对不同相机的图像是独立处理的,这样会有两个不足之处,一是无法添加3D姿态的先验信息;二是无法过滤投影矩阵有问题的相机。
为了解决上述问题,文章提出了一种基于体素的三角重构方法(Volumetric triangulation),首先根据heatmap以及代数三角方法获取的人的pelvis的3D坐标构建一个体素空间区域,然后使用一个Voxel-to-voxel网络计算关键点的3D位置,具体如下:
(1) 获取backbone网络输出的heatmap
M c , k = o γ ( f θ ( I c ) ) k M_{c,k} = o^{\gamma}(f^{\theta}(I_c))_{k} Mc,k=oγ(fθ(Ic))k
其中:
(2) 构建体素空间
通过代数三角的方法获取到人的pelvis的3D位置,以其为中心构建一个 L X L X L LXLXL LXLXL大小的空间,其中代码中设置L为2.5m,然后分割成 64 X 64 X 64 64X64X64 64X64X64个立方体,表示为:
V c o o r d s ∈ R 64 , 64 , 64 , 3 V^{coords} \in R^{64,64,64,3} Vcoords∈R64,64,64,3
其中3表示当前小立方体中心的全局坐标。
(3) 3D体素投影到2D
对于每一个视图,将小立方体的3D坐标投影到2D上:
V c p r o j = P c V c o o r d s V^{proj}_{c} = P_{c}V^{coords} Vcproj=PcVcoords
V c p r o j ∈ R 64 , 64 , 64 , 2 V^{proj}_{c} \in R^{64,64,64,2} Vcproj∈R64,64,64,2
(4) 填充单个视图的体素
根据上一步得到的投影结果,可以通过双线性插值得到当前体素小立方体对应的heatmap的上的值,也就是对于当前视图,这个小立方体的关节点概率;
V c , k v i e w = M c , k V c p r o j V^{view}_{c,k} = M_{c,k}V^{proj}_{c} \ Vc,kview=Mc,kVcproj
这个是第c个视图的第k个关节点的数据,那么对于第c个视图的所有K个关节点整合得到:
V c v i e w ∈ R 64 , 64 , 64 , K V^{view}_{c} \in R^{64,64,64,K} Vcview∈R64,64,64,K
这个跟之前相比,最后一个已经不是中心点的坐标了,而是K个值,来自于heapmap上K个关节点的heatmap值;
(5)所有视图的体素的整合
得到单个视图的体素结果之后,需要将所有视图的体素表示结果整合起来,文中给出了三种方法:
a) 直接将多个视图对应关节点的结果相加
V k i n p u t = ∑ c V c , k v i e w V^{input}_{k} = \sum_{c} V^{view}_{c,k} Vkinput=c∑Vc,kview
b) 加权相加,与代数三角方法中的视图权重相似,通过一个分支网络计算各个视图的一个权重
V k i n p u t = ∑ c ( d c ⋅ V c , k v i e w ) / ∑ c d c V^{input}_{k} = \sum_{c} (d_{c} · V^{view}_{c,k})/ \sum_{c} d_{c} Vkinput=c∑(dc⋅Vc,kview)/c∑dc
c) 通过将现在有值在视图尺度做一个softmax,然后作为类似权重的数值,进行整合:
V c , k w = e x p ( V c , k v i e w ) / ∑ c e x p ( V c , k v i e w ) V^{w}_{c,k} = exp(V^{view}_{c,k})/ \sum_{c}exp(V^{view}_{c,k}) Vc,kw=exp(Vc,kview)/c∑exp(Vc,kview)
然后计算:
V k i n p u t = ∑ c V c , k w ∗ V c , k v i e w V^{input}_{k} = \sum_{c} V^{w}_{c,k} * V^{view}_{c,k} Vkinput=c∑Vc,kw∗Vc,kview
上述计算完成后,即得到了体素结果,然后使用一个V2V网络 u v u^{v} uv进行3D heatmap预测:
V j o u t p u t = ( u v ( V i n p u t ) ) j V^{output}_{j} = (u^{v}(V^{input}))_{j} Vjoutput=(uv(Vinput))j
然后通过soft argmax计算3D关节点位置(前面代数三角方法中类似):
V j ′ o u t p u t = e x p ( V o u t p u t ) / ( ∑ r x = 1 W ∑ r y = 1 H ∑ r z = 1 D e x p ( V j o u t p u t ( r ) ) ) V^{'output}_{j} = exp(V^{output})/(\sum^{W}_{r_{x}=1}\sum^{H}_{r_{y}=1}\sum^{D}_{r_{z}=1} exp(V^{output}_{j}(r))) Vj′output=exp(Voutput)/(rx=1∑Wry=1∑Hrz=1∑Dexp(Vjoutput(r)))
y j = ∑ r x = 1 W ∑ r y = 1 H ∑ r z = 1 D r ⋅ V j ′ o u t p u t y_{j} = \sum^{W}_{r_{x}=1}\sum^{H}_{r_{y}=1}\sum^{D}_{r_{z}=1} r · V^{'output}_{j} yj=rx=1∑Wry=1∑Hrz=1∑Dr⋅Vj′output
损失函数使用L1损失:
L j v o l ( θ , γ , v ) = ∑ j ∣ y j − y j g t ∣ − β ⋅ l o g ( V j o u t p u t ( y j g t ) ) L^{vol}_{j}(\theta,\gamma,v) = \sum_{j}|y_{j} - y^{gt}_{j}| - \beta·log(V^{output}_{j}(y^{gt}_{j})) Ljvol(θ,γ,v)=j∑∣yj−yjgt∣−β⋅log(Vjoutput(yjgt))
其中后面这一项主要用来防止模型输出的heatmap不可解释,没有明显峰值。 β \beta β设为0.01。