《Learning to Estimate 3D Hand Pose from Single RGB Images》2017.3
本文介绍了从2D彩色图像进行3D hand pose estimation的一种方法,总体来说方法很直观
project page
主要流程
如图所示,依次有以下几个环节:
- 1)HandSegNet, 输入256x256x3, 输出256x256x1的一个hand mask。用一个FCN网络进行手的语义分割,分割之后的结果用来对手附近区域进行截图,以减少计算量及提高准确性
- 2)PoseNet,用来计算手的21个keypoint, 输入256x256x3,输出32x32x21, 即21张不同keypoint的score map
- 3)PosePrior,有两个子stream,每个的网络结构除了最后一层不一样其他都一样,输入32x32x21,输出两个层。一个是正则化的手的坐标,以手掌的点为原点,且长度进行了normalize, 即维度为21x3。另一个是相对于实际图片的空间的变换关系,即维度为3
在论文中还用这个结构进行了手语识别,手语识别的网络直接根据手的指示来, 是一个3层的全连接网络,输入维度63, 输出维度35
代码细节解读
使用自带的工具tfprof进行性能分析,发现主要的耗时在于, 2/3耗时在single_obj_scoremap中的tf.nn.dilation2d
操作, 1/6耗时在HandSegNet,1/6耗时在PoseNet2D。
同时,为了复用前人训练好的网络参数,将手部截图重新上采样到256x256来使用PoseNet。可见整个网络还有很大的优化空间。cpu上做到实时也不是没有希望。
训练流程解读
《Online Detection and Classification of Dynamic Hand Gestures with Recurrent 3D Convolutional Neural Networks》2016.11
这篇文章的思路就不一样,它主要在于训练一个end-to-end的手势识别结果,不进行具体的hand pose estimation。从视频效果来看也不错
《Realtime Multi-Person 2D Human Pose Estimation using Part Affinity Fields》2016.6
目标
多人同时Pose Estimation, 如下图所示
框架
分两个部分,检测部分和匹配部分,如下图所示
(b)关键点检测,(c)part affinity fields即四肢关系检测,(d)二分图匹配
检测部分
如下图所示,上下分为两个brach,分别用来检测关键点 Part Confidence Maps 以及 四肢关系Part Affinity Fields
分stage的思路和《Convolutional Pose Machines》一致(毕竟是一个团队)。其中的F来自于VGG-19的前十层finetuned的结果,对于stages t>=2, 每个branch的输入都是$$F, S^{t-1}, L^{t-1}$$ 的联合,即
类似于《Convolutional Pose Machines》,计算每层的loss为
其中的W(p)代表本该存在的单位是否在groud true中存在(有些关节或者四肢没有标注)。而对应的total loss为
注意Part Affinity Fields(PAF)是一些矢量区域,可以通过指定四肢粗细然后在训练数据中根据关节点来标注。
匹配部分
这里首先要明确 Part Confidence Maps和PAF是如何协同确定四肢和关节的预测的
如上图,对于图中的任意点P,在PAF的对应点的投影可以用来表示该点在四肢上的相关性。对于 Part Confidence Maps中任意的两个极值点A,B,可以通过插值A,B中的几个点p0, p1, p2, p3, p4...求这些点在PAF上的投影的积分来确定A,B两点作为同肢节的关节点的可能性,如下图
有了上面的两点同肢节判定的方法,我们就可以通过匹配每组能相连的点来决定连接与点的有效性。即通过右手腕的confidence map 和右手肘的confidence map的极值点之间的二分图匹配问题
其中
用来表示两个关节点是否相连。这个问题可以用Hungarian algorithm来解决,相对的总体的error,可以通过简单的相加来衡量
两个子问题:
-
non-maximum suppression非极大值抑制
定义:处理一份数据,讲非极大值的部分设置为0,是不是非常直观^^
实现:常见的高效算法可以参见 ICPR2006-《Efficient Non-Maximum Suppression》,核心是减少重复比较
应用:检测算法中常见,本质是从众多的滑动窗口的sore中找到局部极值作为检测结果。参见很不错的人脸检测的NMS例子 -
Hungarian algorithm
目标:解决二分图的最大匹配问题 or 任务分配问题,用在文中是解决不同关键点之间的同肢体匹配问题
《Convolutional Pose Machines》
目标
实现关键部位的检测,生成scoremap,如下图所示
框架
常规的思路类似FCN,但是由于网络层数变深会有不好训练的问题。文章的重点在于分stage来训练,每个stage的结果目标都是最终的score map,通过把原图的feature和上一个stage的输出一起传递到下个stage作为输入,来实现迭代。注意下图中的x'这个网络的权重在所有的stages t>=2中都是共享的,用来提取图像的feature
要点
- 通过分阶段stage的方式,用来迭代并扩大receptive field,每个stage都可量化以及可视化
- 由于总体网络层数教深,很容易出现gradient vanish的问题, 由于每个stage的输出都可以计算loss,如下,ground true未真实位置点的高斯分布的max
, 同时,total loss 为每层loss的和
。即文中所谓的Intermediate supervision,每层的gradient都有部份来自于当层的loss。End-to-end learning。
TODO: 不懂如果用了上面的loss却不intermediate supervision的方法