CSDN每次都要上传图片真实蛋疼,搞成图片发还不要超过2M。。。。图省事还是压缩了一下图片质量。。。,最下面是没图的版本。。。
End-to-End Learning of Deformable Mixtureof Parts and Deep Convolutional Neural Networks for Human Pose Estimation
本文所解决的问题是如何将关节之间的依赖关系结合到CNN中去,以实现更好的效果。本文实际上也是学习DPM模型的那篇论文,将单个关节的外形以及关节之间的空间关系考虑进去,加入到CNN中去,但是却使用了概率图模型中的消息传递算法。整体架构就是首先一个用于多分类的CNN,然后后面接一个作者自己实现的消息传递层,消息传递层就是本文作者的卖点,可惜的是消息传递层的计算量还是令人捉急。虽说作者声称效果还可以。
如图所示为整体的架构一览,图中的DCNN本质上就是一个能够输出关节概率的分类网络(最后一层是softmax layer),在输出每个关节的评分之后,经过log,然后到达Message Passing Layers.
为了更为简洁地介绍,我先给出本文的损失函数
上面公式中的参数是和是参数.
1)部件外形项,其定义如下:
其中
是参数
p(.)是softmax函数,表明的含义就是预测第i个关节(该关节的类型为,位置在=)的评分,然后该评分取log就是部件外形项的定义了。
这一项表明网络就是一个多分类的CNN网络,没啥新意。这一点跟咱们的还不大一样。
2)空间关系项
上述公式就是空间关系项,说白了本文的作者还是逃脱不了对两个关节之间的关系进行建模啊!
类型为,位置在的关节与类型为,位置在的关节之间的关系定义是通过定义一个形变特征来进行计算的。
其实所谓的形变特征其定义为:
其中,, 是关节之间的形变权重。至于作者没说是啥。
那么最终的推断过程就是
整体就是图像输入CNN,然后得到softmax函数的输出,然后经过log层,在经过作者设计的消息传递层。这个消息传递层能够构建树结构模型和循环模型。
作者follow的是L.Sigal and M. J. Black. Measure locally, reason globally:Occlusion-sensitivearticulated pose estimation. In CVPR,2006. 2, 4
作者的消息传递层就是根据这篇文章来的,这篇文章介绍了一种max-sum算法被本文作者用进去了,形成了消息传递层。
Max-sum算法是图模型中的一个算法,该算法是一种近似算法。并且不能在有环图上收敛。,但是实验结果很好。
具体介绍:
在每一次迭代,一个顶点发送给其邻接顶点一个消息,其定义为
表明这是从关节i到关节j的所发送的消息。
表明关节i的belief
那么max-sum算法更新消息是这样更新的
上述公式中是公式5和公式6。
假设算法在N轮迭代后收敛,那么每个位置的belief以及每个位置的类型都是最大评分函数的近似。
上面的消息传递层中的max-sum算法对于一个特例:即树结构而言是可以用动态规划来解的。
使用verberti解码。这在之前的论文里面基本都用这个玩意。
首先如何组织消息的调度。
两种方式,分别为flooding schedule和serial schedule.
Flooding schedule 同时将消息传遍每个link
Serial schedule每次传递一个消息
本文采用flooding schedule
上图中的实线表示每个阶段传递给其邻接节点一个消息。虚线表示belief。
belief和类型为t_i的feature map相对应。在整个算法收敛后,就可以通过为每个部件选择最大belief的位置和类型。
这一过程如公式7所示。
在来说说这玩意的缺点:
计算量很大!就算本文使用泛化的距离变换方式来加速收敛过程,也还是计算量大。
分两步走:
前端的CNN使用部件混合类型进行训练,训练前面的CNN为部件检测器。
何为部件混合类型:
对关节i相对于其他关节j的相对位置进行聚类,聚类成T_i个团,然后每个团都与部件的实例的集合相关联,这些部件的集合中都有着近似的相对位置,每个部件的类型类标可以通过这些图案中的关系确定。这种部件混合类型与部件外形是很强烈相关的。
作者使用hinge loss,假设有N个消息传递层,那么对应下面公式的N,那么每个部件的最终的heatmap如下公式所示。
Ground truth 的heatmap是通过一个阈值来定义的,小于阈值则认为是+1否则是-1。
这样的话,得到的图像是一个正方形一样的图像,该正方形以关节位置为重心,以阈值的两倍为边长。
正方形区域内部是+1,其他地方是-1。
其实,不仅是想预测关节部件的位置而且还想最大化每个关节部件的响应。这里使用最大边界的方式进行训练。
下面是损失函数J的定义:
使用随机梯度下降进行学习。损失函数对应的偏导为:
实验在三个数据集上做的分别为:LSP、FLIC、PARSE
实验使用的数据扩增,将图像旋转360度,每6度一个。此外对图像进行水平镜像。
负样本使用INRIA的 Person 数据集。在预训练前端CNN的时候,随机选择5%的训练数据作为验证集。
然后再使用这些数据finetune整个模型。
评价指标:Percentage of Correct Parts (PCP) andPercentage of Detected Joints (PDJ), are used for comparison.
PCP度量正确检测出的肢体的百分比。PDJ是检测的关节百分比。
Strict PCP的代码:
http://human-pose.mpi-inf.mpg.de/
ChenNet:包括五个卷积层、两个max-polling层,三个全连接层
16层的VGG:为了降低计算量,将输入的大小从224x224修改为112x112,并且移除最后的pooling层。
输出的heatmap的个数是关节的个数+1,之所以+1是因为那个是背景。
Tree structure和loopy方式。
①不同变量下的结果(指标是Strict PCP)
比较不同的前端CNN架构带来的影响,VGG和ChenNet
T和LG表示不同的消息传递层之间的连接方式:tree还是loopy graph
unary 表示单个part检测器
Ind表示独立训练
②tree structre的实验,T表示tree(指标是Strict PCP)
③loopy的实验,LG表示loopygraphy(指标是Strict PCP)
④在LSP数据集下PDJ的结果与其他论文的对比
⑤在FLIC数据集上PDJ的结果,比较了各个论文的实验结果
这个作者的个人github也没有https://github.com/bearpaw/
project都是空的。啥都没有
http://www.ee.cuhk.edu.hk/~wyang/Deep-Deformable-Mixture-of-Parts-for-Human-Pose-Estimation/