人体姿态ICCV2019(十一)Oral---Learnable Triangulation of Human Pose
《Learnable Triangulation of Human Pose》论文解读
原文:Learnable Triangulation of Human Pose
代码:Pytorch
Abstract
本文提出 两种 基于新的可学习三角剖分方法的多视图3D人体姿态估计的新方案。
- 第一个(baseline)解决方案是一个 基本的可微分代数三角化,加上从输入图像估计的置信权值;
- 第二种则是基于 从中间的2D特征图进行体积聚合 的新方法。然后该聚合体通过3D卷积 精化,产生最终的3D关节点热图。
1. Related work
1.1 Single view 3D pose estimation
当前单视角3D姿态估计的最新解决方案可以分为两个子类别。
-
第一类是 使用高精度的的2D姿态估计器,然后再通过深度神经网络(FC、卷积或递归)将2D坐标提升为3D。该方案具有几个优点:简单,快速,可以在运动捕获数据上进行训练(带有骨架/视图增强),并且可以在训练后更换2D backbone。
-
第二类是使用卷积神经网络 直接从图像回归3D坐标。当前的最佳解决方案是使用姿势的体积表示。
1.2 Multi-view view 3D pose estimation
基于多视角的工作中很少使用体积姿态表示。具体来说,有些工作使用2D关节点概率热图(从预先训练的2D关节点检测器获得),然后通过随后的不可学习的聚合将其转化到体积层面。
本文工作与上面不同之处有二。
- 本文以一种可学习的方式处理体积信息。
- 可以端到端地训练网络。
D.Tome etc 采用多阶段方法,其中使用了外部的3D姿势先验来从2D关节推断出3D姿势。在第一个阶段,所有的视图都通过卷积神经网络来获得2D关节的热图。通过3D姿态先验空间中优化潜在坐标,以及使用热图中的最大值位置共同来推断3D姿态,在之后的每个阶段中,将3D姿势重新投影回所有摄影机视图,并与来自上一层的预测(通过卷积网络)融合在一起。接下来,根据热图最大值的位置重新估算3D姿态,然后重复该过程。这样的程序允许通过对人体姿势的间接整体推理来校正2D联合热图的预测
本文工作与上面不同之处则是:
- 上面工作没有从3D预测到2D热图的梯度流,因此没有直接信号来校正3D坐标的预测。
2. Method
参数说明:
- C C C cameras;
- 已知的投影矩阵 P c P_{c} Pc;
- 世界坐标系下的3D坐标位置 y j , t \mathbf{y}_{j, t} yj,t(其中 j ∈ ( 1 … J ) j \in(1 \ldots J) j∈(1…J)、 t t t 则是表示时间。 (由于每一帧都是独立来处理,没有使用到时间信息,为简要说明之后省略 t t t 来陈述);
对于每一帧都使用Bounding box来对图像进行裁剪,这些边界框可以通过现成的2D人类检测器进行估算,也可以通过GT值来进行估算。
- 裁剪后的图像 I c I_{c} Ic;
- 将输入的图像输入到 ResNet-152 网络里,输出用 g θ g_{\theta} gθ 表示;
- 将上面的输出再通过一系列反卷积得到 中间层热图,用 f θ f_{\theta} fθ 表示;
- 最后通过 1×1 卷积网将中间热图转化为关节点热图 h θ h_{\theta} hθ。
2.1. Algebraic triangulation approach
基线代数三角剖分方法的主要缺点是,来自不同相机的图像 I c I_{c} Ic 彼此独立地处理,因此,没有简单的方法可以预先添加3D人体姿势,也无法过滤掉错误投影矩阵的相机。
- 先从裁剪的图像里得到相对应的关节点热图:
H c , j = h θ ( I c ) j H_{c, j}=h_{\theta}\left(I_{c}\right)_{j} Hc,j=hθ(Ic)j - 为估算出2D位置,首先计算 softmax:
H c , j ′ = exp ( α H c , j ) / ( ∑ r x = 1 W ∑ r y = 1 H exp ( α H c , j ( r ) ) ) H_{c, j}^{\prime}=\exp \left(\alpha H_{c, j}\right) /\left(\sum_{r_{x}=1}^{W} \sum_{r_{y}=1}^{H} \exp \left(\alpha H_{c, j}(\mathbf{r})\right)\right) Hc,j′=exp(αHc,j)/(∑rx=1W∑ry=1Hexp(αHc,j(r))) - 再通过 soft-argmax 得到位置:
x c , j = ∑ r x = 1 W ∑ r y = 1 H r ⋅ ( H c , j ′ ( r ) ) \mathbf{x}_{c, j}=\sum_{r_{x}=1}^{W} \sum_{r_{y}=1}^{H} \mathbf{r} \cdot\left(H_{c, j}^{\prime}(\mathbf{r})\right) xc,j=∑rx=1W∑ry=1Hr⋅(Hc,j′(r)) - 最后从2D估计点来得到3D点 y j \mathbf{y}_{j} yj:
- 由于使用 RANSAC 会完全阻断到排除相机的梯度流,因此加上权值:
( w j ∘ A j ) y ~ j = 0 \left(\mathbf{w}_{j} \circ A_{j}\right) \tilde{\mathbf{y}}_{j}=0 (wj∘Aj)y~j=0
其中 w j = ( w 1 , j , w 1 , j , w 2 , j , w 2 , j , … , , w C , j , w C , j ) \mathbf{w}_{j}=\left(w_{1, j}, w_{1, j}, w_{2, j}, w_{2, j}, \ldots,, w_{C, j}, w_{C, j}\right) wj=(w1,j,w1,j,w2,j,w2,j,…,,wC,j,wC,j)、 ∘ \circ ∘ 代表哈达玛(Hadamard)积,即基本矩阵相乘;
w c , j = ( q ϕ ( g θ ( I c ) ) ) j w_{c, j}=\left(q^{\phi}\left(g^{\theta}\left(I_{c}\right)\right)\right)_{j} wc,j=(qϕ(gθ(Ic)))j - 最后求解出
y
j
\mathbf{y}_{j}
yj:
y = y ~ / ( y ~ ) 4 \mathbf{y}=\tilde{\mathbf{y}} /(\tilde{\mathbf{y}})_{4} y=y~/(y~)4
2.2. Volumetric triangulation approach
为了解决这个问题,我们建议使用更复杂,更强大的三角剖分程序。我们将2D主干生成的特征图投影到3D体积中。这是通过将2D网络的输出沿3D立方体内部的投射光线投射到人周围来填充3D立方体来完成的。
- 对于体积三角剖分方法,不必需要关节点热图,只用中间热图即可,因此将
f
θ
(
I
c
)
f^{\theta}\left(I_{c}\right)
fθ(Ic) 输入到权值为
γ
\gamma
γ 的单层卷积网络
o
γ
o^{\gamma}
oγ 中:
M c , k = o γ ( f θ ( I c ) ) k M_{c, k}=o^{\gamma}\left(f^{\theta}\left(I_{c}\right)\right)_{k} Mc,k=oγ(fθ(Ic))k - 为得到体积格子volumetric grid,先采用2.1. 节介绍的代数三角剖分baseline来估计人体根节点骨盆的世界坐标,再以根节点骨盆为中心生成一个 L × L × L L \times L \times L L×L×L 的3D bounding box,最后用体素块来离散化bounding box,得到 V coords ∈ R 64 , 64 , 64 , 3 V^{\text {coords }} \in \mathbb{R}^{64,64,64,3} Vcoords ∈R64,64,64,3;
- 对于每个视角,将3D坐标投影到2D,即: V c proj = P c V coords V_{c}^{\text {proj }}=P_{c} V^{\text {coords }} Vcproj =PcVcoords ,其中 V proj ∈ R 64 , 64 , 64 , 2 V^{\text {proj }} \in \mathbb{R}^{64,64,64,2} Vproj ∈R64,64,64,2;
- 然后双线性填充: V c , k view = M c , k { V c proj } V_{c, k}^{\text {view }}=M_{c, k}\left\{V_{c}^{\text {proj }}\right\} Vc,kview =Mc,k{Vcproj };
- 最后将所有的体积块聚合(此处有三种方法)
- 直接求和:
V k input = ∑ c V c , k view V_{k}^{\text {input }}=\sum_{c} V_{c, k}^{\text {view }} Vkinput =∑cVc,kview
- 使用归一化置信度:
V k input = ∑ c ( d c ⋅ V c , k view ) / ∑ c d c V_{k}^{\text {input }}=\sum_{c}\left(d_{c} \cdot V_{c, k}^{\text {view }}\right) / \sum_{c} d_{c} Vkinput =∑c(dc⋅Vc,kview )/∑cdc
其中:归一化置信度–> d c d_{c} dc obtained similarly to w c w_{c} wc using a branch attached to backbone
- 计算体积系数 V c , k w V_{c, k}^{w} Vc,kw,等同于 d c d_{c} dc 所扮演的角色:
V c , k w = exp ( V c , k view ) / ∑ c exp ( V c , k view ) V_{c, k}^{w}=\exp \left(V_{c, k}^{\text {view }}\right) / \sum_{c} \exp \left(V_{c, k}^{\text {view }}\right) Vc,kw=exp(Vc,kview )/∑cexp(Vc,kview )
V k input = ∑ c V c , k w ∘ V c view V_{k}^{\text {input }}=\sum_{c} V_{c, k}^{w} \circ V_{c}^{\text {view }} Vkinput =∑cVc,kw∘Vcview
- 最后将生成的 V k input V_{k}^{\text {input }} Vkinput 输入到 V2V 网络里得到3D关节点。
3. Experiments
3.1. Human3.6M
3.2. CMU
本文地址:https://blog.csdn.net/qq_40520596/article/details/109630548
下一篇: java对象转MAP