Lightweight Network Architecture for Real-Time Action Recognition 用于实时动作识别的轻量级网络架构
代码:https://github.com/opencv/openvino_training_extensions
Abstract 摘要
本文作者,来自俄罗斯英特尔的三位工程师,提出一种新的人体动作识别的方法,他们称之为Video Transformer Network(VTN) ,视频变换器网络。我总结了特点如下
1,采用市面上最为常见的RGB单色摄像头
2,采用轻量级的CNN网络,使用CPU而不是GPU运行,能获得56FPS以上,准确性与之前其它的动作识别的方法相当
3,解释了如何通过从具有不同模态的多个模型中提取到单个模型中来提高准确性(??)
Introduction 引言
目前,姿态识别的趋势是采用越来越复杂的网络,虽然准确率上升了,但导致机器运算使用的时间越来越多。所以作者想降低算法的复杂性,同时最大化准确性。
尤其是在用于边缘计算(在边缘处)的低功率设备的情况下。
注:边缘计算:云计算是把握整体,那么边缘计算就更专注于局部。那么边缘计算的优势就显而易见。边缘计算更靠近设备端,更靠近用户。
作者通过对各种目前常见的模型进行Accuracy vs complexity trade-off (复杂度和精确度的衡量),主要在Kinetics Video 数据集上进行测试,结果如下图,前三种是采用VTN方法的模型变体。
Related Work 相关的工作
1,融合来自空间和时间网络的信息的双流框架
2,使用3D primitives(3D基元),相当于增加了一个维度T,将训练好的2D滤波器融入3D中,精度有上升,但显而易见的是会大大增加计算成本,和不够稳定
3,最近convolutional or fully-attentional (e.g. Transformer) networks用于代替LSTMs序列网络。其中Transformer网络在处理序列数据时,在许多任务上取得更好的结果,同时解决RNN的重大缺点,例如顺序计算或梯度消失。有人认为RNN在NLP领域会逐渐退出历史舞台,被Transformer网络代替。
放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较 - 知乎
https://zhuanlan.zhihu.com/p/54743941
最后,作者采用了最近提出的Transformer network:
We adopt recently proposed Transformer network in our work as a more elaborate way for sequence modeling. This allowed us to attain high accuracy, retaining the perfor-mance, that is sufficient for real-time applications
读这篇文章之前强烈建议先读,有很多Transformer论文出现的术语,在这篇论文中直接就用了。
BERT大火却不懂Transformer?读这一篇就够了
https://baijiahao.baidu.com/s?id=1622064575970777188&wfr=spider&for=pc
注解:前一段时间(2018.11)谷歌推出的BERT模型在11项NLP任务中夺得STOA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了STOA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。
这里又是一个大坑…又要补一些基础知识
深入学习Google Transformer模型网络结构 - 简书
https://www.jianshu.com/p/83de224873f1
BERT大火却不懂Transformer?读这一篇就够了
https://baijiahao.baidu.com/s?id=1622064575970777188&wfr=spider&for=pc
Approach 方法
原文有一句:在多头自关注力机制中,通过使用注意力机制用其他帧的表示来实现每帧表示,来建模帧与帧之间的时间相互关系。这句话比较抽象。我们可以简单认为“每一帧”类似于NLP任务中的“每一个单词”
1. self-attention 自注意力机制:
例如,下列句子是我们想要翻译的输入句子:
The animal didn’t cross the street because it was too tired
这个“it”在这个句子是指什么呢?它指的是street还是这个animal呢?这对于人类来说是一个简单的问题,但是对于算法则不是。
当模型处理这个单词“it”的时候,自注意力机制会允许“it”与“animal”建立联系。
随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。
如果你熟悉RNN(循环神经网络),回忆一下它是如何维持隐藏层的。RNN会将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来。而自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中。
首先我们了解一下如何使用向量来计算自注意力,然后来看它实怎样用矩阵来实现。
计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造**一个查询向量q、一个键向量k和一个值向量v。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。
X1与WQ权重矩阵相乘得到q1, 就是与这个单词相关的查询向量。最终使得输入序列的每个单词的创建一个查询向量、一个键向量和一个值向量。即图中的q,k,v,然后通过一系列操作后获得自注意力的值…(这里面内容多到可以再写几篇博文了,下次有机会,越看越觉得很多不懂O__O "…)
假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。
最后的化简出来的公式如下图所示:
2. 接下来还引入了“多头注意力的机制”,用于进一步完善自注意力层,并在两方面提高了注意力层的性能。
在“多头”注意机制下,我们为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。和之前一样,我们拿X乘以WQ/WK/WV矩阵来产生查询/键/值矩阵。
如果我们做与上述相同的自注意力计算,只需八次不同的权重矩阵运算,我们就会得到八个不同的Z矩阵。
多头的本质是多个独立的attention计算,作为一个集成的作用,防止过拟合
3. 再引入位置编码表示序列的顺序,作用是理解我们输入单词顺序
4,每个编码器中的每个子层(自注意力、前馈网络)的周围都引入一个残差连接,并且都跟随着一个“层-归一化”步骤残差网络核心是解决了增加深度带来的副作用(退化问题),这样能够通过单纯地增加网络深度,来提高网络性能。
最后一个2层编码-解码结构的transformer总体的结构如下,在本文中tranformer的结构有所改变,没有使用解码器:
BERT大火却不懂Transformer?读这一篇就够了
https://baijiahao.baidu.com/s?id=1622064575970777188&wfr=spider&for=pc
Architecture overview 架构概述
该网络由两个部分组成:
First,用2D的CNN处理输入视频的每一帧,获得frame embeddings(帧嵌入)
Second,用 a fullyattentional feed-forward fashion来整合帧内时间信息,然后为the given clip 来生成分类标签
VTN体系结构概述:T输入帧被输入到CNN编码器并被全局合并以获得帧嵌入。然后,解码器块(在图3,即下图,中详细参见)被应用N次
这是因为视频有N帧,自注意力的一种解释就是在编码某个单词时,就是将所有N个单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。在这里帧相当于单词的概念。
最后,通过平均所有帧日志来生成剪辑日志。
Multimodal knowledge distillation
文中使用知识蒸馏(暗知识提取)来降低网络的复杂性。(这部分不是很明白,第一次接触到)
知识蒸馏(Knowledge Distilling),让你的模型轻装上阵——keras 实战 - 简书
https://www.jianshu.com/p/5c38872cdc0f
深度学习在这两年的发展可谓是突飞猛进,为了提升模型性能,模型的参数量变得越来越多,模型自身也变得越来越大。在图像领域中基于Resnet的卷积神经网络模型,不断延伸着网络深度。而在自然语言处理领域(NLP)领域,BERT,GPT等超大模型的诞生也紧随其后。这些巨型模型在准确性上大部分时候都吊打其他一众小参数量模型,可是它们在部署阶段,往往需要占用巨大内存资源,同时运行起来也极其耗时,这与工业界对模型吃资源少,低延时的要求完全背道而驰。所以很多在学术界呼风唤雨的强大模型在企业的运用过程中却没有那么顺风顺水。
为解决上述问题,我们需要将参数量巨大的模型,压缩成小参数量模型,这样就可以在不失精度的情况下,使得模型占用资源少,运行快,所以如何将这些大模型压缩,同时保持住顶尖的准确率,成了学术界一个专门的研究领域。2015年Geoffrey Hinton 发表的Distilling the Knowledge in a Neural Network的论文中提出了知识蒸馏技术,就是为了解决模型压而生的。至于文章的细节这里笔者不做过多介绍,想了解的同学们可以点击上方链接好好研读原文。不过这篇文章的主要思想就如下方图片所示:用一个老师模型(大参数模型)去教一个学生模型(小参数模型),在实做上就是用让学生模型去学习已经在目标数据集上训练过的老师模型。尽管学生模型最终依然达不到老师模型的准确性,但是被老师教过的学生模型会比自己单独训练的学生模型更加强大。
这里大家可能会产生疑惑,为什么让学生模型去学习目标数据集会比被老师模型教出来的差。产生这种结果可能原因是因为老师模型的输出提供了比目标数据集更加丰富的信息,如下图所示,老师模型的输出,不仅提供了输入图片上的数字是数字1的信息,而且还附带着数字1和数字7和9比较像等额外信息。
知识蒸馏具体流程
接下来笔者介绍一下知识蒸馏在实做上的具体流程。
(1)定义一个参数量较大(强大的)的老师模型,和一个参数量较小(弱小的)的学生模型,
(2)让老师模型在目标数据集上训练到最佳,
(3)将目标数据的label替换成老师模型最后一个全连接层的输出,让学生模型学习老师模型的输出,希望学生模型的输出和老师模型输出之间的交叉熵越小越好。
实验:不同模态的多个模型融合
在本文中
用图片RGB,RGB差分训练分别好了两个VTN模型,把两个模型通过知识蒸馏 ,分别蒸馏出一个新的单一RGB模型,和蒸馏出一个输入信号是RGB堆叠和RGB差分信息的模型。(?这句话看得不是很懂 原文:we ran several experiments where knowledge from two ResNet-34 based VTN models working with RGB and RGB difference is distilled to the single RGB model and to the model which receives stacked RGB and RGB difference inputs.)
最后,将这几种模型排列组合来分别尝试,最后获得结果。
表1:基于Mini-Kinetics数据集上的两流(两个模型的融合)ResNet-34-VTN作为教师的知识蒸馏(KD)结果。
当作为学生学习知识蒸馏设置时,与堆叠模式一起使用的单个模型提高了其准确性。仅RGB模型无法从知识蒸馏中受益。
注:差分图像是由目标场景在相邻时间点的图像相减得到的,从而能够得到目标场景随时间的变换。
实验:改变模型的超参数
改变transformer网络的超参数,如多头注意力机制中的头数,还尝试在头连接后添加可训练的线性变换,并在不同位置使用图层归一化等等,
但是这些变化并没有影响准确性。
实验:与其他模型相对比
所有模型都基于ResNet-34,输入 分辨率224x224和16帧输入。在Intel CoreTM i7-8700 CPU@2.90GHz上测量了时间,并以每秒钟帧表示。
实验:与数据集上最先进的模型比较
实验:在相同CPU上运行的推断时间
实验部分总结
速度不是最快的,但保证了相对快的速度,和较好的性能,在速度/精度权衡方面还是很有吸引力的。
总结
在这项工作中,我们提出了一种用于实时动作识别的新型视频变压器网络架构。我们已经证明,采用自然语言处理方法以及使用适当的CNN进行图像分类有助于以最先进的方法实现准确性。此外,已经证明,所提出的方法与其他方法(例如基于3D卷积的模型或两种流方法)相比具有优势。具体而言,它通过将每个输入帧嵌入到低维高级特征向量中,然后通过自我关注得出仅对嵌入向量起作用的动作的结论,从而可以更有效地利用计算资源。这种方法允许在通用CPU上实现实时推理,从而提供在边缘使用AR算法的功能。我们的研究还表明,自我注意机制非常普遍,可以应用于许多任务,例如自然语言处理,语音识别或计算机视觉。
新接触知识点
1,Tranforms网络
2,知识蒸馏(暗知识提取)