用TensorFlow.js实现人体姿态估计模型(下)

上一节简单的介绍了如何实现单人姿态估计和多人姿态估计,这一节将讨论一些技术细节。

用TensorFlow.js实现人体姿态估计模型(下)_第1张图片

PoseNet的单人姿态检测器流程

研究人员同时训练了ResNet和MobileNet模型,虽然ResNet模型有较高的精度,但其庞大的规模和多层结构会使页面加载时间和推理时间对于任何实时应用都不太理想。于是,研究人员采用了MobileNet,因为其本身针对移动设备设计。

重新审视单姿态估计算法

输出步长

首先,了解如何通过讨论输出步长来获得PoseNet模型输出(主要是热点图和偏移矢量)。比较好的一点是,PoseNet模型图像尺寸是不变的,使得它可以预测原始图像相同比例的姿态位置,而不管图像是否被缩小。PoseNet运行时可以通过设置上面提到的输出步长来配置更高的精度(性能相对降低)。

输出步长决定了输出相对于输入图像的缩小程度,这会影响特征图的大小和模型的输出。输出步长越高,网络中的特征图分辨率以及精度就越小。在实际情况中,输出步长可以是8、16或者32。换句话说,32的输出步长将导致最快的性能,最低的精度,而输出步长为8,模型的精度最高性能最低。一般情况下,会选择让输出步长为16。

用TensorFlow.js实现人体姿态估计模型(下)_第2张图片

在处理过程中,当输出步长设置为8或16时,网络的输出步长减小,特征图分辨率增大。然后使用空洞卷积使后续层中的特征具有更广的感知野(当输出步幅为32的时候,不使用空洞卷积)。

模型输出:热图和偏移向量

当PoseNet处理图像时,返回的是热图连同偏移矢量,可以将其解码以找到图像中与姿态关键点对应的高置信度区域。下面我们将讨论每个量代表了什么,下面的图展现了从高层特征捕捉的每个动作关键点是怎么和热图以及偏移矢量张量联系起来的。

用TensorFlow.js实现人体姿态估计模型(下)_第3张图片

PoseNet返回的17个姿态关键点中的每一个都与一个热图张量和一个偏移矢量张量相关联,用于确定关键点的确切位置。

这两个输出都是具有高度和宽度的3D张量,我们将其称为分辨率。分辨率由输入图像的大小和输出步长根据以下公式确定:

用TensorFlow.js实现人体姿态估计模型(下)_第4张图片

热图

每个热图的尺寸是分辨率*分辨率*17的3D张量,因为17是PoseNet检测到的关键点数量。例如,图像的大小是225,输出步长是16,热图的尺寸就是15*15*17。第三维(17)中的每部分对应特定关键点的热图。该热图中的每个位置都有一个置信度值,它表示该关键点类型在这个位置的概率。可以被认为是原始图像被分割成15*15的网格,其中热图的置信度表示每个关键点落在每个网格中的概率。

偏移向量

每个偏移向量都是分辨率*分辨率*34的三维张量,其中34是关键点的数量*2,图像的大小为225,输出步长为16时,表示为15*15*34。由于热图是关键点位置的粗略位置,所以将热图与偏移向量结合来得到准确的关键点位置。偏移向量的前17个是x坐标,后17个是y坐标。偏移向量和原始图像有相同的大小比例。

根据模型输出预估姿势

图像输入模型,经过计算来输出估计的姿势。例如,单姿态跟踪算法返回置信度值,包括关键点数组,每个关键点具有置信度值、x、y。

获得姿势关键点:

1. 在热图上进行sigmoid激活获得置信度

2. argmax对关键点置信度得分进行处理,以获得热图中x和y索引,其中每个部分的置信度值最高,这基本上就是关键点最可能存在的地方。这会产生一个尺寸为17*2的张量,每一行都是热图中的x和y索引,是每个部分置信度值最高的位置。

3. 每个部分的偏移向量是通过从x和y中得到的对于该部分热图中的x和y索引的偏移来检索。这会产生17*2的张量,每行都是相应关键点的偏移向量。例如,对于索引为k的部分,当 热图位置为y和d时,偏移向量为:

4. 为了获得关键点,将热图x和y乘上输出步幅,然后将其添加到它们对应的偏移向量中,该向量与原始图像具有相同的比例。

5. 最后,每个关键点置信度值是热图表位置的置信度值,姿势置信度值是关键点的平均值。

多人姿态跟踪算法的细节由于太过于复杂,无法用文本描述清楚,建议从事相关研究的小伙伴可以自己通过文中提供的内容尝试实验,这样能够加深对于问题的理解。

欢迎持续关注我们微信公众号(geetest_jy),还可以添加技术助理微信“geetest1024”微信,一起交流进步!

用TensorFlow.js实现人体姿态估计模型(下)_第5张图片

你可能感兴趣的:(用TensorFlow.js实现人体姿态估计模型(下))