深度学习的人体动作识别算法
一、基本知识
近年来,基于深度学习的人体动作识别的研究越来越多,出现了基于不同数据源:深度图或RGB视频的人体关节的人体动作分类的方法以及特征表示方法。
本文着眼于人体动作识别领域的进展及挑战,总结了基于深度学习的动作分类的技术和方法。本文主要介绍了数据预处理、公开可用的基准和常用的精度度量等方面。此外,本文根据所采用的特征,对基于深度学习(包括基于无监督学习的行为识别、基于卷积神经网络的行为识别、基于循环神经网络以及一些拓展模型的方法)的人体动作分类的最新研究进行了分类。当然,这里面提到的很多模型都不是最新的技术,还有很多最新的模型和技术都没有包含进来。以大佬的论文为进行自己的阐述.
参考文章:3D skeleton-based human action classification: A survey.
RMPE: Regional Multi-Person Pose Estimation
文章以及相关代码链接:(PDF) 3D Skeleton-based Human Action Classification: a Survey
http://mvig.sjtu.edu.cn/research/alphapose.html
二、本文结构
本文首先提出一共多个人体姿态识别相关的数据集及其链接,然后给出几个经典的深度学习在人体姿态识别领域的应用模型,包括其论文提出的思路、模型结构、实验数据集和使用的加速硬件(如果有的话),本文不提供相关的实现方法。
三、数据集的简单介绍
相关数据集链接:http://mvig.sjtu.edu.cn/research/adha/adha.html
3.1 KTH
基本链接:Recognition of human actions
该视频数据集包括人体的多种肢体动作(如:走、慢跑、快跑、拳击、挥手和鼓掌),所有动作由不同的多个人分别演示,并且融合了不同类型的场景进行演示,大概包含AVI视频文件:25 \times 6 \times 4 = 600个。
3.2 Weizmaan
基本链接:Actions as Space-Time Shapes
该数据集中一共有90个视频文件,由9个人展示,每个人展示十种动作。
3.3 HOHA
基本链接:Ivan Laptev > Projects > Human Action Classification
该数据集从电影中采集的真实的人类活动。
3.4 Keck Gesture
基本链接:http://users.umiacs.umd.edu/~zhuolin/Keckgesturedataset.html
该数据集包含14中不同手势(军用信号),使用彩色相机拍摄,分辨率为 640 \times 480,每个手势都有三个人演示,每个视频序列中,一个人重复演示三次同样的手势,训练的一共有3 \times 3 \times 14 = 126个视频序列。并且拍摄角度固定背景也固定。测试的一共4 \times 3 \times 14 = 168个视频序列,并且使用运动相机拍摄并且处于杂乱且有移动物体的背景中。视频格式为AVI。
3.5 MSR action
基本链接:http://users.eecs.northwestern.edu/~jyu410/index_filesactiondetection.html
介绍:数据集包含16个视频序列,并且一共有63个动作,每一个视频序列包含复合动作,一些序列不同人的不同动作,同时有室内和室外场景,所有的视频都是在杂乱并且移动的背景中。视频分辨率为320 \times 240,帧率为15fps,视频序列的长度在32~76秒之间
3.6 YouTube Action
介绍:包含11种动作类,对于每一类动作,视频分为25组, 每一组有4个动作(分在同一组的视频有着一些共同的特征)
四、主流动作识别思路
(1)two-step framework,就是先进行行人检测,得到边界框,然后在每一个边界框中检测人体关键点,连接成一个人形,缺点就是受检测框的影响太大,漏检,误检,IOU大小等都会对结果有影响,代表方法就是RMPE。
(2)part-based framework,就是先对整个图片进行每个人体关键点部件的检测,再将检测到的部件拼接成一个人形,缺点就是会将不同人的不同部位按一个人进行拼接,代表方法就是openpose。
其中RMPE的基本忘了结构图:
整个框架包括3个部分,
对称空间变换网络SSTN(Symmetric Spatial Transformer Network),由STN和SDTN两部分组成,接收人体候选框由STN负责,产生候选姿态由SDTN,过滤掉多余的姿态估计由PNMS (Parametric PoseNonMaximum-Suppression)进行负责,其中PGPG(Pose-Guided Proposals Generator)是SPPE这一部分,可以产生各种姿态图片,供训练过程使用。具体的训练过程如图:
Open Pose的经典代表为R-CNN系列:详细介绍在我会将本文简书上写的文章转接过来。
五、深度学习算法
5.1 基于无监督学习的行为识别
5.1.1 案例1
论文[1]: Learning hierarchical invariant Spatio temporal features for action recognition with independent subspace analysis.
论文链接:http://www.robots.ox.ac.uk/~vgg/rg/papers/LeZouYeungNg11.pdf
该论文将独立子空间分析(Independent subspace analysis,ISA)扩展到三维的视频数据上,使用无监督的学习算法对视频块进行建模。这个方法首先在小的输入块上使用ISA算法,然后将学习到的网络和较大块的输入图像进行卷积,将卷积过程得到的响应组合在一起作为下一层的输入,将得到的描述方法运用到视频数据上。
论文中使用的模型(Model)
文章提出,为了克服过大数据量带来的ISA算法的低效,将ISA改为一种堆叠卷积ISA网络,网络结构如下:
首先使用小批量的数据训练ISA网络,然后将训练好的网络与较大的输入卷积,然后使用PCA算法处理,最后再经过一层ISA网络训练。为了适应三维的视频信息,将一段视频序列压缩成一个向量作为输入,得到最终模型如下图所示:
其中ISA的基本实现方式:
ISA是一种无监督学习方法,具有两层网络的生成模型,可以有效模拟人类视觉系统V1区简单细胞(simple cells)与复杂细胞(complex cells)感受野的层次化响应模式。
1)模型第一层学习线性变换的权重W(类似FC),
2)第二层将同一子空间元素合并,执行固定的非线性变换V(L2-pooling),得到对相位变化响应不变的特征。
比如对自然二维图像的中的应用:
Natural image中的ISA模型图中的第一层是输入图像的path,第二层其实是ISA的第一层输出,第二层和第一层之间的W就是我们需要learn的权值,第二层和输出层第三层的权值V是固定的,是不需要学习的,可以看到第二层的2个绿色的圈和第三层红色圈中的一个相邻,所以这里的子空间个数为2。第一层的输入是把图像的二维patch变成一个一维的向量。当然这个W的学习过程就是在优化图中下面那个公式,并且满足权值矩阵W是正交矩阵。
该论文的实验结果:
作者在UCF,Hollywood2,Youtube,KTH等数据库上做了测试,其测试结果表明,作者提出的算法比在此之前的其它算法的最好结果都要好,这是一个比较令人惊讶的地方。其算法准确度结果如下:
上述模型的feature learning的学习能力还是非常强的,应该是以后的研究热点,相应以后还会大大提高它在AI各个领域的作用。
5.2 基于卷积神经网络的行为识别
5.2.1 案例2
论文:3D Convolutional Neural Networks for Human Action Recognition
论文链接:mypapers/ICML10_Ji_Xu_Yang_Yu.pdf
上述论文将传统的CNN拓展到具有时间信息的3D-CNN,在视频数据的时间维度和空间维度上进行特征计算,在卷积过程中的特征图与多个连续帧中的数据进行连接。
模型
简单来说,3D-CNN就是将连续的视频帧看作一个盒子,使用一个三维的卷积核进行卷积,通过这种结构,就能捕获动作信息,三维卷积如下所示:
3D-CNN网络结构如下:
图中的3D CNN架构包含一个硬连线hardwired层、3个卷积层、2个下采样层和一个全连接层。每个3D卷积核卷积的立方体是连续7帧,每帧patch大小是60x40;在第一层,我们应用了一个固定的hardwired的核去对原始的帧进行处理,产生多个通道的信息,然后对多个通道分别处理。最后再将所有通道的信息组合起来得到最终的特征描述。这个实线层实际上是编码了我们对特征的先验知识,这比随机初始化性能要好。
每帧提取五个通道的信息,分别是:灰度、x和y方向的梯度,x和y方向的光流。其中,前面三个都可以每帧都计算。然后水平和垂直方向的光流场需要两个连续帧才确定。所以是7x3 + (7-1)x2=33个特征maps。然后我们用一个7x7x3的3D卷积核(7x7在空间,3是时间维)在五个通道的每一个通道分别进行卷积。为了增加特征map的个数(实际上就是提取不同的特征),我们在每一个位置都采用两个不同的卷积核,这样在C2层的两个特征maps组中,每组都包含23个特征maps。23是(7-3+1)x3+(6-3+1)x2(这样卷积之后会减少两个feature map,见图2),前面那个是:七个连续帧,其灰度、x和y方向的梯度这三个通道都分别有7帧,然后水平和垂直方向的光流场都只有6帧。54x34是(60-7+1)x(40-7+1)。在紧接着的下采样层S3层max pooling,我们在C2层的特征maps中用2x2窗口进行下采样,这样就会得到相同数目但是空间分辨率降低的特征maps。下采样后,就是27x17=(52/2)*(34/2)。C4是在5个通道中分别采用7x6x3的3D卷积核。为了增加特征maps个数,我们在每个位置都采用3个不同的卷积核,这样就可以得到6组不同的特征maps,每组有13个特征maps。13是((7-3+1)-3+1)x3+((6-3+1)-3+1)x2前面那个是:七个连续帧,其灰度、x和y方向的梯度这三个通道都分别有7帧,然后水平和垂直方向的光流场都只有6帧。21x12是(27-7+1)x(17-6+1)。S5层用的是3x3的下采样窗口,所以得到7x4。
到这个阶段,时间维上帧的个数已经很小了。在这一层,我们只在空间维度上面卷积,这时候我们使用的核是7x4,然后输出的特征maps就被减小到1x1的大小。而C6层就包含有128个特征map,每个特征map与S5层中所有78(13x6)个特征maps全连接,这样每个特征map就是1x1,也就是一个值了,而这个就是最终的特征向量了。共128维。
由于本人时间问题,先写一部分,后续部分在下一篇中继续!!谢谢!