动作识别实现
要识别出人物的动作通常需要连续的视频数据进行分析处理,需要采集的特征通常有单帧图像数据的特征和多帧图像数据之间时间上的特征,简单来说就是静态帧数据+帧间数据。
a、静态帧数据,表示单帧图像空间信息
b、帧间数据,表示时间信息(光流数据)
常用的数据集有:KTH、Weizmaan、HOHA、Keck Gesture、MSR action、YouTube Action、UT-Interaction等等。
从目标分析的角度上看,动作识别也能看作是分类的问题,每个动作就是一类,如果有二十个动作就是二十类。那么动作的识别最终就能转变成特征提取、分类两个主要过程。特征提取包含静态帧的特征,动态帧间的特征。算法在不断的迭代发展,产生了很多经典的处理模型、算法。一般的识别流程为:
从上图可以看到,动作识别的关键步骤是人体分割、特征提取以及特征编码。
人体分割是将图像中人体所在区域与图像的其他部分分割出来,使用人体关键点检测来分割的方法前文已经有所介绍;特征编码的作用主要是将提取到的特征标准化到统一的空间,而通常特征提取和特征编码一般是配套使用的,动作识别的CNN模型中已经包含了特征提取和特征编码。
上文提到,动作识别需要提取静态帧特征与帧间特征,比较经典的网络模型是Two-StreamConvolutionalNetworks、TSN、TRN等,下面分别介绍。
Two-StreamConvolutionalNetworks
two-stream结构是受到神经科学的启发,人类视觉皮层包含两条路径:腹侧流(执行物体识别)和背侧流(识别运动)。
spatial stream convnet输入单帧RGB图片,可以在Image-net上进行预训练,再在视频数据集上进行fine-tuning,训练图片是从所有视频帧中随机选一帧,并进行相应的数据增强,如翻转等其他处理,再随机剪切成224*224。用于提取单帧数据并分类。
temporal stream convnet处理的是连续帧的光流信息,由于光流是矢量,为了方便输入网络训练,故将此向量分解为水平和垂直方向的两个分量,因此一帧mn3的彩色图片,对应的光流特征图就是mn2,总共是L个连续的帧,经过随机剪裁,输入矩阵为2242242L。由于光流计算比较耗时,所以每个视频的光流图可通过OpenCV预先提取,并量化到0-255,用于提取帧间数据特征并分类。
##TSN
两个CNN方式的动作识别,提出了一个很好的思路,在动作识别领域除了使用3DCNN等思路之外又提出的一个有效的思路,并且能解决一定的问题。但是Two-StreamConvolutionalNetworks的方式有个明显的缺点,就是对输入的图像帧并没有处理,这样的帧采集方式为密集采样方式,如果连续多帧图像人的动作都保持不变,那么动作识别将失效,同时浪费了处理的时间。
为了解决上面的问题,于是TSN出现了,结构如下:TSN将输入的视频流分成k片段,然后再在每个片段随机选择一小片段分别送入CNN(two-CNN的方式),然后再进行特征融合,最后分类。
##TRN
TSN主要是提出了稀疏时间的采样策略,提高了识别精度。不过在对帧间时间序列的处理上似乎并没有太多的优化,于是TRN在TSN的基础上对Temporal部分进行了优化,提出了video-level的实时时间关系推理框架,架构如下:
two-CNN方式的优化不仅有前面介绍的TSN、TRN,还有对spatial进行加权优化的方式DOVF,还有对spatial、temporal的部分同时进行优化处理的ECO,等。TSN、TRN、DOVF、ECO解决了一系列连续多帧采集的问题,使密集采样转到稀疏采样成为现实,大大提高了处理的速度跟精度。
静态帧数据 + 帧间数据处理方式除了可以直接使用two-CNN的方式处理,还有CNN+LSTM、GCN(GR-GCN)网络、3DCNN等结构,常见模型除了前面介绍的还有LRCN、ST-GCN、DPRL+GCNN、GEGCN、SGR-GCN、2s-NLGCN等等,技术的发展总是在你追我赶中不断前进。
动作分析的模型一直在进化、在向着精度更高、速度更快的方向进化,不管是two-CNN的、3DCNN的、CNN+LSTM的等等,都需要解决下面的问题:
1.动作识别一般都需要一系列连续的frame,如何从video里采样到更好更合适不重复的frame;
2.一系列连续的frame往往需要消耗很大的计算力,使real time比较难;
3.动态动作幅度有大小,有快有慢,静态动作又是静止的图像,需要准确区分识别;
4.训练集的动作跟实际环境的动作会有较大差别,如何保证实际环境中的准确率是个大问题。