如今市面上做身份识别一般用到的是人脸识别,虹膜识别,指纹识别这些技术,需要被识别人一定程度的配合,比如露脸和伸手,同时必须是相对近距离的识别,但如果被识别人不配合呢?比如人脸识别的时候戴个面具搞个丝袜,这样就会抓不到人脸特征,那么在无法近距离采集人体特征的情况下如何识别,研究发现可以从人体的整体形态上着手,但识别什么呢?高矮胖瘦?是不是S曲线?这些恐怕都很难保证识别的准确率,所以目前在生物识别领域有一项号称最具有发展前景的技术,它就是步态识别,取一段人走路的视频,对人走路的特征进行识别,例如步幅,走路膝部弯曲程度,摆臂的幅度,肩颈部和头部的细微动作等等,这些都可以作为特征进行识别。今天就介绍一个性能良好的步态识别模型—GaitPart模型。
本文将通过口语化的描述谈谈此模型的下列几个方面:模型的整体思路、FPFE模块、HP模块、TFA模块、训练。在谈GaitPart模型前,先解释几个张量维度的含义,后面会经常用到,B样本个数,S每个样本序列长度(有多少帧),N分割数量,C图像通道数,H图像高,W图像宽,T是H和W展平后的向量,F特征向量。
- 模型整体思路
GaitPart整体思想就是取一些人走路轮廓的视频样本,然后按照每个视频的每一帧组成待识别的步态序列[B,S,C,H,W],将序列输入模型得到每个样本不同部位的特征输出[B,N,F]的过程。模型整体分为四大块,分别是FPE帧级特征抽取模块、HP水平池化模块、TFA时空特征聚合模块、FC输出模块,前三个名字第一看时,感觉很是高大上,了解过后发现基本都是CV的一些常规操作,没出圈,下面分别介绍一下吧。
- FPFE模块
FPFE的作用是将输入的步态序列在每一帧上切分出N个部分,然后针对每一个部分提取特征,内部组成就是卷积、激活、池化三兄弟,常规操作就不谈了,这里重点说一下FConv焦点卷积的原理,FConv是在卷积之前对输入的每帧图像在H维度上水平切割成N个部分,然后对每一个部分单独进行卷积,目的是通过卷积抽特征的时候,聚焦于人体的特定部位,避免其它部位的干扰(论文上的说法是缩小感受野,细粒度学习)。按切成4份举例,可以理解就是头部、上半身、腰部、下半身4个部分,这个N可作为一个超参用于模型调优,实验证明多切几份,对提高模型性能是有帮助的,目前流行的做法是切成16份。卷积后通过concat将16个特征序列进行的合并后输出。
FPFE输入张量[B,S,C,H,W]
FPFE输出张量[B,S,C,H,W]
- HP模块
HP将FPFE输入的特征序列[B,S,C,H,W],保留B,S,C维度不变,将H和W两个维度展平后切分成16份[B,S,C,N,T],然后每份通过平均池化和最大池化进行下采样—就是对16份中的每一份分别求均值和最大值,然后将均值和最大值加起来,这样就得到16个值,张量上的维度T中的数值全部归并到维度N上后得到输出[B,S,C,N],这个输出就是PRMatrix零件表示矩阵。
HP输入张量[B,S,C,H,W]
HP输出张量[B,S,C,N]
- TFA模块
TFA由多个MCM组成,每个MCM负责处理焦点卷积再经过水平池化后的每个部分的特征,所以MCM的数量等于水平池化中的N。
MCM微动作捕捉器,GaitPart模型的重头戏。MCM和MCM之间是参数独立的,也就是说它们之间互不影响,自己干自己的。MCM的核心思想是抽取局部短程时空特征,什么意思呢?局部就是HP输出的人体的不同部分。短程时空,短时是相对于长时来说的,一个人的走路是一个有时序特征的数据,可以用NLP的思想处理,这个可以理解为长时处理,但是步态又具有一个周期性,意思就是走路是在不断循环重复一个迈步的动作,如果用NLP的思想对步态进行全局理解,难免会造成冗余的特征抽取,而MCM的短时就是强调一个局部的动作只和它前面的动作和后面的动作有关系(论文上说此处配合上加权体现了注意力的概念),循环往复也能达到步态的全局理解。一个MCM又包含MTB微动作模板生成器和TP时间池化两个模块。
MTB,是将输入的人体部分特征Sp转换为微动作特征Sm,怎做的呢,这里就用到了前面提到的短程时空的概念,就是每一个样本,他在每一帧的每一个局部上的当前动作只和它前r帧和后r帧相同局部上的当前动作有关系,然后由这几个动作组成2r+1的一个子序列(前r加上后r,再加上本身)。具体操作上就是将每个子序列分别进行一层一维池化(平均和最大),以及两层一维卷积(目的是通过增加权重的方式增加注意力,可以从池化的角度理解为什么会增加权重),然后用池化的结果点乘上sigmiod(卷积的结果)得到MTB的输出,见下图,两外MTB实际上有两个,只是在参数上有所区别。
TP时间池化就比较简单了,它的作用就是将MTB层的输出,在样本维度上,将序列中的所有动作特征通过max进行聚合,形成输出。
- 训练
身份识别理论上属于一种深度度量学习,通过求取不同样本特征的欧氏距离得出结论,因此GaitPart模型使用三元损失函数计算损失,三元损失也是目前深度度量学习中比较常用计算损失的方法,论文中也是建议用三元损失,因此模型的每一轮训练选择两个正样本(同一人)和一个负样本(与正样本不同人)组成为一组,当然在满足这个条件的情况下,一轮训练可以选择多组数据,最终对多组数的损失求均值即可
注:本文是经过论文研读和实践后的个人理解,仅代表个人想法,如果有不妥处,欢迎指正