Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose

Lightweight OpenPose:
(附上个人github实现: 地址)
OpenPose很好,目前在多人目标关键点检测方面基本已经成为一个baseline. 但原始的openpose需要很好的显卡参与计算,或者说目前大部分关键点检测网络都是依赖于GPU的.这篇文章就提出如何基于OpenPose的设计思路,设计一个可以在纯CPU上实时跑的多人关键点检测网络,作者命名为"Lightweight OpenPose".

首先简单介绍下OpenPose,这篇文章我也没有细看,只是大概了解其中的内容.OpenPose是一个bottom-up的方法,先检测出图像上的所有人体关键点,然后根据paf(part affinity fields)将关键点进行聚类,使得任何人之间能够区分开来. OpenPose整体的pipeline如下:
Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose_第1张图片
Backbone使用的是VGG-19, 之后接连续6个stage. 每个stage都有两个分支,一个用来预测heatmap,一个用来预测paf. 本文作者沿用这个结构,但改变了一些网络结构,使其成为"Lightweight OpenPose":

  1. 原始的6个stage太多. 作者发现从第3个stage,即第二个refinement stage开始(第一个stage称之为 initial stage),AP值结果提升很少,但GFLOPs增加很大.(下表所示)所以作者砍掉了后面的四个stage,只保留了第一个initial stage和第一个refinement stage. Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose_第2张图片
  2. 原来的stage都是双路并行,其实很多操作都是一样的,作者发现这些操作之间应该可以权值共享.因此对于剩下的stage,将其改为一路操作,只有在最后才分开出两个branch,分别用来预测heatmap和paf. 另外,原来的branch中都是使用7x7的卷积核,作者使用了三个连续的1x1, 3x3, 3x3的卷积核来代替7x7,并且最后的3x3是使用了空洞卷积, dilation=2. 另外由于用3个卷积核代替原来的一个卷积核,网络层数变得很深,所以作者又加上了一个residual连接. 最终的设计如下:
    Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose_第3张图片Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose_第4张图片
  3. stage方面修改完了,最后就是backbone方面.原来的openpose是VGG-19,作者测试了最近两年新出的网络结构,例如PVANet, MobileNet V1, MobileNet V2, 以及 Dilated residual Network. 最终测试发现dilated + MobileNet V1 结果最好.(不知道为什么MobileNet V2反而结果更差). 另外对于原openpose在VGG-19后面新加的两个conv4_3, conv4_4,使用3个depthwise separable conv代替,channel数从256降为128. 最后的网络设计及精度如下表所示:
    Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose_第5张图片

总结
这是一个很好的实现,在降低原始openpose map值不到%1的情况下做到了在cpu上的实时操作,并且加入了最近很火的MobileNet, dilated conv, residual(这个应该算老的)等结构,很具有工业参考价值. Idea和Practice都很不错.

你可能感兴趣的:(Real-time 2D Multi-Person Pose Estimation on CPU: Lightweight OpenPose)