单阶段多人 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。该方法以 YOLOv5 为基础,不使用热图,并包含一个高效的网络设计。其同时检测人体姿态对象和关键点对象,并使用简单的匹配算法将这两者融合起来。在测试时,使用一块 TITAN Xp GPU 实时运算,720p 视频的推理速度可达每秒 35 帧,1080p 的视频可达每秒 20 帧。在不使用测试时增强(TTA)时 KAPAO 比此前的单阶段方法(如 DEKR 和 HigherHRNet)更快、更准确。
KAPAO 与其他算法对比

网络结构

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 输出

Grid cell 输出

  • 每个 cell 的输出由存在物体概率 p 0 p_0 p0边界框 ( t x , t y , t w , t h ) (t_x, t_y, t_w, t_h) (tx,ty,tw,th) K + 1 K+1 K+1类别 c 1 c_1 c1 判断是否为人,即用于姿态对象,其余用来确定是哪类关节点)、姿态对象的 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=3K+6
  • 当为姿态对象时(上图蓝色部分), c 1 c_1 c1 的值为 1,输出的所有值都需要计算损失;由于关键点对象包含在一个框中,该框的中心即为关键点对象的位置,所以若为关键点对象(上图红色部分)则后面姿态对象的关键点坐标值不需要计算损失,当没有物体时(上图绿框), p 0 p_0 p0 为 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.5t^y=2σ(t^y)0.5t^w=sAw(2σ(t^w))2t^h=sAh(2σ(t^h))2

✍️其中 A w A_w Aw A h A_h Ah 分别为锚框的宽和高 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^xk=sAw(4σ(v^xk)2)v^yk=sAw(4σ(v^yk)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(Lobj)、边界框 t ^ ( L b o x ) \hat{t}(L_{box}) t^(Lbox)、类别分数 c ^ ( L c l s ) \hat{c}(L_{cls}) c^(Lcls) 和关键点对象 v ^ ( L k p s ) \hat{v}(L_{kps}) v^(Lkps)。其中各个任务损失计算如下:

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} Lobj=sn(Gs)wsGsBCE(p^o,poIoU(t^,t))Lbox=sn(OGs)1OGs1IoU(t^,t)Lcls=sn(OGs)1OGsBCE(c^,c)Lkps=sn(OpGs)1OpGsk=1Kδ(vk>0)v^kvk2

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

  • 总损失通过 batch size N b N_b Nb 和 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=Nb(λobjLobj+λboxLbox+λclsLcls+λkpsLkps)

推理

  • 边界框 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^omax(C^) 大于阈值 τ c p \tau_{cp} τcp a r g m a x ( C ^ ) = 1 arg max(\hat{C})=1 argmax(C^)=1 时, G ^ i , j , a s \hat{G}_{i, j, a}^s G^i,j,as 表示姿态对象检测 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^omax(C^)>τck a r g m a x ( C ^ ) > 1 arg max(\hat{C}) \gt 1 argmax(C^)>1,则 G ^ i , j , a s \hat{G}_{i, j, a}^s G^i,j,as 表示关键点对象检测 O ^ k \hat{O}^k O^k,其中关键点对象类为 a r g m a x ( C ^ ) − 1 arg max(\hat{C})-1 argmax(C^)1(第一类为姿态对象,所以减去 1)
  • N M S NMS NMS 通过 I o U IoU IoU 的阈值 τ b p \tau_{bp} τbp τ 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,τbp)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^iRK×3}(i{1n(O^p)})。为了促进关键点与姿态的正确匹配,只将关键点目标与置信度 p ^ o ⋅ m a x ( c ^ ) > τ f c \hat{p}_o \cdot max(\hat{c}) \gt \tau_{fc} p^omax(c^)>τfc 的姿态目标融合

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,τfc)

融合算法

融合算法

  • 当候选姿态对象大于 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^p0pmax(O^cp),并遍历每个姿态对象的各个关键点,获取其坐标 ( O ^ x k p , O ^ y k p , 0 ) (\hat{O}_{x_k}^p, \hat{O}_{y_k}^p, 0) (O^xkp,O^ykp,0)
  • 将置信度 ζ i > τ f c \zeta_i \gt \tau_{fc} ζi>τfc 的姿态对象保存 P ^ ∗ \hat{P}^* P^
  • P ^ ∗ \hat{P}^* P^ 和候选关键点对象 O ^ k ′ \hat{O}^{k^{'}} O^k 均不为空,则开始融合
  • 遍历候选关键点对象,获取其概率最大值的位置(对应不同的关键点类型)、关键点对象置信度 C k C_k Ck
  • 计算前面姿态对象中的关键点和对应关键点对象的欧式距离 d i d_i di,获取距离最小的下标 m m m
  • 若这个最小距离 d m d_m dm 小于 τ f d \tau_fd τfd 且姿态对象的置信度小于关键点对象的置信度,则将对应坐标和置信度替换为关键点对象的

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

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.08557

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值