Two-Stream Convolutional Networks for Action Recognition in Videos双流网络论文精读

论文:Two-Stream Convolutional Networks for Action Recognition in Videos
链接:https://arxiv.org/abs/1406.2199

本文是深度学习应用在视频分类领域的开山之作,双流网络的意思就是使用了两个卷积神经网络,一个是Spatial stream ConvNet,一个是Temporal stream ConvNet。此前的研究者在将卷积神经网络直接应用在视频分类中时,效果并不好。作者认为可能是因为卷积神经网络只能提取局部特征,于是作者使用了视频的光流信息,先提取了一遍视频光流特征,再将其送入卷积神经网络中,这样就取得了不错的效果。

双流卷积神经网络的示意图如下,其中上半部分的空间流卷积神经网络输入是静态的单帧图像,该网络输出动作的分类概率;下半部分的事件流卷积神经网络输入的是optical flow,即视频中的光流信息,最后也是通过softmax输出分类概率,最后这两个分类概率取加权平均值,就能得到最终的预测。

OpenCv提取光流的代码在这里:OpenCV: Optical Flow

那么什么是视频中的光流信息呢,作者给出了如下解释。如下图(a)(b)所示,图中人物在抽出弓箭,图©就是相邻两帧的光流信息,图中的箭头就是人物手臂的运动方向,也就是视频的运动特征。因为光流有x,y两个方向,其中图(d)就表示这个视频x方向的光流特征,图(e)表示视频y方向的光流特征。假设图片长度为320,宽度为240,那么输入的相邻两帧视频维度即为(320,240,3),图©中光流图的维度即为(320,240,2)2代表xy两个方向,最后图(d)(e)的维度就是(320,240,1)。

为了得到整个视频的光流特征,作者认为不能直接把视频的光流图像输入2D卷积神经网络,因为这样还是不能得到视频之间的连续信息。作者想出了以下两种方法得到输入的光流信息,分别是optical flow stacking和trajectory stacking,如下图所示。

optical flow stacking的计算公式如下,
I τ ( u , v , 2 k − 1 ) = d τ + k − 1 x ( u , v ) I τ ( u , v , 2 k ) = d τ + k − 1 y ( u , v ) , u = [ 1 ; w ] , v = [ 1 ; h ] , k = [ 1 ; L ] . \begin{aligned} &I_{\tau}(u, v, 2 k-1)=d_{\tau+k-1}^{x}(u, v) \\ &I_{\tau}(u, v, 2 k)=d_{\tau+k-1}^{y}(u, v), \quad u=[1 ; w], v=[1 ; h], k=[1 ; L] . \end{aligned} ​Iτ​(u,v,2k−1)=dτ+k−1x​(u,v)Iτ​(u,v,2k)=dτ+k−1y​(u,v),u=[1;w],v=[1;h],k=[1;L].​
trajectory stacking的计算公式如下:
I τ ( u , v , 2 k − 1 ) = d τ + k − 1 x ( p k ) I τ ( u , v , 2 k ) = d τ + k − 1 y ( p k ) , u = [ 1 ; w ] , v = [ 1 ; h ] , k = [ 1 ; L ] . \begin{aligned} &I_{\tau}(u, v, 2 k-1)=d_{\tau+k-1}^{x}\left(\mathbf{p}_{k}\right) \\ &I_{\tau}(u, v, 2 k)=d_{\tau+k-1}^{y}\left(\mathbf{p}_{k}\right), \quad u=[1 ; w], v=[1 ; h], k=[1 ; L] . \end{aligned} ​Iτ​(u,v,2k−1)=dτ+k−1x​(pk​)Iτ​(u,v,2k)=dτ+k−1y​(pk​),u=[1;w],v=[1;h],k=[1;L].​
其中 p k \mathbf{p}_{k} pk​ 是轨迹上的第 k k k个点, 从第 τ \tau τ帧的位置 ( u , v ) (u, v) (u,v)开始,且由以下递归关系定义:

p 1 = ( u , v ) ; p k = p k − 1 + d τ + k − 2 ( p k − 1 ) , k > 1. \mathbf{p}_{1}=(u, v) ; \quad \mathbf{p}_{k}=\mathbf{p}_{k-1}+\mathbf{d}_{\tau+k-2}\left(\mathbf{p}_{k-1}\right), k>1 . p1​=(u,v);pk​=pk−1​+dτ+k−2​(pk−1​),k>1.
其中,这里的每一帧已经被resize为(224,224)的大小。左边表示视频的每一帧都在相同位置取出光流信息,即每次都在P1的位置上取光流的值,右边这种方式表示沿着光流运动的轨迹来取光流的值,即在第T+1帧时第T帧在P1的点运动到了P2,那么就继续从P2的位置开始取光流信息。最终作者发现左边的方式效果更好一些。

那么光流怎么作为网络输入呢?假设给定L+1帧的一个视频,可以得到L个光流图,这L个光流图可以作为(w,h,2L)这么大的一个张量输入网络。因为每个光流图都有L个x方向的光流和L个y方向的光流,所以2L这个channel的叠加方式就是(x1,x2…,xL,y1,y2,…yL)。再看回图1,作者设计的训练网络中Spatial stream ConNet部分有RGB三个channel,然后作者每个视频从中抽样出11帧图片,可以获得10个光流图,因此Temporal stream ConvNet部分有20个channel。

那么最后的结果是怎么通过双流网络获得的呢?对于空间流卷积网络,作者从每个视频中等间隔抽取25帧图片,然后抽取这个图片的四个边角和中心框,再将图像翻转,重复上述操作。这样一张照片就被增强为了10张照片。由于每个视频从中抽取了25帧,增强过后一个视频就变成了250帧,这250张照片分别输入空间流卷积网络,得到动作是每个类别的概率。最后这250个概率值取平均,就可得到这个视频属于每个类别的总概率。对于时间流卷积网络,作者在上述25帧之后都取了连续的11帧,然后将张量送入卷积网络,再取平均,得到每个类别的平均概率。最后将这两个流的结果做一个late fusion,即结果相加再除以2,得到最终的双流网络预测结果。

我从github上看到一份pytorch复现代码,但是目前还没有尝试运行,链接如下:blacknwhite5/pytorch-two-stream-CNN: Two-Stream Convolutional Networks for Action Recognition in Videos (github.com)

pytorch网络实现细节:

class SpatialNet(nn.Module):def __init__(self):super(SpatialNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 96, kernel_size=7, stride=2),# nn.batchnorm2d(96),nn.ReLU(),nn.MaxPool2d(3, stride=2),nn.LocalResponseNorm(2),nn.Conv2d(96, 256, kernel_size=5, stride=2),# nn.batchnorm2d(256),nn.ReLU(),nn.MaxPool2d(3, stride=2),nn.LocalResponseNorm(2),nn.Conv2d(256, 512, kernel_size=3),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3),# nn.batchnorm2d(512),            nn.ReLU(),nn.MaxPool2d(3, stride=2),)self.classifier = nn.Sequential(nn.Linear(2048, 4096),nn.Dropout(),nn.Linear(4096, 2048),nn.Dropout(),nn.Linear(2048, 5),)def forward(self, x):x = self.features(x)x = x.view(x.size(0), -1)x = self.classifier(x)return xclass TemporalNet(nn.Module):def __init__(self):super(TemporalNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 96, kernel_size=7, stride=2),# nn.batchnorm2d(96),nn.ReLU(),nn.MaxPool2d(3, stride=2),nn.LocalResponseNorm(2),nn.Conv2d(96, 256, kernel_size=5, stride=2),# nn.batchnorm2d(256),nn.ReLU(),nn.MaxPool2d(3, stride=2),nn.LocalResponseNorm(2),nn.Conv2d(256, 512, kernel_size=3),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3),# nn.batchnorm2d(512),            nn.ReLU(),nn.MaxPool2d(3, stride=2),)self.classifier = nn.Sequential(nn.Linear(2048, 4096),nn.Dropout(),nn.Linear(4096, 2048),nn.Dropout(),nn.Linear(2048, 5),)

Two-Stream Convolutional Networks for Action Recognition in Videos双流网络论文精读相关推荐

  1. 双流网络: Two-Stream Convolutional Networks for Action Recognition in Videos

    Contents Introduction Two-stream architecture for video recognition Evaluation Enlightenment Referen ...

  2. 视频动作识别--Two-Stream Convolutional Networks for Action Recognition in Videos

    Two-Stream Convolutional Networks for Action Recognition in Videos NIPS2014 http://www.robots.ox.ac. ...

  3. Two-Stream Convolutional Networks for Action Recognition in Videos算法笔记

    论文:Two-Stream Convolutional Networks for Action Recognition in Videos 链接:https://arxiv.org/abs/1406. ...

  4. 【论文模型讲解】Two-Stream Convolutional Networks for Action Recognition in Videos

    文章目录 前言 0 摘要 1 Introduction 1.1 相关工作 2 用于视频识别的双流结构 3 光流卷积神经网络(时间流) 3.1 ConvNet 输入配置 4 实现细节 4.1 测试 4. ...

  5. 深度学习-视频行为识别:论文阅读——双流网络(Two-stream convolutional networks for action recognition in videos)

    这里写目录标题 视频的行为识别 前言 背景 内容组成 主要贡献 算法介绍 网络结构 双流(two stream)网络结构 空间流卷积网络(Spatial stream ConvNet) 时间流卷积网络 ...

  6. 【论文学习】Two-Stream Convolutional Networks for Action Recognition in Videos

    Two-Stream Convolutional Networks for Action Recognition in Videos 原文地址 粗略翻译 摘要: 我们研究了视频中用于训练动作识别的深度 ...

  7. 【视频分类论文阅读】Two-Stream Convolutional Networks for Action Recognition in Videos

    论文是视频分类的开山之作,采用了一个双流网络,是空间流和事件流共同组成的,网络的具体实现都是CNN,空间流的输入是静止的图片,来获取物体形状大小等appearance信息,时间流的输入是多个从两帧之间 ...

  8. 译:Two-stream convolutional networks for action recognition in videos

    该篇文章为视频识别十分经典的一篇论文也是入门文章,开创了比较经典的双流(时间流+空间流)神经网络,本人发现很多大神博主翻译的论文不是特别完整,故按照原文与个人理解整理完整翻译见下. 摘要:我们研究了用 ...

  9. [论文阅读笔记]Two-Stream Convolutional Networks for Action Recognition in Videos

    Karen Simonyan Andrew Zisserman  Visual Geometry Group, University of Oxford  fkaren,azg@robots.ox.a ...

最新文章

  1. vlc android 移植版编译
  2. 使用AWS Lambdas扩展技术堆栈
  3. 群签名和环签名的区别_超级签名和TF签名使用个人开发者账号的区别是什么?...
  4. idea修改回默认字体,设置 IntelliJ Idea 的中英文字体
  5. java 向下转型运行时错误_java多态和向下转型问题。
  6. wxcharts.js结合java后台在小程序中的使用(柱状图,其它同理)
  7. EPS格式转黑白照片(高清晰版本)
  8. 2018今日头条内推笔试1
  9. [转]关于Gmail打不开的解决办法
  10. 埃及分数数学模型c语言,C语言将真分数分解为埃及分数代码解析
  11. android气泡组件,Android 聊天气泡
  12. python第三章_Python学习(第三章)
  13. win2008服务器蓝屏如何修复,win2008r2 老是蓝屏重启。
  14. Zookeeper分布式锁
  15. 数分可视化笔记整理4 - 2017年内地电影和票房数据情况(条形图)
  16. 使用无界面方式登录人人网
  17. BZOJ 1430 小猴打架
  18. 参数反演 计算机,基于Radon变换的波场参数反演算法及图像重构
  19. 佳明520自制中文地图
  20. Java类加载,getClassLoader()

热门文章

  1. Revit中模型图元是什么意思?绘图时借助出图插件实现标注调整?
  2. JAVA实现自动弹出公告栏 可设置24小时内不显示
  3. 实践 | 百信银行基础设施容器化改造之路
  4. 2021年最常见前端面试问题以及答案参考(持续更新...)
  5. illustrator基本操作
  6. Verilog Assertions
  7. 关于完全二叉树先序遍历,中序遍历,后续遍历
  8. 如何让猎头公司发现你
  9. SSO_and_OBIEE
  10. 连接器金属外壳接地处理