人体姿态估计_CVPR2020_heatmap新思考
目前在人体姿态估计任务中,广泛采用heatmap作为训练目标,heatmap的编码和解码都遵从固定范式,却从未被深入探究。
不同于大量对网络结构的创新,CVPR 2020 中出现了两篇文章对heatmap提出了新的理解,并引入了无偏的编码/解码方式。这也揭示了一个全新的研究方向。
一、回顾heatmap的传统编解码方式
heatmap是keypoints的概率分布图,通常建模成围绕每个keypoint的高斯分布的叠加。
编码(encoding):原始图像 --> ground truth heatmap
解码(decoding):predicted heatmap --> 原始图像中的keypoint坐标
受限于计算开销,原始图像通常需要进行下采样,再输入网络中;预测出来的heatmap中的坐标信息也需要恢复到原始图像尺度。在这个过程中,就引入了sub-pixel的系统量化误差。
传统的编码过程包括:
- 下采样
g ′ = ( u ′ , v ′ ) = g λ = ( u λ , v λ ) \boldsymbol{g}^{\prime}=\left(u^{\prime}, v^{\prime}\right)=\frac{\boldsymbol{g}}{\lambda}=\left(\frac{u}{\lambda}, \frac{v}{\lambda}\right) g′=(u′,v′)=λg=(λu,λv) - 量化
g ′ ′ = ( u ′ ′ , v ′ ′ ) = quantise ( g ′ ) = quantise ( u λ , v λ ) \boldsymbol{g}^{\prime \prime}=\left(u^{\prime \prime}, v^{\prime \prime}\right)=\text { quantise }\left(\boldsymbol{g}^{\prime}\right)=\text { quantise }\left(\frac{u}{\lambda}, \frac{v}{\lambda}\right) g′′=(u′′,v′′)= quantise (g′)= quantise (λu,λv) - 高斯分布生成
G ( x , y ; g ′ ′ ) = 1 2 π σ 2 exp ( − ( x − u ′ ′ ) 2 + ( y − v ′ ′ ) 2 2 σ 2 ) \mathcal{G}\left(x, y ; \boldsymbol{g}^{\prime \prime}\right)=\frac{1}{2 \pi \sigma^{2}} \exp \left(-\frac{\left(x-u^{\prime \prime}\right)^{2}+\left(y-v^{\prime \prime}\right)^{2}}{2 \sigma^{2}}\right) G(x,y;g′′)=2πσ21exp(−2σ2(x−u′′)2+(y−v′′)2)
传统的解码过程包括:
- 预测关节点的sub-pixel位置:一个常用做法是以最大值点为原点,向第二大值点偏移0.25个像素单位(0.25是人工设定的偏移量,至于为什么是0.25可以看下文UDP-Pose中的量化分析)
p = m + 0.25 s − m ∥ s − m ∥ 2 \boldsymbol{p}=\boldsymbol{m}+0.25 \frac{s-\boldsymbol{m}}{\|\boldsymbol{s}-\boldsymbol{m}\|_{2}} p=m+0.25∥s−m∥2s−m - 恢复到原图尺度
p ^ = λ p \hat{p}=\lambda \boldsymbol{p} p^=λp
二、DARK-Pose
《Distribution-Aware Coordinate Representation for Human Pose Estimation》
这篇文章思路很直观,方法也很简单,符合直觉,看得很舒服。
它的核心思想就是编码和解码应保持一致性 。
在传统方法中,编码时我们将heatmap作为一种高斯概率分布,解码时却只利用了最大值信息。DARK-Pose认为模型预测出的heatmap应与ground truth有一致性,即假设预测出的heatmap也是一个高斯分布,我们应该利用整个分布的信息来进行keypoint的精确位置预测。具体地,通过泰勒二阶展开,我们可以预测从最大值点到真实keypoint的偏移。具体推导见论文。
整个解码过程如上图所示,其中第一步就是将预测出的heatmap进行平滑(使用与编码时相同的高斯核),消除真值附近的多个峰值;第二步是根据分布信息预测偏移;第三步是恢复到原图尺度。
在编码过程中,不再进行量化,直接以sub-pixel精度的为中心点生成高斯分布。这就是无偏编码 unbiased encodinng。
这个改进是模型无关的,且计算量较小,可以非常轻松且无害地集成到现有方法中。在训练阶段,只需要修改ground truth heatmap的生成方式;在测试阶段,只需要修改predicted heatmap的解码方式。而模型的内部结构、训练方式、损失函数都不需要任何改变。
对于较小尺度的图片,该方法的精度提升更明显。
三、UDP-Pose
《The Devil Is in the Details: Delving Into Unbiased Data Processing for Human Pose Estimation》
这篇文章对有偏数据处理引入的系统误差进行了量化分析,并提出了无偏的数据处理流程(UDP,Unbiased Data Processing),适用于大部分top-down的检测算法。此处笔者存疑:为什么特意指出top-down算法,看流程感觉bottom-up算法也能用。此外,文中说该算法是模型无关的,但它对heatmap的处理改变了模型的预测输出,还是需要对结构和loss进行调整的,不如Dark-Pose那样轻量级。
1 量化分析
定义
k
q
\mathbf{k}_{q}
kq 是一个关节点的在gt heatmap中量化后的坐标,
R
\mathcal{R}
R是取整函数。
k
q
=
(
m
q
,
n
q
)
=
R
(
k
)
=
(
R
(
m
)
,
R
(
n
)
)
\mathbf{k}_{q}=\left(m_{q}, n_{q}\right)=\mathcal{R}(\mathbf{k})=(\mathcal{R}(m), \mathcal{R}(n))
kq=(mq,nq)=R(k)=(R(m),R(n))
假设在最理想情况下,即预测出的heatmap与gt heatmap完全一致,那么可以定位最大值点
k
^
q
=
(
m
^
q
,
n
^
q
)
=
argmax
(
H
^
)
\hat{\mathbf{k}}_{q}=\left(\hat{m}_{q}, \hat{n}_{q}\right)=\operatorname{argmax}(\hat{\mathcal{H}})
k^q=(m^q,n^q)=argmax(H^)
我们预测的关节点坐标(以x轴为例)如下,其中
F
\mathcal{F}
F和
C
\mathcal{C}
C分别代表floor和ceil操作:
m
^
q
=
{
F
(
m
)
if
m
−
F
(
m
)
<
0.5
C
(
m
)
otherwise
\hat{m}_{q}=\left\{\begin{array}{ll}\mathcal{F}(m) & \text { if } m-\mathcal{F}(m)<0.5 \\ \mathcal{C}(m) & \text { otherwise }\end{array}\right.
m^q={F(m)C(m) if m−F(m)<0.5 otherwise
容易得出各方向的期望误差是
E
(
∣
m
−
m
^
q
∣
)
=
E
(
∣
n
−
n
^
q
∣
)
=
1
/
4
E\left(\left|m-\hat{m}_{q}\right|\right)=E\left(\left|n-\hat{n}_{q}\right|\right)=1 / 4
E(∣m−m^q∣)=E(∣n−n^q∣)=1/4,这也是为什么传统解码会取0.25单位长度作为偏移量的原因。
2 UDP之encoding-decoding
提出了一种结合分类和回归的heatmap编解码方式。
编码时,生成一张二值的heatmap
H
(
x
,
y
,
k
)
=
{
1
if
(
x
−
m
)
2
+
(
y
−
n
)
2
<
R
0
otherwise
\mathcal{H}(x, y, \mathbf{k})=\left\{\begin{array}{ll}1 & \text { if }(x-m)^{2}+(y-n)^{2}<R \\ 0 & \text { otherwise }\end{array}\right.
H(x,y,k)={10 if (x−m)2+(y−n)2<R otherwise
和两张offset map
X
(
x
,
y
,
k
)
=
m
−
x
Y
(
x
,
y
,
k
)
=
n
−
y
\begin{aligned} \mathcal{X}(x, y, \mathbf{k}) &=m-x \\ \mathcal{Y}(x, y, \mathbf{k}) &=n-y \end{aligned}
X(x,y,k)Y(x,y,k)=m−x=n−y
(这显然需要改变原模型的尾部结构和loss)
解码时,首先用高斯模糊对三张预测的map都进行平滑,然后得到预测位置
k
^
=
k
^
h
+
[
X
^
(
k
^
h
,
k
)
⊗
K
,
Y
^
(
k
^
h
,
k
)
⊗
K
]
T
\hat{\mathbf{k}}=\hat{\mathbf{k}}_{h}+\left[\hat{\mathcal{X}}\left(\hat{\mathbf{k}}_{h}, \mathbf{k}\right) \otimes K, \hat{\mathcal{Y}}\left(\hat{\mathbf{k}}_{h}, \mathbf{k}\right) \otimes K\right]^{T}
k^=k^h+[X^(k^h,k)⊗K,Y^(k^h,k)⊗K]T
其中
k
^
h
=
argmax
(
H
^
⊗
K
)
\hat{\mathbf{k}}_{h}=\operatorname{argmax}(\hat{\mathcal{H}} \otimes K)
k^h=argmax(H^⊗K)
3 UDP之flip alignment
文中还提到,在inference过程中使用flip test时,会出现misalignment,引入系统误差。作者通过以unit length作为图片度量单位(取代pixel),优雅地解决了这个问题。数学公式较多,感兴趣的读论文。
比较有意思的一点是,通过误差的量化分析,发现原图尺寸更大时,该误差更小。这也从一个方面解释了为什么大尺寸的图片能够达到更高精度,而小尺寸的图片检测精度较差。