单阶段多人 2D 人体估计算法——KAPAO

😸KAPAO(ECCV2022) 的主要贡献:

  1. 提出了一种新的 姿态对象(pose object)表示方法,其通过增加 一组与对象相关的关键点来扩展传统的对象表示方法,在辅助实验中展示了如何使用 多任务损失来学习姿态对象表示。
  2. 提出了一种 单阶段多人人体姿态估计的新方法,该方法 不使用热图且同时检测 关键点对象(keypoint objects)和人体 姿态对象,然后将两者的 检测融合起来从而利用这两者的优点。与之前的 SOTA 方法(都使用热图)相比,当不使用 TTA 时,所提出的无热图方法在 Microsoft COCO Keypoints 基准测试上明显 更快、更准确

文章目录

人体姿态估计简述

😸人体姿态估计根据估计的关节坐标维度分为 2D 姿态估计和 3D 姿态估计

  • 2D 人体姿态估计的目标是定位并识别出 人体的关键点( x , y ) (x, y)(x ,y ),这些关键点按照关节 顺序相连,就可以得到人体的骨架
  • 3D 姿态估计的目标是从图像或视频中估计人体基于某点的人体 三维关节坐标( x , y , z ) (x, y, z)(x ,y ,z ),一般以人体的臀部关节为基点

😸双阶段的人体姿态估计总的来说有两种方式

  • 自顶向下:先检测出人的位置,然后再根据检测出的位置为每个人做姿态估计。该方法更加符合人的思维,准确率相对较高,但推理速度较慢
  • 自底向上:先检测出所有的人体关键点,再通过聚类将这些节点归为每一个人。该方法推理速度较快,但准确率不如前者。下图为自底向上方法的示意图
    单阶段多人 2D 人体估计算法——KAPAO

😼单阶段的人体姿态估计是通过网络的 单次前向传递之后直接预测人体姿态估计,虽然目前主流算法多采用双阶段方法,且单阶段的精度不如双阶段,但单阶段方法往往 在拥挤场景中会表现得更好

😸热图法是目前人体姿态估计中最常用的方法之一,其通过以下步骤预测关键点

  • 在目标关键点坐标上以具有小方差的 2D 高斯函数来生成目标热图
  • 使用深度卷积神经网络对输入图像上的目标热图 进行回归
  • 根据预测热图中的 概率最大值来进行关键点预测

🙀但是热图法也存在着明显的 缺点

  • 速度问题:大型热图需要通过大量计算来产生,也需要特殊的后处理步骤来优化关键点预测,这会 降低推理速度
  • 精度问题: 存在量化误差,关键点预测的精度本质上 受到热图分辨率的限制;当同类别的两个关键点彼此比较接近时,重叠的热图信号可能会让它们被 *误认为是同一个关键点

; KAPAO

🙀鉴于热图存在的明显缺点,来自加拿大滑铁卢大学的研究者提出一种全新的 单阶段 2D 多人关键点和姿态检测方法 KAPAO。该方法以 YOLOv5 为基础, 不使用热图,并包含一个高效的网络设计。其 同时检测人体姿态对象和关键点对象,并使用简单的 匹配算法将这两者融合起来。在测试时,使用一块 TITAN Xp GPU 实时运算,720p 视频的推理速度可达每秒 35 帧,1080p 的视频可达每秒 20 帧。在不使用测试时增强(TTA)时 KAPAO 比此前的单阶段方法(如 DEKR 和 HigherHRNet)更快、更准确。

单阶段多人 2D 人体估计算法——KAPAO

网络结构

单阶段多人 2D 人体估计算法——KAPAO
  • KAPAO 将图片输入 YOLO-style 的特征提取器(使用 YOLOv5,其中包含了CSP 的 bottlenecks 和特征金字塔架构),从而得到 四种类型大小的 output grids G ^ s \hat{G}^{s}G ^s。其中,上标s s s 的取值为 8、16、32、64。每种 grid 使用不同的 anchor,较小的 grid 感受野比较大,可预测较大物体;而较大 grid 感受野较小,更适合预测较小物体。
  • 经过这组 grid 可得到预测关键点对象O ^ k \hat{O}^k O ^k 和姿态对象O ^ p \hat{O}^p O ^p,而O ^ k \hat{O}^k O ^k和O ^ p \hat{O}^p O ^p 会有 冗余现象,可通过 非极大值抑制处理得到候选姿态对象O ^ p ′ \hat{O}^{p^{‘}}O ^p ′ 和关键点对象O ^ k ′ \hat{O}^{k^{‘}}O ^k ′
  • 最后使用匹配算法φ \varphi φ 将O ^ p ′ \hat{O}^{p^{‘}}O ^p ′ 和O ^ k ′ \hat{O}^{k^{‘}}O ^k ′ 融合为最后的姿态估计结果P ^ \hat{P}P ^

❗注:姿态对象与关键点对象既有关联,又有区别

; Grid cell 输出

单阶段多人 2D 人体估计算法——KAPAO
  • 每个 cell 的输出由 存在物体概率p 0 p_0 p 0 ​、 边界框( t x , t y , t w , t h ) (t_x, t_y, t_w, t_h)(t x ​,t y ​,t w ​,t h ​)、K + 1 K+1 K +1 个 类别(c 1 c_1 c 1 ​ 判断是否为人,即用于姿态对象,其余用来确定是哪类关节点)、姿态对象的K K K 类 关键点坐标(每个关键点包含 2 个值,COCO 数据集中为 17),故输出通道为1 + 4 + ( K + 1 ) + 2 × K = 3 K + 6 1+4+(K+1)+2×K= 3K+6 1 +4 +(K +1 )+2 ×K =3 K +6
  • 当为姿态对象时(上图 蓝色部分),c 1 c_1 c 1 ​ 的值为 1,输出的所有值都需要计算损失;由于关键点对象包含在一个框中,该框的中心即为关键点对象的位置,所以若为关键点对象(上图 红色部分)则后面姿态对象的关键点坐标值不需要计算损失,当没有物体时(上图 绿框),p 0 p_0 p 0 ​ 为 0,后面所有值都不需要计算损失

关键点对象和姿态对象的理解

  • 关键点对象并 不包含任何关于人或姿态的信息,所以在使用自底向上方法来做姿态估计时需要将这些关键点 解析成人体姿态;而姿态对象允许神经网络学习这些关键点的 空间关系,从而可以 直接用于姿态估计
  • 从上图可以看出,关键点对象存在于姿态对象的一个 子空间中。因此,KAPAO 将网络设计为通过一个共享的 network head 同时检测出姿态对象和关键点对象,从而最小化计算开销
  • 论文中提出 越精确的关键点对象融合到姿态检测中,越能提高人体姿态预测的精度,个人认为关键点对象在某种意义上可能为姿态对象的另一种模态,通过模态的融合,从而提高精度

边界框和关键点计算

  • 边界框( t ^ x , t ^ y , t ^ w , t ^ h ) (\hat{t}_x, \hat{t}_y, \hat{t}_w, \hat{t}_h)(t ^x ​,t ^y ​,t ^w ​,t ^h ​) 计算

t ^ x = 2 σ ( t ^ x ′ ) − 0.5 t ^ y = 2 σ ( t ^ y ′ ) − 0.5 t ^ w = A w s ( 2 σ ( t ^ w ′ ) ) 2 t ^ h = A h s ( 2 σ ( t ^ h ′ ) ) 2 \begin{aligned} & \hat{t}_x = 2\sigma(\hat{t}_x^{‘}) – 0.5 \ & \hat{t}_y = 2\sigma(\hat{t}_y^{‘}) – 0.5 \ & \hat{t}_w = \frac{A_w}{s}(2\sigma(\hat{t}_w^{‘}))^2 \ & \hat{t}_h = \frac{A_h}{s}(2\sigma(\hat{t}_h^{‘}))^2 \end{aligned}​t ^x ​=2 σ(t ^x ′​)−0.5 t ^y ​=2 σ(t ^y ′​)−0.5 t ^w ​=s A w ​​(2 σ(t ^w ′​))2 t ^h ​=s A h ​​(2 σ(t ^h ′​))2 ​

✍️其中 A w A_w A w ​ 和 A h A_h A h ​ 分别为 锚框的宽和高,s s s 的值根据对应的 grid 分为 8、16、32 或 64,σ \sigma σ 为 sigmoid 函数,t ^ ∗ ′ \hat{t}_{*}^{‘}t ^∗′​ 为边界框的中间值

  • 关键点坐标计算

v ^ x k = A w s ( 4 σ ( v ^ x k ′ ) − 2 ) v ^ y k = A w s ( 4 σ ( v ^ y k ′ ) − 2 ) \begin{aligned} & \hat{v}{xk} = \frac{A_w}{s}(4\sigma(\hat{v}{xk}^{‘})-2) \ & \hat{v}{yk} = \frac{A_w}{s}(4\sigma(\hat{v}{yk}^{‘})-2) \end{aligned}​v ^x k ​=s A w ​​(4 σ(v ^x k ′​)−2 )v ^y k ​=s A w ​​(4 σ(v ^y k ′​)−2 )​

✍️其中,σ \sigma σ 用来 限制关键点的可能取值,v ^ ∗ ′ \hat{v}_{*}^{‘}v ^∗′​ 为关键点中间值

损失函数

  • KAPAO 使用 多任务损失函数L ( G ^ , G ) L(\hat{G}, G)L (G ^,G ) 学习物体存在概率p ^ o ( L o b j ) \hat{p}o(L{obj})p ^​o ​(L o bj ​)、边界框t ^ ( L b o x ) \hat{t}(L_{box})t ^(L b o x ​)、类别分数c ^ ( L c l s ) \hat{c}(L_{cls})c ^(L c l s ​) 和关键点对象v ^ ( L k p s ) \hat{v}(L_{kps})v ^(L k p s ​)。其中各个任务损失计算如下:

L o b j = ∑ s w s n ( G s ) ∑ G s B C E ( p ^ o , p o ⋅ I o U ( t ^ , t ) ) L b o x = ∑ s 1 n ( O ∈ G s ) ∑ O ∈ G s 1 − I o U ( t ^ , t ) L c l s = ∑ s 1 n ( O ∈ G s ) ∑ O ∈ G s B C E ( c ^ , c ) L k p s = ∑ s 1 n ( O p ∈ G s ) ∑ O p ∈ G s ∑ k = 1 K δ ( v k > 0 ) ∥ v ^ k − v k ∥ 2 \begin{aligned} & L_{obj} = \sum_{s}\frac{w_s}{n(G^s)}\sum_{G^s}BCE(\hat{p}o, p_o \cdot IoU(\hat{t}, t)) \ & L{box} = \sum_s \frac{1}{n(O \in G^s)}\sum_{O \in G^s} 1-IoU(\hat{t}, t) \ & L_{cls} = \sum_s \frac{1}{n(O \in G^s)}\sum_{O \in G^s}BCE(\hat{c}, c) \ & L_{kps} = \sum_s \frac{1}{n(O^p \in G^s)}\sum_{O^p \in G^s}\sum_{k=1}^K \delta(v_k > 0) \parallel \hat{v}_k – v_k \parallel_2 \end{aligned}​L o bj ​=s ∑​n (G s )w s ​​G s ∑​BCE (p ^​o ​,p o ​⋅I o U (t ^,t ))L b o x ​=s ∑​n (O ∈G s )1 ​O ∈G s ∑​1 −I o U (t ^,t )L c l s ​=s ∑​n (O ∈G s )1 ​O ∈G s ∑​BCE (c ^,c )L k p s ​=s ∑​n (O p ∈G s )1 ​O p ∈G s ∑​k =1 ∑K ​δ(v k ​>0 )∥v ^k ​−v k ​∥2 ​​

✍️其中,w s w_s w s ​ 为 grid 的 权值,n ( ∗ ) n()n (∗) 表示 个数,B C E BCE BCE 为 二元交叉熵,I o U IoU I o U 使用 C I o U CIoU C I o U,∥ ∗ ∥ 2 \parallel * \parallel_2 ∥∗∥2 ​ 为 欧式距离*

  • 总损失通过 batch size N b N_b N b ​ 和 4 个超参数得出

L = N b ( λ o b j L o b j + λ b o x L b o x + λ c l s L c l s + λ k p s L k p s ) L = N_b (\lambda_{obj}L_{obj} + \lambda_{box}L_{box} + \lambda_{cls}L_{cls} + \lambda_{kps}L_{kps})L =N b ​(λo bj ​L o bj ​+λb o x ​L b o x ​+λc l s ​L c l s ​+λk p s ​L k p s ​)

推理

  • 边界框t ^ \hat{t}t ^ 和关键点v ^ \hat{v}v ^ 映射回原始图像

b ^ = s ( t ^ + [ i , j , 0 , 0 ] ) z ^ k = s ( v ^ k + [ i , j ] ) \begin{aligned} & \hat{b} = s(\hat{t} + [i, j, 0, 0]) \ & \hat{z}_k = s(\hat{v}_k + [i, j]) \end{aligned}​b ^=s (t ^+[i ,j ,0 ,0 ])z ^k ​=s (v ^k ​+[i ,j ])​

  • 当置信度p ^ o ⋅ m a x ( C ^ ) \hat{p}o \cdot max(\hat{C})p ^​o ​⋅ma x (C ^) 大于阈值τ c p \tau{cp}τc p ​ 且a r g m a x ( C ^ ) = 1 arg max(\hat{C})=1 a r g ma x (C ^)=1 时,G ^ i , j , a s \hat{G}{i, j, a}^s G ^i ,j ,a s ​ 表示姿态对象检测O ^ p \hat{O}^p O ^p。同理,如果p ^ o ⋅ m a x ( C ^ ) > τ c k \hat{p}_o \cdot max(\hat{C}) \gt \tau{ck}p ^​o ​⋅ma x (C ^)>τc k ​ 且a r g m a x ( C ^ ) > 1 arg max(\hat{C}) \gt 1 a r g ma x (C ^)>1,则G ^ i , j , a s \hat{G}_{i, j, a}^s G ^i ,j ,a s ​ 表示关键点对象检测O ^ k \hat{O}^k O ^k,其中关键点对象类为a r g m a x ( C ^ ) − 1 arg max(\hat{C})-1 a r g ma x (C ^)−1(第一类为姿态对象,所以减去 1)
  • N M S NMS NMS 通过I o U IoU I o U 的阈值τ b p \tau_{bp}τb p ​ 和τ b k \tau_{bk}τbk ​ 来去除一些姿态对象和关键点对象

O ^ p ′ = N M S ( O ^ p , τ b p ) O ^ k ′ = N M S ( O ^ k , τ b k ) \begin{aligned} & \hat{O}^{p^{‘}} = NMS(\hat{O}^p, \tau_{bp}) \ & \hat{O}^{k^{‘}} = NMS(\hat{O}^k, \tau_{bk}) \end{aligned}​O ^p ′=NMS (O ^p ,τb p ​)O ^k ′=NMS (O ^k ,τbk ​)​

  • 利用τ f d \tau_{fd}τfd ​ 将候选关键点对象与姿态对象融合得到人体姿态估计P ^ = { P ^ i ∈ R K × 3 } ( i ∈ { 1 ⋯ n ( O ^ p ′ ) } ) \hat{P}={\hat{P}i \in R^{K \times 3}}(i \in {1 \cdots n(\hat{O}^p{‘})})P ^={P ^i ​∈R K ×3 }(i ∈{1 ⋯n (O ^p ′)})。为了促进关键点与姿态的正确匹配,只将关键点目标与置信度p ^ o ⋅ m a x ( c ^ ) > τ f c \hat{p}_o \cdot max(\hat{c}) \gt \tau{fc}p ^​o ​⋅ma x (c ^)>τf c ​ 的姿态目标融合

P ^ = φ ( O ^ p ′ , O ^ k ′ , τ f d , τ f c ) \hat{P} = \varphi(\hat{O}^{p^{‘}}, \hat{O}^{k^{‘}}, \tau_{fd}, \tau_{fc})P ^=φ(O ^p ′,O ^k ′,τfd ​,τf c ​)

融合算法

单阶段多人 2D 人体估计算法——KAPAO
  • 当候选姿态对象大于 0 时则开始 筛选相关的候选姿态对象,若为 0 则返回空
  • 先初始化姿态对象和姿态的置信度为 全 0
  • 遍历候选姿态对象,获取其 置信度ζ i = O ^ p 0 p ⋅ m a x ( O ^ c p ) \zeta_i = \hat{O}{p_0}^p \cdot max(\hat{O}_c^p)ζi ​=O ^p 0 ​p ​⋅ma x (O ^c p ​),并遍历每个姿态对象的各个关键点,获取其 坐标( O ^ x k p , O ^ y k p , 0 ) (\hat{O}{x_k}^p, \hat{O}_{y_k}^p, 0)(O ^x k ​p ​,O ^y k ​p ​,0 )
  • 将置信度ζ i > τ f c \zeta_i \gt \tau_{fc}ζi ​>τf c ​ 的姿态对象 保存到P ^ ∗ \hat{P}^*P ^∗
  • 若P ^ ∗ \hat{P}^P ^∗ 和候选关键点对象O ^ k ′ \hat{O}^{k^{‘}}O ^k ′ 均不为空,则 开始融合*
  • 遍历候选关键点对象,获取其 概率最大值的位置(对应不同的关键点类型)、关键点对象置信度C k C_k C k ​
  • 计算前面姿态对象中的关键点和对应关键点对象的 欧式距离d i d_i d i ​,获取 距离最小的下标m m m
  • 若这个最小距离d m d_m d m ​ 小于τ f d \tau_fd τf ​d 且姿态对象的置信度 小于关键点对象的置信度,则将对应坐标和置信度替换为关键点对象的

😿 姿态对象的关键点关键点对象不是一个东西,注意区分。以上是我个人对融合算法的浅显理解

; KAPAO 的局限性

  • 姿态对象不包括单个关键点置信度,因此人体姿态估计通常包含一个 稀疏的关键点置信度集P ^ i [ : , 3 ] \hat{P}_i[:, 3]P ^i ​[:,3 ]
  • 训练需要 相当多的时间和 GPU 内存,训练采用 4 张 V100,每张 32G

😼虽然训练比较耗算力,但是论文作者已经提供了训练好的模型。以下是我配置运行代码的结果,我的显卡内存是 6G,当然也可以使用 CPU 运行,具体查看项目说明

配置代码并运行

  • 下载作者的代码 git clone https://github.com/wmcnally/kapao.git
  • 创建虚拟环境,并安装相应依赖,推荐使用 conda(作者采用的是 python3.6,我自己电脑是 python3.9,也可以运行)
  • 运行 download_models.py 文件下载训练好的模型(需要科学上网),这里可以使用我下载好的模型

kapao_l_coco.pt 链接:https://pan.baidu.com/s/1_q8fxFPLF-s_9ZIxrdcY_g 提取码:sjr8

kapao_s_coco.pt 链接:https://pan.baidu.com/s/1L03ykmvcQFTPPvdVf0kPBg 提取码:0kel

😼默认使用 kapao_l_coco.pt 来处理图片,使用 kapao_s_coco.pt 处理视频,以下为我通过 CARLA 搭建几个场景的预测结果

单阶段多人 2D 人体估计算法——KAPAO

😻项目地址:https://github.com/wmcnally/kapao
😻论文地址:https://arxiv.org/abs/2111.08557

Original: https://blog.csdn.net/steven_ysh/article/details/124079546
Author: Lemon_Yam
Title: 单阶段多人 2D 人体估计算法——KAPAO

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/706119/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球