(吐槽:标题为啥最后一个单词是tracking而不是Tracking)
谷歌研究院提出的用于边缘设备上运行的单人人体姿态估计算法,思路很清奇,和之前的做法有很大的不同。
- 使用face detector检测人体而不是body detector。作者发现,使用body detector的话受场景中密集人群遮挡的影响,而且遮挡严重状态下,body detector的confidence值不会很高。而人的头部一是不容易被遮挡,二是在神经网络中该出的响应值往往是最高的。因为,文章使用了一个face detect,并额外输出当前人的middle hips point,size of the circle circumscribing the whole person, incline(根据后文的意思来看,这个incline就是 middle hips point 和 middle shoulder point 的连线和y轴的夹角)。这样,首先就有了一个轻量化的person detector。
- 网络是有两个部分组成,分别是keypoints detection部分和keypoints regression部分。这个网络新颖的地方在于,在训练阶段,keypoints detection和regression一起训练,但两者之间仅有feature的连接,gradient不传播。在测试的时候,砍掉detection部分,仅保留regression部分,这样可以加快运行速度。文章通过实验证明这种方法在大幅加速的同时也没有损失精度,网络结构如下图所示:
- 另外在训练阶段,文章针对模型的应用场景,针对性的对数据增强部分做了限制,这样降低了模型学习复杂场景的能力,但能让模型更快的去学习真实场景下的数据。
- 除了pose detect部分,整体模型还包含了一个pose tracker用来做跟踪。按照文章的意思来说,如果在当前帧pose tracker部分能够预测到下一帧中pose的位置的时候,pose detector就不会运行,会一直使用pose tracker的结果,否则就会运行pose detector重新初始化pose tracker。这一块应该就是tracking-by-detection部分的具体逻辑,不必要每次都运行pose detector,而仅仅在tracker失败的时候再运行pose detector。
- 文章最后在自己创建的数据集上,将自己的模型和openpose的做了比较,当然是速度远超openpose精度略差(openpose在这数据集上没有预训练,用来比较是否有点不妥)
- 所以最终是BlazeFace + BlazePose + BlazePalm,blaze家族大集合。下面是一些结果,还是很不错的