本文介绍了从2D彩色图像进行3D hand pose estimation的一种方法,总体来说方法很直观
project page
在论文中还用这个结构进行了手语识别,手语识别的网络直接根据手的指示来, 是一个3层的全连接网络,输入维度63, 输出维度35
使用自带的工具tfprof进行性能分析,发现主要的耗时在于, 2/3耗时在single_obj_scoremap中的tf.nn.dilation2d
操作, 1/6耗时在HandSegNet,1/6耗时在PoseNet2D。
同时,为了复用前人训练好的网络参数,将手部截图重新上采样到256x256来使用PoseNet。可见整个网络还有很大的优化空间。cpu上做到实时也不是没有希望。
如上图所示,采用两个stream,一个用静态的单张图片来分类,另一个stream用累积的多张图片的信息来分类
非常直观,直接用每张图片过cnn
文中提到了两种方法,一种是光流Optical flow stacking,一种是轨迹Trajectory stacking
文中还讨论了一些方便用在学习中的特征,可以参考一下
code
这篇文章主要是在《Two-Stream Convolutional Networks for Action Recognition in Videos》的基础上进行改进。主要针对其中的两个缺点:
* spatial 和 temporal 的feature没有在pixel层面上进行合作,只用了最后的score
* temporal的操作基本还是基于2d的conv
核心在于引入3d-conv , 3d-pooling,以及对网络结构进行fusion
TODO
这篇文章的思路就不一样,它主要在于训练一个end-to-end的手势识别结果,不进行具体的hand pose estimation。从视频效果来看也不错
大道至简,对于近距离的手势识别,觉得这个方案应该是目前比较靠谱的。
project page
如上图所示基本框架很简单
3D-CNN + RNN + Softmax + CTC loss
文中采用了多模态数据,比如RGB,深度,红外,光流,但本身基于单数据源也效果很好
在 project page上,有他们自制的训练数据,大概30G,包含25个预定义动作,20个训练人员,10秒不到的短视频,每个视频一个动作,视频中包含无动作开始+动作+无动作结尾。除此之外,在训练过程中还做了data augment,比如从120x160的尺寸中随机取112x112大小的数据,还有random spatial rotation (±15◦) and scal- ing (±20%), temporal scaling (±20%), and jittering (±3 frames).
经过测试他们选取了一个clip 8帧来兼顾性能和速度,3D-CNN使用pretrain自C3D的一个比较大的运动数据集。然后在pretrain的weights的基础上直接加softmax算cross entropy的loss来fine tune 3D-CNN的参数。
用了8层conv和2层的全连接。
在准备好3D-CNN之后,加上RNN,用back-propagation-through-time(BPTT)来做gradient descent就行了。需要注意的是,在训练的过程中,我们主要考虑两个loss
先说下最终test的效果,112x112x3的大小,在nvidia TitanX上面但clip 8帧的情况下,单次耗时30ms左右。可以说,还不错,但是conv感觉太深,可能没有必要。
具体流程如下
code
多人同时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,St−1,Lt−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 任务分配问题,用在文中是解决不同关键点之间的同肢体匹配问题
code
常规的思路类似FCN,但是由于网络层数变深会有不好训练的问题。文章的重点在于分stage来训练,每个stage的结果目标都是最终的score map,通过把原图的feature和上一个stage的输出一起传递到下个stage作为输入,来实现迭代。注意下图中的x’这个网络的权重在所有的stages t>=2中都是共享的,用来提取图像的feature
TODO: 不懂如果用了上面的loss却不intermediate supervision的方法
code
model-based的方法可以有效的利用手的先验知识,如下图所示:  注:上图中的拇指部分的关节标错了,下移一节应该才正确
流程图如下: 
Loss分为两部分: 一个是最终的Joint Locations的一个Loss  另一个是在计算关节角度值之后根据生理学模型或者统计求得的每个角度的角度范围,然后用这个合理范围作一个penalty  Total loss就是上面两个loss的系数相加 
这文章其实没有啥新意,不过有代码,而且引用了一些不错的文章。这篇文章是采用将动作序列采样到标准长度,更好的替代方法是采用ctc
两个steam,分别处理RGB的图像和Depth图像
其中每个子stream的框架如下:
在常规的LSTM中,上面的 * 是矩阵乘法,而convolutional LSTM中,上面的X,H都是二维数据(类似图像),* 也变成了convolution操作
参看下面的文章《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
图像金字塔方法,多尺度。解决两个问题
非常直观,如下图
采用多个尺度的pooling(比如Max pooling),与传统的pooling不同的是,窗口大小不固定,而是依据输入来变化,比如输入是一个100x100x5的feature map,现在我们需要对其作左边蓝色的SPP,则直接将100划分成四段,对每个bin中的25x25作Max pooling, 得到的结果就是16x5的一个vector,这样每层出来的结果都是定长的。
如何利用现有框架的方法来训练是个问题
对于传统的固定大小的输入,使用金字塔方法也能获得多尺度信息来提升准确性,这个时候可以简单的用传统的pooling的方法来拼接就可以(根据bin的数目来算出所需要的size和stride),如下图所示
要像训练得到一些变尺度的信息,比如一个数据集原先图片的尺寸都是224x224,可以通过resize所有数据到180x180,这样,我们用224x224可以训练一个网络,用180x180也训练一个网络,都采用上面single-size training的方法。而两个网络中的参数数目是相同的,我们share两个网络中的参数,这样tain出来的参数更加符合多尺度特征。
在test的时候,则不论尺寸大小,这个时候poolling的size和stride需要根据数据确定。
水文,简单的cnn+lstm。唯一的收获是可以使用图像差来做输入,即
思路很有意思,不直接recognize,而是去predict下一步来recognize
首先采用的是三轴加速度计的输出,这一点本身比较适合predict next。
核心思路就是,对于每个gesture,训练一个下面的预测器:
即根据t-1时刻的值来预测t时刻的x,y,z三个传感器输出。
学习好之后,对于recognize过程,输入是一个序列,可以将输入放到所有的gesture的predict当中,比较输出的predict error的大小,最小的即为预测值。