论文复现课程链接:https://aistudio.baidu.com/aistudio/education/group/info/1340
这篇博客主要是对飞桨PaddlePaddle论文复现课程中 视频分类 论文的解析.
课程中有关视频分类的论文主要有4篇, 本博客对其中的第4篇进行解读:
1.ECO: Efficient Convolutional Network for Online Video Understanding
网址:https://github.com/mzolfaghari/ECO-pytorch
2.Temporal Pyramid Network for Action Recognition
网址:https://github.com/decisionforce/TPN
3.Learning Spatio-Temporal Features with 3D Residual Networks For Action Recognition
网址:https://github.com/kenshohara/3D-ResNets-PyTorch
4.Representation Flow for Action Recognition
网址:https://github.com/piergiaj/representation-flow-cvpr19
Representation Flow for Action Recognition这篇文章是CVPR2019上美国印第安纳大学发的一篇论文。
这篇论文的主要创新点在于,之前有关光流的深度学习,是把光流当成一张特征图进行学习;而本文发明了Representation Flow,是一个CNN中完全可微的层,能够端到端地进行动作识别。论文另外提出了Representation Flow层是可以堆叠的。实验证明此方法比传统的光流算法在速度和性能上都有很大提升(在仅需RGB输入的视频分类模型里面达到了SOTA,而需要光流输入的方法,如双流法,普遍慢10倍)。
这篇论文参考了TV-L1的论文https://www.ipol.im/pub/art/2013/26/article.pdf,
关于TV-L1的解读可参考一个写的不错的知乎:https://zhuanlan.zhihu.com/p/42537928
TV-L1(Total Variation L1-norm)中的方案如下(这里的推导非常复杂,建议只关注其在flow layer中的实现):
本论文中设计的flow layer, 把TV-L1算法中的迭代变成了一系列的tensor操作:
其中主要有2点改动:1)g θ, λ, τ, divergence weights等参数变成了可以学习的;2)为了部分替代多尺度、仿射变换等耗时操作的效果,提出了在不同尺度的cnn层上采用flow layer的方法。
整体的方案如下(中间for循环里面即TV-L1):
那么flow layer怎么用于视频分类的任务呢?
模型输入是T×C×W×H,C是RGB层,WH是长款,T是帧数。每帧都有输出,通过时域平均后,产生每个类别的概率。
模型的目标函数如下(即视频v和类别c的loss定义为交叉熵):
视频表征光流的可视化如下(ResNet34第3个残差层后)。动态图见作者项目主页:https://piergiaj.github.io/rep-flow-site/
为了进一步提高准确率,文章还提出了Flow of Flow的结构:
相比于单层的Flow,网络深处的Flow可以提升分类的准确率。不过其语义可解释性并没有那么强,但肉眼也能看出来一些运动模式。动态图见项目主页https://piergiaj.github.io/rep-flow-site/
Kinetics数据集简介。tiny-Kinetics比较小。
实验一可以看到,使用ResNet34的情况下,在3个CNNblock后计算flow,最终的效果比较好。
实验二可以看出,,计算所有参数时效果最好。
为了验证方法的可靠性,中间消融实验还有很多,建议阅读原始论文。
最终的实验结果对比如下:
可以看到,FcF(Flow-Conv-Flow)+ Non-local的方式,在Kinetics和HMDB数据集上都取得了不错的效果.作者还非常良心地测了耗时(很多文章都只关注性能),耗时也仅是双流法的十分之一左右,约为RGB输入的1.5~2倍。
这篇文章是比较实用的,从TV-L1光流算法入手,设计了可微分的flow层,融入了CNN网络,实际使用时添加flow层即可。看来把传统图像算法设计成端到端的网络,这一思想还是值得深挖。