😸KAPAO(ECCV2022) 的主要贡献:
- 提出了一种新的 姿态对象(pose object)表示方法,其通过增加 一组与对象相关的关键点来扩展传统的对象表示方法,在辅助实验中展示了如何使用 多任务损失来学习姿态对象表示。
- 提出了一种 单阶段多人人体姿态估计的新方法,该方法 不使用热图且同时检测 关键点对象(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。该方法以 YOLOv5 为基础, 不使用热图
,并包含一个高效的网络设计。其 同时检测人体姿态对象和关键点对象,并使用简单的 匹配算法将这两者融合起来。在测试时,使用一块 TITAN Xp GPU 实时运算,720p 视频的推理速度可达每秒 35 帧,1080p 的视频可达每秒 20 帧。在不使用测试时增强(TTA)时 KAPAO 比此前的单阶段方法(如 DEKR 和 HigherHRNet)更快、更准确。
网络结构
- 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 输出
- 每个 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 )
融合算法
- 当候选姿态对象大于 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 搭建几个场景的预测结果
😻项目地址:https://github.com/wmcnally/kapao
😻论文地址:https://arxiv.org/abs/2111.08557Original: https://blog.csdn.net/steven_ysh/article/details/124079546
Author: Lemon_Yam
Title: 单阶段多人 2D 人体估计算法——KAPAO
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/706119/
转载文章受原作者版权保护。转载请注明原作者出处!